示例#1
0
        private void UpdateDoorPosition()
        {
            if (this.CubeGrid.Physics == null)
            {
                return;
            }

            for (int i = 0; i < m_subpartCount; i++)
            {
                transMat[i] = Matrix.Identity;
                rotMat[i]   = Matrix.Identity;
            }

            for (int i = 0; i < m_sequenceCount; i++)
            {
                MyObjectBuilder_AdvancedDoorDefinition.Opening.MoveType moveType = m_openingSequence[i].Move;
                float opening = m_currentOpening[i];

                // get id of the subpart this opening sequenz should be applied to
                int id = m_subpartIDs[i];

                if (m_subparts.Count == 0 || id < 0)
                {
                    break;
                }

                if (m_subparts[id] != null && m_subparts[id].Physics != null)
                {
                    if (moveType == MyObjectBuilder_AdvancedDoorDefinition.Opening.MoveType.Slide)
                    {
                        transMat[id] *=
                            Matrix.CreateTranslation(m_openingSequence[i].SlideDirection * new Vector3(opening));
                    }
                    else if (moveType == MyObjectBuilder_AdvancedDoorDefinition.Opening.MoveType.Rotate)
                    {
                        float invert = m_openingSequence[i].InvertRotation ? -1f : 1f;

                        float rotX = 0f;
                        float rotY = 0f;
                        float rotZ = 0f;

                        if (m_openingSequence[i].RotationAxis == MyObjectBuilder_AdvancedDoorDefinition.Opening.Rotation.X)
                        {
                            rotX = MathHelper.ToRadians(opening * invert);
                        }
                        else if (m_openingSequence[i].RotationAxis == MyObjectBuilder_AdvancedDoorDefinition.Opening.Rotation.Y)
                        {
                            rotY = MathHelper.ToRadians(opening * invert);
                        }
                        else if (m_openingSequence[i].RotationAxis == MyObjectBuilder_AdvancedDoorDefinition.Opening.Rotation.Z)
                        {
                            rotZ = MathHelper.ToRadians(opening * invert);
                        }

                        Vector3 hingePos = (m_openingSequence[i].PivotPosition == null) ? m_hingePosition[id] : (Vector3)m_openingSequence[i].PivotPosition;

                        rotMat[id] *=
                            (Matrix.CreateTranslation(-(hingePos)) *
                             (Matrix.CreateRotationX(rotX) *
                              Matrix.CreateRotationY(rotY) *
                              Matrix.CreateRotationZ(rotZ)) *
                             Matrix.CreateTranslation(hingePos));
                    }

                    if (m_subparts[id].Physics.LinearVelocity != this.CubeGrid.Physics.LinearVelocity)
                    {
                        m_subparts[id].Physics.LinearVelocity = this.CubeGrid.Physics.LinearVelocity;
                    }

                    if (m_subparts[id].Physics.AngularVelocity != this.CubeGrid.Physics.AngularVelocity)
                    {
                        m_subparts[id].Physics.AngularVelocity = this.CubeGrid.Physics.AngularVelocity;
                    }
                }
            }

            // combine matrices and apply to subparts
            for (int i = 0; i < m_subpartCount; i++)
            {
                m_subparts[i].PositionComp.LocalMatrix = rotMat[i] * transMat[i];
            }
        }
示例#2
0
 private unsafe void UpdateDoorPosition()
 {
     if (base.CubeGrid.Physics != null)
     {
         for (int i = 0; i < this.m_subpartCount; i++)
         {
             this.transMat[i] = Matrix.Identity;
             this.rotMat[i]   = Matrix.Identity;
         }
         int num2 = 0;
         while (true)
         {
             if (num2 < this.m_sequenceCount)
             {
                 MyObjectBuilder_AdvancedDoorDefinition.Opening.MoveType move = this.m_openingSequence[num2].Move;
                 float num3  = this.m_currentOpening[num2];
                 int   index = this.m_subpartIDs[num2];
                 if ((this.m_subparts.Count != 0) && (index >= 0))
                 {
                     if ((this.m_subparts[index] != null) && (this.m_subparts[index].Physics != null))
                     {
                         if (move == MyObjectBuilder_AdvancedDoorDefinition.Opening.MoveType.Slide)
                         {
                             Matrix *matrixPtr1 = (Matrix *)ref this.transMat[index];
                             matrixPtr1[0] *= Matrix.CreateTranslation((Vector3)(this.m_openingSequence[num2].SlideDirection * new Vector3(num3)));
                         }
                         else if (move == MyObjectBuilder_AdvancedDoorDefinition.Opening.MoveType.Rotate)
                         {
                             float num5    = this.m_openingSequence[num2].InvertRotation ? -1f : 1f;
                             float radians = 0f;
                             float num7    = 0f;
                             float num8    = 0f;
                             if (this.m_openingSequence[num2].RotationAxis == MyObjectBuilder_AdvancedDoorDefinition.Opening.Rotation.X)
                             {
                                 radians = MathHelper.ToRadians((float)(num3 * num5));
                             }
                             else if (this.m_openingSequence[num2].RotationAxis == MyObjectBuilder_AdvancedDoorDefinition.Opening.Rotation.Y)
                             {
                                 num7 = MathHelper.ToRadians((float)(num3 * num5));
                             }
                             else if (this.m_openingSequence[num2].RotationAxis == MyObjectBuilder_AdvancedDoorDefinition.Opening.Rotation.Z)
                             {
                                 num8 = MathHelper.ToRadians((float)(num3 * num5));
                             }
                             Vector3 position   = (this.m_openingSequence[num2].PivotPosition == null) ? this.m_hingePosition[index] : ((Vector3)this.m_openingSequence[num2].PivotPosition.Value);
                             Matrix *matrixPtr2 = (Matrix *)ref this.rotMat[index];
                             matrixPtr2[0] *= (Matrix.CreateTranslation(-position) * ((Matrix.CreateRotationX(radians) * Matrix.CreateRotationY(num7)) * Matrix.CreateRotationZ(num8))) * Matrix.CreateTranslation(position);
                         }
                         if (this.m_subparts[index].Physics.LinearVelocity != base.CubeGrid.Physics.LinearVelocity)
                         {
                             this.m_subparts[index].Physics.LinearVelocity = base.CubeGrid.Physics.LinearVelocity;
                         }
                         if (this.m_subparts[index].Physics.AngularVelocity != base.CubeGrid.Physics.AngularVelocity)
                         {
                             this.m_subparts[index].Physics.AngularVelocity = base.CubeGrid.Physics.AngularVelocity;
                         }
                     }
                     num2++;
                     continue;
                 }
             }
             for (int j = 0; j < this.m_subpartCount; j++)
             {
                 this.m_subparts[j].PositionComp.LocalMatrix = this.rotMat[j] * this.transMat[j];
             }
             return;
         }
     }
 }