Exemple #1
0
        public override void LoadContent(IServiceProvider services)
        {
            base.LoadContent(services);
            var content = (ContentManager)services.GetService(typeof(ContentManager));

            var texture = content.Load <Texture2D>(@"Sprites\SpaceShip");
            var sprite  = new StaticSprite(new Vector2(2.0f, 6.0f), texture, Name + "_Sprite", new Rectangle(0, 0, 128, 386));

            SceneNode.Attach(sprite);
        }
Exemple #2
0
        public override void LoadContent(IServiceProvider services)
        {
            base.LoadContent(services);
            var content = (ContentManager)services.GetService(typeof(ContentManager));

            var texture = content.Load <Texture2D>(@"Sprites\Chain");
            var sprite  = new StaticSprite(new Vector2(1.0f), texture, Name + "_Sprite");

            SceneNode.Attach(sprite);
        }
Exemple #3
0
        void CreateBackgroundImageMeshObject()
        {
            backgroundImageMeshObject = SceneManager.Instance.CreateMeshObject(
                "JigsawPuzzleGame\\BackgroundImage.mesh");

            if (backgroundImageMeshObject != null)
            {
                backgroundImageSceneNode = new SceneNode();
                backgroundImageSceneNode.Attach(backgroundImageMeshObject);
            }
        }
Exemple #4
0
            private void CreateMeshObject()
            {
                meshObject = SceneManager.Instance.CreateMeshObject("Base\\Simple Models\\Box.mesh");
                if (meshObject != null)
                {
                    meshObject.SetMaterialNameForAllSubObjects("Red");

                    sceneNode = new SceneNode();
                    //sceneNode.Position = new Vec3( 0, 0, 1 );
                    sceneNode.Attach(meshObject);
                }
            }
Exemple #5
0
        void CreateMeshObject()
        {
            DestroyMeshObject();

            meshObject = SceneManager.Instance.CreateMeshObject("Base\\Simple Models\\Cylinder.mesh");
            if (meshObject != null)
            {
                meshObject.SetMaterialNameForAllSubObjects("Red");

                sceneNode          = new SceneNode();
                sceneNode.Visible  = false;
                sceneNode.Position = new Vec3(5, 0, 0);
                sceneNode.Rotation = new Angles(50, 50, 50).ToQuat();
                sceneNode.Attach(meshObject);
            }
        }
Exemple #6
0
 /// <summary>
 /// Inserts the child node.
 /// </summary>
 /// <param name="index">The index.</param>
 /// <param name="node">The node.</param>
 /// <returns></returns>
 public bool InsertChildNode(int index, SceneNode node)
 {
     if (node == null || node.IsAttached || itemHashSet.ContainsKey(node.GUID))
     {
         return(false);
     }
     itemHashSet.Add(node.GUID, node);
     ItemsInternal.Insert(index, node);
     node.Parent = this;
     if (IsAttached)
     {
         node.Attach(EffectsManager);
         InvalidateSceneGraph();
     }
     ChildNodeAdded?.Invoke(this, new OnChildNodeChangedArgs(node, Operation.Add));
     return(true);
 }
Exemple #7
0
        void CreateScene()
        {
            DestroyScene();

            //create light
            var light = SceneManager.Instance.CreateLight();

            light.Type      = RenderLightType.Directional;
            light.Direction = new Vec3(0, 0, -1);
            lights.Add(light);

            //create meshes

            string[] colorNames   = new string[] { "Red", "Blue", "Yellow", "Green" };
            int      colorCounter = 0;

            for (float z = -5; z <= 5; z++)
            {
                for (float y = -5; y <= 5; y++)
                {
                    for (float x = -5; x <= 5; x++)
                    {
                        MeshObject meshObject = SceneManager.Instance.CreateMeshObject("Base\\Simple Models\\Cylinder.mesh");
                        if (meshObject != null)
                        {
                            meshObject.SetMaterialNameForAllSubObjects(colorNames[colorCounter % colorNames.Length]);
                            colorCounter++;

                            SceneNode sceneNode = new SceneNode();
                            sceneNode.Position = new Vec3(x * 2, y * 2, z * 2);
                            sceneNode.Rotation = new Angles(0, 0, 0).ToQuat();
                            sceneNode.Scale    = new Vec3(1, 1, 1);
                            sceneNode.Attach(meshObject);

                            sceneNodes.Add(sceneNode);
                        }
                    }
                }
            }

            //Hide by default. Show during drawing time.
            SetObjectsVisible(false);

            sceneCreated = true;
        }
