Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Engine\source\ts\tsRenderState.h
- class TSRenderState
- {
- protected: //test_material
- SimObjectId mCreatorObjectId; //test_material
- public: //test_material
- const SimObjectId &getCOI() const { return mCreatorObjectId; } //test_material
- void setCOI(const SimObjectId &val) { mCreatorObjectId = val; } //test_material
- Engine\source\ts\tsRenderState.cpp (TSRenderState::TSRenderState())
- change
- mAccuTex( NULL )
- to:
- mAccuTex( NULL ),
- mCreatorObjectId(0) //test_material Note: delete previous comma if we delete this
- Engine\source\T3D\shapeBase.cpp (in void ShapeBase::prepBatchRender( after rdata.setFadeOverride(...);)
- rdata.setCOI(getId()); //test_material
- Engine\source\T3D\tsStatic.cpp (in void TSStatic::prepRenderImage( after rdata.setOriginSort( mUseOriginSort );)
- rdata.setCOI(getId()); //test_material
- Engine\source\renderInstance\renderPassManager.h (inside struct MeshRenderInst : public RenderInst add)
- SimObjectId creatorObjectId; //test_material
- Engine\source\renderInstance\renderPassManager.cpp (in void MeshRenderInst::clear() )
- creatorObjectId = 0; //test_material
- Engine\source\ts\tsMesh.cpp (in void TSMesh::innerRender( TSMaterialList *materials, const TSRenderState &rdata, TSVertexBufferHandle &vb, GFXPrimitiveBufferHandle &pb )
- careful, there is another TSMesh::innerRender. We must use the correct one.
- Then, after coreRI->type = RenderPassManager::RIT_Mesh;)
- coreRI->creatorObjectId = rdata.getCOI(); //test_material
- Engine\source\materials\sceneData.h (in struct SceneData{ after F32 visibility;)
- SimObjectId creatorObjectId; //test_material
- Engine\source\renderInstance\renderBinManager.cpp in (void RenderBinManager::setupSGData( )
- data.creatorObjectId = ri->creatorObjectId; //test_material
- Engine\source\materials\processedShaderMaterial.cpp
- 1st- #include our custom .h (we have there DeclareFeatureType( MFT_CustomShaderObject );)
- 2nd- In "void ProcessedShaderMaterial::_determineFeatures( " before "// Allow features to add themselves." add:
- fd.features.addFeature( MFT_CustomShaderObject ); //test_material //to do: add a conditional
- ------------------------------------------------------------------------
- customShaderObject.h
- ------------------------------------------------------------------------
- #ifndef _CUSTOM_SHADERGEN_OBJECT_H_
- #define _CUSTOM_SHADERGEN_OBJECT_H_
- #ifndef _SHADERGEN_H_
- #include "shaderGen/shaderGen.h"
- #endif
- #ifndef _FEATURETYPE_H_
- #include "materials/materialFeatureTypes.h"
- #endif
- class GFXShaderConstHandle;
- class CustomShaderObjectConstHandles : public ShaderFeatureConstHandles
- {
- public:
- GFXShaderConstHandle *mAlphaMultiplier;
- // ShaderFeatureConstHandles
- virtual void init( GFXShader *shader );
- virtual void setConsts( SceneRenderState *state,
- const SceneData &sgData,
- GFXShaderConstBuffer *buffer );
- };
- //----------------------------------------------------------------------
- #ifndef _SHADERGEN_HLSL_SHADERFEATUREHLSL_H_
- #include "shaderGen/HLSL/shaderFeatureHLSL.h"
- #endif
- class CustomShaderObjectHLSL : public ShaderFeatureHLSL
- {
- protected:
- //ShaderIncludeDependency mDep;
- public:
- CustomShaderObjectHLSL();
- //virtual void processVert( Vector<ShaderComponent*> &componentList, const MaterialFeatureData &fd );
- virtual void processPix( Vector<ShaderComponent*> &componentList, const MaterialFeatureData &fd );
- virtual String getName() { return "CustomShaderObject"; }
- virtual void determineFeature( Material *material,
- const GFXVertexFormat *vertexFormat,
- U32 stageNum,
- const FeatureType &type,
- const FeatureSet &features,
- MaterialFeatureData *outFeatureData );
- virtual ShaderFeatureConstHandles* createConstHandles( GFXShader *shader, SimObject *userObject );
- };
- //----------------------------------------------------------------------
- DeclareFeatureType( MFT_CustomShaderObject );
- #endif // _CUSTOM_SHADERGEN_OBJECT_H_
- ------------------------------------------------------------------------
- ------------------------------------------------------------------------
- ------------------------------------------------------------------------
- ------------------------------------------------------------------------
- customShaderObject.cpp
- ------------------------------------------------------------------------
- #include "platform/platform.h"
- #include "customShaderObject.h"
- #include "materials/sceneData.h"
- #include "scene/sceneRenderState.h"
- #include "gfx/gfxShader.h"
- #include "gfx/gfxStructs.h"
- #include "core/util/str.h"
- ImplementFeatureType( MFT_CustomShaderObject , MFG_PostProcess, 998.0f, true );
- void CustomShaderObjectConstHandles::init( GFXShader *shader )
- {
- mAlphaMultiplier = shader->getShaderConstHandle( "$alphaMultiplier" );
- }
- void CustomShaderObjectConstHandles::setConsts( SceneRenderState *state,
- const SceneData &sgData,
- GFXShaderConstBuffer *buffer )
- {
- PROFILE_SCOPE( CustomShaderObjectConstHandles_setConsts );
- F32 alpha = 1.0f;
- SimObject *object = Sim::findObject( sgData.creatorObjectId );
- if( object )
- {
- String v = object->getDataField("cAlpha", "");
- if(!v.isEmpty())
- alpha = dAtof(v);
- }
- buffer->setSafe( mAlphaMultiplier, alpha );
- }
- //----------------------------------------------------------------------
- #include "shaderGen/shaderGen.h"
- #include "shaderGen/featureMgr.h"
- #include "shaderGen/langElement.h"
- #include "shaderGen/shaderOp.h"
- #include "shaderGen/shaderGenVars.h"
- #include "core/module.h"
- static void _onRegisterFeatures( GFXAdapterType type )
- {
- if ( type == OpenGL )
- return;
- FEATUREMGR->registerFeature( MFT_CustomShaderObject, new CustomShaderObjectHLSL );
- }
- MODULE_BEGIN( CustomShaderObjectHLSL )
- MODULE_INIT_AFTER( ShaderGen )
- MODULE_INIT
- {
- SHADERGEN->getFeatureInitSignal().notify( _onRegisterFeatures );
- }
- MODULE_END;
- CustomShaderObjectHLSL::CustomShaderObjectHLSL()
- //: mDep(String(Con::getVariable("$Core::CommonShaderPath")) + String("/wind.hlsl" ))
- {
- //addDependency( &mDep );
- }
- void CustomShaderObjectHLSL::determineFeature( Material *material,
- const GFXVertexFormat *vertexFormat,
- U32 stageNum,
- const FeatureType &type,
- const FeatureSet &features,
- MaterialFeatureData *outFeatureData )
- {
- bool enabled = features.hasFeature( MFT_CustomShaderObject );
- outFeatureData->features.setFeature( type, enabled );
- }
- void CustomShaderObjectHLSL::processPix( Vector<ShaderComponent*> &componentList, const MaterialFeatureData &fd )
- {
- // Find the constant value
- Var *alphaMult = (Var*)LangElement::find( "alphaMultiplier" );
- if ( !alphaMult )
- {
- alphaMult = new Var( "alphaMultiplier", "float" );
- alphaMult->uniform = true;
- alphaMult->constSortPos = cspPass;
- }
- // Find output fragment
- Var *color = (Var*) LangElement::find( getOutputTargetVarName(DefaultTarget) );
- if ( !color )
- {
- color = new Var;
- color->setType( GFX->getAdapterType() == OpenGL ? "vec4" : "fragout" );
- color->setName( getOutputTargetVarName(DefaultTarget) );
- if(GFX->getAdapterType() != OpenGL)
- color->setStructName( "OUT" );
- output = new GenOp( "@ = float4(0,0,0,@)", color, alphaMult );
- }
- output = new GenOp( " @ *= float4(1,1,1,@);\r\n", color, alphaMult );
- }
- ShaderFeatureConstHandles* CustomShaderObjectHLSL::createConstHandles( GFXShader *shader, SimObject *userObject )
- {
- CustomShaderObjectConstHandles *handles = new CustomShaderObjectConstHandles();
- handles->init( shader );
- return handles;
- }
- ------------------------------------------------------------------------
- ------------------------------------------------------------------------
- ------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement