#include <lod_character_manager.h>
Nevrax France
Definition at line 107 of file lod_character_manager.h.
Instance texturing. | |
CRGBA * | getTextureInstance (CLodCharacterInstance &instance) |
CSmartPtr< CTextureBlank > | _BigTexture |
std::vector< uint > | _FreeIds |
CLodCharacterTmpBitmap | _TmpBitmaps [256] |
Public Member Functions | |
CLodCharacterManager () | |
Constructor. | |
~CLodCharacterManager () | |
render process | |
bool | addRenderCharacterKey (CLodCharacterInstance &instance, const CMatrix &worldMatrix, CRGBA ambient, CRGBA diffuse, const CVector &lightDir) |
void | beginRender (IDriver *driver, const CVector &managerPos) |
void | endRender () |
uint32 | getMaxVertex () const |
see setMaxVertex() | |
uint32 | getVertexStreamNumVBHard () const |
see setVertexStreamNumVBHard | |
bool | isRendering () const |
tells if we are beetween a beginRender() and a endRender() | |
void | setMaxVertex (uint32 maxVertex) |
void | setupNormalCorrectionMatrix (const CMatrix &normalMatrix) |
void | setVertexStreamNumVBHard (uint32 numVBHard) |
Instance texturing. | |
void | addTextureCompute (CLodCharacterInstance &instance, const CLodCharacterTexture &lodTexture) |
add a texture from an instance. Texture Lookup are made in _TmpBitmaps | |
void | endTextureCompute (CLodCharacterInstance &instance, uint numBmpToReset) |
end and compile. reset/free memory of _TmpBitmaps up to numBmpToReset. | |
CLodCharacterTmpBitmap & | getTmpBitmap (uint8 id) |
get a tmp bitmap for a special slot. caller can fill RGBA texture for the associated material Id in it. | |
void | initInstance (CLodCharacterInstance &instance) |
Init the instance texturing with this manager. A texture space is reserved (if possible), and UVs are generated. | |
void | releaseInstance (CLodCharacterInstance &instance) |
Release a lod instance. Free texture space. | |
bool | startTextureCompute (CLodCharacterInstance &instance) |
reset the textureSpace. Instance must have been inited (nlassert). return false if no more texture space available | |
build process | |
bool | compile () |
uint32 | createShapeBank () |
void | deleteShapeBank (uint32 bankId) |
delete a Shape Bank. No-op if bad id. | |
const CLodCharacterShape * | getShape (uint32 shapeId) const |
Get a const ref on a shape. Ptr not valid if shape Banks are modfied. NULL if not found. | |
CLodCharacterShapeBank * | getShapeBank (uint32 bankId) |
get a shape Bank. UseFull for serialisation for example. return NULL if not found | |
const CLodCharacterShapeBank * | getShapeBank (uint32 bankId) const |
get a shape Bank. UseFull for serialisation for example. return NULL if not found | |
sint32 | getShapeIdByName (const std::string &name) const |
void | reset () |
reset the manager. | |
Private Types | |
typedef TStrIdMap::const_iterator | CstItStrIdMap |
typedef TStrIdMap::iterator | ItStrIdMap |
typedef std::map< std::string, uint32 > | TStrIdMap |
Map name To Id. | |
Private Attributes | |
std::vector< CLodCharacterShapeBank * > | _ShapeBankArray |
Array of shapeBank. | |
TStrIdMap | _ShapeMap |
Map of shape id. | |
render process | |
uint | _CurrentTriId |
uint | _CurrentVertexId |
CMatrix | _LightCorrectionMatrix |
bool | _LockDone |
CVector | _ManagerMatrixPos |
CMaterial | _Material |
uint | _MaxNumVertices |
uint | _NumVBHard |
bool | _Rendering |
std::vector< uint32 > | _Triangles |
uint8 * | _VertexData |
uint | _VertexSize |
CVertexStreamManager | _VertexStream |
|
Definition at line 247 of file lod_character_manager.h. Referenced by getShapeIdByName(). |
|
Definition at line 246 of file lod_character_manager.h. Referenced by compile(). |
|
Map name To Id.
Definition at line 245 of file lod_character_manager.h. |
|
Constructor.
Definition at line 68 of file lod_character_manager.cpp. References _BigTexture, _FreeIds, _LightCorrectionMatrix, _LockDone, _MaxNumVertices, _NumVBHard, _Rendering, NL3D::CMaterial::initUnlit(), NLMISC::CMatrix::invert(), NL3D_CLOD_BIGTEXT_HEIGHT, NL3D_CLOD_BIGTEXT_WIDTH, NL3D_CLOD_TEXT_NUM_IDS, NLMISC::Pi, NLMISC::CMatrix::rotateZ(), NL3D::CMaterial::setAlphaTest(), NL3D::CMaterial::setDoubleSided(), NL3D::CMaterial::setTexture(), and uint.
00069 { 00070 _MaxNumVertices= 3000; 00071 _NumVBHard= 8; 00072 _Rendering= false; 00073 _LockDone= false; 00074 00075 // setup the texture. 00076 _BigTexture= new CTextureBlank; 00077 // The texture always reside in memory... This take 1Mo of RAM. (16*32*16*32 * 4) 00078 // NB: this is simplier like that, and this is not a problem, since only 1 or 2 Mo are allocated :o) 00079 _BigTexture->setReleasable(false); 00080 // create the bitmap. 00081 _BigTexture->resize(NL3D_CLOD_BIGTEXT_WIDTH, NL3D_CLOD_BIGTEXT_HEIGHT, CBitmap::RGBA); 00082 // Format of texture, 16 bits and no mipmaps. 00083 _BigTexture->setUploadFormat(ITexture::RGB565); 00084 _BigTexture->setFilterMode(ITexture::Linear, ITexture::LinearMipMapOff); 00085 _BigTexture->setWrapS(ITexture::Clamp); 00086 _BigTexture->setWrapT(ITexture::Clamp); 00087 00088 // Alloc free Ids 00089 _FreeIds.resize(NL3D_CLOD_TEXT_NUM_IDS); 00090 for(uint i=0;i<_FreeIds.size();i++) 00091 { 00092 _FreeIds[i]= i; 00093 } 00094 00095 // setup the material 00096 _Material.initUnlit(); 00097 _Material.setAlphaTest(true); 00098 _Material.setDoubleSided(true); 00099 _Material.setTexture(0, _BigTexture); 00100 00101 // setup for lighting, Default for Ryzom setup 00102 _LightCorrectionMatrix.rotateZ((float)Pi/2); 00103 _LightCorrectionMatrix.invert(); 00104 } |
|
Definition at line 108 of file lod_character_manager.cpp. References reset().
00109 { 00110 reset(); 00111 } |
|
Add an instance to the render list. nlassert if not isRendering() initInstance() must have been called before (nlassert)
Definition at line 359 of file lod_character_manager.cpp. References _CurrentTriId, _CurrentVertexId, _LightCorrectionMatrix, _LockDone, _ManagerMatrixPos, _MaxNumVertices, _VertexData, _VertexSize, _VertexStream, NLMISC::CRGBA::A, a00, a01, a02, a10, a11, a12, a20, a21, a22, NL3D::CLodCharacterInstance::AnimId, NL3D::CLodCharacterInstance::AnimTime, NL3D::computeLodLighting(), NLMISC::CMatrix::get(), NL3D::CLodCharacterShape::getAnimKey(), NL3D::CVertexStreamManager::getDriver(), NL3D::CLodCharacterShape::getNormals(), NL3D::CLodCharacterShape::getNumTriangles(), NL3D::CLodCharacterShape::getNumVertices(), NLMISC::CMatrix::getPos(), getShape(), NL3D::CLodCharacterShape::getTriangleArray(), NL3D::CLodCharacterInstance::getUVs(), H_AUTO, isRendering(), NL3D::CVertexStreamManager::lock(), NLMISC::CMatrix::mulVector(), NL3D_CLOD_COLOR_OFF, NL3D_CLOD_UV_OFF, NL3D_CLOD_VERTEX_SIZE, nlassert, NLMISC::CVector::normalize(), NL3D::CLodCharacterInstance::ShapeId, sint, uint, uint32, uint64, uint8, NL3D::CLodCharacterInstance::VertexAlphas, NL3D::CLodCharacterInstance::WrapMode, NL3D::CLodCharacterShape::CVector3s::x, NLMISC::CVector::x, NL3D::CLodCharacterShape::CVector3s::y, NLMISC::CVector::y, NL3D::CLodCharacterShape::CVector3s::z, and NLMISC::CVector::z. Referenced by NL3D::CSkeletonModel::renderCLod().
00361 { 00362 H_AUTO ( NL3D_CharacterLod_AddRenderKey ) 00363 00364 nlassert(_VertexStream.getDriver()); 00365 // we must be beewteen beginRender() and endRender() 00366 nlassert(isRendering()); 00367 00368 00369 // regroup all variables that will be accessed in the ASM loop (minimize cache problems) 00370 uint numVertices; 00371 const CLodCharacterShape::CVector3s *vertPtr; 00372 const CVector *normalPtr; 00373 const CUV *uvPtr; 00374 const uint8 *alphaPtr; 00375 CVector lightObjectSpace; 00376 CVector matPos; 00377 float a00, a01, a02; 00378 float a10, a11, a12; 00379 float a20, a21, a22; 00380 sint f8; 00381 uint64 blank= 0; 00382 CRGBA ambient= paramAmbient; 00383 CRGBA diffuse= paramDiffuse; 00384 // For ASM / MMX, must set 0 to alpha part, because replaced by *alphaPtr (with add) 00385 ambient.A= 0; 00386 diffuse.A= 0; 00387 00388 00389 // Get the Shape and current key. 00390 //============= 00391 00392 // get the shape 00393 const CLodCharacterShape *clod= getShape(instance.ShapeId); 00394 // if not found quit, return true 00395 if(!clod) 00396 return true; 00397 00398 // get UV/Normal array. NULL => error 00399 normalPtr= clod->getNormals(); 00400 // get UV of the instance 00401 uvPtr= instance.getUVs(); 00402 // uvPtr is NULL means that initInstance() has not been called!! 00403 nlassert(normalPtr && uvPtr); 00404 00405 // get the anim key 00406 CVector unPackScaleFactor; 00407 vertPtr= clod->getAnimKey(instance.AnimId, instance.AnimTime, instance.WrapMode, unPackScaleFactor); 00408 // if not found quit, return true 00409 if(!vertPtr) 00410 return true; 00411 // get num verts 00412 numVertices= clod->getNumVertices(); 00413 00414 // empty shape?? 00415 if(numVertices==0) 00416 return true; 00417 00418 // If too many vertices, quit, returning false. 00419 if(_CurrentVertexId+numVertices > _MaxNumVertices) 00420 return false; 00421 00422 // get alpha array 00423 static vector<uint8> defaultAlphaArray; 00424 // get the instance alpha if correctly setuped 00425 if(instance.VertexAlphas.size() == numVertices) 00426 { 00427 alphaPtr= &instance.VertexAlphas[0]; 00428 } 00429 // if error, take 255 as alpha. 00430 else 00431 { 00432 // NB: still use an array. This case should never arise, but support it not at full optim. 00433 if(defaultAlphaArray.size()<numVertices) 00434 defaultAlphaArray.resize(numVertices, 255); 00435 alphaPtr= &defaultAlphaArray[0]; 00436 } 00437 00438 // Lock Buffer if not done 00439 //============= 00440 00441 // Do this after code above because we are sure that we will fill something (numVertices>0) 00442 if(!_LockDone) 00443 { 00444 _VertexData= _VertexStream.lock(); 00445 _LockDone= true; 00446 } 00447 00448 // Prepare Transform 00449 //============= 00450 00451 // HTimerInfo: all this block takes 0.1% 00452 00453 // Get matrix pos. 00454 matPos= worldMatrix.getPos(); 00455 // compute in manager space. 00456 matPos -= _ManagerMatrixPos; 00457 // Get rotation line vectors 00458 const float *worldM= worldMatrix.get(); 00459 a00= worldM[0]; a01= worldM[4]; a02= worldM[8]; 00460 a10= worldM[1]; a11= worldM[5]; a12= worldM[9]; 00461 a20= worldM[2]; a21= worldM[6]; a22= worldM[10]; 00462 00463 // get the light in object space. 00464 // Multiply light dir with transpose of worldMatrix. This may be not exact (not uniform scale) but sufficient. 00465 lightObjectSpace.x= a00 * lightDir.x + a10 * lightDir.y + a20 * lightDir.z; 00466 lightObjectSpace.y= a01 * lightDir.x + a11 * lightDir.y + a21 * lightDir.z; 00467 lightObjectSpace.z= a02 * lightDir.x + a12 * lightDir.y + a22 * lightDir.z; 00468 // animation User correction 00469 lightObjectSpace= _LightCorrectionMatrix.mulVector(lightObjectSpace); 00470 // normalize, and neg for Dot Product. 00471 lightObjectSpace.normalize(); 00472 lightObjectSpace= -lightObjectSpace; 00473 // preMul by 255 for RGBA uint8 00474 lightObjectSpace*= 255; 00475 00476 // multiply matrix with scale factor for Pos. 00477 a00*= unPackScaleFactor.x; a01*= unPackScaleFactor.y; a02*= unPackScaleFactor.z; 00478 a10*= unPackScaleFactor.x; a11*= unPackScaleFactor.y; a12*= unPackScaleFactor.z; 00479 a20*= unPackScaleFactor.x; a21*= unPackScaleFactor.y; a22*= unPackScaleFactor.z; 00480 00481 // get dst Array. 00482 uint8 *dstPtr; 00483 dstPtr= _VertexData + _CurrentVertexId * _VertexSize; 00484 00485 00486 /* PreCaching Note: CFastMem::precache() has been tested (done on the 4 arrays) but not very interesting, 00487 maybe because the cache miss improve //ism a bit below. 00488 */ 00489 00490 // Fill the VB 00491 //============= 00492 #ifdef NL_OS_WINDOWS 00493 // optimized version 00494 if(CSystemInfo::hasMMX()) 00495 { 00496 H_AUTO( NL3D_CharacterLod_vertexFill ); 00497 00498 if(numVertices) 00499 { 00500 /* NB: order is important for AGP filling optimisation in dstPtr 00501 00502 Pentium2+ optimisation notes: 00503 00504 - "uop" comment formating: 00505 A/B means "A micro-ops in port 0, and B micro-ops in port 2". (port 1 is very rare for FPU) 00506 A/B/C/D means "A micro-ops in port 0, B in port 2, C in port 3 and D in port 4". 00507 The number in () is the delay (if any). 00508 - the "compute lighting part" must done first, because of the "fistp f8" mem writes that must 00509 be place far away from the "mov eax, f8" read in clamp lighting part 00510 (else seems that it crashes all the //ism) 00511 - No need to Interleave on Pentium2+. But prevents "write/read stall" by putting the write 00512 far away from the next read. Else stall of 3 cycles + BIG BREAK OF //ism (I think). 00513 This had save me 120 cycles / 240 !!! 00514 00515 BenchResults: 00516 - The "transform vertex part" and "all next part" cost 42 cycles, but is somewhat optimal: 00517 63 uop (=> min 21 cycles), but 36 uop in the P0 port (=> this is the bottleneck) 00518 - The lighting part adds 1 cycle only ????? (44 cycles) But still relevant and optimal: 00519 43 uop in port P0!!!! 00520 - The UV part adds 4 cycles (47) (should not since 0 in Port P0), still acceptable. 00521 - The clamp part adds 3 cycles (50), and add 11 cycles in "P0 or P1" (but heavy dependency) 00522 If we assume all goes into P1, it should takes 0... still acceptable (optimal==43?) 00523 - The alpha part adds 2 cycles (52, optimal=45). OK. 00524 - The modulate part adds 15 cycles. OK 00525 00526 TOTAL: 67 cycles in theory (write in RAM, no cache miss problem) 00527 BENCH: ASM version: 91 cycles (Write in AGP, some cache miss problems, still good against 67) 00528 C version: 316 cycles. 00529 */ 00530 __asm 00531 { 00532 mov edi, dstPtr 00533 theLoop: 00534 // **** compute lighting 00535 mov esi,normalPtr // uop: 0/1 00536 // dot3 00537 fld dword ptr [esi] // uop: 0/1 00538 fmul lightObjectSpace.x // uop: 1/1 (5) 00539 fld dword ptr [esi+4] // uop: 0/1 00540 fmul lightObjectSpace.y // uop: 1/1 (5) 00541 faddp st(1),st // uop: 1/0 (3) 00542 fld dword ptr [esi+8] // uop: 0/1 00543 fmul lightObjectSpace.z // uop: 1/1 (5) 00544 faddp st(1),st // uop: 1/0 (3) 00545 fistp f8 // uop: 2/0/1/1 (5) 00546 // next 00547 add esi, 12 // uop: 1/0 00548 mov normalPtr, esi // uop: 0/0/1/1 00549 00550 00551 // **** transform vertex, and store 00552 mov esi, vertPtr // uop: 0/1 00553 fild word ptr[esi] // uop: 3/1 (5) 00554 fild word ptr[esi+2] // uop: 3/1 (5) 00555 fild word ptr[esi+4] // uop: 3/1 (5) 00556 // x 00557 fld a00 // uop: 0/1 00558 fmul st, st(3) // uop: 1/0 (5) 00559 fld a01 // uop: 0/1 00560 fmul st, st(3) // uop: 1/0 (5) 00561 faddp st(1), st // uop: 1/0 (3) 00562 fld a02 // uop: 0/1 00563 fmul st, st(2) // uop: 1/0 (5) 00564 faddp st(1), st // uop: 1/0 (3) 00565 fld matPos.x // uop: 0/1 00566 faddp st(1), st // uop: 1/0 (3) 00567 fstp dword ptr[edi] // uop: 0/0/1/1 00568 // y 00569 fld a10 00570 fmul st, st(3) 00571 fld a11 00572 fmul st, st(3) 00573 faddp st(1), st 00574 fld a12 00575 fmul st, st(2) 00576 faddp st(1), st 00577 fld matPos.y 00578 faddp st(1), st 00579 fstp dword ptr[edi+4] 00580 // z 00581 fld a20 00582 fmul st, st(3) 00583 fld a21 00584 fmul st, st(3) 00585 faddp st(1), st 00586 fld a22 00587 fmul st, st(2) 00588 faddp st(1), st 00589 fld matPos.z 00590 faddp st(1), st 00591 fstp dword ptr[edi+8] 00592 // flush stack 00593 fstp st // uop: 1/0 00594 fstp st // uop: 1/0 00595 fstp st // uop: 1/0 00596 // next 00597 add esi, 6 // uop: 1/0 00598 mov vertPtr, esi // uop: 0/0/1/1 00599 00600 00601 // **** copy uv 00602 mov esi, uvPtr // uop: 0/1 00603 mov eax, [esi] // uop: 0/1 00604 mov [edi+NL3D_CLOD_UV_OFF], eax // uop: 0/0/1/1 00605 mov ebx, [esi+4] // uop: 0/1 00606 mov [edi+NL3D_CLOD_UV_OFF+4], ebx // uop: 0/0/1/1 00607 // next 00608 add esi, 8 // uop: 1/0 00609 mov uvPtr, esi // uop: 0/0/1/1 00610 00611 00612 // **** Clamp lighting 00613 // clamp to 0 only. will be clamped to 255 by MMX 00614 mov eax, f8 // uop: 0/1 00615 cmp eax, 0x80000000 // if>=0 => CF=1 00616 sbb ebx, ebx // if>=0 => CF==1 => ebx=0xFFFFFFFF 00617 and eax, ebx // if>=0 => eax unchanged, else eax=0 (clamped) 00618 00619 00620 // **** Modulate lighting modulate with diffuse color, add ambient term, using MMX 00621 movd mm0, eax // 0000000L uop: 1/0 00622 packuswb mm0, mm0 // 000L000L uop: 1/0 (p1) 00623 packuswb mm0, mm0 // 0L0L0L0L uop: 1/0 (p1) 00624 movd mm1, diffuse // uop: 0/1 00625 punpcklbw mm1, blank // uop: 1/1 (p1) 00626 pmullw mm0, mm1 // diffuse*L uop: 1/0 (3) 00627 psrlw mm0, 8 // 0A0B0G0R uop: 1/0 (p1) 00628 packuswb mm0, blank // 0000ABGR uop: 1/1 (p1) 00629 movd mm2, ambient // uop: 0/1 00630 paddusb mm0, mm2 // uop: 1/0 00631 movd ebx, mm0 // ebx= AABBGGRR uop: 1/0 00632 // NB: emms is not so bad on P2+: delay of 6, +11 (NB: far better than no MMX instructions) 00633 emms // uop: 11/0 (6). (?????) 00634 00635 00636 // **** append alpha, and store 00637 mov esi, alphaPtr // uop: 0/1 00638 movzx eax, byte ptr[esi] // uop: 0/1 00639 shl eax, 24 // uop: 1/0 00640 add ebx, eax // uop: 1/0 00641 // now, ebx= AABBGGRR 00642 mov [edi+NL3D_CLOD_COLOR_OFF], ebx // uop: 0/0/1/1 00643 // next 00644 add esi, 1 // uop: 1/0 00645 mov alphaPtr, esi // uop: 0/0/1/1 00646 00647 00648 // **** next 00649 add edi, NL3D_CLOD_VERTEX_SIZE // uop: 1/0 00650 00651 mov eax, numVertices // uop: 0/1 00652 dec eax // uop: 1/0 00653 mov numVertices, eax // uop: 0/0/1/1 00654 00655 jnz theLoop // uop: 1/1 (p1) 00656 00657 // To have same behavior than c code 00658 mov dstPtr, edi 00659 } 00660 } 00661 } 00662 else 00663 #endif 00664 { 00665 H_AUTO( NL3D_CharacterLod_vertexFill ); 00666 00667 CVector fVect; 00668 00669 for(;numVertices>0;) 00670 { 00671 // NB: order is important for AGP filling optimisation 00672 // transform vertex, and store. 00673 CVector *dstVector= (CVector*)dstPtr; 00674 fVect.x= vertPtr->x; fVect.y= vertPtr->y; fVect.z= vertPtr->z; 00675 ++vertPtr; 00676 dstVector->x= a00 * fVect.x + a01 * fVect.y + a02 * fVect.z + matPos.x; 00677 dstVector->y= a10 * fVect.x + a11 * fVect.y + a12 * fVect.z + matPos.y; 00678 dstVector->z= a20 * fVect.x + a21 * fVect.y + a22 * fVect.z + matPos.z; 00679 // Copy UV 00680 *(CUV*)(dstPtr + NL3D_CLOD_UV_OFF)= *uvPtr; 00681 ++uvPtr; 00682 00683 // Compute Lighting. 00684 CRGBA lightRes; 00685 computeLodLighting(lightRes, lightObjectSpace, *normalPtr, ambient, diffuse); 00686 ++normalPtr; 00687 lightRes.A= *alphaPtr; 00688 ++alphaPtr; 00689 // store. 00690 *((CRGBA*)(dstPtr + NL3D_CLOD_COLOR_OFF))= lightRes; 00691 00692 // next 00693 dstPtr+= NL3D_CLOD_VERTEX_SIZE; 00694 numVertices--; 00695 } 00696 } 00697 00698 // Add Primitives. 00699 //============= 00700 00701 { 00702 H_AUTO( NL3D_CharacterLod_primitiveFill ) 00703 00704 // get number of tri indexes 00705 uint numTriIdxs= clod->getNumTriangles() * 3; 00706 00707 // realloc tris if needed. 00708 if(_CurrentTriId+numTriIdxs > _Triangles.size()) 00709 { 00710 _Triangles.resize(_CurrentTriId+numTriIdxs); 00711 } 00712 00713 // reindex and copy tris 00714 const uint32 *srcIdx= clod->getTriangleArray(); 00715 uint32 *dstIdx= &_Triangles[_CurrentTriId]; 00716 for(;numTriIdxs>0;numTriIdxs--, srcIdx++, dstIdx++) 00717 { 00718 *dstIdx= *srcIdx + _CurrentVertexId; 00719 } 00720 } 00721 00722 // Next 00723 //============= 00724 00725 // Inc Vertex count. 00726 _CurrentVertexId+= clod->getNumVertices(); 00727 // Inc Prim count. 00728 _CurrentTriId+= clod->getNumTriangles() * 3; 00729 00730 00731 // key added 00732 return true; 00733 } |
|
add a texture from an instance. Texture Lookup are made in _TmpBitmaps
Definition at line 955 of file lod_character_manager.cpp. References _TmpBitmaps, NLMISC::CRGBA::A, NL3D::CLodCharacterTmpBitmap::getPixel(), getTextureInstance(), NL3D_CLOD_BIGTEXT_WIDTH, NL3D_CLOD_TEXT_HEIGHT, NL3D_CLOD_TEXT_SIZE, NL3D_CLOD_TEXT_WIDTH, nlassert, NL3D::CLodCharacterTexture::CTUVQ::Q, NL3D::CLodCharacterTexture::CTUVQ::T, NL3D::CLodCharacterTexture::Texture, NL3D::CLodCharacterTexture::CTUVQ::U, uint, NL3D::CLodCharacterTexture::CTUVQ::V, x, and y. Referenced by NL3D::CSkeletonModel::computeLodTexture().
00956 { 00957 CRGBA *dst= getTextureInstance(instance); 00958 if(!dst) 00959 return; 00960 00961 // get lookup ptr. 00962 nlassert(lodTexture.Texture.size()==NL3D_CLOD_TEXT_SIZE); 00963 const CLodCharacterTexture::CTUVQ *lookUpPtr= &lodTexture.Texture[0]; 00964 00965 // apply the lodTexture, taking only better quality (ie nearer 0) 00966 for(uint y=0;y<NL3D_CLOD_TEXT_HEIGHT;y++) 00967 { 00968 // erase the line 00969 for(uint x=0;x<NL3D_CLOD_TEXT_WIDTH;x++) 00970 { 00971 CLodCharacterTexture::CTUVQ lut= *lookUpPtr; 00972 // if this quality is better than the one stored 00973 if(lut.Q<dst[x].A) 00974 { 00975 // get what texture to read, and read the pixel. 00976 CRGBA col= _TmpBitmaps[lut.T].getPixel(lut.U, lut.V); 00977 // set quality. 00978 col.A= lut.Q; 00979 // set in dest 00980 dst[x]= col; 00981 } 00982 00983 // next lookup 00984 lookUpPtr++; 00985 } 00986 // Next line 00987 dst+= NL3D_CLOD_BIGTEXT_WIDTH; 00988 } 00989 } |
|
Start the rendering process, freeing VBuffer. nlassert if isRendering() NB: VBhard is locked here, so you must call endRender to unlock him (even if 0 meshes are rendered)
Definition at line 276 of file lod_character_manager.cpp. References _CurrentTriId, _CurrentVertexId, _LockDone, _ManagerMatrixPos, _MaxNumVertices, _NumVBHard, _Rendering, _VertexSize, _VertexStream, NL3D::CVertexBuffer::getColorOff(), NL3D::CVertexStreamManager::getDriver(), NL3D::CVertexStreamManager::getMaxVertices(), NL3D::CVertexStreamManager::getNumVBHard(), NL3D::CVertexBuffer::getTexCoordOff(), NL3D::CVertexStreamManager::getVertexSize(), H_AUTO, NL3D::CVertexStreamManager::init(), isRendering(), NL3D_CLOD_COLOR_OFF, NL3D_CLOD_UV_OFF, NL3D_CLOD_VERTEX_FORMAT, NL3D_CLOD_VERTEX_SIZE, nlassert, NL3D::CVertexStreamManager::release(), and NL3D::CVertexBuffer::setVertexFormat(). Referenced by NL3D::CSkeletonModel::renderCLod(), and NL3D::CRenderTrav::traverse().
00277 { 00278 H_AUTO( NL3D_CharacterLod_beginRender ); 00279 00280 // we must not be beewteen beginRender() and endRender() 00281 nlassert(!isRendering()); 00282 00283 // Reset render 00284 //================= 00285 _CurrentVertexId=0; 00286 _CurrentTriId= 0; 00287 00288 // update Driver. 00289 //================= 00290 nlassert(driver); 00291 00292 // test change of vertexStream setup 00293 bool mustChangeVertexStream= _VertexStream.getDriver() != driver; 00294 if(!mustChangeVertexStream) 00295 { 00296 mustChangeVertexStream= _MaxNumVertices != _VertexStream.getMaxVertices(); 00297 mustChangeVertexStream= mustChangeVertexStream || _NumVBHard != _VertexStream.getNumVBHard(); 00298 } 00299 // re-init? 00300 if( mustChangeVertexStream ) 00301 { 00302 // chech offset 00303 CVertexBuffer vb; 00304 vb.setVertexFormat(NL3D_CLOD_VERTEX_FORMAT); 00305 // NB: addRenderCharacterKey() loop hardCoded for Vertex+UV+Normal+Color only. 00306 nlassert( NL3D_CLOD_UV_OFF == vb.getTexCoordOff()); 00307 nlassert( NL3D_CLOD_COLOR_OFF == vb.getColorOff()); 00308 00309 // Setup the vertex stream 00310 _VertexStream.release(); 00311 _VertexStream.init(driver, NL3D_CLOD_VERTEX_FORMAT, _MaxNumVertices, _NumVBHard, "CLodManagerVB"); 00312 } 00313 00314 // prepare for render. 00315 //================= 00316 00317 // Do not Lock Buffer now (will be done at the first instance added) 00318 nlassert(!_LockDone); 00319 _VertexSize= _VertexStream.getVertexSize(); 00320 // NB: addRenderCharacterKey() loop hardCoded for Vertex+UV+Normal+Color only. 00321 nlassert( _VertexSize == NL3D_CLOD_VERTEX_SIZE ); // Vector + Normal + UV + RGBA 00322 00323 00324 // Alloc a minimum of primitives (2*vertices), to avoid as possible reallocation in addRenderCharacterKey 00325 if(_Triangles.size()<_MaxNumVertices * 2) 00326 _Triangles.resize(_MaxNumVertices * 2); 00327 00328 // Local manager matrix 00329 _ManagerMatrixPos= managerPos; 00330 00331 // Ok, start rendering 00332 _Rendering= true; 00333 } |
|
re-compile the shape map. This must be called after changing shape bank list. It return false if same names have been found, but it is still correctly builded. Definition at line 212 of file lod_character_manager.cpp. References _ShapeBankArray, _ShapeMap, NL3D::CLodCharacterShape::getName(), ItStrIdMap, nlwarning, and uint. Referenced by NL3D::CSceneUser::deleteCLodShapeBank(), and NL3D::CSceneUser::loadCLodShapeBank().
00213 { 00214 bool error= false; 00215 00216 // clear the map 00217 contReset(_ShapeMap); 00218 00219 // build the map 00220 for(uint i=0; i<_ShapeBankArray.size(); i++) 00221 { 00222 if(_ShapeBankArray[i]) 00223 { 00224 // Parse all Shapes 00225 for(uint j=0; j<_ShapeBankArray[i]->getNumShapes(); j++) 00226 { 00227 // build the shape Id 00228 uint shapeId= (i<<16) + j; 00229 00230 // get the shape 00231 const CLodCharacterShape *shape= _ShapeBankArray[i]->getShape(j); 00232 if(shape) 00233 { 00234 const string &name= shape->getName(); 00235 ItStrIdMap it= _ShapeMap.find(name); 00236 if(it == _ShapeMap.end()) 00237 // insert the id in the map 00238 _ShapeMap.insert(make_pair(name, shapeId)); 00239 else 00240 { 00241 error= true; 00242 nlwarning("Found a Character Lod with same name in the manager: %s", name.c_str()); 00243 } 00244 } 00245 } 00246 } 00247 } 00248 00249 return error; 00250 } |
|
create a Shape Bank. NB: a vector of ShapeBank is maintained internally, hence, not so many shapeBank should be created at same Time.
Definition at line 134 of file lod_character_manager.cpp. References _ShapeBankArray, uint, and uint32. Referenced by NL3D::CSceneUser::loadCLodShapeBank().
00135 { 00136 // search a free entry 00137 for(uint i=0;i<_ShapeBankArray.size();i++) 00138 { 00139 // if ree, use it. 00140 if(_ShapeBankArray[i]==NULL) 00141 { 00142 _ShapeBankArray[i]= new CLodCharacterShapeBank; 00143 return i; 00144 } 00145 } 00146 00147 // no free entrey, resize array. 00148 _ShapeBankArray.push_back(new CLodCharacterShapeBank); 00149 return _ShapeBankArray.size()-1; 00150 } |
|
delete a Shape Bank. No-op if bad id.
Definition at line 171 of file lod_character_manager.cpp. References _ShapeBankArray, and uint32. Referenced by NL3D::CSceneUser::deleteCLodShapeBank().
00172 { 00173 if(bankId>=_ShapeBankArray.size()) 00174 { 00175 if(_ShapeBankArray[bankId]) 00176 { 00177 delete _ShapeBankArray[bankId]; 00178 _ShapeBankArray[bankId]= NULL; 00179 } 00180 } 00181 } |
|
compile the rendering process, effectively rendering into driver the lods. nlassert if not isRendering(). The VBHard is unlocked here. Definition at line 736 of file lod_character_manager.cpp. References _CurrentTriId, _CurrentVertexId, _LockDone, _ManagerMatrixPos, _Rendering, _VertexStream, NL3D::CVertexStreamManager::activate(), NL3D::CVertexStreamManager::getDriver(), H_AUTO, isRendering(), nlassert, NL3D::IDriver::renderTriangles(), NLMISC::CMatrix::setPos(), NL3D::IDriver::setupModelMatrix(), NL3D::CVertexStreamManager::swapVBHard(), and NL3D::CVertexStreamManager::unlock(). Referenced by NL3D::CSkeletonModel::renderCLod(), and NL3D::CRenderTrav::traverse().
00737 { 00738 H_AUTO ( NL3D_CharacterLod_endRender ); 00739 00740 IDriver *driver= _VertexStream.getDriver(); 00741 nlassert(driver); 00742 // we must be beewteen beginRender() and endRender() 00743 nlassert(isRendering()); 00744 00745 // if something rendered 00746 if(_LockDone) 00747 { 00748 // UnLock Buffer. 00749 _VertexStream.unlock(_CurrentVertexId); 00750 _LockDone= false; 00751 00752 // Render the VBuffer and the primitives. 00753 if(_CurrentTriId>0) 00754 { 00755 // setup matrix. 00756 CMatrix managerMatrix; 00757 managerMatrix.setPos(_ManagerMatrixPos); 00758 driver->setupModelMatrix(managerMatrix); 00759 00760 // active VB 00761 _VertexStream.activate(); 00762 00763 // render triangles 00764 driver->renderTriangles(_Material, &_Triangles[0], _CurrentTriId/3); 00765 } 00766 00767 // swap Stream VBHard 00768 _VertexStream.swapVBHard(); 00769 } 00770 00771 // Ok, end rendering 00772 _Rendering= false; 00773 } |
|
end and compile. reset/free memory of _TmpBitmaps up to numBmpToReset.
Definition at line 992 of file lod_character_manager.cpp. References _BigTexture, NL3D::CLodCharacterInstance::_TextureId, _TmpBitmaps, NLMISC::CRGBA::A, getTextureInstance(), NL3D_CLOD_BIGTEXT_WIDTH, NL3D_CLOD_DEFAULT_TEXCOLOR, NL3D_CLOD_TEXT_HEIGHT, NL3D_CLOD_TEXT_NLOD_WIDTH, NL3D_CLOD_TEXT_WIDTH, NL3D::CLodCharacterTmpBitmap::reset(), uint, x, and y. Referenced by NL3D::CSkeletonModel::computeLodTexture().
00993 { 00994 CRGBA *dst= getTextureInstance(instance); 00995 if(!dst) 00996 return; 00997 00998 // reset All Alpha values to 255 => no AlphaTest problems 00999 for(uint y=0;y<NL3D_CLOD_TEXT_HEIGHT;y++) 01000 { 01001 // erase the line 01002 for(uint x=0;x<NL3D_CLOD_TEXT_WIDTH;x++) 01003 { 01004 dst[x].A= 255; 01005 } 01006 // Next line 01007 dst+= NL3D_CLOD_BIGTEXT_WIDTH; 01008 } 01009 01010 // If the id == 0 then must reset the 0,0 Pixel to black. for the "Not Enough memory" case in initInstance(). 01011 if(instance._TextureId==0) 01012 *(CRGBA*)&_BigTexture->getPixels(0)[0]= NL3D_CLOD_DEFAULT_TEXCOLOR; 01013 01014 // get the x/y. 01015 uint xId= instance._TextureId % NL3D_CLOD_TEXT_NLOD_WIDTH; 01016 uint yId= instance._TextureId / NL3D_CLOD_TEXT_NLOD_WIDTH; 01017 // touch the texture for Driver update. 01018 _BigTexture->touchRect( 01019 CRect(xId*NL3D_CLOD_TEXT_WIDTH, yId*NL3D_CLOD_TEXT_HEIGHT, NL3D_CLOD_TEXT_WIDTH, NL3D_CLOD_TEXT_HEIGHT) ); 01020 01021 // reset tmpBitmaps / free memory. 01022 for(uint i=0; i<numBmpToReset; i++) 01023 { 01024 _TmpBitmaps[i].reset(); 01025 } 01026 01027 // TestYoyo 01028 /*NLMISC::COFile f("tam.tga"); 01029 _BigTexture->writeTGA(f,32);*/ 01030 } |
|
see setMaxVertex()
Definition at line 163 of file lod_character_manager.h. References _MaxNumVertices, and uint32.
00163 {return _MaxNumVertices;} |
|
Get a const ref on a shape. Ptr not valid if shape Banks are modfied. NULL if not found.
Definition at line 194 of file lod_character_manager.cpp. References NL3D::CLodCharacterShapeBank::getShape(), getShapeBank(), uint, and uint32. Referenced by addRenderCharacterKey(), NL3D::CSkeletonModel::computeCLodVertexAlpha(), NL3D::CSceneUser::getCLodAnimIdByName(), and initInstance().
00195 { 00196 // split the id 00197 uint bankId= shapeId >> 16; 00198 uint shapeInBankId= shapeId &0xFFFF; 00199 00200 // if valid bankId 00201 const CLodCharacterShapeBank *shapeBank= getShapeBank(bankId); 00202 if(shapeBank) 00203 { 00204 // return the shape from the bank 00205 return shapeBank->getShape(shapeInBankId); 00206 } 00207 else 00208 return NULL; 00209 } |
|
get a shape Bank. UseFull for serialisation for example. return NULL if not found
Definition at line 162 of file lod_character_manager.cpp. References _ShapeBankArray, and uint32.
00163 { 00164 if(bankId>=_ShapeBankArray.size()) 00165 return NULL; 00166 else 00167 return _ShapeBankArray[bankId]; 00168 } |
|
get a shape Bank. UseFull for serialisation for example. return NULL if not found
Definition at line 153 of file lod_character_manager.cpp. References _ShapeBankArray, and uint32. Referenced by getShape(), and NL3D::CSceneUser::loadCLodShapeBank().
00154 { 00155 if(bankId>=_ShapeBankArray.size()) 00156 return NULL; 00157 else 00158 return _ShapeBankArray[bankId]; 00159 } |
|
Get a shapeId by its name. -1 if not found. Call valid only if compile() has been correctly called Definition at line 184 of file lod_character_manager.cpp. References _ShapeMap, CstItStrIdMap, and sint32. Referenced by NL3D::CSceneUser::getCLodShapeIdByName().
00185 { 00186 CstItStrIdMap it= _ShapeMap.find(name); 00187 if(it==_ShapeMap.end()) 00188 return -1; 00189 else 00190 return it->second; 00191 } |
|
Definition at line 915 of file lod_character_manager.cpp. References _BigTexture, NL3D::CLodCharacterInstance::_Owner, NL3D::CLodCharacterInstance::_TextureId, NL3D_CLOD_BIGTEXT_WIDTH, NL3D_CLOD_TEXT_HEIGHT, NL3D_CLOD_TEXT_NLOD_WIDTH, NL3D_CLOD_TEXT_NUM_IDS, NL3D_CLOD_TEXT_WIDTH, nlassert, and uint. Referenced by addTextureCompute(), endTextureCompute(), and startTextureCompute().
00916 { 00917 nlassert(instance._Owner==this); 00918 nlassert(instance._TextureId!=-1); 00919 // if the texture id is a "not enough memory", quit. 00920 if(instance._TextureId==NL3D_CLOD_TEXT_NUM_IDS) 00921 return NULL; 00922 00923 // get the x/y. 00924 uint xId= instance._TextureId % NL3D_CLOD_TEXT_NLOD_WIDTH; 00925 uint yId= instance._TextureId / NL3D_CLOD_TEXT_NLOD_WIDTH; 00926 00927 // get the ptr on the correct pixel. 00928 CRGBA *pix= (CRGBA*)&_BigTexture->getPixels(0)[0]; 00929 return pix + yId*NL3D_CLOD_TEXT_HEIGHT*NL3D_CLOD_BIGTEXT_WIDTH + xId*NL3D_CLOD_TEXT_WIDTH; 00930 } |
|
get a tmp bitmap for a special slot. caller can fill RGBA texture for the associated material Id in it.
Definition at line 233 of file lod_character_manager.h. References _TmpBitmaps, and uint8. Referenced by NL3D::CSkeletonModel::computeLodTexture().
00233 {return _TmpBitmaps[id];} |
|
see setVertexStreamNumVBHard
Definition at line 173 of file lod_character_manager.h. References _NumVBHard, and uint32.
00173 {return _NumVBHard;} |
|
Init the instance texturing with this manager. A texture space is reserved (if possible), and UVs are generated.
Definition at line 844 of file lod_character_manager.cpp. References _FreeIds, NL3D::CLodCharacterInstance::_Owner, NL3D::CLodCharacterInstance::_TextureId, NL3D::CLodCharacterInstance::_UVs, NL3D::CLodCharacterShape::getNumVertices(), getShape(), NL3D::CLodCharacterShape::getUVs(), NL3D_CLOD_TEXT_NLOD_HEIGHT, NL3D_CLOD_TEXT_NLOD_WIDTH, NL3D_CLOD_TEXT_NUM_IDS, nlassert, releaseInstance(), NL3D::CLodCharacterInstance::ShapeId, NLMISC::CUV::U, uint, and NLMISC::CUV::V. Referenced by NL3D::CSkeletonModel::setLodCharacterShape().
00845 { 00846 // first release in (maybe) other manager. 00847 if(instance._Owner) 00848 instance._Owner->releaseInstance(instance); 00849 00850 // get the shape 00851 const CLodCharacterShape *clod= getShape(instance.ShapeId); 00852 // if not found quit 00853 if(!clod) 00854 return; 00855 // get Uvs. 00856 const CUV *uvSrc= clod->getUVs(); 00857 nlassert(uvSrc); 00858 00859 00860 // Ok, init header 00861 instance._Owner= this; 00862 instance._UVs.resize(clod->getNumVertices()); 00863 00864 // allocate an id. If cannot, then fill Uvs with 0 => filled with Black. (see endTextureCompute() why). 00865 if(_FreeIds.empty()) 00866 { 00867 // set a "Not enough memory" id 00868 instance._TextureId= NL3D_CLOD_TEXT_NUM_IDS; 00869 CUV uv(0,0); 00870 fill(instance._UVs.begin(), instance._UVs.end(), uv); 00871 } 00872 // else OK, can instanciate the Uvs. 00873 else 00874 { 00875 // get the id. 00876 instance._TextureId= _FreeIds.back(); 00877 _FreeIds.pop_back(); 00878 // get the x/y. 00879 uint xId= instance._TextureId % NL3D_CLOD_TEXT_NLOD_WIDTH; 00880 uint yId= instance._TextureId / NL3D_CLOD_TEXT_NLOD_WIDTH; 00881 // compute the scale/bias to apply to Uvs. 00882 float scaleU= 1.0f / NL3D_CLOD_TEXT_NLOD_WIDTH; 00883 float scaleV= 1.0f / NL3D_CLOD_TEXT_NLOD_HEIGHT; 00884 float biasU= (float)xId / NL3D_CLOD_TEXT_NLOD_WIDTH; 00885 float biasV= (float)yId / NL3D_CLOD_TEXT_NLOD_HEIGHT; 00886 // apply it to each UVs. 00887 CUV *uvDst= &instance._UVs[0]; 00888 for(uint i=0; i<instance._UVs.size();i++) 00889 { 00890 uvDst[i].U= biasU + uvSrc[i].U*scaleU; 00891 uvDst[i].V= biasV + uvSrc[i].V*scaleV; 00892 } 00893 } 00894 } |
|
tells if we are beetween a beginRender() and a endRender()
Definition at line 209 of file lod_character_manager.h. References _Rendering. Referenced by addRenderCharacterKey(), beginRender(), endRender(), NL3D::CSkeletonModel::renderCLod(), reset(), setMaxVertex(), and setVertexStreamNumVBHard().
00209 {return _Rendering;} |
|
Release a lod instance. Free texture space.
Definition at line 897 of file lod_character_manager.cpp. References _FreeIds, NL3D::CLodCharacterInstance::_Owner, NL3D::CLodCharacterInstance::_TextureId, NL3D::CLodCharacterInstance::_UVs, NL3D_CLOD_TEXT_NUM_IDS, and nlassert. Referenced by initInstance(), NL3D::CSkeletonModel::setLodCharacterShape(), and NL3D::CLodCharacterInstance::~CLodCharacterInstance().
00898 { 00899 if(instance._Owner==NULL) 00900 return; 00901 nlassert(this==instance._Owner); 00902 00903 // if the id is not a "Not enough memory" id, release it. 00904 if(instance._TextureId>=0 && instance._TextureId<NL3D_CLOD_TEXT_NUM_IDS) 00905 _FreeIds.push_back(instance._TextureId); 00906 00907 // reset the instance 00908 instance._Owner= NULL; 00909 instance._TextureId= -1; 00910 contReset(instance._UVs); 00911 } |
|
reset the manager.
Definition at line 114 of file lod_character_manager.cpp. References _ShapeBankArray, _ShapeMap, _VertexStream, isRendering(), nlassert, NL3D::CVertexStreamManager::release(), and uint. Referenced by NL3D::CScene::release(), NL3D::CSceneUser::resetCLodManager(), and ~CLodCharacterManager().
00115 { 00116 nlassert(!isRendering()); 00117 00118 // delete shapeBanks. 00119 for(uint i=0;i<_ShapeBankArray.size();i++) 00120 { 00121 if(_ShapeBankArray[i]) 00122 delete _ShapeBankArray[i]; 00123 } 00124 00125 // clears containers 00126 contReset(_ShapeBankArray); 00127 contReset(_ShapeMap); 00128 00129 // reset render part. 00130 _VertexStream.release(); 00131 } |
|
set the max number of vertices the manager can render in one time. Default is 3000 vertices. nlassert if isRendering() Definition at line 260 of file lod_character_manager.cpp. References _MaxNumVertices, isRendering(), nlassert, and uint32.
00261 { 00262 // we must not be beewteen beginRender() and endRender() 00263 nlassert(!isRendering()); 00264 _MaxNumVertices= maxVertex; 00265 } |
|
Setup a correction matrix for Lighting. Normals are multiplied with this matrix before lighting. This is important in Ryzom because models (and so Lods) are building with eye looking in Y<0. But they are animated with eye looking in X>0. The default setup is hence a matrix wich do a RotZ+=90.
Definition at line 776 of file lod_character_manager.cpp. References _LightCorrectionMatrix, NLMISC::CMatrix::invert(), and NLMISC::CMatrix::setPos().
00777 { 00778 _LightCorrectionMatrix= normalMatrix; 00779 _LightCorrectionMatrix.setPos(CVector::Null); 00780 _LightCorrectionMatrix.invert(); 00781 } |
|
set the number of vbhard to allocate for the vertexStream. The more, the better (no lock stall). Default is 8. With MaxVertices==3000 and numVBHard==8, this led us with 576 Ko in AGP. And this is sufficient cause it can handle 300 entities of approx 80 vertices each frame with no lock at all. Definition at line 268 of file lod_character_manager.cpp. References _NumVBHard, isRendering(), nlassert, and uint32.
00269 { 00270 // we must not be beewteen beginRender() and endRender() 00271 nlassert(!isRendering()); 00272 _NumVBHard= numVBHard; 00273 } |
|
reset the textureSpace. Instance must have been inited (nlassert). return false if no more texture space available
Definition at line 934 of file lod_character_manager.cpp. References getTextureInstance(), NL3D_CLOD_BIGTEXT_WIDTH, NL3D_CLOD_DEFAULT_TEXCOLOR, NL3D_CLOD_TEXT_HEIGHT, NL3D_CLOD_TEXT_WIDTH, uint, x, and y. Referenced by NL3D::CSkeletonModel::computeLodTexture().
00935 { 00936 CRGBA *dst= getTextureInstance(instance); 00937 if(!dst) 00938 return false; 00939 00940 // erase the texture with 0,0,0,255. Alpha is actually the min "Quality" part of the CTUVQ. 00941 CRGBA col= NL3D_CLOD_DEFAULT_TEXCOLOR; 00942 for(uint y=0;y<NL3D_CLOD_TEXT_HEIGHT;y++) 00943 { 00944 // erase the line 00945 for(uint x=0;x<NL3D_CLOD_TEXT_WIDTH;x++) 00946 dst[x]= col; 00947 // Next line 00948 dst+= NL3D_CLOD_BIGTEXT_WIDTH; 00949 } 00950 00951 return true; 00952 } |
|
Definition at line 290 of file lod_character_manager.h. Referenced by CLodCharacterManager(), endTextureCompute(), and getTextureInstance(). |
|
Definition at line 277 of file lod_character_manager.h. Referenced by addRenderCharacterKey(), beginRender(), and endRender(). |
|
Definition at line 267 of file lod_character_manager.h. Referenced by addRenderCharacterKey(), beginRender(), and endRender(). |
|
Definition at line 292 of file lod_character_manager.h. Referenced by CLodCharacterManager(), initInstance(), and releaseInstance(). |
|
Definition at line 281 of file lod_character_manager.h. Referenced by addRenderCharacterKey(), CLodCharacterManager(), and setupNormalCorrectionMatrix(). |
|
Definition at line 274 of file lod_character_manager.h. Referenced by addRenderCharacterKey(), beginRender(), CLodCharacterManager(), and endRender(). |
|
Definition at line 262 of file lod_character_manager.h. Referenced by addRenderCharacterKey(), beginRender(), and endRender(). |
|
Definition at line 265 of file lod_character_manager.h. |
|
Definition at line 268 of file lod_character_manager.h. Referenced by addRenderCharacterKey(), beginRender(), CLodCharacterManager(), getMaxVertex(), and setMaxVertex(). |
|
Definition at line 269 of file lod_character_manager.h. Referenced by beginRender(), CLodCharacterManager(), getVertexStreamNumVBHard(), and setVertexStreamNumVBHard(). |
|
Definition at line 273 of file lod_character_manager.h. Referenced by beginRender(), CLodCharacterManager(), endRender(), and isRendering(). |
|
Array of shapeBank.
Definition at line 253 of file lod_character_manager.h. Referenced by compile(), createShapeBank(), deleteShapeBank(), getShapeBank(), and reset(). |
|
Map of shape id.
Definition at line 256 of file lod_character_manager.h. Referenced by compile(), getShapeIdByName(), and reset(). |
|
Definition at line 295 of file lod_character_manager.h. Referenced by addTextureCompute(), endTextureCompute(), and getTmpBitmap(). |
|
Definition at line 278 of file lod_character_manager.h. |
|
Definition at line 271 of file lod_character_manager.h. Referenced by addRenderCharacterKey(). |
|
Definition at line 272 of file lod_character_manager.h. Referenced by addRenderCharacterKey(), and beginRender(). |
|
Definition at line 270 of file lod_character_manager.h. Referenced by addRenderCharacterKey(), beginRender(), endRender(), and reset(). |