Exemple #8
0
 public bool AddChildNode(SceneNode node)
 {
     if (!itemHashSet.ContainsKey(node.GUID))
     {
         itemHashSet.Add(node.GUID, node);
         Items.Add(node);
         if (IsAttached)
         {
             node.Attach(RenderHost);
         }
         forceUpdateTransform = true;
         OnAddChildNode?.Invoke(this, new OnChildNodeChangedArgs(node, Operation.Add));
         return(true);
     }
     else
     {
         return(false);
     }
 }
 public bool AddChildNode(SceneNode node)
 {
     if (!itemHashSet.ContainsKey(node.GUID))
     {
         itemHashSet.Add(node.GUID, node);
         Items.Add(node);
         if (node.Parent != NullSceneNode.NullNode && node.Parent != this)
         {
             throw new ArgumentException("SceneNode already attach to a different node");
         }
         node.Parent = this;
         if (IsAttached)
         {
             node.Attach(RenderHost);
         }
         OnAddChildNode?.Invoke(this, new OnChildNodeChangedArgs(node, Operation.Add));
         return(true);
     }
     else
     {
         return(false);
     }
 }
Exemple #10
0
 /// <summary>
 /// Adds the child node.
 /// </summary>
 /// <param name="node">The node.</param>
 /// <returns></returns>
 /// <exception cref="System.ArgumentException">SceneNode already attach to a different node</exception>
 public bool AddChildNode(SceneNode node)
 {
     if (node != null && !itemHashSet.ContainsKey(node.GUID))
     {
         itemHashSet.Add(node.GUID, node);
         ItemsInternal.Add(node);
         if (node.Parent != NullSceneNode.NullNode && node.Parent != this)
         {
             throw new ArgumentException("SceneNode already attach to a different node");
         }
         node.Parent = this;
         if (IsAttached)
         {
             node.Attach(EffectsManager);
             InvalidateSceneGraph();
         }
         ChildNodeAdded?.Invoke(this, new OnChildNodeChangedArgs(node, Operation.Add));
         return(true);
     }
     else
     {
         return(false);
     }
 }
