예제 #1
0
 private Color NodeColorizer(CgfDrawStyle style, bool isNodeCollidable, int v0)
 {
     if (isNodeCollidable)
     {
         var chan = v0 % 128 + 128;
         if (style == CgfDrawStyle.Brush)
         {
             return(new Color(255, chan, 0, 80));
         }
         else if (style == CgfDrawStyle.Vegetation)
         {
             return(new Color(chan, 100, 0, 100));
         }
         else if (style == CgfDrawStyle.Door)
         {
             return(new Color(0, 80, 255, 80));
         }
         else if (style == CgfDrawStyle.Door2)
         {
             return(new Color(0, 255, 80, 80));
         }
         return(new Color(128, 128, 128));
     }
     else
     {
         var chan = v0 % 256;
         if (style == CgfDrawStyle.Brush)
         {
             return(new Color(chan, 0, 0));
         }
         else if (style == CgfDrawStyle.Vegetation)
         {
             return(new Color(0, chan, 0));
         }
         else if (style == CgfDrawStyle.Door)
         {
             return(new Color(0, 0, chan));
         }
         else if (style == CgfDrawStyle.Door2)
         {
             return(new Color(chan, 0, 80));
         }
         return(new Color(128, 128, 128));
     }
 }
예제 #2
0
        private void NodeHandler(CgfLoader cgf, NodeData node, Vector3 worldPosition, Matrix transform,
                                 List <VertexPositionColor> vertices,
                                 List <VertexPositionColor> collisionVertices,
                                 List <VertexPositionColor> lineVertices,
                                 CgfDrawStyle style)
        {
            var hackackack = true;

            //Debug.WriteLine($"NODE {transform.Translation} === {node.chunkId}");
            bool isNodeCollidable = cgf.IsNodeCollidable(node);

            foreach (var vi in node.Mesh.indices)
            {
                var v0 = Vector3.Transform(node.Mesh.vertices[vi.v0], transform);
                var v1 = Vector3.Transform(node.Mesh.vertices[vi.v1], transform);
                var v2 = Vector3.Transform(node.Mesh.vertices[vi.v2], transform);

                if (hackackack && DOOR_HACK)
                {
                    m_renderData.labels.Add(new Label3D {
                        position = v0, text = node.objectId.ToString()
                    });
                    hackackack = false;
                }

                Color color = NodeColorizer(style, isNodeCollidable, vi.v0);
                var   dest  = isNodeCollidable ? collisionVertices : vertices;

                dest.Add(new VertexPositionColor(v1, color));
                dest.Add(new VertexPositionColor(v0, color));
                dest.Add(new VertexPositionColor(v2, color));
            }

            var zero = Vector3.Transform(Vector3.Zero, transform);

            lineVertices.Add(new VertexPositionColor(zero, Color.Blue));
            lineVertices.Add(new VertexPositionColor(Vector3.Transform(Vector3.UnitX, transform), Color.Blue));
            lineVertices.Add(new VertexPositionColor(zero, Color.Red));
            lineVertices.Add(new VertexPositionColor(Vector3.Transform(Vector3.UnitY, transform), Color.Red));
            lineVertices.Add(new VertexPositionColor(zero, Color.Yellow));
            lineVertices.Add(new VertexPositionColor(Vector3.Transform(Vector3.UnitZ, transform), Color.Yellow));

            lineVertices.Add(new VertexPositionColor(worldPosition, Color.Cyan));
            lineVertices.Add(new VertexPositionColor(zero, Color.Cyan));
        }
예제 #3
0
        private void DrawCgfInWorld(CgfLoader cgf, ref Matrix xform, Vector3 position, CgfDrawStyle style,
                                    List <VertexPositionColor> vertices,
                                    List <VertexPositionColor> collisionVertices,
                                    List <VertexPositionColor> lineVertices)
        {
            // Collect collidable meshes
            int collisionStart = collisionVertices.Count;

            // traverse nodes
            cgf.TraverseNodes((node, transform)
                              => NodeHandler(cgf, node, position, transform, vertices, collisionVertices, lineVertices, style),
                              ref xform);

            // Add collected vertices as a new mesh.
            m_geoSpace.AddCollidableMeshToTree(collisionVertices, collisionStart, collisionVertices.Count - collisionStart);
        }