diff options
| author | git perforce import user <a@b> | 2016-10-25 12:29:14 -0600 |
|---|---|---|
| committer | Sheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees> | 2016-10-25 18:56:37 -0500 |
| commit | 3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch) | |
| tree | fa6485c169e50d7415a651bf838f5bcd0fd3bfbd /PhysX_3.4/Samples/SampleBase/RenderMaterial.cpp | |
| download | physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.tar.xz physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.zip | |
Initial commit:
PhysX 3.4.0 Update @ 21294896
APEX 1.4.0 Update @ 21275617
[CL 21300167]
Diffstat (limited to 'PhysX_3.4/Samples/SampleBase/RenderMaterial.cpp')
| -rw-r--r-- | PhysX_3.4/Samples/SampleBase/RenderMaterial.cpp | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/PhysX_3.4/Samples/SampleBase/RenderMaterial.cpp b/PhysX_3.4/Samples/SampleBase/RenderMaterial.cpp new file mode 100644 index 00000000..25313c80 --- /dev/null +++ b/PhysX_3.4/Samples/SampleBase/RenderMaterial.cpp @@ -0,0 +1,184 @@ +// This code contains NVIDIA Confidential Information and is disclosed to you +// under a form of NVIDIA software license agreement provided separately to you. +// +// Notice +// NVIDIA Corporation and its licensors retain all intellectual property and +// proprietary rights in and to this software and related documentation and +// any modifications thereto. Any use, reproduction, disclosure, or +// distribution of this software and related documentation without an express +// license agreement from NVIDIA Corporation is strictly prohibited. +// +// ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES +// NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. +// +// Information and code furnished is believed to be accurate and reliable. +// However, NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2008-2016 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#include "SamplePreprocessor.h" +#include "RenderMaterial.h" +#include "RenderTexture.h" +#include "RendererMaterialDesc.h" +#include "Renderer.h" +#include "RendererMaterial.h" +#include "RendererMaterialInstance.h" +#include "RendererMemoryMacros.h" + +using namespace physx; +using namespace SampleRenderer; + +const char* defaultMaterialLitVertexShader = "vertex/staticmesh.cg"; +const char* defaultMaterialTexturedUnlitFragmentShader = "fragment/sample_diffuse_and_texture.cg"; +const char* defaultMaterialTexturedLitFragmentShader = "fragment/sample_diffuse_and_texture.cg"; +const char* defaultMaterialFragmentShader = "fragment/sample_diffuse_no_texture.cg"; + +RenderMaterial::RenderMaterial(Renderer& renderer, const PxVec3& diffuseColor, PxReal opacity, bool doubleSided, PxU32 id, RenderTexture* texture, bool lit, bool flat, bool instanced) : + mRenderMaterial (NULL), + mRenderMaterialInstance (NULL), + mID (id), + mDoubleSided (doubleSided), + mOwnsRendererMaterial (true) +{ + RendererMaterialDesc matDesc; + if(lit) + matDesc.type = RendererMaterial::TYPE_LIT; + else + matDesc.type = RendererMaterial::TYPE_UNLIT; + matDesc.alphaTestFunc = RendererMaterial::ALPHA_TEST_ALWAYS; + matDesc.alphaTestRef = 0.0f; + if(opacity==1.0f) + { + matDesc.blending = false; + matDesc.srcBlendFunc = RendererMaterial::BLEND_ONE; + matDesc.dstBlendFunc = RendererMaterial::BLEND_ONE; + } + else + { + matDesc.type = RendererMaterial::TYPE_UNLIT; + matDesc.blending = true; +// matDesc.srcBlendFunc = RendererMaterial::BLEND_ONE; +// matDesc.dstBlendFunc = RendererMaterial::BLEND_ONE; + matDesc.srcBlendFunc = RendererMaterial::BLEND_SRC_ALPHA; + matDesc.dstBlendFunc = RendererMaterial::BLEND_ONE_MINUS_SRC_ALPHA; + } + + if(instanced) + { + matDesc.instanced = true; + } + else + { + matDesc.instanced = false; + } + + matDesc.geometryShaderPath = NULL; + + matDesc.vertexShaderPath = defaultMaterialLitVertexShader; + + if(texture) + { + if(lit) + { + matDesc.fragmentShaderPath = defaultMaterialTexturedLitFragmentShader; + } + else + { + matDesc.fragmentShaderPath = defaultMaterialTexturedUnlitFragmentShader; + } + } + else + { + matDesc.fragmentShaderPath = defaultMaterialFragmentShader; + } + PX_ASSERT(matDesc.isValid()); + + mRenderMaterial = renderer.createMaterial(matDesc); + mRenderMaterialInstance = new RendererMaterialInstance(*mRenderMaterial); + + setDiffuseColor(PxVec4(diffuseColor.x, diffuseColor.y, diffuseColor.z, opacity)); + setShadeMode(flat); + + update(renderer); + + if(texture) + { + const RendererMaterial::Variable* var = mRenderMaterialInstance->findVariable("diffuseTexture", RendererMaterial::VARIABLE_SAMPLER2D); + //PX_ASSERT(var); + if(var) + mRenderMaterialInstance->writeData(*var, &texture->mTexture); + } +} + +RenderMaterial::RenderMaterial(Renderer& renderer, RendererMaterial* mat, RendererMaterialInstance* matInstance, PxU32 id) : + mRenderMaterial (mat), + mRenderMaterialInstance (matInstance), + mID (id), + mDoubleSided (false), + mOwnsRendererMaterial (false) +{ + update(renderer); +} + +void RenderMaterial::update(SampleRenderer::Renderer& renderer) +{ + const RendererMaterial::Variable* var = mRenderMaterialInstance->findVariable("windowWidth", RendererMaterial::VARIABLE_FLOAT); + if(var) + { + PxU32 tmpWindowWidth, tmpWindowHeight; + renderer.getWindowSize(tmpWindowWidth, tmpWindowHeight); + + const PxReal windowWidth = PxReal(tmpWindowWidth); + mRenderMaterialInstance->writeData(*var, &windowWidth); + } + +} + +void RenderMaterial::setParticleSize(const PxReal particleSize) +{ + const RendererMaterial::Variable* var = mRenderMaterialInstance->findVariable("particleSize", RendererMaterial::VARIABLE_FLOAT); + if(var) + { + mRenderMaterialInstance->writeData(*var, &particleSize); + } +} + +void RenderMaterial::setDiffuseColor(const PxVec4& color) +{ + const RendererMaterial::Variable* var = mRenderMaterialInstance->findVariable("diffuseColor", RendererMaterial::VARIABLE_FLOAT4); + if(var) + { + const PxReal data[] = { color.x, color.y, color.z, color.w }; + mRenderMaterialInstance->writeData(*var, data); + } +} + +void RenderMaterial::setShadeMode(bool flat) +{ + const RendererMaterial::Variable* var = mRenderMaterialInstance->findVariable("shadeMode", RendererMaterial::VARIABLE_FLOAT); + if(var) + { + float shadeMode = flat?1.0f:0.0f; + mRenderMaterialInstance->writeData(*var, &shadeMode); + } +} + +RenderMaterial::~RenderMaterial() +{ + if(mOwnsRendererMaterial) + { + DELETESINGLE(mRenderMaterialInstance); + SAFE_RELEASE(mRenderMaterial); + } +} |