public virtual void OnFrameRender(Device device, double totalTime, float elapsedTime) { if (Visible == false) { return; } if (matrixInvalid) { // scale transformMatrix = Matrix.Scaling(scale); // Rotate switch (orientationMode) { case OrientationModeEnum.XYZ: transformMatrix.Multiply(Matrix.RotationX(orientation.X)); transformMatrix.Multiply(Matrix.RotationY(orientation.Y)); transformMatrix.Multiply(Matrix.RotationZ(orientation.Z)); break; case OrientationModeEnum.Axis: transformMatrix.Multiply(Matrix.RotationAxis(orientation, rotationAngle)); break; case OrientationModeEnum.YawPitchRoll: transformMatrix.Multiply(Matrix.RotationYawPitchRoll(orientation.X, orientation.Y, orientation.Z)); break; case OrientationModeEnum.Quaternion: // TODO break; case OrientationModeEnum.YXZ: transformMatrix.Multiply(Matrix.RotationY(orientation.Y)); transformMatrix.Multiply(Matrix.RotationX(orientation.X)); transformMatrix.Multiply(Matrix.RotationZ(orientation.Z)); break; } // Translate transformMatrix.Multiply(Matrix.Translation(position)); matrixInvalid = false; } device.Transform.World = InheritedTransformMatrix; /* * if (parent != null) * { * Matrix inheritedTransform = transformMatrix; * inheritedTransform.Multiply(parent.transformMatrix); * device.Transform.World = inheritedTransform; * } * else * { * // Move * device.Transform.World = transformMatrix; * } */ // Set renderstates if (scaleSet) { device.RenderState.NormalizeNormals = true; // this will make lighting scale invariant } // Render if (mesh != null) { if (shader != null) { shader.WorldMatrix = InheritedTransformMatrix; shader.SetGlobalParameters(); int passes = shader.Effect.Begin(0); for (int iPass = 0; iPass < passes; iPass++) { shader.Effect.BeginPass(iPass); mesh.OnFrameRender(device, totalTime, elapsedTime); shader.Effect.EndPass(); } shader.Effect.End(); } else { mesh.OnFrameRender(device, totalTime, elapsedTime); } } // Reset transformation device.Transform.World = Matrix.Identity; // Forward to children foreach (GameObject child in children) { child.OnFrameRender(device, totalTime, elapsedTime); } // Reset renderstates if (scaleSet) { device.RenderState.NormalizeNormals = false; } }