Exemplo n.º 1
0
    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;
    }
Exemplo n.º 2
0
    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);
            }
        }
    }
Exemplo n.º 3
0
    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;
    }