From dfc6a0cfe88f6e401d21ac6c8a6268c4432dd431 Mon Sep 17 00:00:00 2001 From: Cyberarm Date: Thu, 22 Mar 2018 22:27:56 -0500 Subject: [PATCH] Got basic terrain generation working in immediate mode, all list is bugged atm. --- lib/objects/terrain.rb | 97 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 85 insertions(+), 12 deletions(-) diff --git a/lib/objects/terrain.rb b/lib/objects/terrain.rb index 31aeb86..9415a61 100644 --- a/lib/objects/terrain.rb +++ b/lib/objects/terrain.rb @@ -2,28 +2,101 @@ class IMICFPS class Terrain include OpenGL def initialize(size:, heightmap: nil) - @size = size.to_f + @size = size @heightmap = heightmap + @map = [] + + @vertices = [] + @normals = [] + @colors = [] + generate + end + + def generate + # x + @size.times do |x| + height = 0 + # row = [] + @size.times do |z| + @map << Vertex.new(x, height, z) + @map << Vertex.new(x, height, z-1) + @map << Vertex.new(x+1, height, z-1) + + @map << Vertex.new(x, height, z) + @map << Vertex.new(x+1, height, z) + @map << Vertex.new(x+1, height, z-1) + # height +=0.5 + end + + # @map << row + end + + @map.size do |i| + @vertices << @map[i].x + @vertices << @map[i].y + @vertices << @map[i].z + @vertices << 1.0 + normal = Vertex.new(0,1,0) + @normals << normal.x + @normals << normal.y + @normals << normal.z + color = Vertex.new(0,rand(0.2..1.0),0) + @colors << color.red + @colors << color.green + @colors << color.blue + end + @vertices = @vertices.pack("f*") + @normals = @normals.pack("f*") + @colors = @colors.pack("f*") end def draw + new_draw + old_draw + end + + def old_draw height = 0 glEnable(GL_COLOR_MATERIAL) - glBegin(GL_TRIANGLES) - glNormal3f(0,1,0) - glColor3f(1, 0.5, 0.0) - glVertex3f(-@size/2,height,-@size/2) - glVertex3f(-@size/2,height,@size/2) - glVertex3f(@size/2,height,@size/2) + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) - glColor3f(0, 0.5, 0.0) - glVertex3f(@size/2,height,@size/2) - glVertex3f(@size/2,height,-@size/2) - glVertex3f(-@size/2,height,-@size/2) - glEnd + glBegin(GL_TRIANGLES) + @map.each do |vertex| + glNormal3f(0,1,0) + glColor3f(0.0, 0.5, 0) + glVertex3f(vertex.x, vertex.y, vertex.z) + end + glEnd glDisable(GL_COLOR_MATERIAL) + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL) + end + + def new_draw + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) + glEnable(GL_NORMALIZE) + glPushMatrix + + glEnable(GL_COLOR_MATERIAL) + glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE) + glShadeModel(GL_SMOOTH) + glEnableClientState(GL_VERTEX_ARRAY) + glEnableClientState(GL_NORMAL_ARRAY) + glEnableClientState(GL_COLOR_ARRAY) + + glVertexPointer(4, GL_FLOAT, 0, @vertices) + glNormalPointer(GL_FLOAT, 0, @normals) + glColorPointer(3, GL_FLOAT, 0, @colors) + + glDrawArrays(GL_TRIANGLES, 0, @map.size/4) + + glDisableClientState(GL_VERTEX_ARRAY) + glDisableClientState(GL_NORMAL_ARRAY) + glDisableClientState(GL_COLOR_ARRAY) + + glPopMatrix + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL) end end end