class IMICFPS
  class Wavefront
    class Object
      attr_reader :parent, :name, :vertices, :textures, :normals, :bounding_box, :debug_color
      attr_accessor :faces

      def initialize(parent, name)
        @parent = parent
        @name = name
        @vertices = []
        @textures = []
        @normals  = []
        @faces    = []
        @bounding_box = BoundingBox.new(0,0,0, 0,0,0)
        @debug_color = Color.new(1.0,1.0,1.0)
        @x,@y,@z = 0,0,0

        # Faces array packs everything:
        #   vertex   = index[0]
        #   uv       = index[1]
        #   normal   = index[2]
        #   material = index[3]
      end

      def at_same_position?
        if @x == @parent.x
          if @x == @parent.x
            if @z == @parent.z
              true
            end
          end
        end
      end

      def flattened_vertices
        unless @vertices_list && at_same_position?
          @debug_color = @faces.first[3].diffuse
          @x,@y,@z = @parent.x,@parent.y,@parent.z

          list = []
          @faces.each do |face|
            [face[0]].each do |v|
              next unless v
              list << v.x*@parent.scale#+@parent.x
              list << v.y*@parent.scale#+@parent.y
              list << v.z*@parent.scale#+@parent.z
              list << v.weight
            end
          end

          @vertices_list_size = list.size
          @vertices_list = list.pack("f*")
        end

        return @vertices_list
      end

      def flattened_vertices_size
        @vertices_list_size
      end

      def flattened_textures
        unless @textures_list
          list = []
          @faces.each_with_index do |face, i|
            [face[1]].each do |v|
              next unless v
              list << v.x
              list << v.y
              list << v.z
            end
          end

          @textures_list_size = list.size
          @textures_list = list.pack("f*")
        end

        return @textures_list
      end

      def flattened_normals
        unless @normals_list
          list = []
          @faces.each do |face|
            [face[2]].each do |v|
              next unless v
              list << v.x
              list << v.y
              list << v.z
              # list << v.weight
            end
          end

          @normals_list_size = list.size
          @normals_list = list.pack("f*")
        end

        return @normals_list
      end

      def flattened_materials
        unless @materials_list
          list = []
          @faces.each do |face|
            # p face
            [face[3]].each do |v|
              next unless v
              # p v
              # exit
              list << v.diffuse.red
              list << v.diffuse.green
              list << v.diffuse.blue
              # list << v.alpha
            end
          end

          @materials_list_size = list.size
          @materials_list = list.pack("f*")
        end

        return @materials_list
      end
    end
  end
end
