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]; } }
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; } } }