mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-04-26 06:45:36 +00:00
Oculus VR DK2 Support
- Updated to work with 0.5.x SDK - Uses Oculus Rendering rather than PostFX - Stereo rendering refactored so more rendering info is grabbed from the DisplayDevice - Implements an Offscreen Canvas for in-game gui with oculus - Message dialogs and metrics display can now go to the OffScreen Canvas (if oculus demo is setup correctly)
This commit is contained in:
parent
b3170bcddf
commit
3a457749ec
56 changed files with 2654 additions and 1426 deletions
|
|
@ -695,9 +695,9 @@ GFXShader* GFXD3D9Device::createShader()
|
|||
return shader;
|
||||
}
|
||||
|
||||
void GFXD3D9Device::disableShaders()
|
||||
void GFXD3D9Device::disableShaders(bool force)
|
||||
{
|
||||
setShader( NULL );
|
||||
setShader( NULL, force );
|
||||
setShaderConstBuffer( NULL );
|
||||
}
|
||||
|
||||
|
|
@ -706,25 +706,24 @@ void GFXD3D9Device::disableShaders()
|
|||
// and to make sure redundant shader states are not being
|
||||
// sent to the card.
|
||||
//-----------------------------------------------------------------------------
|
||||
void GFXD3D9Device::setShader( GFXShader *shader )
|
||||
void GFXD3D9Device::setShader( GFXShader *shader, bool force )
|
||||
{
|
||||
GFXD3D9Shader *d3dShader = static_cast<GFXD3D9Shader*>( shader );
|
||||
|
||||
IDirect3DPixelShader9 *pixShader = ( d3dShader != NULL ? d3dShader->mPixShader : NULL );
|
||||
IDirect3DVertexShader9 *vertShader = ( d3dShader ? d3dShader->mVertShader : NULL );
|
||||
|
||||
if( pixShader != mLastPixShader )
|
||||
if( pixShader != mLastPixShader || force )
|
||||
{
|
||||
mD3DDevice->SetPixelShader( pixShader );
|
||||
mLastPixShader = pixShader;
|
||||
}
|
||||
|
||||
if( vertShader != mLastVertShader )
|
||||
if( vertShader != mLastVertShader || force )
|
||||
{
|
||||
mD3DDevice->SetVertexShader( vertShader );
|
||||
mLastVertShader = vertShader;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -238,7 +238,7 @@ protected:
|
|||
// }
|
||||
|
||||
virtual GFXShader* createShader();
|
||||
void disableShaders();
|
||||
void disableShaders(bool force = false);
|
||||
|
||||
/// Device helper function
|
||||
virtual D3DPRESENT_PARAMETERS setupPresentParams( const GFXVideoMode &mode, const HWND &hwnd ) const = 0;
|
||||
|
|
@ -272,7 +272,7 @@ public:
|
|||
|
||||
virtual F32 getPixelShaderVersion() const { return mPixVersion; }
|
||||
virtual void setPixelShaderVersion( F32 version ){ mPixVersion = version; }
|
||||
virtual void setShader( GFXShader *shader );
|
||||
virtual void setShader( GFXShader *shader, bool force = false );
|
||||
virtual U32 getNumSamplers() const { return mNumSamplers; }
|
||||
virtual U32 getNumRenderTargets() const { return mNumRenderTargets; }
|
||||
// }
|
||||
|
|
|
|||
|
|
@ -161,7 +161,6 @@ GFXDevice::GFXDevice()
|
|||
mAllowRender = true;
|
||||
mCurrentRenderStyle = RS_Standard;
|
||||
mCurrentProjectionOffset = Point2F::Zero;
|
||||
mStereoEyeOffset = Point3F::Zero;
|
||||
mCanCurrentlyRender = false;
|
||||
mInitialized = false;
|
||||
|
||||
|
|
@ -197,6 +196,9 @@ GFXDevice::GFXDevice()
|
|||
#elif defined TORQUE_OS_PS3
|
||||
GFXShader::addGlobalMacro( "TORQUE_OS_PS3" );
|
||||
#endif
|
||||
|
||||
mStereoTargets[0] = NULL;
|
||||
mStereoTargets[1] = NULL;
|
||||
}
|
||||
|
||||
GFXDrawUtil* GFXDevice::getDrawUtil()
|
||||
|
|
|
|||
|
|
@ -213,6 +213,9 @@ public:
|
|||
/// The device is about to finish rendering a frame
|
||||
deEndOfFrame,
|
||||
|
||||
/// The device has rendered a frame and ended the scene
|
||||
dePostFrame,
|
||||
|
||||
/// The device has started rendering a frame's field (such as for side-by-side rendering)
|
||||
deStartOfField,
|
||||
|
||||
|
|
@ -244,7 +247,12 @@ public:
|
|||
enum GFXDeviceRenderStyles
|
||||
{
|
||||
RS_Standard = 0,
|
||||
RS_StereoSideBySide = (1<<0),
|
||||
RS_StereoSideBySide = (1<<0), // Render into current Render Target side-by-side
|
||||
};
|
||||
|
||||
enum GFXDeviceLimits
|
||||
{
|
||||
NumStereoPorts = 2
|
||||
};
|
||||
|
||||
private:
|
||||
|
|
@ -277,7 +285,19 @@ protected:
|
|||
Point2F mCurrentProjectionOffset;
|
||||
|
||||
/// Eye offset used when using a stereo rendering style
|
||||
Point3F mStereoEyeOffset;
|
||||
Point3F mStereoEyeOffset[NumStereoPorts];
|
||||
|
||||
MatrixF mStereoEyeTransforms[NumStereoPorts];
|
||||
MatrixF mInverseStereoEyeTransforms[NumStereoPorts];
|
||||
|
||||
/// Fov port settings
|
||||
FovPort mFovPorts[NumStereoPorts];
|
||||
|
||||
/// Destination viewports for stereo rendering
|
||||
RectI mStereoViewports[NumStereoPorts];
|
||||
|
||||
/// Destination targets for stereo rendering
|
||||
GFXTextureTarget* mStereoTargets[NumStereoPorts];
|
||||
|
||||
/// This will allow querying to see if a device is initialized and ready to
|
||||
/// have operations performed on it.
|
||||
|
|
@ -323,10 +343,50 @@ public:
|
|||
void setCurrentProjectionOffset(const Point2F& offset) { mCurrentProjectionOffset = offset; }
|
||||
|
||||
/// Get the current eye offset used during stereo rendering
|
||||
const Point3F& getStereoEyeOffset() { return mStereoEyeOffset; }
|
||||
const Point3F* getStereoEyeOffsets() { return mStereoEyeOffset; }
|
||||
|
||||
const MatrixF* getStereoEyeTransforms() { return mStereoEyeTransforms; }
|
||||
const MatrixF* getInverseStereoEyeTransforms() { return mInverseStereoEyeTransforms; }
|
||||
|
||||
/// Set the current eye offset used during stereo rendering
|
||||
void setStereoEyeOffset(const Point3F& offset) { mStereoEyeOffset = offset; }
|
||||
void setStereoEyeOffsets(Point3F *offsets) { dMemcpy(mStereoEyeOffset, offsets, sizeof(Point3F) * NumStereoPorts); }
|
||||
|
||||
void setStereoEyeTransforms(MatrixF *transforms) { dMemcpy(mStereoEyeTransforms, transforms, sizeof(mStereoEyeTransforms)); dMemcpy(mInverseStereoEyeTransforms, transforms, sizeof(mInverseStereoEyeTransforms)); mInverseStereoEyeTransforms[0].inverse(); mInverseStereoEyeTransforms[1].inverse(); }
|
||||
|
||||
/// Set the current eye offset used during stereo rendering. Assumes NumStereoPorts are available.
|
||||
void setFovPort(const FovPort *ports) { dMemcpy(mFovPorts, ports, sizeof(mFovPorts)); }
|
||||
|
||||
/// Get the current eye offset used during stereo rendering
|
||||
const FovPort* getSteroFovPort() { return mFovPorts; }
|
||||
|
||||
/// Sets stereo viewports
|
||||
void setSteroViewports(const RectI *ports) { dMemcpy(mStereoViewports, ports, sizeof(RectI) * NumStereoPorts); }
|
||||
|
||||
/// Sets stereo render targets
|
||||
void setStereoTargets(GFXTextureTarget **targets) { mStereoTargets[0] = targets[0]; mStereoTargets[1] = targets[1]; }
|
||||
|
||||
RectI* getStereoViewports() { return mStereoViewports; }
|
||||
|
||||
/// Activates a stereo render target, setting the correct viewport to render eye contents.
|
||||
/// If eyeId is -1, set a viewport encompassing the entire size of the render targets.
|
||||
void activateStereoTarget(S32 eyeId)
|
||||
{
|
||||
if (eyeId == -1)
|
||||
{
|
||||
if (mStereoTargets[0])
|
||||
{
|
||||
setActiveRenderTarget(mStereoTargets[0], true);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mStereoTargets[eyeId])
|
||||
{
|
||||
setActiveRenderTarget(mStereoTargets[eyeId], false);
|
||||
}
|
||||
setViewport(mStereoViewports[eyeId]);
|
||||
}
|
||||
}
|
||||
|
||||
GFXCardProfiler* getCardProfiler() const { return mCardProfiler; }
|
||||
|
||||
|
|
@ -722,8 +782,8 @@ public:
|
|||
/// Returns the number of simultaneous render targets supported by the device.
|
||||
virtual U32 getNumRenderTargets() const = 0;
|
||||
|
||||
virtual void setShader( GFXShader *shader ) {}
|
||||
virtual void disableShaders() {} // TODO Remove when T3D 4.0
|
||||
virtual void setShader( GFXShader *shader, bool force = false ) {}
|
||||
virtual void disableShaders( bool force = false ) {} // TODO Remove when T3D 4.0
|
||||
|
||||
/// Set the buffer! (Actual set happens on the next draw call, just like textures, state blocks, etc)
|
||||
void setShaderConstBuffer(GFXShaderConstBuffer* buffer);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue