CSharpGL.RendererBase.GetModelMatrix C# (CSharp) Method

GetModelMatrix() public method

Get model matrix that transform this renderer from model space to world space.
public GetModelMatrix ( ) : MarkableStruct
return MarkableStruct
        public MarkableStruct<mat4> GetModelMatrix()
        {
            if (this.modelMatrixRecord.IsMarked())// this model matrix is updated.
            {
                // get matrix representing transform relative to parent node.
                mat4 matrix = IModelSpaceHelper.GetModelMatrix(this);
                this.modelMatrixRecord.CancelMark();
                // cascade parent's model matrix.
                SceneObject obj = this.BindingSceneObject;
                if (obj != null)
                {
                    SceneObject parent = obj.Parent;
                    if (parent != null)
                    {
                        RendererBase parentRenderer = parent.Renderer;
                        if (parentRenderer != null)
                        {
                            // get parent's matrix representing transform relative to world space coordinate.
                            MarkableStruct<mat4> parentMatrix = parentRenderer.GetModelMatrix();
                            // get matrix means transform relative to world space coordinate for this renderer.
                            matrix = parentMatrix.Value * matrix;
                        }
                    }
                }
                // update this renderer's transform matrix relative to world space coordinate.
                this.modelMatrix.Value = matrix;
            }
            else // this model matrix is not updated.
            {
                SceneObject obj = this.BindingSceneObject;
                if (obj != null)
                {
                    SceneObject parent = obj.Parent;
                    if (parent != null)
                    {
                        RendererBase parentRenderer = parent.Renderer;
                        if (parentRenderer != null)
                        {
                            // get parent's matrix representing transform relative to world space coordinate.
                            MarkableStruct<mat4> parentMatrix = parentRenderer.GetModelMatrix();
                            long ticks = parentMatrix.UpdateTicks;
                            if (this.parentMatrixTicks != ticks) // parent's model matrix is updated.
                            {
                                mat4 matrix = IModelSpaceHelper.GetModelMatrix(this);
                                this.modelMatrix.Value = parentMatrix.Value * matrix;
                                this.parentMatrixTicks = ticks;
                            }
                        }
                    }
                }
            }

            return this.modelMatrix;
        }

Usage Example

        private void RenderForPicking(RendererBase sceneElement, PickEventArgs arg)
        {
            if (sceneElement != null)
            {
                mat4 parentCascadeModelMatrix = arg.ModelMatrixStack.Peek();
                sceneElement.cascadeModelMatrix = sceneElement.GetModelMatrix(parentCascadeModelMatrix);

                var      pickable = sceneElement as IPickable;
                TwoFlags flags    = (pickable != null) ? pickable.EnablePicking : TwoFlags.None;
                bool     before   = (pickable != null) && ((flags & TwoFlags.BeforeChildren) == TwoFlags.BeforeChildren);
                bool     children = (pickable == null) || ((flags & TwoFlags.Children) == TwoFlags.Children);

                if (before)
                {
                    pickable.PickingBaseId += arg.RenderedVertexCount;
                    pickable.RenderForPicking(arg);
                    arg.RenderedVertexCount += pickable.GetVertexCount();
                }

                if (children)
                {
                    arg.ModelMatrixStack.Push(sceneElement.cascadeModelMatrix);
                    foreach (var item in sceneElement.Children)
                    {
                        this.RenderForPicking(item, arg);
                    }
                    arg.ModelMatrixStack.Pop();
                }
            }
        }
All Usage Examples Of CSharpGL.RendererBase::GetModelMatrix