|
RenderStack 11.06.1
|
Manages transformations used for cameras and lights. More...
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] |
| 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;
}
| 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;
}
Parameters RenderStack.Scene.Camera.parameters = new Parameters() [protected] |
ProjectionType RenderStack.Scene.Camera.ProjectionType [get, set] |
StereoParameters RenderStack.Scene.Camera.StereoParameters [get] |
1.7.4