From e473c9fb1546436be03a3aa1e6290e4f95c23dc9 Mon Sep 17 00:00:00 2001 From: David Allemang Date: Sat, 25 Feb 2017 00:40:41 -0500 Subject: [PATCH] Initial tiles testing --- hexworld/HexRender.cs | 205 ++++++++++++++++++++++++++++----------- hexworld/grass.png | Bin 0 -> 771 bytes hexworld/hexworld.csproj | 6 +- hexworld/s.fs.glsl | 4 +- hexworld/s.vs.glsl | 11 ++- hexworld/stone.png | Bin 0 -> 596 bytes hexworld/tex.png | Bin 5234 -> 0 bytes hexworld/tex2.png | Bin 718 -> 0 bytes 8 files changed, 165 insertions(+), 61 deletions(-) create mode 100644 hexworld/grass.png create mode 100644 hexworld/stone.png delete mode 100644 hexworld/tex.png delete mode 100644 hexworld/tex2.png diff --git a/hexworld/HexRender.cs b/hexworld/HexRender.cs index 2bcdba2..2c5f89b 100644 --- a/hexworld/HexRender.cs +++ b/hexworld/HexRender.cs @@ -7,61 +7,124 @@ using OpenTK.Graphics.OpenGL4; namespace hexworld { + public struct Vertex + { + public Vector3 Position; + public Vector2 UV; + public Vector3 Normal; + + public Vertex(Vector3 position, Vector2 uv, Vector3 normal) + { + Position = position; + UV = uv; + Normal = normal; + } + } + + public struct Tile + { + public Vector3 Position; + + public Tile(Vector3 position) + { + Position = position; + } + } + public class HexRender : GameWindow { private Program pgm; - private Texture tex1; + private Texture grass; + private Texture stone; private Texture tex2; private Matrix4 view; private Matrix4 proj; - private readonly float[] verts = + private readonly Vertex[] cubeVerts = { - // +X - +.5f, +.5f, -.5f, 1.0f, 0.5f, - +.5f, +.5f, +.5f, 1.0f, 0.0f, - +.5f, -.5f, +.5f, 0.5f, 0.0f, - +.5f, -.5f, +.5f, 0.5f, 0.0f, - +.5f, -.5f, -.5f, 0.5f, 0.5f, - +.5f, +.5f, -.5f, 1.0f, 0.5f, + // +X + new Vertex(new Vector3(+.5f, +.5f, -.5f), new Vector2(1.0f, 0.5f), new Vector3(+1, +0, +0)), + new Vertex(new Vector3(+.5f, +.5f, +.5f), new Vector2(1.0f, 0.0f), new Vector3(+1, +0, +0)), + new Vertex(new Vector3(+.5f, -.5f, +.5f), new Vector2(0.5f, 0.0f), new Vector3(+1, +0, +0)), + new Vertex(new Vector3(+.5f, -.5f, +.5f), new Vector2(0.5f, 0.0f), new Vector3(+1, +0, +0)), + new Vertex(new Vector3(+.5f, -.5f, -.5f), new Vector2(0.5f, 0.5f), new Vector3(+1, +0, +0)), + new Vertex(new Vector3(+.5f, +.5f, -.5f), new Vector2(1.0f, 0.5f), new Vector3(+1, +0, +0)), // -X - -.5f, +.5f, +.5f, 0.5f, 0.0f, - -.5f, +.5f, -.5f, 0.5f, 0.5f, - -.5f, -.5f, -.5f, 1.0f, 0.5f, - -.5f, -.5f, -.5f, 1.0f, 0.5f, - -.5f, -.5f, +.5f, 1.0f, 0.0f, - -.5f, +.5f, +.5f, 0.5f, 0.0f, + new Vertex(new Vector3(-.5f, +.5f, +.5f), new Vector2(0.5f, 0.0f), new Vector3(-1, +0, +0)), + new Vertex(new Vector3(-.5f, +.5f, -.5f), new Vector2(0.5f, 0.5f), new Vector3(-1, +0, +0)), + new Vertex(new Vector3(-.5f, -.5f, -.5f), new Vector2(1.0f, 0.5f), new Vector3(-1, +0, +0)), + new Vertex(new Vector3(-.5f, -.5f, -.5f), new Vector2(1.0f, 0.5f), new Vector3(-1, +0, +0)), + new Vertex(new Vector3(-.5f, -.5f, +.5f), new Vector2(1.0f, 0.0f), new Vector3(-1, +0, +0)), + new Vertex(new Vector3(-.5f, +.5f, +.5f), new Vector2(0.5f, 0.0f), new Vector3(-1, +0, +0)), // +Y - +.5f, +.5f, -.5f, 0.5f, 0.5f, - -.5f, +.5f, -.5f, 1.0f, 0.5f, - -.5f, +.5f, +.5f, 1.0f, 0.0f, - -.5f, +.5f, +.5f, 1.0f, 0.0f, - +.5f, +.5f, +.5f, 0.5f, 0.0f, - +.5f, +.5f, -.5f, 0.5f, 0.5f, + new Vertex(new Vector3(+.5f, +.5f, -.5f), new Vector2(0.5f, 0.5f), new Vector3(+0, +1, +0)), + new Vertex(new Vector3(-.5f, +.5f, -.5f), new Vector2(1.0f, 0.5f), new Vector3(+0, +1, +0)), + new Vertex(new Vector3(-.5f, +.5f, +.5f), new Vector2(1.0f, 0.0f), new Vector3(+0, +1, +0)), + new Vertex(new Vector3(-.5f, +.5f, +.5f), new Vector2(1.0f, 0.0f), new Vector3(+0, +1, +0)), + new Vertex(new Vector3(+.5f, +.5f, +.5f), new Vector2(0.5f, 0.0f), new Vector3(+0, +1, +0)), + new Vertex(new Vector3(+.5f, +.5f, -.5f), new Vector2(0.5f, 0.5f), new Vector3(+0, +1, +0)), // -Y - +.5f, -.5f, +.5f, 1.0f, 0.0f, - -.5f, -.5f, +.5f, 0.5f, 0.0f, - -.5f, -.5f, -.5f, 0.5f, 0.5f, - -.5f, -.5f, -.5f, 0.5f, 0.5f, - +.5f, -.5f, -.5f, 1.0f, 0.5f, - +.5f, -.5f, +.5f, 1.0f, 0.0f, + new Vertex(new Vector3(+.5f, -.5f, +.5f), new Vector2(1.0f, 0.0f), new Vector3(+0, -1, +0)), + new Vertex(new Vector3(-.5f, -.5f, +.5f), new Vector2(0.5f, 0.0f), new Vector3(+0, -1, +0)), + new Vertex(new Vector3(-.5f, -.5f, -.5f), new Vector2(0.5f, 0.5f), new Vector3(+0, -1, +0)), + new Vertex(new Vector3(-.5f, -.5f, -.5f), new Vector2(0.5f, 0.5f), new Vector3(+0, -1, +0)), + new Vertex(new Vector3(+.5f, -.5f, -.5f), new Vector2(1.0f, 0.5f), new Vector3(+0, -1, +0)), + new Vertex(new Vector3(+.5f, -.5f, +.5f), new Vector2(1.0f, 0.0f), new Vector3(+0, -1, +0)), // +Z - +.5f, +.5f, +.5f, 0.5f, 0.0f, - -.5f, +.5f, +.5f, 0.0f, 0.0f, - -.5f, -.5f, +.5f, 0.0f, 0.5f, - -.5f, -.5f, +.5f, 0.0f, 0.5f, - +.5f, -.5f, +.5f, 0.5f, 0.5f, - +.5f, +.5f, +.5f, 0.5f, 0.0f, + new Vertex(new Vector3(+.5f, +.5f, +.5f), new Vector2(0.5f, 0.0f), new Vector3(+0, +0, +1)), + new Vertex(new Vector3(-.5f, +.5f, +.5f), new Vector2(0.0f, 0.0f), new Vector3(+0, +0, +1)), + new Vertex(new Vector3(-.5f, -.5f, +.5f), new Vector2(0.0f, 0.5f), new Vector3(+0, +0, +1)), + new Vertex(new Vector3(-.5f, -.5f, +.5f), new Vector2(0.0f, 0.5f), new Vector3(+0, +0, +1)), + new Vertex(new Vector3(+.5f, -.5f, +.5f), new Vector2(0.5f, 0.5f), new Vector3(+0, +0, +1)), + new Vertex(new Vector3(+.5f, +.5f, +.5f), new Vector2(0.5f, 0.0f), new Vector3(+0, +0, +1)), // -Z - +.5f, +.5f, -.5f, 0.5f, 0.5f, - -.5f, +.5f, -.5f, 0.0f, 0.5f, - -.5f, -.5f, -.5f, 0.0f, 1.0f, - -.5f, -.5f, -.5f, 0.0f, 1.0f, - +.5f, -.5f, -.5f, 0.5f, 1.0f, - +.5f, +.5f, -.5f, 0.5f, 0.5f, + new Vertex(new Vector3(+.5f, +.5f, -.5f), new Vector2(0.5f, 0.5f), new Vector3(+0, +0, -1)), + new Vertex(new Vector3(-.5f, +.5f, -.5f), new Vector2(0.0f, 0.5f), new Vector3(+0, +0, -1)), + new Vertex(new Vector3(-.5f, -.5f, -.5f), new Vector2(0.0f, 1.0f), new Vector3(+0, +0, -1)), + new Vertex(new Vector3(-.5f, -.5f, -.5f), new Vector2(0.0f, 1.0f), new Vector3(+0, +0, -1)), + new Vertex(new Vector3(+.5f, -.5f, -.5f), new Vector2(0.5f, 1.0f), new Vector3(+0, +0, -1)), + new Vertex(new Vector3(+.5f, +.5f, -.5f), new Vector2(0.5f, 0.5f), new Vector3(+0, +0, -1)), + + // Plane + new Vertex(new Vector3(+.5f, +.5f, 0.0f), new Vector2(0.5f, 0.0f), new Vector3(+0, +0, +1)), + new Vertex(new Vector3(-.5f, +.5f, 0.0f), new Vector2(0.0f, 0.0f), new Vector3(+0, +0, +1)), + new Vertex(new Vector3(-.5f, -.5f, 0.0f), new Vector2(0.0f, 0.5f), new Vector3(+0, +0, +1)), + new Vertex(new Vector3(-.5f, -.5f, 0.0f), new Vector2(0.0f, 0.5f), new Vector3(+0, +0, +1)), + new Vertex(new Vector3(+.5f, -.5f, 0.0f), new Vector2(0.5f, 0.5f), new Vector3(+0, +0, +1)), + new Vertex(new Vector3(+.5f, +.5f, 0.0f), new Vector2(0.5f, 0.0f), new Vector3(+0, +0, +1)), }; + private Tile[] tiles = + { + // Cubes + new Tile(new Vector3(-2, -2, 0)), + new Tile(new Vector3(-2, -1, 0)), + new Tile(new Vector3(-2, +0, 0)), + new Tile(new Vector3(-2, +1, 0)), + new Tile(new Vector3(-2, +2, 0)), + new Tile(new Vector3(+2, -2, 0)), + new Tile(new Vector3(+2, -1, 0)), + new Tile(new Vector3(+2, +0, 0)), + new Tile(new Vector3(+2, +1, 0)), + new Tile(new Vector3(+2, +2, 0)), + new Tile(new Vector3(-1, -2, 0)), + new Tile(new Vector3(-1, +2, 0)), + new Tile(new Vector3(+0, -2, 0)), + new Tile(new Vector3(+0, +2, 0)), + new Tile(new Vector3(+1, -2, 0)), + new Tile(new Vector3(+1, +2, 0)), + // Planes + new Tile(new Vector3(+0, +0, +1)), + new Tile(new Vector3(+0, +1, +1)), + new Tile(new Vector3(+0, -1, +1)), + new Tile(new Vector3(+1, +0, +1)), + new Tile(new Vector3(-1, +0, +1)), + }; + + private VBO tileVbo; + private VBO cubeVbo; + public HexRender(int width, int height) : base(width, height) { Width = width; @@ -70,20 +133,35 @@ namespace hexworld Y = (DisplayDevice.Default.Height - Height) / 2; } + private Random rand = new Random(); + protected override void OnUpdateFrame(FrameEventArgs e) { base.OnUpdateFrame(e); view = Matrix4.LookAt(10 * Vector3.One, Vector3.Zero, Vector3.UnitZ); proj = Matrix4.CreateOrthographic(Width / 100f, Height / 100f, 0, 20); + + for (var i = 0; i < 16; i++) + { + tiles[i].Position.Z += (float) ((rand.NextDouble() - .5) * e.Time); + } + +// tileVbo.Data(tiles, BufferUsageHint.DynamicDraw); + tileVbo.Bind(); + GL.BufferSubData(BufferTarget.ArrayBuffer, (IntPtr) (0), (IntPtr) (16 * 3 * sizeof(float)), tiles); + VBO.Unbind(); } protected override void OnLoad(EventArgs e) { base.OnLoad(e); - var vbo = new VBO(); - vbo.Data(verts); + cubeVbo = new VBO(); + cubeVbo.Data(cubeVerts, BufferUsageHint.StaticDraw); + + tileVbo = new VBO(); + tileVbo.Data(tiles, BufferUsageHint.DynamicDraw); var vs = new Shader(ShaderType.VertexShader) { @@ -105,17 +183,34 @@ namespace hexworld pgm.Link(); Console.Out.WriteLine(pgm.Log); - vbo.Bind(); - GL.EnableVertexAttribArray(pgm.GetAttribute("pos")); - GL.VertexAttribPointer(pgm.GetAttribute("pos"), 3, VertexAttribPointerType.Float, false, 5 * sizeof(float), + var pos = pgm.GetAttribute("locpos"); + var crd = pgm.GetAttribute("coord"); + var nrm = pgm.GetAttribute("norm"); + var tpos = pgm.GetAttribute("glbpos"); + + GL.EnableVertexAttribArray(pos); + GL.EnableVertexAttribArray(crd); + GL.EnableVertexAttribArray(nrm); + GL.EnableVertexAttribArray(tpos); + + cubeVbo.Bind(); + + GL.VertexAttribPointer(pos, 3, VertexAttribPointerType.Float, false, 8 * sizeof(float), 0); - GL.EnableVertexAttribArray(pgm.GetAttribute("coord")); - GL.VertexAttribPointer(pgm.GetAttribute("coord"), 2, VertexAttribPointerType.Float, false, 5 * sizeof(float), + GL.VertexAttribPointer(crd, 2, VertexAttribPointerType.Float, false, 8 * sizeof(float), 3 * sizeof(float)); + GL.VertexAttribPointer(nrm, 3, VertexAttribPointerType.Float, false, 8 * sizeof(float), + 5 * sizeof(float)); + + tileVbo.Bind(); + + GL.VertexAttribPointer(tpos, 3, VertexAttribPointerType.Float, false, 0, 0); + GL.VertexAttribDivisor(tpos, 1); + VBO.Unbind(); - tex1 = Texture.FromBitmap(new Bitmap("tex.png")); - tex2 = Texture.FromBitmap(new Bitmap("tex2.png")); + grass = Texture.FromBitmap(new Bitmap("grass.png")); + stone = Texture.FromBitmap(new Bitmap("stone.png")); } protected override void OnRenderFrame(FrameEventArgs e) @@ -127,20 +222,22 @@ namespace hexworld GL.Enable(EnableCap.DepthTest); pgm.Use(); - tex1.Bind(0); - tex2.Bind(1); + + grass.Bind(0); + stone.Bind(1); GL.Uniform1(pgm.GetUniform("tex"), 0); - view = Matrix4.CreateTranslation(1,-1,0) * view; GL.UniformMatrix4(pgm.GetUniform("view"), false, ref view); GL.UniformMatrix4(pgm.GetUniform("proj"), false, ref proj); - GL.DrawArrays(PrimitiveType.Triangles, 0, 36); + GL.DrawArraysInstancedBaseInstance(PrimitiveType.Triangles, 0, 36, 16, 0); GL.Uniform1(pgm.GetUniform("tex"), 1); - view = Matrix4.CreateTranslation(-2,2,0) * view; GL.UniformMatrix4(pgm.GetUniform("view"), false, ref view); - GL.DrawArrays(PrimitiveType.Triangles, 0, 36); + GL.UniformMatrix4(pgm.GetUniform("proj"), false, ref proj); + +// GL.DrawArraysInstancedBaseInstance(PrimitiveType.Triangles, 36, 6, 5, 16); + GL.DrawArraysInstancedBaseInstance(PrimitiveType.Triangles, 0, 36, 5, 16); SwapBuffers(); } diff --git a/hexworld/grass.png b/hexworld/grass.png new file mode 100644 index 0000000000000000000000000000000000000000..fe2e4dd2ab733ace4edf8abc48020a86c1008889 GIT binary patch literal 771 zcmV+e1N{7nP)N2bZe?^J zG%heMF*7s+TY3Nh0)R4gh7-a)=ps8sDT|K9Y}W|-_p?;KL3>Q}R0>HcqbPj9Q!NX6sC{T1}# zWMYV{`>tz@5%ed1V;+>S{BhF2#?!~HbH0{lWQ6dr>pElKfB&*=VB_gyu(>cdbPm%0 z15QEgEKgJ#HhA{wfjK^Y6`Et$IbZ9|2XXXkiV#Q0=G}`H0YPxWYZjg6V_Mhe!#Fyu z6W)q?XQ@eCd?_xd*A8giSP0|(j~d}k(AM(?akX1q5QJbwg#Lf65krFV(v-CmQLy0O zUX7fbf6f=gpoZ`wz*~gymh`6kiJ;3t>auvd_>@)%LaKpBK>^YKUMDAu;PD6 zF(@S{E2S(bI!FYe9@5TT@U};)OAE^DO}+Lk!GdnS)#7WNKGf9Ty(Ar|D|QT6*tSkx zrl3*9n-!t8<`W`1nlg@xvNPykBLzuVZOjnSZ{2Z^bd&p8*Y%V{2@yh(+Yw?QijTbs zdL2v?E5So8?2+!mv%022>P^^9h=TpuNW;+@KS8dWHZTUGFb*eh2B&b&LiA7hV0;B3 zTrLrt&*tcx10m?B_#lF=-s0UBgeApn8bW(~C zqN1bI(UHM(h!8hK+pv^7f{H{65y6TS@+ZSKEJanF^t=nII_V{%LT$_KpezbC0;H23 z4`#MuDT)oIC%wFB4=;cfHN-Du8Ube>wIro8|F002ovPDHLkV1f<~ BT5kXV literal 0 HcmV?d00001 diff --git a/hexworld/hexworld.csproj b/hexworld/hexworld.csproj index 439710c..a20381a 100644 --- a/hexworld/hexworld.csproj +++ b/hexworld/hexworld.csproj @@ -74,12 +74,10 @@ - + Always - - - + Always diff --git a/hexworld/s.fs.glsl b/hexworld/s.fs.glsl index eedf250..67733e3 100644 --- a/hexworld/s.fs.glsl +++ b/hexworld/s.fs.glsl @@ -1,10 +1,12 @@ #version 440 in vec2 vcoord; +in float light; uniform sampler2D tex; void main () { - gl_FragColor = texture(tex, vcoord); + vec4 color = light * texture(tex, vcoord); + gl_FragColor = clamp(color, 0, 1); } \ No newline at end of file diff --git a/hexworld/s.vs.glsl b/hexworld/s.vs.glsl index 8c6ac6e..a3bb41c 100644 --- a/hexworld/s.vs.glsl +++ b/hexworld/s.vs.glsl @@ -1,15 +1,22 @@ #version 440 -in vec3 pos; +in vec3 locpos; +in vec3 glbpos; in vec2 coord; +in vec3 norm; out vec2 vcoord; +out float light; uniform mat4 view; uniform mat4 proj; void main () { - gl_Position = proj*view*vec4(pos, 1); + mat4 pv = proj * view; + vec3 position = glbpos + locpos; + gl_Position = pv * vec4(position, 1); vcoord = coord; + + light = dot(vec3(0, 0, 1), norm) / 2 + .5; } \ No newline at end of file diff --git a/hexworld/stone.png b/hexworld/stone.png new file mode 100644 index 0000000000000000000000000000000000000000..3d44249bdb9d73140690b2cd2dac3f958bb819ae GIT binary patch literal 596 zcmV-a0;~OrP)N2bZe?^J zG%heMF*7s+TY3Nh0ntfBK~z{r?UlVw!!QtlGa&I)(5g@pflQ3K8lbs|M^KkRB zv4n0-w;w32Lr25S1Zp8FF7HRQLU4eJ>p1K_Bv1=cad|&N3ZYCMDNJ~AITy%90N))i z#c?k%eR>xZ?vOffVQ?>yi^#>i_J~|VRtn`M3}ymdF}EEv*BO%QKjeB>$K|t<^ph9`oRT2sMZ){6GE9RQYtVP03{(q z3875x4yEDp&H$8zOs)>C0}9!D5h;TB-bBohu1lp09W*1>+U;>}S&P5h%|3JX2h4N$ z-NT0-u7-MJ$cY7wosj^=%o7Sj{tqev{#a#Tu8=x>x|kZrn3}jKTA{4`ZK2ciXEH8R znUGG3;;Q$yc&|)IE|>?Sgz&5}LcqV!Dk>9FrQ|Oujmm_mVp%XkNWL(CT`23inz$&5 i8CnN5aZwBtV%9gUA^a00004XF*Lt006O% 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 diff --git a/hexworld/tex2.png b/hexworld/tex2.png deleted file mode 100644 index 2d3ddb57e0d689caca9f92f8d45d80cc000e19cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 718 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+K$tP>S|=w^P_o1|q9iy!t)x7$D3zfgF*C13FE6!3!9>qM&(PR}Il790fyvv` z#WAEJ?(G!AyeAF<%wMJUr{6F9fBt$%!Hz^j1-?TGOr-}}FRHFwE&1bDjop3I>!p#~ zKHJBi{`&al+2svdJ7$X?yj#PyV1kbA_nfoNa;**;JMKk(p0QcLZozgNuuxNQ!?EB4 z`&q7AXUi3f9T5LArPanRVn>_UCxNUvt)}bdK4Z6I{lJ*JbwYc>L#e0}j~k8^Iy}9V zS@$5ALHypN>=TchTeCA1mj^t3n^5%DWdDtu}labJ$Ht5_CV;x_!yhd21_AtQOb_3aiB%G#mI| z=$^NY{yd@mfyjc7Cz)Px@3w4NG~wtl*m7d@_3>*c5gj#`W3^PN6$weB!vT{zzHIAZNh3 zXB`7a;EYzAr-3u-{L{E*FvZ0)v<93gTley$4`XP7`SmX;ad8K}|6bP0l+XkKw4pya