class IMICFPS
  class Terrain
    TILE_SIZE = 0.5
    include OpenGL
    def initialize(size:, height: nil, width: nil, length: nil, heightmap: nil)
      @size = size
      @heightmap = heightmap
      @map = []

      @height  = height ? height : 1
      @width  = width ? width : @size
      @length = length ? length : @size

      @vertices = []
      @normals  = []
      @colors   = []
      generate
    end

    def generate
      #@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)
      #  end
      #end
      @width.times do |x|
        @length.times do |z|
          # 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-@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
      end

      @map.size.times do |i|
        @vertices << @map[i].x
        @vertices << @map[i].y
        @vertices << @map[i].z
        normal = Vertex.new(0,1,0)
        @normals << normal.x
        @normals << normal.y
        @normals << normal.z
        color = Color.new(0,rand(0.2..1.0),0)
        @colors << color.red
        @colors << color.green
        @colors << color.blue
      end

      @vertices_packed = @vertices.pack("f*")
      @normals_packed  = @normals.pack("f*")
      @colors_packed   = @colors.pack("f*")
    end

    def draw
      new_draw
      # old_draw
    end

    def old_draw
      glEnable(GL_COLOR_MATERIAL)

      # glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
      glPointSize(5)
      # glBegin(GL_LINES)
      # glBegin(GL_POINTS)
      glBegin(GL_TRIANGLES)
        @map.each_with_index do |vertex, index|
          glNormal3f(0,1,0)
          glColor3f(0.0, 0.5, 0) if index.even?
          glColor3f(0, 1.0, 0) if index.odd?
          glVertex3f(vertex.x, vertex.y, vertex.z)
        end
      glEnd

      glDisable(GL_COLOR_MATERIAL)
      glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
    end

    def new_draw
      glEnable(GL_NORMALIZE)
      glPushMatrix

      glEnable(GL_COLOR_MATERIAL)
      glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE)
      glShadeModel(GL_FLAT)
      glEnableClientState(GL_VERTEX_ARRAY)
      glEnableClientState(GL_NORMAL_ARRAY)
      glEnableClientState(GL_COLOR_ARRAY)

      glVertexPointer(3, GL_FLOAT, 0, @vertices_packed)
      glNormalPointer(GL_FLOAT, 0, @normals_packed)
      glColorPointer(3, GL_FLOAT, 0, @colors_packed)

      glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
      glDrawArrays(GL_TRIANGLES, 0, @vertices.size/3)
      glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)

      # glDrawArrays(GL_TRIANGLE_STRIP, 0, @vertices.size/3)
      $window.number_of_faces+=@vertices.size/3

      glDisableClientState(GL_VERTEX_ARRAY)
      glDisableClientState(GL_NORMAL_ARRAY)
      glDisableClientState(GL_COLOR_ARRAY)

      glPopMatrix
    end
  end
end
