예제 #1
0
        public void GenerateVisualAIMesh()
        {
            if (aimesh != null)
            {
                int index = 0;
                foreach (var vertexData in aimesh.AIMeshVertexData)
                {
                    AIMeshVertex visualVertex = new AIMeshVertex();
                    visualVertex.Position = vertexData;
                    Entity    visualAIMeshVertexEnt       = scm.CreateEntity("AIMESH_VERTEX_ENT_" + index, "marker_vertex.mesh");
                    SceneNode visualAIMeshVertexSceneNode = scm.RootSceneNode.CreateChildSceneNode("AIMESH_VERTEX_SCENENODE_" + index);
                    visualAIMeshVertexSceneNode.AttachObject(visualAIMeshVertexEnt);
                    visualAIMeshVertexSceneNode.Position = vertexData;
                    visualAIMeshVertexEnt.QueryFlags     = 1 << 0;
                    visualAIMeshVertexEnt.Visible        = true;
                    visualVertex.Mesh = visualAIMeshVertexEnt;
                    index++;
                }
                index = 0;
                foreach (var indexData in aimesh.AIMeshIndicsData)
                {
                    int lastVertexNumber = -1;
                    foreach (int vertexNumber in indexData.VertexNumber)
                    {
                        if (lastVertexNumber != -1)
                        {
                            Vector3 startVertexData = aimesh.AIMeshVertexData.ElementAt(lastVertexNumber - 1);
                            Vector3 endVertexData   = aimesh.AIMeshVertexData.ElementAt(vertexNumber - 1);
                            Vector3 startToEndVect  = new Vector3(
                                endVertexData.x - startVertexData.x,
                                endVertexData.y - startVertexData.y,
                                endVertexData.z - startVertexData.z
                                );
                            Vector3 centralVertexData = new Vector3(
                                (startVertexData.x - endVertexData.x) / 2,
                                (startVertexData.y - endVertexData.y) / 2,
                                (startVertexData.z - endVertexData.z) / 2
                                );

                            AIMeshEdge visualEdge = new AIMeshEdge();
                            visualEdge.Position = centralVertexData;
                            Entity visualAIMeshLineEnt = map.CreateEntityWithMaterial(
                                "AIMESH_LINE_ENT_" + Guid.NewGuid().ToString(),
                                "marker_line.mesh",
                                "marker_line"
                                );
                            SceneNode visualAIMeshLineSceneNode = scm.RootSceneNode.CreateChildSceneNode("AIMESH_LINE_SCENENODE_" + index);
                            visualAIMeshLineSceneNode.AttachObject(visualAIMeshLineEnt);
                            visualAIMeshLineSceneNode.Position = centralVertexData;
                            Radian angle = Mogre.Math.ACos(startToEndVect.DotProduct(Vector3.UNIT_Z) / startToEndVect.Normalise());
                            visualAIMeshLineSceneNode.Rotate(Vector3.UNIT_Y, angle);
                            visualEdge.Mesh = visualAIMeshLineEnt;
                        }
                        lastVertexNumber = vertexNumber;
                        index++;
                    }
                }
            }
        }
예제 #2
0
        public Entity AddNewAIMeshLine(Vector3 newLinePos)
        {
            AIMeshEdge newEdge = new AIMeshEdge();

            newEdge.Position = newLinePos;
            aimesh.AIMeshEdges.Add(newEdge);
            Entity    visualAIMeshLineEnt       = scm.CreateEntity("AIMESH_LINE_ENT_" + aimesh.AIMeshEdges.Count, "marker_line.mesh");
            SceneNode visualAIMeshLineSceneNode = scm.RootSceneNode.CreateChildSceneNode("AIMESH_LINE_SCENENODE_" + aimesh.AIMeshEdges.Count);

            visualAIMeshLineSceneNode.AttachObject(visualAIMeshLineEnt);
            visualAIMeshLineSceneNode.Position = newLinePos;
            visualAIMeshLineEnt.QueryFlags     = 1 << 0;
            newEdge.Mesh = visualAIMeshLineEnt;
            return(visualAIMeshLineEnt);
        }