RenderStack 11.06.1
Classes | Public Member Functions | Protected Attributes | Properties
RenderStack.Scene.Camera Class Reference

Manages transformations used for cameras and lights. More...

Inheritance diagram for RenderStack.Scene.Camera:
RenderStack.Graphics.IUniformSource

List of all members.

Classes

class  Parameters

Public Member Functions

override string ToString ()
 Camera ()
void UpdateViewport (Viewport viewport)
void UpdateModelFrame (Frame modelFrame)
void UpdateCameraFrame ()
bool Connect (IProgram program, LogicalUniform uniform, int slot)

Protected Attributes

Parameters parameters = new Parameters()

Properties

string Name [get, set]
Frame Frame [get]
Frame Model [get, set]
Camera[] Shadow [get, set]
Floats NearParameter [get]
Floats FarParameter [get]
Floats FovXParameter [get]
Floats FovYParameter [get]
float Near [get, set]
float Far [get, set]
ProjectionType ProjectionType [get, set]
float FovXRadians [get, set]
float FovYRadians [get, set]
float OrthoLeft [get, set]
float OrthoTop [get, set]
float OrthoWidth [get, set]
float OrthoHeight [get, set]
float FrustumLeft [get, set]
float FrustumRight [get, set]
float FrustumBottom [get, set]
float FrustumTop [get, set]
StereoParameters StereoParameters [get]
Transform ViewToClip [get]
Transform ViewToWorld [get]
Transform ModelToClip [get]
Transform ModelToView [get]
Transform WorldToClip [get]
Transform[] ModelToShadow [get]

Detailed Description

Note:
Mostly stable, shadow stuff will be moved to Light
Todo:
Create Light class, move shadow stuff there

Definition at line 35 of file Camera.cs.


Constructor & Destructor Documentation

RenderStack.Scene.Camera.Camera ( )

Definition at line 230 of file Camera.cs.

        {
            Near            = 1.0f;
            Far             = 100.0f;
            ProjectionType  = ProjectionType.PerspectiveVertical;
            FovXRadians     = (float)(0.5 * System.Math.PI);
            FovYRadians     = (float)(0.5 * System.Math.PI);
            OrthoWidth      = 1.0f;
            OrthoHeight     = 1.0f;
        }

Member Function Documentation

override string RenderStack.Scene.Camera.ToString ( )

Definition at line 65 of file Camera.cs.

References RenderStack.Scene.StereoParameters.EyeSeparation, RenderStack.Scene.Camera.ToString(), and RenderStack.Graphics.Params< T >.X.

