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)); } }
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)); }
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); }