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); }
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); }
void CreateBackgroundImageMeshObject() { backgroundImageMeshObject = SceneManager.Instance.CreateMeshObject( "JigsawPuzzleGame\\BackgroundImage.mesh"); if (backgroundImageMeshObject != null) { backgroundImageSceneNode = new SceneNode(); backgroundImageSceneNode.Attach(backgroundImageMeshObject); } }
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); } }
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); } }
/// <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); }
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; }
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); } }
/// <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); } }
/// <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; }