Referenced by RenderStack.Scene.Camera.ToString().

        {
            var sb = new System.Text.StringBuilder();
            sb.Append(name);
            sb.Append(" Near: ");
            sb.Append(Near);
            sb.Append(" Far: ");
            sb.Append(Far);
            sb.Append(" Projection: ");
            sb.Append(ProjectionType);
            sb.Append(" ");
            switch(ProjectionType)
            {
                case ProjectionType.Orthogonal:
                {
                    sb.Append(" OrthoWidth: ");
                    sb.Append(OrthoWidth);
                    sb.Append(" OrthoHeight: ");
                    sb.Append(OrthoHeight);
                    break;
                }
                case ProjectionType.OrthogonalHorizontal:
                {
                    sb.Append(" OrthoWidth: ");
                    sb.Append(OrthoWidth);
                    break;
                }
                case ProjectionType.OrthogonalRectangle:
                {
                    sb.Append(" OrthoLeft: ");
                    sb.Append(OrthoLeft);
                    sb.Append(" OrthoTop: ");
                    sb.Append(OrthoTop);
                    sb.Append(" OrthoWidth: ");
                    sb.Append(OrthoWidth);
                    sb.Append(" OrthoHeight: ");
                    sb.Append(OrthoHeight);
                    break;
                }
                case ProjectionType.OrthogonalVertical:
                {
                    sb.Append(" OrthoHeight: ");
                    sb.Append(OrthoHeight);
                    break;
                }
                case ProjectionType.Other:
                {
                    break;
                }
                case ProjectionType.Perspective:
                {
                    sb.Append(" FovXRadians: ");
                    sb.Append(FovXRadians);
                    sb.Append(" FovYRadians: ");
                    sb.Append(FovYRadians);
                    break;
                }
                case ProjectionType.PerspectiveHorizontal:
                {
                    sb.Append(" FovXRadians: ");
                    sb.Append(FovXRadians);
                    break;
                }
                case ProjectionType.PerspectiveVertical:
                {
                    sb.Append(" FovYRadians: ");
                    sb.Append(FovYRadians);
                    break;
                }
                case ProjectionType.StereoscopicHorizontal:
                {
                    sb.Append(" FovXRadians: ");
                    sb.Append(FovXRadians);
                    sb.Append(" EyeSeparation: ");
                    sb.Append(StereoParameters.EyeSeparation.X);
                    sb.Append(" ViewportCenter.Z: ");
                    sb.Append(stereoParameters.ViewportCenter.Z);
                    break;
                }
                case ProjectionType.StereoscopicVertical:
                {
                    sb.Append(" FovYRadians: ");
                    sb.Append(FovYRadians);
                    sb.Append(" EyeSeparation: ");
                    sb.Append(StereoParameters.EyeSeparation.X);
                    sb.Append(" ViewportCenter.Z: ");
                    sb.Append(stereoParameters.ViewportCenter.Z);
                    break;
                }
                case ProjectionType.GenericFrustum:
                {
                    sb.Append(" FrustumLeft: ");
                    sb.Append(FrustumLeft);
                    sb.Append(" FrustumRight: ");
                    sb.Append(FrustumRight);
                    sb.Append(" FrustumBottom: ");
                    sb.Append(FrustumBottom);
                    sb.Append(" FrustumTop: ");
                    sb.Append(FrustumTop);
                    break;
                }
                default:
                {
                    break;
                }
            }
            return sb.ToString();
        }
void RenderStack.Scene.Camera.UpdateViewport ( Viewport  viewport)

Viewport has been modified, updates transformations.

Definition at line 243 of file Camera.cs.

