internal void CreateObject(UnifiedObject Prototype, OpenBveApi.Math.Vector3 Position, Transformation BaseTransformation, Transformation AuxTransformation, bool AccurateObjectDisposal, double StartingDistance, double EndingDistance, double BlockLength, double TrackPosition) { if (Prototype != null) { CreateObject(Prototype, Position, BaseTransformation, AuxTransformation, -1, AccurateObjectDisposal, StartingDistance, EndingDistance, BlockLength, TrackPosition, 1.0, false); } }
internal int CreateStaticObject(UnifiedObject Prototype, OpenBveApi.Math.Vector3 Position, Transformation BaseTransformation, Transformation AuxTransformation, bool AccurateObjectDisposal, double AccurateObjectDisposalZOffset, double StartingDistance, double EndingDistance, double BlockLength, double TrackPosition, double Brightness) { StaticObject obj = Prototype as StaticObject; if (obj == null) { Interface.AddMessage(MessageType.Error, false, "Attempted to use an animated object where only static objects are allowed."); return(-1); } return(base.CreateStaticObject(obj, Position, BaseTransformation, AuxTransformation, AccurateObjectDisposal, AccurateObjectDisposalZOffset, StartingDistance, EndingDistance, BlockLength, TrackPosition, Brightness)); }
internal void CreateObject(UnifiedObject Prototype, OpenBveApi.Math.Vector3 Position, Transformation BaseTransformation, Transformation AuxTransformation, int SectionIndex, bool AccurateObjectDisposal, double StartingDistance, double EndingDistance, double BlockLength, double TrackPosition, double Brightness, bool DuplicateMaterials) { if (Prototype is StaticObject) { StaticObject s = (StaticObject)Prototype; CreateStaticObject(s, Position, BaseTransformation, AuxTransformation, AccurateObjectDisposal, 0.0, StartingDistance, EndingDistance, BlockLength, TrackPosition, Brightness); } else if (Prototype is AnimatedObjectCollection) { AnimatedObjectCollection a = (AnimatedObjectCollection)Prototype; a.CreateObject(Position, BaseTransformation, AuxTransformation, SectionIndex, AccurateObjectDisposal, StartingDistance, EndingDistance, BlockLength, TrackPosition, Brightness, DuplicateMaterials); } }
internal int CreateStaticObject(StaticObject Prototype, OpenBveApi.Math.Vector3 Position, Transformation BaseTransformation, Transformation AuxTransformation, bool AccurateObjectDisposal, double StartingDistance, double EndingDistance, double BlockLength, double TrackPosition) { return(base.CreateStaticObject(Prototype, Position, BaseTransformation, AuxTransformation, AccurateObjectDisposal, 0.0, StartingDistance, EndingDistance, BlockLength, TrackPosition, 1.0)); }
public int CreateStaticObject(StaticObject Prototype, Vector3 Position, Transformation AuxTransformation, Matrix4D Rotate, Matrix4D Translate, bool AccurateObjectDisposal, double AccurateObjectDisposalZOffset, double StartingDistance, double EndingDistance, double BlockLength, double TrackPosition, double Brightness) { if (Prototype == null) { return(-1); } float startingDistance = float.MaxValue; float endingDistance = float.MinValue; if (AccurateObjectDisposal) { foreach (VertexTemplate vertex in Prototype.Mesh.Vertices) { OpenBveApi.Math.Vector3 Coordinates = vertex.Coordinates; Coordinates.Rotate(AuxTransformation); 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); } if (AccurateObjectDisposal) { 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)); } else { startingDistance = (float)StartingDistance; endingDistance = (float)EndingDistance; } 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 & MeshFace.FaceTypeMask) { case MeshFace.FaceTypeTriangles: InfoTotalTriangles++; break; case MeshFace.FaceTypeTriangleStrip: InfoTotalTriangleStrip++; break; case MeshFace.FaceTypeQuads: InfoTotalQuads++; break; case MeshFace.FaceTypeQuadStrip: InfoTotalQuadStrip++; break; case MeshFace.FaceTypePolygon: InfoTotalPolygon++; break; } } return(StaticObjectStates.Count - 1); }