63mBBOrigin (BBO_CENTER),
64mFadeVisibleDist (0.f),
65mFadeInvisibleDist (0.f)
67 assert(rootSceneNode);
69 mpSceneNode = rootSceneNode->createChildSceneNode();
75 HighLevelGpuProgramManager& mgr = HighLevelGpuProgramManager::getSingleton();
76 s_isGLSL = mgr.isLanguageSupported(
"glsl");
77 Ogre::String shaderLanguage =
s_isGLSL ?
"glsl" : mgr.isLanguageSupported(
"hlsl") ?
"hlsl" :
"cg";
85 " float4 position : POSITION, \n"
86 " float3 normal : NORMAL, \n"
87 " float4 color : COLOR, \n"
88 " float2 uv : TEXCOORD0, \n"
89 " out float4 oPosition : POSITION, \n"
90 " out float2 oUv : TEXCOORD0, \n"
91 " out float4 oColor : COLOR, \n"
92 " out float oFog : FOG, \n"
93 " uniform float4x4 worldViewProj, \n"
94 " uniform float uScroll, \n"
95 " uniform float vScroll, \n"
96 " uniform float4 preRotatedQuad[4] ) \n"
99 " float4 vCenter = float4( position.x, position.y, position.z, 1.0f ); \n"
100 " float4 vScale = float4( normal.x, normal.y, normal.x, 1.0f ); \n"
101 " oPosition = mul( worldViewProj, vCenter + (preRotatedQuad[normal.z] * vScale) ); \n"
104 " oColor = color; \n"
108 " oUv.x += uScroll; \n"
109 " oUv.y += vScroll; \n"
112 " oFog = oPosition.z; \n"
118 "uniform mat4 worldViewProj;\n"
119 "uniform float uScroll; \n"
120 "uniform float vScroll; \n"
121 "uniform vec4 preRotatedQuad[4]; \n"
125 " vec4 vCenter = vec4( gl_Vertex.x, gl_Vertex.y, gl_Vertex.z, 1.0 ); \n"
126 " vec4 vScale = vec4( gl_Normal.x, gl_Normal.y, gl_Normal.x , 1.0 ); \n"
127 " gl_Position = worldViewProj * (vCenter + (preRotatedQuad[int(gl_Normal.z)] * vScale) ); \n"
130 " gl_FrontColor = gl_Color; \n"
133 " gl_TexCoord[0] = gl_MultiTexCoord0; \n"
134 " gl_TexCoord[0].x += uScroll; \n"
135 " gl_TexCoord[0].y += vScroll; \n"
138 " gl_FogFragCoord = gl_Position.z; \n"
142 HighLevelGpuProgramPtr vertexShader = HighLevelGpuProgramManager::getSingleton().getByName(
"Sprite_vp");
143 OgreAssert(!vertexShader,
"Sprite_vp already exist");
145 vertexShader = HighLevelGpuProgramManager::getSingleton().createProgram(
146 "Sprite_vp", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, shaderLanguage, GPT_VERTEX_PROGRAM);
147 vertexShader->setSource(vertexProg);
152 if (shaderLanguage ==
"hlsl")
154 vertexShader->setParameter(
"target",
"vs_1_1");
155 vertexShader->setParameter(
"entry_point",
"Sprite_vp");
157 else if(shaderLanguage ==
"cg")
159 vertexShader->setParameter(
"profiles",
"vs_1_1 arbvp1");
160 vertexShader->setParameter(
"entry_point",
"Sprite_vp");
164 assert(
false &&
"Unknown shader language");
169 vertexShader->load();
178 "void SpriteFade_vp( \n"
179 " float4 position : POSITION, \n"
180 " float3 normal : NORMAL, \n"
181 " float4 color : COLOR, \n"
182 " float2 uv : TEXCOORD0, \n"
183 " out float4 oPosition : POSITION, \n"
184 " out float2 oUv : TEXCOORD0, \n"
185 " out float4 oColor : COLOR, \n"
186 " out float oFog : FOG, \n"
187 " uniform float4x4 worldViewProj, \n"
189 " uniform float3 camPos, \n"
190 " uniform float fadeGap, \n"
191 " uniform float invisibleDist, \n"
193 " uniform float uScroll, \n"
194 " uniform float vScroll, \n"
195 " uniform float4 preRotatedQuad[4] ) \n"
198 " float4 vCenter = float4( position.x, position.y, position.z, 1.0f ); \n"
199 " float4 vScale = float4( normal.x, normal.y, normal.x, 1.0f ); \n"
200 " oPosition = mul( worldViewProj, vCenter + (preRotatedQuad[normal.z] * vScale) ); \n"
202 " oColor.rgb = color.rgb; \n"
205 " float dist = distance(camPos.xz, position.xz); \n"
206 " oColor.a = (invisibleDist - dist) / fadeGap; \n"
210 " oUv.x += uScroll; \n"
211 " oUv.y += vScroll; \n"
214 " oFog = oPosition.z; \n"
220 "uniform mat4 worldViewProj;\n"
221 "uniform vec3 camPos; \n"
222 "uniform float fadeGap; \n"
223 "uniform float invisibleDist; \n"
224 "uniform float uScroll; \n"
225 "uniform float vScroll; \n"
226 "uniform vec4 preRotatedQuad[4]; \n"
230 " vec4 vCenter = vec4( gl_Vertex.x, gl_Vertex.y, gl_Vertex.z, 1.0 ); \n"
231 " vec4 vScale = vec4( gl_Normal.x, gl_Normal.y, gl_Normal.x , 1.0 ); \n"
232 " gl_Position = worldViewProj * (vCenter + (preRotatedQuad[int(gl_Normal.z)] * vScale) ); \n"
234 " gl_FrontColor.xyz = gl_Color.xyz; \n"
237 " vec4 position = gl_Vertex; \n"
238 " float dist = distance(camPos.xz, position.xz); \n"
239 " gl_FrontColor.w = (invisibleDist - dist) / fadeGap; \n"
242 " gl_TexCoord[0] = gl_MultiTexCoord0; \n"
243 " gl_TexCoord[0].x += uScroll; \n"
244 " gl_TexCoord[0].y += vScroll; \n"
247 " gl_FogFragCoord = gl_Position.z; \n"
251 HighLevelGpuProgramPtr vertexShader2 = HighLevelGpuProgramManager::getSingleton().getByName(
"SpriteFade_vp");
252 OgreAssert(!vertexShader2,
"SpriteFade_vp already exist");
253 vertexShader2 = HighLevelGpuProgramManager::getSingleton().createProgram(
"SpriteFade_vp",
254 ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, shaderLanguage, GPT_VERTEX_PROGRAM);
255 vertexShader2->setSource(vertexProg2);
261 if (shaderLanguage ==
"hlsl")
263 vertexShader2->setParameter(
"target",
"vs_1_1");
264 vertexShader2->setParameter(
"entry_point",
"SpriteFade_vp");
266 else if(shaderLanguage ==
"cg")
268 vertexShader2->setParameter(
"profiles",
"vs_1_1 arbvp1");
269 vertexShader2->setParameter(
"entry_point",
"SpriteFade_vp");
273 vertexShader2->load();
354 MeshManager::getSingleton().remove(
mPtrMesh);
363 mPtrMesh = MeshManager::getSingleton().createManual(
getUniqueID(
"SBSmesh"), ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
364 Ogre::SubMesh *pSubMesh =
mPtrMesh->createSubMesh();
365 pSubMesh->useSharedVertices =
false;
368 pSubMesh->vertexData =
new VertexData;
369 pSubMesh->vertexData->vertexStart = 0;
372 VertexDeclaration* dcl = pSubMesh->vertexData->vertexDeclaration;
374 dcl->addElement(0, offset, VET_FLOAT3, VES_POSITION);
375 offset += VertexElement::getTypeSize(VET_FLOAT3);
376 dcl->addElement(0, offset, VET_FLOAT3, VES_NORMAL);
377 offset += VertexElement::getTypeSize(VET_FLOAT3);
378 dcl->addElement(0, offset, VET_COLOUR, VES_DIFFUSE);
379 offset += VertexElement::getTypeSize(VET_COLOUR);
380 dcl->addElement(0, offset, VET_FLOAT2, VES_TEXTURE_COORDINATES);
381 offset += VertexElement::getTypeSize(VET_FLOAT2);
384 HardwareVertexBufferSharedPtr vbuf = HardwareBufferManager::getSingleton().createVertexBuffer(
385 offset, pSubMesh->vertexData->vertexCount, HardwareBuffer::HBU_STATIC_WRITE_ONLY,
false);
386 float* pReal =
static_cast<float*
>(vbuf->lock(HardwareBuffer::HBL_DISCARD));
388 float minX = (float)Math::POS_INFINITY, minY = (
float)Math::POS_INFINITY, minZ = (float)Math::POS_INFINITY;
389 float maxX = (float)Math::NEG_INFINITY, maxY = (
float)Math::NEG_INFINITY, maxZ = (float)Math::NEG_INFINITY;
393 for (
size_t ibb = 0; ibb < billboardCount; ++ibb)
405 memcpy(pReal, &(bb->
xPos), 5 *
sizeof(
float));
410 *(
reinterpret_cast< uint32*
>(pReal++)) = bb->
color;
423 memcpy(pReal, &(bb->
xPos), 5 *
sizeof(
float));
427 *(
reinterpret_cast< uint32*
>(pReal++)) = bb->
color;
440 memcpy(pReal, &(bb->
xPos), 5 *
sizeof(
float));
444 *(
reinterpret_cast< uint32*
> (pReal++)) = bb->
color;
457 memcpy(pReal, &(bb->
xPos), 5 *
sizeof(
float));
461 *(
reinterpret_cast< uint32*
>(pReal++)) = bb->
color;
473 if (bb->
zPos < minZ) minZ = bb->
zPos - 0.5f;
474 if (bb->
zPos > maxZ) maxZ = bb->
zPos + 0.5f;
481 pSubMesh->vertexData->vertexBufferBinding->setBinding(0, vbuf);
485 pSubMesh->indexData->indexStart = 0;
486 pSubMesh->indexData->indexCount = 6 * billboardCount;
487 assert(pSubMesh->indexData->indexCount <= std::numeric_limits<Ogre::uint16>::max() &&
"To many indices. Use 32 bit indices");
488 Ogre::HardwareIndexBufferSharedPtr &ptrIndBuf = pSubMesh->indexData->indexBuffer;
489 ptrIndBuf = HardwareBufferManager::getSingleton().createIndexBuffer(HardwareIndexBuffer::IT_16BIT,
490 pSubMesh->indexData->indexCount, HardwareBuffer::HBU_STATIC_WRITE_ONLY,
false);
492 Ogre::uint16 *pIBuf =
static_cast < Ogre::uint16*
> (ptrIndBuf->lock(HardwareBuffer::HBL_DISCARD));
493 for (Ogre::uint16 i = 0; i < billboardCount; ++i)
495 Ogre::uint16 offset = i * 4;
497 *pIBuf++ = 0 + offset;
498 *pIBuf++ = 2 + offset;
499 *pIBuf++ = 1 + offset;
501 *pIBuf++ = 1 + offset;
502 *pIBuf++ = 2 + offset;
503 *pIBuf++ = 3 + offset;
510 AxisAlignedBox bounds(minX, minY, minZ, maxX, maxY, maxZ);
512 Vector3 temp = bounds.getMaximum() - bounds.getMinimum();
513 mPtrMesh->_setBoundingSphereRadius(temp.length() * 0.5f);
516 Ogre::LoggingLevel logLev = LogManager::getSingleton().getDefaultLog()->getLogDetail();
517 LogManager::getSingleton().setLogDetail(LL_LOW);
519 LogManager::getSingleton().setLogDetail(logLev);
634 Real visibleDist_, Real invisibleDist_)
636 assert(protoMaterial);
638 Ogre::StringStream materialSignature;
640 materialSignature << visibleDist_ <<
"|";
641 materialSignature << invisibleDist_ <<
"|";
642 materialSignature << protoMaterial->getTechnique(0)->getPass(0)->getTextureUnitState(0)->getTextureUScroll() <<
"|";
643 materialSignature << protoMaterial->getTechnique(0)->getPass(0)->getTextureUnitState(0)->getTextureVScroll() <<
"|";
650 MaterialPtr fadeMaterial = protoMaterial->clone(
getUniqueID(
"ImpostorFade"));
653 for (
unsigned short t = 0; t < fadeMaterial->getNumTechniques(); ++t)
655 Technique *tech = fadeMaterial->getTechnique(t);
656 for (
unsigned short p = 0; p < tech->getNumPasses(); ++p)
658 Pass *pass = tech->getPass(p);
661 pass->setVertexProgram(
"SpriteFade_vp");
662 GpuProgramParametersSharedPtr params = pass->getVertexProgramParameters();
664 params->setNamedAutoConstant(
"worldViewProj", GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX);
666 static const Ogre::String uScroll =
"uScroll", vScroll =
"vScroll",
667 preRotatedQuad0 =
"preRotatedQuad[0]", preRotatedQuad1 =
"preRotatedQuad[1]",
668 preRotatedQuad2 =
"preRotatedQuad[2]", preRotatedQuad3 =
"preRotatedQuad[3]",
669 camPos =
"camPos", fadeGap =
"fadeGap", invisibleDist =
"invisibleDist";
671 params->setNamedAutoConstant(uScroll, GpuProgramParameters::ACT_CUSTOM);
672 params->setNamedAutoConstant(vScroll, GpuProgramParameters::ACT_CUSTOM);
673 params->setNamedAutoConstant(preRotatedQuad0, GpuProgramParameters::ACT_CUSTOM);
674 params->setNamedAutoConstant(preRotatedQuad1, GpuProgramParameters::ACT_CUSTOM);
675 params->setNamedAutoConstant(preRotatedQuad2, GpuProgramParameters::ACT_CUSTOM);
676 params->setNamedAutoConstant(preRotatedQuad3, GpuProgramParameters::ACT_CUSTOM);
678 params->setNamedAutoConstant(camPos, GpuProgramParameters::ACT_CAMERA_POSITION_OBJECT_SPACE);
679 params->setNamedAutoConstant(fadeGap, GpuProgramParameters::ACT_CUSTOM);
680 params->setNamedAutoConstant(invisibleDist, GpuProgramParameters::ACT_CUSTOM);
683 params->setNamedConstant(invisibleDist, invisibleDist_);
684 params->setNamedConstant(fadeGap, invisibleDist_ - visibleDist_);
686 pass->setSceneBlending(SBT_TRANSPARENT_ALPHA);
695 s_mapFadedMaterial.insert(std::pair<String, MaterialPtr>(materialSignature.str(), fadeMaterial));
710 Vector3 forward = cameraDirection;
711 Vector3 vRight = forward.crossProduct(Vector3::UNIT_Y);
712 Vector3 vUp = forward.crossProduct(vRight);
722 Vector3 vPoint0 = (-vRight + vUp);
723 Vector3 vPoint1 = ( vRight + vUp);
724 Vector3 vPoint2 = (-vRight - vUp);
725 Vector3 vPoint3 = ( vRight - vUp);
727 float preRotatedQuad_BBO_CENTER[16] =
729 (float)vPoint0.x, (
float)vPoint0.y, (float)vPoint0.z, 0.0f,
730 (
float)vPoint1.x, (float)vPoint1.y, (
float)vPoint1.z, 0.0f,
731 (float)vPoint2.x, (
float)vPoint2.y, (float)vPoint2.z, 0.0f,
732 (
float)vPoint3.x, (float)vPoint3.y, (
float)vPoint3.z, 0.0f
735 vPoint0 = (-vRight + vUp + vUp);
736 vPoint1 = ( vRight + vUp + vUp);
739 float preRotatedQuad_BBO_BOTTOM_CENTER[16] =
741 (float)vPoint0.x, (
float)vPoint0.y, (float)vPoint0.z, 0.0f,
742 (
float)vPoint1.x, (float)vPoint1.y, (
float)vPoint1.z, 0.0f,
743 (float)vPoint2.x, (
float)vPoint2.y, (float)vPoint2.z, 0.0f,
744 (
float)vPoint3.x, (float)vPoint3.y, (
float)vPoint3.z, 0.0f
748 static const Ogre::String uScroll =
"uScroll", vScroll =
"vScroll", preRotatedQuad0 =
"preRotatedQuad[0]",
749 preRotatedQuad1 =
"preRotatedQuad[1]", preRotatedQuad2 =
"preRotatedQuad[2]", preRotatedQuad3 =
"preRotatedQuad[3]";
752 const GpuConstantDefinition *pGPU_ConstDef_preRotatedQuad0 = 0,
753 *pGPU_ConstDef_uScroll = 0, *pGPU_ConstDef_vScroll = 0;
759 Ogre::Material *mat = i1->second->getMaterial();
762 Pass *p = mat->getTechnique(0)->getPass(0);
763 if (!p->hasVertexProgram())
765 static const Ogre::String Sprite_vp =
"Sprite_vp";
766 p->setVertexProgram(Sprite_vp);
768 p->getVertexProgramParameters()->setNamedAutoConstant(
"worldViewProj", GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX);
770 GpuProgramParametersSharedPtr params = p->getVertexProgramParameters();
771 params->setNamedAutoConstant(uScroll, GpuProgramParameters::ACT_CUSTOM);
772 params->setNamedAutoConstant(vScroll, GpuProgramParameters::ACT_CUSTOM);
773 params->setNamedAutoConstant(preRotatedQuad0, GpuProgramParameters::ACT_CUSTOM);
774 params->setNamedAutoConstant(preRotatedQuad1, GpuProgramParameters::ACT_CUSTOM);
775 params->setNamedAutoConstant(preRotatedQuad2, GpuProgramParameters::ACT_CUSTOM);
776 params->setNamedAutoConstant(preRotatedQuad3, GpuProgramParameters::ACT_CUSTOM);
780 const float *pQuad = i1->second->getOrigin() == BBO_CENTER ? preRotatedQuad_BBO_CENTER : preRotatedQuad_BBO_BOTTOM_CENTER;
783 GpuProgramParametersSharedPtr params = p->getVertexProgramParameters();
793 const GpuConstantDefinition *def = params->_findNamedConstantDefinition(preRotatedQuad0,
true);
794 if (def != pGPU_ConstDef_preRotatedQuad0)
796 pGPU_ConstDef_preRotatedQuad0 = def;
797 pGPU_ConstDef_uScroll = params->_findNamedConstantDefinition(uScroll,
true);
798 pGPU_ConstDef_vScroll = params->_findNamedConstantDefinition(vScroll,
true);
802 float fUScroll = (float)p->getTextureUnitState(0)->getTextureUScroll(),
803 fVScroll = (float)p->getTextureUnitState(0)->getTextureVScroll();
804 params->_writeRawConstants(pGPU_ConstDef_preRotatedQuad0->physicalIndex, pQuad, 16);
805 params->_writeRawConstants(pGPU_ConstDef_uScroll->physicalIndex, &fUScroll, 1);
806 params->_writeRawConstants(pGPU_ConstDef_vScroll->physicalIndex, &fVScroll, 1);