References RenderStack.Math.Viewport.AspectRatio, RenderStack.Scene.StereoParameters.EyeSeparation, RenderStack.Math.Viewport.Height, RenderStack.Scene.Frame.LocalToWorld, RenderStack.Scene.Transform.Matrix, RenderStack.Scene.StereoParameters.Perspective, RenderStack.Graphics.Floats.Set(), RenderStack.Scene.StereoParameters.ViewPlaneSize, RenderStack.Math.Viewport.Width, RenderStack.Graphics.Params< T >.X, RenderStack.Math.Viewport.X, and RenderStack.Math.Viewport.Y.

        {
            parameters.NearFar.Set(Near, Far);
            parameters.Viewport.Set(
                (float)viewport.X, 
                (float)viewport.Y, 
                (float)viewport.Width, 
                (float)viewport.Height
            );

            try
            {
                switch(ProjectionType)
                {
                    case ProjectionType.Perspective:
                    {
                        ViewToClip.SetPerspective(
                            FovXRadians,
                            FovYRadians,
                            Near,
                            Far
                        );
                        break;
                    }
                    case ProjectionType.PerspectiveHorizontal:
                    {
                        ViewToClip.SetPerspectiveHorizontal(
                            FovXRadians,
                            viewport.AspectRatio,
                            Near,
                            Far
                        );
                        break;
                    }
                    case ProjectionType.PerspectiveVertical:
                    {
                        ViewToClip.SetPerspectiveVertical(
                            FovYRadians,
                            viewport.AspectRatio,
                            Near,
                            Far
                        );
                        break;
                    }
                    case ProjectionType.OrthogonalHorizontal:
                    {
                        ViewToClip.SetOrthographic(
                            -0.5f * OrthoWidth,
                             0.5f * OrthoWidth,
                            -0.5f * OrthoWidth / viewport.AspectRatio,
                             0.5f * OrthoWidth / viewport.AspectRatio,
                            Near,
                            Far
                        );
                        break;
                    }
                    case ProjectionType.OrthogonalVertical:
                    {
                        ViewToClip.SetOrthographic(
                            -0.5f * OrthoHeight * viewport.AspectRatio,
                             0.5f * OrthoHeight * viewport.AspectRatio,
                            -0.5f * OrthoHeight,
                             0.5f * OrthoHeight,
                            Near,
                            Far
                        );
                        break;
                    }
                    case ProjectionType.Orthogonal:
                    {
                        ViewToClip.SetOrthographic(
                            -0.5f * OrthoWidth,
                             0.5f * OrthoWidth,
                            -0.5f * OrthoHeight,
                             0.5f * OrthoHeight,
                            Near,
                            Far
                        );
                        break;
                    }
                    case ProjectionType.OrthogonalRectangle:
                    {
                        ViewToClip.SetOrthographic(
                            OrthoLeft,
                            OrthoLeft + OrthoWidth,
                            OrthoTop,
                            OrthoTop + OrthoHeight,
                            Near,
                            Far
                        );
                        break;
                    }
                    case ProjectionType.GenericFrustum:
                    {
                        ViewToClip.SetFrustum(
                            FrustumLeft,
                            FrustumRight,
                            FrustumBottom,
                            FrustumTop,
                            Near,
                            Far
                        );
                        break;
                    }
                    case ProjectionType.StereoscopicHorizontal:
                    {
                        float fov = FovXRadians;
                        fov = System.Math.Max(fov, 0.01f);
                        fov = System.Math.Min(fov, (float)(System.Math.PI * 0.99));

                        float z = System.Math.Max(stereoParameters.ViewportCenter.Z, 0.01f);

                        float w = 2.0f * z * (float)(System.Math.Tan(fov * 0.5f));
                        float h = w / viewport.AspectRatio;

                        StereoParameters.ViewPlaneSize.Set(w, h);

                        ViewToClip.SetProjection(
                            StereoParameters.EyeSeparation.X,
                            StereoParameters.Perspective.X,
                            Near,
                            Far,
                            w,
                            h,
                            new Vector3(stereoParameters.ViewportCenter.X, stereoParameters.ViewportCenter.Y, stereoParameters.ViewportCenter.Z),
                            new Vector3(stereoParameters.EyePosition.X, stereoParameters.EyePosition.Y, stereoParameters.EyePosition.Z)
                        );
                        break;
                    }
                    case ProjectionType.StereoscopicVertical:
                    {
                        float fov = FovYRadians;
                        fov = System.Math.Max(fov, 0.01f);
                        fov = System.Math.Min(fov, (float)(System.Math.PI * 0.99));

                        float z = System.Math.Max(stereoParameters.ViewportCenter.Z, 0.01f);

                        float h = 2.0f * z * (float)(System.Math.Tan(fov * 0.5f));
                        float w = h * viewport.AspectRatio;

                        StereoParameters.ViewPlaneSize.Set(w, h);

                        ViewToClip.SetProjection(
                            StereoParameters.EyeSeparation.X,
                            StereoParameters.Perspective.X,
                            Near,
                            Far,
                            w,
                            h,
                            new Vector3(stereoParameters.ViewportCenter.X, stereoParameters.ViewportCenter.Y, stereoParameters.ViewportCenter.Z),
                            new Vector3(stereoParameters.EyePosition.X, stereoParameters.EyePosition.Y, stereoParameters.EyePosition.Z)
                        );
                        break;
                    }
                }
            }
            catch(Exception e)
            {
                Trace.TraceError("UpdateViewport exception: " + e.ToString());
            }

            //  world to (view) local  =>  view to clip
            WorldToClip.Set(
                ViewToClip.Matrix * ViewToWorld.InverseMatrix,
                Frame.LocalToWorld.Matrix * ViewToClip.InverseMatrix 
            );

            parameters.ViewToClip.Set(ViewToClip.Matrix);
            parameters.ClipToView.Set(ViewToClip.InverseMatrix);
            parameters.WorldToClip.Set(WorldToClip.Matrix);
            parameters.ClipToWorld.Set(WorldToClip.InverseMatrix);
        }
void RenderStack.Scene.Camera.UpdateModelFrame ( Frame  modelFrame)

Model Frame (or Model) has been modified, update transformations.

Definition at line 418 of file Camera.cs.

