コード例 #1
0
 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);
     }
 }
コード例 #2
0
        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));
        }
コード例 #3
0
 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);
     }
 }
コード例 #4
0
 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));
 }
コード例 #5
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);
        }