From 05a77a0f11fbcac3d6a60737eb12c171ab751128 Mon Sep 17 00:00:00 2001 From: Cyberarm Date: Sat, 31 Mar 2018 21:22:11 -0500 Subject: [PATCH] Fixed nameplate oddly cutting off terrain, got a grid for terrain, first/third person toggle. --- lib/objects/camera.rb | 8 ++++++ lib/objects/player.rb | 8 +++--- lib/objects/skydome.rb | 6 +++++ lib/objects/terrain.rb | 60 +++++++++++++++++++++--------------------- lib/window.rb | 7 ++--- objects/skydome.mtl | 2 +- 6 files changed, 54 insertions(+), 37 deletions(-) diff --git a/lib/objects/camera.rb b/lib/objects/camera.rb index 7850133..63de877 100644 --- a/lib/objects/camera.rb +++ b/lib/objects/camera.rb @@ -46,6 +46,14 @@ class IMICFPS end def position_camera + if defined?(@game_object.first_person_view) + if @game_object.first_person_view + @distance = 0 + else + @distance = 5 + end + end + x_offset = horizontal_distance_from_object * Math.sin(@game_object.y_rotation.degrees_to_radians) z_offset = horizontal_distance_from_object * Math.cos(@game_object.y_rotation.degrees_to_radians) # p @game_object.x, @game_object.z;exit diff --git a/lib/objects/player.rb b/lib/objects/player.rb index 5bc1e4e..25e90a1 100644 --- a/lib/objects/player.rb +++ b/lib/objects/player.rb @@ -2,7 +2,7 @@ class IMICFPS class Player < GameObject attr_accessor :speed - attr_reader :name, :bound_model + attr_reader :name, :bound_model, :first_person_view def setup bind_model(ModelLoader.new(type: :obj, file_path: "objects/biped.obj", game_object: self)) @@ -76,8 +76,10 @@ class IMICFPS end def draw - draw_nameplate - super + if !@first_person_view + draw_nameplate + super + end end def update diff --git a/lib/objects/skydome.rb b/lib/objects/skydome.rb index 9775c35..1582215 100644 --- a/lib/objects/skydome.rb +++ b/lib/objects/skydome.rb @@ -3,5 +3,11 @@ class IMICFPS def setup bind_model(ModelLoader.new(type: :obj, file_path: "objects/skydome.obj", game_object: self)) end + + def draw + glDisable(GL_LIGHTING) + super + glEnable(GL_LIGHTING) + end end end diff --git a/lib/objects/terrain.rb b/lib/objects/terrain.rb index 2b8bcb2..4f15c2f 100644 --- a/lib/objects/terrain.rb +++ b/lib/objects/terrain.rb @@ -1,8 +1,9 @@ class IMICFPS class Terrain + TILE_SIZE = 0.5 include OpenGL def initialize(size:, height: nil, width: nil, length: nil, heightmap: nil) - @size = 3#size + @size = size @heightmap = heightmap @map = [] @@ -17,49 +18,45 @@ class IMICFPS end def generate - # x - row = [] @width.times do |x| @length.times do |z| + # TRIANGLE STRIP (BROKEN) + # @map << Vertex.new((x+1)-@width.to_f/2, 0, z-@legth.to_f/2) + # @map << Vertex.new(x-@width.to_f/2, 0, (z+1)-@length.to_f/2) + + # WORKING TRIANGLES @map << Vertex.new(x-@width.to_f/2, @height, z-@length.to_f/2) - @map << Vertex.new(x+1-@width.to_f/2, @height, z-@length.to_f/2) - @map << Vertex.new(x-@width.to_f/2, @height, z+1-@length.to_f/2) + @map << Vertex.new((x+1)-@width.to_f/2, @height, z-@length.to_f/2) + @map << Vertex.new(x-@width.to_f/2, @height, (z+1)-@length.to_f/2) - # @map << Vertex.new(x+1, height, z) - # @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 + @map << Vertex.new(x-@width.to_f/2, @height, (z+1)-@length.to_f/2) + @map << Vertex.new((x+1)-@width.to_f/2, @height, z-@length.to_f/2) + @map << Vertex.new((x+1)-@width.to_f/2, @height, (z+1)-@length.to_f/2) end - - - # @map << row end - @map.size do |i| + @map.size.times 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) + color = Color.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*") + + @vertices_packed = @vertices.pack("f*") + @normals_packed = @normals.pack("f*") + @colors_packed = @colors.pack("f*") end def draw - # new_draw - old_draw + new_draw + # old_draw end def old_draw @@ -83,29 +80,32 @@ class IMICFPS 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) + glShadeModel(GL_FLAT) 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) + glVertexPointer(3, GL_FLOAT, 0, @vertices_packed) + glNormalPointer(GL_FLOAT, 0, @normals_packed) + glColorPointer(3, GL_FLOAT, 0, @colors_packed) - glDrawArrays(GL_TRIANGLE_STRIP, 0, @map.size/4) + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) + # glDrawArrays(GL_TRIANGLE_STRIP, 0, @vertices.size/3) + glDrawArrays(GL_TRIANGLES, 0, @vertices.size/3) + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL) + # glDrawArrays(GL_TRIANGLE_STRIP, 0, @vertices.size/3) + glDrawArrays(GL_TRIANGLES, 0, @vertices.size/3) glDisableClientState(GL_VERTEX_ARRAY) glDisableClientState(GL_NORMAL_ARRAY) glDisableClientState(GL_COLOR_ARRAY) glPopMatrix - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL) end end end diff --git a/lib/window.rb b/lib/window.rb index ae17e77..e85d31c 100644 --- a/lib/window.rb +++ b/lib/window.rb @@ -19,7 +19,7 @@ class IMICFPS @delta_time = Gosu.milliseconds @number_of_faces = 0 @draw_skydome = true - @skydome = Skydome.new(scale: 0.02, backface_culling: false, auto_manage: false) + @skydome = Skydome.new(scale: 0.08, backface_culling: false, auto_manage: false) Tree.new(x: 1, y: 0, z: -5) Tree.new(x: 5, y: 0, z: 5) Tree.new(x: -5, y: 0, z: 1) @@ -27,7 +27,7 @@ class IMICFPS # Model.new(type: :obj, file_path: "objects/tree.obj", z: -5) # Model.new(type: :obj, file_path: "objects/tree.obj", x: -2, z: -6) # Model.new(type: :obj, file_path: "objects/sponza.obj", scale: 1, y: -0.2) - @terrain = Terrain.new(size: 20, height: 0) + @terrain = Terrain.new(size: 40, height: 0) @player = Player.new(x: 1, y: 0, z: -1) @camera = Camera.new(x: 0, y: -2, z: 1) @@ -58,14 +58,15 @@ class IMICFPS LightManager.lights.each do |light| light.draw end + @camera.draw @skydome.draw if @skydome.renderable glEnable(GL_DEPTH_TEST) + @terrain.draw if @terrain ObjectManager.objects.each do |object| object.draw if object.visible && object.renderable end - @terrain.draw if @terrain end # Draw crosshair diff --git a/objects/skydome.mtl b/objects/skydome.mtl index 76ce825..6848c3a 100644 --- a/objects/skydome.mtl +++ b/objects/skydome.mtl @@ -10,4 +10,4 @@ Ke 0.000000 0.000000 0.000000 Ni 1.000000 d 1.000000 illum 2 -map_Kd objects/skydome.png +map_Kd objects/skydome_next.png