References RenderStack.Math.Matrix4.Identity, RenderStack.Scene.Transform.InverseMatrix, RenderStack.Scene.Frame.LocalToWorld, RenderStack.Scene.Transform.Matrix, and RenderStack.Scene.Frame.UpdateHierarchical().

        {
            Model = modelFrame;
            Model.UpdateHierarchical();

            //  (model) local to world  =>  world to clip
            ModelToClip.Set(
                WorldToClip.Matrix * Model.LocalToWorld.Matrix,
                Model.LocalToWorld.InverseMatrix * WorldToClip.InverseMatrix
            );
            //  (model) local to world  =>  world to (view) local
            ModelToView.Set(
                Frame.LocalToWorld.InverseMatrix * Model.LocalToWorld.Matrix,
                Model.LocalToWorld.InverseMatrix * Frame.LocalToWorld.Matrix
            );

            parameters.ModelToClip.Set(ModelToClip.Matrix);
            parameters.ClipToModel.Set(ModelToClip.InverseMatrix);
            parameters.ModelToView.Set(ModelToView.Matrix);
            parameters.ViewToModel.Set(ModelToView.InverseMatrix);
            parameters.ModelToWorld.Set(Model.LocalToWorld.Matrix);
            parameters.WorldToModel.Set(Model.LocalToWorld.InverseMatrix);

            if(Shadow != null)
            {
                if(modelToShadow == null || modelToShadow.Length != Shadow.Length)
                {
                    modelToShadow = new Transform[Shadow.Length];
                    for(int i = 0; i < Shadow.Length; ++i)
                    {
                        modelToShadow[i] = new Transform(Matrix4.Identity, Matrix4.Identity);
                    }
                    parameters.ModelToShadow = new Floats(16, Shadow.Length);
                }
                for(int i = 0; i < Shadow.Length; ++i)
                {
                    ModelToShadow[i].Set(
                        Texture * Shadow[i].WorldToClip.Matrix * Model.LocalToWorld.Matrix,
                        Model.LocalToWorld.InverseMatrix * Shadow[i].WorldToClip.InverseMatrix * TextureInverse
                    );
                    parameters.ModelToShadow.Set(i, ModelToShadow[i].Matrix);
                }
            }
        }
void RenderStack.Scene.Camera.UpdateCameraFrame ( )

Camera Frame has been modified, update transformations

Definition at line 465 of file Camera.cs.

References RenderStack.Scene.Frame.UpdateHierarchical().

        {
            Frame.UpdateHierarchical();
            parameters.ViewToWorld.Set(ViewToWorld.Matrix);
            parameters.WorldToView.Set(ViewToWorld.InverseMatrix);

            parameters.ViewPositionInWorld.Set(
                ViewToWorld.Matrix._30,
                ViewToWorld.Matrix._31,
                ViewToWorld.Matrix._32
            );
        }
bool RenderStack.Scene.Camera.Connect ( IProgram  program,
LogicalUniform  uniform,
int  slot 
)

Connect uniform values from this Camera to an OpenGL program

Implements RenderStack.Graphics.IUniformSource.

Definition at line 480 of file Camera.cs.

References RenderStack.Graphics.IProgram.Bind().

        {
            switch(uniform)
            {
                case LogicalUniform.NearFar:
                {
                    program.Bind(slot, parameters.NearFar);
                    return true;
                }
                case LogicalUniform.Viewport:
                {
                    program.Bind(slot, parameters.Viewport);
                    return true;
                }
                case LogicalUniform.ViewToWorld:
                {
                    program.Bind(slot, parameters.ViewToWorld);
                    return true;
                }
                case LogicalUniform.WorldToView:
                {
                    program.Bind(slot, parameters.WorldToView);
                    return true;
                }

                case LogicalUniform.ModelToWorld:
                {
                    program.Bind(slot, parameters.ModelToWorld);
                    return true;
                }

                case LogicalUniform.WorldToModel:
                {
                    program.Bind(slot, parameters.WorldToModel);
                    return true;
                }

                case LogicalUniform.ModelToClip:
                {
                    program.Bind(slot, parameters.ModelToClip);
                    return true;
                }

                case LogicalUniform.ClipToModel:
                {
                    program.Bind(slot, parameters.ClipToModel);
                    return true;
                }

                case LogicalUniform.WorldToClip:
                {
                    program.Bind(slot, parameters.WorldToClip);
                    return true;
                }

                case LogicalUniform.ClipToWorld:
                {
                    program.Bind(slot, parameters.ClipToWorld);
                    return true;
                }

                case LogicalUniform.ModelToView:
                {
                    program.Bind(slot, parameters.ModelToView);
                    return true;
                }

                case LogicalUniform.ViewToModel:
                {
                    program.Bind(slot, parameters.ViewToModel);
                    return true;
                }

                case LogicalUniform.ViewToClip:
                {
                    program.Bind(slot, parameters.ViewToClip);
                    return true;
                }

                case LogicalUniform.ClipToView:
                {
                    program.Bind(slot, parameters.ClipToView);
                    return true;
                }

                case LogicalUniform.ModelToShadow:
                {
                    program.Bind(slot, parameters.ModelToShadow);
                    return true;
                }

                case LogicalUniform.ViewPositionInWorld:
                {
                    throw new System.NotImplementedException();
                }
            }
            return false;
        }

