예제 #1
0
        public void Process()
        {
            Indexing = BeginMode.Triangles;
            foreach (GeometricObject geometricObj in _identity)
            {
                SetPolygonMode(geometricObj.Mode);
            }
            if (_polygonMode == GeometricObject.PolygonMode.Quadratic)
            {
                Indexing = BeginMode.Quads;
            }

            Vector polygonNormal = null;

            foreach (GeometricObject geometricObj in _identity)
            {
                foreach (Polygon polygon in geometricObj.Polygons)
                {
                    if (_normalPackage == null)
                    {
                        polygonNormal = polygon.GetNormalVec();
                    }
                    foreach (Coordinate coord in polygon.EdgeCoords)
                    {
                        int vertexIndex = _vertices.FindIndex(vertex => vertex.Coord.Equals(coord));
                        if (vertexIndex != -1 && _normalPackage == null)
                        {
                            _vertices[vertexIndex].IntegrateNormalVec(polygonNormal);
                        }
                        else
                        {
                            Vertex insert;
                            Color4 color  = ColorPackage.DefaultColor;
                            Vector normal = polygonNormal;
                            if (_colorPackage != null)
                            {
                                color = _colorPackage.ColorMap[coord];
                            }
                            if (_normalPackage != null)
                            {
                                normal = _normalPackage.NormalMap[coord];
                            }
                            insert = new Vertex(coord, color, normal, Vertex.DefaultJointIndex, Vertex.DefaultJointCoeff);
                            _vertices.Add(insert);
                            vertexIndex = _vertices.Count - 1;
                        }
                        Indices.Add((uint)vertexIndex);
                    }
                }
            }
            foreach (Vertex vertex in _vertices)
            {
                Vertices.Add(vertex.GetVertexData());
            }
            BufferData();
            _vertices.Clear();
            _polygonMode = GeometricObject.PolygonMode.Invalid;
        }
예제 #2
0
 public RenderableIdentity(List <GeometricObject> identity, ColorPackage colorPackage = null, NormalPackage normalPackage = null)
 {
     this._identity        = identity;
     this._colorPackage    = colorPackage;
     this._normalPackage   = normalPackage;
     this._jointTransforms = new Dictionary <ObjectModel.ComponentKey, JointTransform>();
     this._vertices        = new List <Vertex>();
     this._polygonMode     = GeometricObject.PolygonMode.Invalid;
 }
예제 #3
0
 private void SetPolygonMode(GeometricObject.PolygonMode mode)
 {
     if (PolygonMode == GeometricObject.PolygonMode.Invalid)
     {
         PolygonMode = mode;
     }
     else if (PolygonMode != mode)
     {
         throw new InvalidSingularObjectModelConstructionException();
     }
 }
예제 #4
0
 private void SetPolygonMode(GeometricObject.PolygonMode mode)
 {
     if (_polygonMode == GeometricObject.PolygonMode.Invalid)
     {
         if (mode == GeometricObject.PolygonMode.Triangular || mode == GeometricObject.PolygonMode.Quadratic)
         {
             _polygonMode = mode;
         }
         else
         {
             throw new InvalidRenderableIdentityException();
         }
     }
     else if (_polygonMode != mode)
     {
         throw new InvalidRenderableIdentityException();
     }
 }
예제 #5
0
 public void InsertIndex(int insert)
 {
     _indices.Add(insert);
     if (_indices.Count < Polygon.MinEdgeNumber)
     {
         _mode = GeometricObject.PolygonMode.Invalid;
     }
     if (_indices.Count == Triangle.EdgeNumber)
     {
         _mode = GeometricObject.PolygonMode.Triangular;
     }
     else if (_indices.Count == Quadrangle.EdgeNumber)
     {
         _mode = GeometricObject.PolygonMode.Quadratic;
     }
     else
     {
         _mode = GeometricObject.PolygonMode.Polygonal;
     }
 }
예제 #6
0
 public void FlushGeometricObjs()
 {
     GeometricObjs.Clear();
     PolygonMode = GeometricObject.PolygonMode.Invalid;
 }
예제 #7
0
 public SingularObjectModel()
 {
     this.GeometricObjs = new List <GeometricObject>();
     this.PolygonMode   = GeometricObject.PolygonMode.Invalid;
 }