Exemple #11
0
        /// <summary>
        /// Creates the element in the world. It automatically
        /// sets up the mesh and the node.</summary>
        protected virtual void Initialise(RenderQueueGroupID renderGroup, string meshName, Vec3 scale, Vec3 rotation)
        {
            // Creates the mesh in the world
            mMesh = SceneManager.Instance.CreateMeshObject(meshName);
            mMesh.CastShadows = false;
            mMesh.RenderQueueGroup = renderGroup;

            // Attaches the mesh on a node
            if (mMesh.ParentSceneNode == null)
            {
                mNode = new SceneNode();
                mNode.Attach(mMesh);
            }
            else
                mNode = mMesh.ParentSceneNode;

            // Sets up the node (Position, Scale and Rotation)
            mNode.Position = Vec3.Zero;
            mNode.Scale = scale;
            mNode.Rotation *= CaelumUtils.GenerateQuat(CaelumUtils.XAxis, new Degree(rotation.X));
            mNode.Rotation *= CaelumUtils.GenerateQuat(CaelumUtils.YAxis, new Degree(rotation.Y));
            mNode.Rotation *= CaelumUtils.GenerateQuat(CaelumUtils.ZAxis, new Degree(rotation.Z));
        }
        private unsafe void UpdateGeometry()
        {
            DestroyGeometry();

            Curve positionCurve = GetPositionCurve();

            Curve radiusCurve = null;

            {
                bool existsSpecialRadius = false;
                foreach (MapCurvePoint point in Points)
                {
                    RenderableCurvePoint point2 = point as RenderableCurvePoint;
                    if (point2 != null && point2.OverrideRadius >= 0)
                    {
                        existsSpecialRadius = true;
                        break;
                    }
                }

                if (existsSpecialRadius)
                {
                    switch (radiusCurveType)
                    {
                    case RadiusCurveTypes.UniformCubicSpline:
                        radiusCurve = new UniformCubicSpline();
                        break;

                    case RadiusCurveTypes.Bezier:
                        radiusCurve = new BezierCurve();
                        break;

                    case RadiusCurveTypes.Line:
                        radiusCurve = new LineCurve();
                        break;
                    }

                    for (int n = 0; n < Points.Count; n++)
                    {
                        MapCurvePoint point = Points[n];

                        if (!point.Editor_IsExcludedFromWorld())
                        {
                            float rad = radius;
                            RenderableCurvePoint renderableCurvePoint = point as RenderableCurvePoint;
                            if (renderableCurvePoint != null && renderableCurvePoint.OverrideRadius >= 0)
                            {
                                rad = renderableCurvePoint.OverrideRadius;
                            }
                            radiusCurve.AddValue(point.Time, new Vec3(rad, 0, 0));
                        }
                    }
                }
            }

            //create mesh
            Vertex[] vertices = null;
            int[]    indices  = null;
            if (positionCurve != null && positionCurve.Values.Count > 1 && Points.Count >= 2)
            {
                Vec3 positionOffset = -Position;

                int steps       = (Points.Count - 1) * pathSteps + 1;
                int vertexCount = steps * (shapeSegments + 1);
                int indexCount  = (steps - 1) * shapeSegments * 2 * 3;

                vertices = new Vertex[vertexCount];
                indices  = new int[indexCount];

                //fill data
                {
                    int   currentVertex   = 0;
                    int   currentIndex    = 0;
                    float currentDistance = 0;
                    Vec3  lastPosition    = Vec3.Zero;
                    Quat  lastRot         = Quat.Identity;

                    for (int nStep = 0; nStep < steps; nStep++)
                    {
                        int startStepVertexIndex = currentVertex;

                        float coefficient = (float)nStep / (float)(steps - 1);
                        Vec3  pos         = CalculateCurvePointByCoefficient(coefficient) + positionOffset;

                        Quat rot;
                        {
                            Vec3 v = CalculateCurvePointByCoefficient(coefficient + .3f / (float)(steps - 1)) -
                                     CalculateCurvePointByCoefficient(coefficient);
                            if (v != Vec3.Zero)
                            {
                                rot = Quat.FromDirectionZAxisUp(v.GetNormalize());
                            }
                            else
                            {
                                rot = lastRot;
                            }
                        }

                        if (nStep != 0)
                        {
                            currentDistance += (pos - lastPosition).Length();
                        }

                        float rad;
                        if (radiusCurve != null)
                        {
                            Range range = new Range(radiusCurve.Times[0], radiusCurve.Times[radiusCurve.Times.Count - 1]);
                            float t     = range.Minimum + (range.Maximum - range.Minimum) * coefficient;
                            rad = radiusCurve.CalculateValueByTime(t).X;
                        }
                        else
                        {
                            rad = radius;
                        }

                        for (int nSegment = 0; nSegment < shapeSegments + 1; nSegment++)
                        {
                            float rotateCoefficient = ((float)nSegment / (float)(shapeSegments));
                            float angle             = rotateCoefficient * MathFunctions.PI * 2;
                            Vec3  p = pos + rot * new Vec3(0, MathFunctions.Cos(angle) * rad, MathFunctions.Sin(angle) * rad);

                            Vertex vertex = new Vertex();
                            vertex.position = p;
                            Vec3 pp = p - pos;
                            if (pp != Vec3.Zero)
                            {
                                vertex.normal = pp.GetNormalize();
                            }
                            else
                            {
                                vertex.normal = Vec3.XAxis;
                            }
                            //vertex.normal = ( p - pos ).GetNormalize();
                            vertex.texCoord           = new Vec2(currentDistance * textureCoordinatesTilesPerMeter, rotateCoefficient + .25f);
                            vertex.tangent            = new Vec4(rot.GetForward(), 1);
                            vertices[currentVertex++] = vertex;
                        }

                        if (nStep < steps - 1)
                        {
                            for (int nSegment = 0; nSegment < shapeSegments; nSegment++)
                            {
                                indices[currentIndex++] = startStepVertexIndex + nSegment;
                                indices[currentIndex++] = startStepVertexIndex + nSegment + 1;
                                indices[currentIndex++] = startStepVertexIndex + nSegment + 1 + shapeSegments + 1;
                                indices[currentIndex++] = startStepVertexIndex + nSegment + 1 + shapeSegments + 1;
                                indices[currentIndex++] = startStepVertexIndex + nSegment + shapeSegments + 1;
                                indices[currentIndex++] = startStepVertexIndex + nSegment;
                            }
                        }

                        lastPosition = pos;
                        lastRot      = rot;
                    }
                    if (currentVertex != vertexCount)
                    {
                        Log.Fatal("RenderableCurve: UpdateRenderingGeometry: currentVertex != vertexCount.");
                    }
                    if (currentIndex != indexCount)
                    {
                        Log.Fatal("RenderableCurve: UpdateRenderingGeometry: currentIndex != indexCount.");
                    }
                }

                if (vertices.Length != 0 && indices.Length != 0)
                {
                    //create mesh
                    string meshName = MeshManager.Instance.GetUniqueName(
                        string.Format("__RenderableCurve_{0}_{1}", Name, uniqueMeshIdentifier));
                    uniqueMeshIdentifier++;
                    //string meshName = MeshManager.Instance.GetUniqueName( string.Format( "__RenderableCurve_{0}", Name ) );
                    mesh = MeshManager.Instance.CreateManual(meshName);
                    SubMesh subMesh = mesh.CreateSubMesh();
                    subMesh.UseSharedVertices = false;

                    //init vertexData
                    VertexDeclaration declaration = subMesh.VertexData.VertexDeclaration;
                    declaration.AddElement(0, 0, VertexElementType.Float3, VertexElementSemantic.Position);
                    declaration.AddElement(0, 12, VertexElementType.Float3, VertexElementSemantic.Normal);
                    declaration.AddElement(0, 24, VertexElementType.Float2, VertexElementSemantic.TextureCoordinates, 0);
                    declaration.AddElement(0, 32, VertexElementType.Float4, VertexElementSemantic.Tangent, 0);

                    fixed(Vertex *pVertices = vertices)
                    {
                        subMesh.VertexData = VertexData.CreateFromArray(declaration, (IntPtr)pVertices,
                                                                        vertices.Length * Marshal.SizeOf(typeof(Vertex)));
                    }

                    subMesh.IndexData = IndexData.CreateFromArray(indices, 0, indices.Length, false);

                    //set material
                    subMesh.MaterialName = materialName;

                    //set mesh gabarites
                    Bounds bounds = Bounds.Cleared;
                    foreach (Vertex vertex in vertices)
                    {
                        bounds.Add(vertex.position);
                    }
                    mesh.SetBoundsAndRadius(bounds, bounds.GetRadius());
                }
            }

            //create MeshObject, SceneNode
            if (mesh != null)
            {
                meshObject = SceneManager.Instance.CreateMeshObject(mesh.Name);
                if (meshObject != null)
                {
                    meshObject.SetMaterialNameForAllSubObjects(materialName);
                    meshObject.CastShadows = true;

                    sceneNode = new SceneNode();
                    sceneNode.Attach(meshObject);
                    //apply offset
                    sceneNode.Position = Position;
                    MapObject.AssociateSceneNodeWithMapObject(sceneNode, this);
                }
            }

            //create collision body
            if (mesh != null && collision)
            {
                Vec3[] positions = new Vec3[vertices.Length];
                for (int n = 0; n < vertices.Length; n++)
                {
                    positions[n] = vertices[n].position;
                }
                string meshPhysicsMeshName = PhysicsWorld.Instance.AddCustomMeshGeometry(positions, indices, null,
                                                                                         MeshShape.MeshTypes.TriangleMesh, 0, 0);

                collisionBody                   = PhysicsWorld.Instance.CreateBody();
                collisionBody.Static            = true;
                collisionBody._InternalUserData = this;
                collisionBody.Position          = Position;

                MeshShape shape = collisionBody.CreateMeshShape();
                shape.MeshName     = meshPhysicsMeshName;
                shape.MaterialName = CollisionMaterialName;
                shape.ContactGroup = (int)ContactGroup.Collision;
                //shape.VehicleDrivableSurface = collisionVehicleDrivableSurface;

                collisionBody.PushedToWorld = true;
            }

            needUpdate = false;
        }