Member Data Documentation

Definition at line 228 of file Camera.cs.


Property Documentation

string RenderStack.Scene.Camera.Name [get, set]

Definition at line 60 of file Camera.cs.

Frame RenderStack.Scene.Camera.Frame [get]

Definition at line 61 of file Camera.cs.

Frame RenderStack.Scene.Camera.Model [get, set]

Definition at line 62 of file Camera.cs.

Camera [] RenderStack.Scene.Camera.Shadow [get, set]

Definition at line 63 of file Camera.cs.

Floats RenderStack.Scene.Camera.NearParameter [get]

Definition at line 174 of file Camera.cs.

Floats RenderStack.Scene.Camera.FarParameter [get]

Definition at line 175 of file Camera.cs.

Floats RenderStack.Scene.Camera.FovXParameter [get]

Definition at line 176 of file Camera.cs.

Floats RenderStack.Scene.Camera.FovYParameter [get]

Definition at line 177 of file Camera.cs.

float RenderStack.Scene.Camera.Near [get, set]

Definition at line 178 of file Camera.cs.

float RenderStack.Scene.Camera.Far [get, set]

Definition at line 179 of file Camera.cs.

ProjectionType RenderStack.Scene.Camera.ProjectionType [get, set]

Definition at line 180 of file Camera.cs.

float RenderStack.Scene.Camera.FovXRadians [get, set]

Definition at line 181 of file Camera.cs.

float RenderStack.Scene.Camera.FovYRadians [get, set]

Definition at line 182 of file Camera.cs.

float RenderStack.Scene.Camera.OrthoLeft [get, set]

Definition at line 183 of file Camera.cs.

float RenderStack.Scene.Camera.OrthoTop [get, set]

Definition at line 184 of file Camera.cs.

float RenderStack.Scene.Camera.OrthoWidth [get, set]

Definition at line 185 of file Camera.cs.

float RenderStack.Scene.Camera.OrthoHeight [get, set]

Definition at line 186 of file Camera.cs.

float RenderStack.Scene.Camera.FrustumLeft [get, set]

Definition at line 187 of file Camera.cs.

float RenderStack.Scene.Camera.FrustumRight [get, set]

Definition at line 188 of file Camera.cs.

float RenderStack.Scene.Camera.FrustumBottom [get, set]

Definition at line 189 of file Camera.cs.

float RenderStack.Scene.Camera.FrustumTop [get, set]

Definition at line 190 of file Camera.cs.

StereoParameters RenderStack.Scene.Camera.StereoParameters [get]

Definition at line 193 of file Camera.cs.

Transform RenderStack.Scene.Camera.ViewToClip [get]

Definition at line 201 of file Camera.cs.

Transform RenderStack.Scene.Camera.ViewToWorld [get]

Definition at line 202 of file Camera.cs.

Transform RenderStack.Scene.Camera.ModelToClip [get]

Definition at line 203 of file Camera.cs.

Transform RenderStack.Scene.Camera.ModelToView [get]

Definition at line 204 of file Camera.cs.

Transform RenderStack.Scene.Camera.WorldToClip [get]

Definition at line 205 of file Camera.cs.

Transform [] RenderStack.Scene.Camera.ModelToShadow [get]

Definition at line 206 of file Camera.cs.


The documentation for this class was generated from the following file: