public static UnifiedObject InstantiateObject(Node parent, UnifiedObject templateObject, Vector3 position, Transform baseTransformation, Transform auxTransformation, bool accurateObjectDisposal, double startingDistance, double endingDistance, double blockLength, double trackPosition) { StaticObject instantiatedObject = (StaticObject)templateObject.Clone(); MeshInstance instantiatedMesh = instantiatedObject.ObjectMeshInstance; Transform finalTrans = baseTransformation * auxTransformation; instantiatedMesh.GlobalTransform = new Transform(finalTrans.basis, Vector3.Zero); parent.AddChild(instantiatedMesh); instantiatedMesh.GlobalTranslate(position); return(instantiatedObject); // UnifiedObject retObject = null; // if (templateObject is StaticObject) // { // retObject = new StaticObject(); // retObject.gameObject = instantiatedMesh; // } // else if (templateObject is AnimatedObjectCollection) // { // } // return retObject; }
private void Move(float delta) { float dist = (_destination - GlobalTransform.origin).Length(); Vector3 dest = new Vector3(); float snapLimit = 0.2f;//1f/64f; if (dist < snapLimit) { // snap Transform glob = GlobalTransform; glob.origin = _destination; this.GlobalTransform = glob; if (_open == STATE.OPENING) { _open = STATE.OPEN; } else if (_open == STATE.CLOSING) { _open = STATE.CLOSE; } } else { // move dest = (_destination - GlobalTransform.origin).Normalized(); dest *= _speed * delta; GlobalTranslate(dest); _mesh.GlobalTranslate(dest); foreach (CollisionShape cs in _collisions) { cs.GlobalTranslate(dest); } } }
public override void CreateObject(Vector3 position, Transform worldTransformation, Transform localTransformation, int SectionIndex, double StartingDistance, double EndingDistance, double TrackPosition, double Brightness, bool DuplicateMaterials = false) { StaticObject instantiatedObject = (StaticObject)this.Clone(); MeshInstance instantiatedMesh = instantiatedObject.ObjectMeshInstance; if (instantiatedMesh != null) // todo: why is this happening sometimes { Transform finalTrans = worldTransformation * localTransformation; instantiatedMesh.GlobalTransform = new Transform(finalTrans.basis, Vector3.Zero); UnifiedObject.RouteRootNode.AddChild(instantiatedMesh); instantiatedMesh.GlobalTranslate(position); } // return instantiatedObject; // Protototype is passed as 'this' from staticobject // currentHost.CreateStaticObject(this, Position, WorldTransformation, LocalTransformation, 0.0, StartingDistance, EndingDistance, TrackPosition, Brightness); // Matrix4D Translate = Matrix4D.CreateTranslation(Position.X, Position.Y, -Position.Z); // Matrix4D Rotate = (Matrix4D)new Transformation(LocalTransformation, WorldTransformation); // return CreateStaticObject(Prototype, LocalTransformation, Rotate, Translate, AccurateObjectDisposal, AccurateObjectDisposalZOffset, StartingDistance, EndingDistance, BlockLength, TrackPosition, Brightness); // if (Prototype == null) // { // return -1; // } // if (Prototype.Mesh.Faces.Length == 0) // { // //Null object- Waste of time trying to calculate anything for these // return -1; // } // float startingDistance = float.MaxValue; // float endingDistance = float.MinValue; // if (AccurateObjectDisposal == ObjectDisposalMode.Accurate) // { // foreach (VertexTemplate vertex in Prototype.Mesh.Vertices) // { // Vector3 Coordinates = new Vector3(vertex.Coordinates); // Coordinates.Rotate(LocalTransformation); // if (Coordinates.Z < startingDistance) // { // startingDistance = (float)Coordinates.Z; // } // if (Coordinates.Z > endingDistance) // { // endingDistance = (float)Coordinates.Z; // } // } // startingDistance += (float)AccurateObjectDisposalZOffset; // endingDistance += (float)AccurateObjectDisposalZOffset; // } // const double minBlockLength = 20.0; // if (BlockLength < minBlockLength) // { // BlockLength *= Math.Ceiling(minBlockLength / BlockLength); // } // switch (AccurateObjectDisposal) // { // case ObjectDisposalMode.Accurate: // startingDistance += (float)TrackPosition; // endingDistance += (float)TrackPosition; // double z = BlockLength * Math.Floor(TrackPosition / BlockLength); // StartingDistance = Math.Min(z - BlockLength, startingDistance); // EndingDistance = Math.Max(z + 2.0 * BlockLength, endingDistance); // startingDistance = (float)(BlockLength * Math.Floor(StartingDistance / BlockLength)); // endingDistance = (float)(BlockLength * Math.Ceiling(EndingDistance / BlockLength)); // break; // case ObjectDisposalMode.Legacy: // startingDistance = (float)StartingDistance; // endingDistance = (float)EndingDistance; // break; // case ObjectDisposalMode.Mechanik: // startingDistance = (float) StartingDistance; // endingDistance = (float) EndingDistance + 1500; // if (startingDistance < 0) // { // startingDistance = 0; // } // break; // } // StaticObjectStates.Add(new ObjectState // { // Prototype = Prototype, // Translation = Translate, // Rotate = Rotate, // Brightness = Brightness, // StartingDistance = startingDistance, // EndingDistance = endingDistance // }); // foreach (MeshFace face in Prototype.Mesh.Faces) // { // switch (face.Flags & FaceFlags.FaceTypeMask) // { // case FaceFlags.Triangles: // InfoTotalTriangles++; // break; // case FaceFlags.TriangleStrip: // InfoTotalTriangleStrip++; // break; // case FaceFlags.Quads: // InfoTotalQuads++; // break; // case FaceFlags.QuadStrip: // InfoTotalQuadStrip++; // break; // case FaceFlags.Polygon: // InfoTotalPolygon++; // break; // } // } // return StaticObjectStates.Count - 1; }