Example #1
0
        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;
            }
        }