#include <computed_string.h>
Nevrax France
Definition at line 82 of file computed_string.h.
Public Types | |
| enum | THotSpot { BottomLeft = 0, MiddleLeft, TopLeft, MiddleBottom, MiddleMiddle, MiddleTop, BottomRight, MiddleRight, TopRight, HotSpotCount } |
Public Member Functions | |
| CComputedString (bool bSetupVB=true) | |
| CVector | getHotSpotVector (THotSpot hotspot) |
| void | render2D (IDriver &driver, float x, float z, THotSpot hotspot=BottomLeft, float scaleX=1, float scaleZ=1, float rotateY=0, bool useScreenAR43=false, bool roundToNearestPixel=true) |
| void | render2DClip (IDriver &driver, CRenderStringBuffer &rdrBuffer, float x, float z, float xmin=0, float ymin=0, float xmax=1, float ymax=1) |
| void | render2DUnProjected (IDriver &driver, CRenderStringBuffer &rdrBuffer, class NL3D::CFrustum &frustum, const NLMISC::CMatrix &scaleMatrix, float x, float z, float depth, float xmin=0, float ymin=0, float xmax=1, float ymax=1) |
| void | render3D (IDriver &driver, CMatrix matrix, THotSpot hotspot=MiddleMiddle) |
Data Fields | |
| CRGBA | Color |
| CMaterial * | Material |
| uint32 | SelectSize |
| uint32 | SelectStart |
| Optionnal: each render*() method can draw a subset of letters. Default is 0/FFFFFFFF. | |
| float | StringHeight |
| The height of the string, in pixels (eg: 10). | |
| float | StringLine |
| float | StringWidth |
| The width of the string, in pixels (eg: 30). | |
| CVertexBuffer | Vertices |
| float | XMax |
| The BBox of all vertices. used for render2DClip(). | |
| float | XMin |
| The BBox of all vertices. used for render2DClip(). | |
| float | ZMax |
| The BBox of all vertices. used for render2DClip(). | |
| float | ZMin |
| The BBox of all vertices. used for render2DClip(). | |
|
|
Hotspot positions (origine for the string placement) You should take care that for vertical hotspot, an imaginary line is defined under letters with no leg (like m,b,c etc..) between the leg of p and the loop of the p.
Definition at line 112 of file computed_string.h.
00113 {
00114 BottomLeft=0,
00115 MiddleLeft,
00116 TopLeft,
00117 MiddleBottom,
00118 MiddleMiddle,
00119 MiddleTop,
00120 BottomRight,
00121 MiddleRight,
00122 TopRight,
00123
00124 HotSpotCount
00125 };
|
|
|
Default constructor Definition at line 130 of file computed_string.h. References SelectSize, SelectStart, NL3D::CVertexBuffer::setVertexFormat(), StringHeight, and StringWidth.
00131 {
00132 StringWidth = 0;
00133 StringHeight = 0;
00134 if (bSetupVB)
00135 {
00136 Vertices.setVertexFormat (CVertexBuffer::PositionFlag | CVertexBuffer::TexCoord0Flag);
00137 }
00138 SelectStart= 0;
00139 SelectSize= ~0;
00140 }
|
|
|
Get the string's origin
Definition at line 49 of file computed_string.cpp. References BottomRight, MiddleBottom, MiddleLeft, MiddleMiddle, MiddleRight, MiddleTop, StringHeight, StringWidth, TopLeft, and TopRight. Referenced by render2D(), and render3D().
00050 {
00051 CVector hotspotVector(0,0,0);
00052
00053 if (hotspot==MiddleLeft)
00054 hotspotVector = CVector(0,0,-StringHeight/2);
00055
00056 if (hotspot==TopLeft)
00057 hotspotVector = CVector(0,0,-StringHeight);
00058
00059 if (hotspot==MiddleBottom)
00060 hotspotVector = CVector(-StringWidth/2,0,0);
00061
00062 if (hotspot==MiddleMiddle)
00063 hotspotVector = CVector(-StringWidth/2,0,-StringHeight/2);
00064
00065 if (hotspot==MiddleTop)
00066 hotspotVector = CVector(-StringWidth/2,0,-StringHeight);
00067
00068 if (hotspot==BottomRight)
00069 hotspotVector = CVector(-StringWidth,0,0);
00070
00071 if (hotspot==MiddleRight)
00072 hotspotVector = CVector(-StringWidth,0,-StringHeight/2);
00073
00074 if (hotspot==TopRight)
00075 hotspotVector = CVector(-StringWidth,0,-StringHeight);
00076
00077 return hotspotVector;
00078 }
|
|
||||||||||||||||||||||||||||||||||||||||
|
Render the unicode string in a driver.
Definition at line 84 of file computed_string.cpp. References NL3D::IDriver::activeVertexBuffer(), Color, getHotSpotVector(), NL3D::CVertexBuffer::getNumVertices(), NL3D::IDriver::getWindowSize(), Material, matrix, min, NL3D::IDriver::renderQuads(), SelectSize, SelectStart, NL3D::CMaterial::setColor(), NL3D::IDriver::setFrustum(), NL3D::IDriver::setupModelMatrix(), NL3D::IDriver::setupViewMatrix(), NL3D::CMaterial::setZFunc(), NL3D::CMaterial::setZWrite(), uint32, NLMISC::CVector::x, x, NLMISC::CVector::z, and z. Referenced by NL3D::CTextContext::printAt(), and NL3D::CTextContext::printfAt().
00091 {
00092 if (Vertices.getNumVertices() == 0)
00093 return;
00094
00095 // get window size
00096 uint32 wndWidth, wndHeight;
00097 driver.getWindowSize(wndWidth, wndHeight);
00098 // scale to window size.
00099 x*= wndWidth;
00100 z*= wndHeight;
00101
00102 driver.setFrustum(0, (float)wndWidth, 0, (float)wndHeight, -1, 1, false); // resX/resY
00103
00104 // Computing hotspot translation vector
00105 CVector hotspotVector = getHotSpotVector(hotspot);
00106
00107 // tansformation matrix initialized to identity
00108 CMatrix matrix;
00109 matrix.identity();
00110
00111 // view matrix <-> identity
00112 driver.setupViewMatrix(matrix);
00113
00114 // model matrix :
00115 // centering to hotspot, then scaling, rotating, and translating.
00116 matrix.translate(CVector(x,0,z));
00117 matrix.rotateY(rotateY);
00118 matrix.scale(CVector(scaleX,1,scaleZ));
00119 // scale the string to follow window aspect Ratio
00120 if(useScreenAR43)
00121 {
00122 matrix.scale(CVector((3.0f*wndWidth)/(4.0f*wndHeight),1,1));
00123 }
00124 matrix.translate(hotspotVector);
00125 // if roundToNearestPixel, then snap the position to the nearest pixel
00126 if( roundToNearestPixel)
00127 {
00128 CVector pos= matrix.getPos();
00129 pos.x= (float)floor(pos.x+0.5f);
00130 pos.z= (float)floor(pos.z+0.5f);
00131 matrix.setPos(pos);
00132 }
00133 // setup the matrix
00134 driver.setupModelMatrix(matrix);
00135
00136 driver.activeVertexBuffer(Vertices);
00137
00138 // rendering each primitives
00139 Material->setZFunc (CMaterial::always);
00140 Material->setZWrite (false);
00141 Material->setColor (Color);
00142 // Clamp for selection
00143 uint32 nNumQuad= Vertices.getNumVertices()/4;
00144 driver.renderQuads (*Material, SelectStart, min(nNumQuad, SelectSize) );
00145 }
|
|
||||||||||||||||||||||||||||||||||||
|
Special for interface. same as render2D but clip the quads to xmin,ymin/xmax,ymax. NB: behavior is same as render2D with: Hotspot = bottomLeft, scaleX=1, scaleZ=1, rotateY=0, useScreenAR43= false, roundToNearestPixel= false Additionnaly, this method don't render directly to the driver but add primitives to a CRenderStringBuffer Use the method CRenderStringBuffer::flush() to flush it all. Definition at line 183 of file computed_string.cpp. References Color, NL3D::CVertexBuffer::getColorOff(), NL3D::CVertexBuffer::getNumVertices(), NL3D::CVertexBuffer::getTexCoordOff(), NL3D::CVertexBuffer::getVertexCoordPointer(), NL3D::CVertexBuffer::getVertexSize(), NL3D::IDriver::getWindowSize(), min, NL3D::CRenderStringBuffer::NumQuads, SelectSize, SelectStart, NL3D::CVertexBuffer::setNumVertices(), sint, NLMISC::CUV::U, uint, uint32, uint8, NLMISC::CUV::V, NL3D::CRenderStringBuffer::Vertices, NLMISC::CVector::x, x, XMax, XMin, NLMISC::CVector::z, z, ZMax, and ZMin. Referenced by NL3D::CTextContext::printClipAt().
00186 {
00187 if (Vertices.getNumVertices() == 0)
00188 return;
00189 if(SelectSize==0)
00190 return;
00191
00192 // get window size
00193 uint32 wndWidth, wndHeight;
00194 driver.getWindowSize(wndWidth, wndHeight);
00195 // scale to window size.
00196 x*= wndWidth;
00197 z*= wndHeight;
00198 xmin*= wndWidth;
00199 xmax*= wndWidth;
00200 zmin*= wndHeight;
00201 zmax*= wndHeight;
00202
00203 // Test String Bound against clip window
00204 // If entirely out skip
00205 if (((x+XMin) > xmax) || ((x+XMax) < xmin) ||
00206 ((z+ZMin) > zmax) || ((z+ZMax) < zmin))
00207 return;
00208
00209 // test if entirely in.
00210 bool allIn;
00211 allIn= ((x+XMin) >= xmin) && ((x+XMax) <= xmax) &&
00212 ((z+ZMin) >= zmin) && ((z+ZMax) <= zmax);
00213
00214
00215 // How many quad to render?
00216 uint nNumQuadSrc= Vertices.getNumVertices()/4;
00217 nNumQuadSrc= min(nNumQuadSrc, (uint)SelectSize);
00218
00219 // Enlarge dest Buffer if needed
00220 if( (rdrBuffer.NumQuads+nNumQuadSrc)*4 > rdrBuffer.Vertices.getNumVertices() )
00221 {
00222 rdrBuffer.Vertices.setNumVertices( (rdrBuffer.NumQuads+nNumQuadSrc)*4 );
00223 }
00224
00225 // prepare copy.
00226 sint ofsSrcUV= Vertices.getTexCoordOff();
00227 sint ofsDstUV= rdrBuffer.Vertices.getTexCoordOff();
00228 sint ofsDstColor= rdrBuffer.Vertices.getColorOff();
00229 uint8 *srcPtr= (uint8*)Vertices.getVertexCoordPointer();
00230 uint8 *dstPtr= (uint8*)rdrBuffer.Vertices.getVertexCoordPointer(rdrBuffer.NumQuads*4);
00231 sint srcSize= Vertices.getVertexSize();
00232 sint dstSize= rdrBuffer.Vertices.getVertexSize();
00233
00234 // decal src for selection
00235 srcPtr+= SelectStart*4 * srcSize;
00236
00237 // **** clipping?
00238 if(allIn)
00239 {
00240 // copy All vertices
00241 uint numVerts= nNumQuadSrc*4;
00242 for(uint i=0;i<numVerts;i++)
00243 {
00244 // copy and translate pos
00245 ((CVector*)dstPtr)->x= x + ((CVector*)srcPtr)->x;
00246 ((CVector*)dstPtr)->y= ((CVector*)srcPtr)->y;
00247 ((CVector*)dstPtr)->z= z + ((CVector*)srcPtr)->z;
00248 // uv
00249 *((CUV*)(dstPtr+ofsDstUV))= *((CUV*)(srcPtr+ofsSrcUV));
00250 // color
00251 *((CRGBA*)(dstPtr+ofsDstColor))= Color;
00252
00253 // next
00254 srcPtr+= srcSize;
00255 dstPtr+= dstSize;
00256 }
00257
00258 // update the rdrBuffer
00259 rdrBuffer.NumQuads+= nNumQuadSrc;
00260 }
00261 else
00262 {
00263 uint nNumQuadClipped= 0;
00264
00265 // the real number of vertices to comute (with selection)
00266 uint numVerts= nNumQuadSrc*4;
00267
00268 // clip into VerticesClipped
00269 CVector *pIniPos0 = (CVector*)srcPtr;
00270 CVector *pIniPos2 = (CVector*)(((uint8*)pIniPos0) + srcSize*2);
00271 CVector *pClipPos0 = (CVector*)dstPtr;
00272 CVector *pClipPos1 = (CVector*)(((uint8*)pClipPos0) + dstSize);
00273 CVector *pClipPos2 = (CVector*)(((uint8*)pClipPos1) + dstSize);
00274 CVector *pClipPos3 = (CVector*)(((uint8*)pClipPos2) + dstSize);
00275 CUV *pClipUV0 = (CUV*)(dstPtr + ofsDstUV );
00276 CUV *pClipUV1 = (CUV*)(((uint8*)pClipUV0) + dstSize);
00277 CUV *pClipUV2 = (CUV*)(((uint8*)pClipUV1) + dstSize);
00278 CUV *pClipUV3 = (CUV*)(((uint8*)pClipUV2) + dstSize);
00279 float ratio;
00280 for (uint32 i = 0; i < numVerts; i+=4)
00281 {
00282 if (((x+pIniPos0->x) > xmax) || ((x+pIniPos2->x) < xmin) ||
00283 ((z+pIniPos0->z) > zmax) || ((z+pIniPos2->z) < zmin))
00284 {
00285 // Totally clipped do nothing
00286 }
00287 else
00288 {
00289 // copy with no clip
00290 // v0
00291 *((CVector*) (dstPtr + dstSize*0))= *((CVector*) (srcPtr + srcSize*0));
00292 *((CUV*) (dstPtr + dstSize*0 + ofsDstUV))= *((CUV*)(srcPtr + srcSize*0 + ofsSrcUV));
00293 *((CRGBA*) (dstPtr + dstSize*0 + ofsDstColor))= Color;
00294 // v1
00295 *((CVector*) (dstPtr + dstSize*1))= *((CVector*) (srcPtr + srcSize*1));
00296 *((CUV*) (dstPtr + dstSize*1 + ofsDstUV))= *((CUV*)(srcPtr + srcSize*1 + ofsSrcUV));
00297 *((CRGBA*) (dstPtr + dstSize*1 + ofsDstColor))= Color;
00298 // v2
00299 *((CVector*) (dstPtr + dstSize*2))= *((CVector*) (srcPtr + srcSize*2));
00300 *((CUV*) (dstPtr + dstSize*2 + ofsDstUV))= *((CUV*)(srcPtr + srcSize*2 + ofsSrcUV));
00301 *((CRGBA*) (dstPtr + dstSize*2 + ofsDstColor))= Color;
00302 // v3
00303 *((CVector*) (dstPtr + dstSize*3))= *((CVector*) (srcPtr + srcSize*3));
00304 *((CUV*) (dstPtr + dstSize*3 + ofsDstUV))= *((CUV*)(srcPtr + srcSize*3 + ofsSrcUV));
00305 *((CRGBA*) (dstPtr + dstSize*3 + ofsDstColor))= Color;
00306
00307
00308 // translate dest
00309 pClipPos0->x += x; pClipPos1->x += x; pClipPos2->x += x; pClipPos3->x += x;
00310 pClipPos0->z += z; pClipPos1->z += z; pClipPos2->z += z; pClipPos3->z += z;
00311 if ((pClipPos0->x >= xmin) && (pClipPos0->z >= zmin) && (pClipPos2->x <= xmax) && (pClipPos2->z <= zmax))
00312 {
00313 // Not clipped
00314 }
00315 else
00316 {
00317 // Partially clipped
00318
00319 if (pClipPos0->x < xmin)
00320 {
00321 ratio = ((float)(xmin - pClipPos0->x))/((float)(pClipPos1->x - pClipPos0->x));
00322 pClipPos3->x = pClipPos0->x = xmin;
00323 pClipUV0->U += ratio*(pClipUV1->U - pClipUV0->U);
00324 pClipUV3->U += ratio*(pClipUV2->U - pClipUV3->U);
00325 }
00326
00327 if (pClipPos0->z < zmin)
00328 {
00329 ratio = ((float)(zmin - pClipPos0->z))/((float)(pClipPos3->z - pClipPos0->z));
00330 pClipPos1->z = pClipPos0->z = zmin;
00331 pClipUV0->V += ratio*(pClipUV3->V - pClipUV0->V);
00332 pClipUV1->V += ratio*(pClipUV2->V - pClipUV1->V);
00333 }
00334
00335 if (pClipPos2->x > xmax)
00336 {
00337 ratio = ((float)(xmax - pClipPos2->x))/((float)(pClipPos3->x - pClipPos2->x));
00338 pClipPos2->x = pClipPos1->x = xmax;
00339 pClipUV2->U += ratio*(pClipUV3->U - pClipUV2->U);
00340 pClipUV1->U += ratio*(pClipUV0->U - pClipUV1->U);
00341 }
00342
00343 if (pClipPos2->z > zmax)
00344 {
00345 ratio = ((float)(zmax - pClipPos2->z))/((float)(pClipPos1->z - pClipPos2->z));
00346 pClipPos2->z = pClipPos3->z = zmax;
00347 pClipUV2->V += ratio*(pClipUV1->V - pClipUV2->V);
00348 pClipUV3->V += ratio*(pClipUV0->V - pClipUV3->V);
00349 }
00350 }
00351
00352 // next quad out
00353 ++nNumQuadClipped;
00354 pClipPos0 = (CVector*)(((uint8*)pClipPos0) + dstSize*4);
00355 pClipPos1 = (CVector*)(((uint8*)pClipPos0) + dstSize);
00356 pClipPos2 = (CVector*)(((uint8*)pClipPos1) + dstSize);
00357 pClipPos3 = (CVector*)(((uint8*)pClipPos2) + dstSize);
00358 pClipUV0 = (CUV*)( ((uint8*)pClipUV0) + dstSize*4 );
00359 pClipUV1 = (CUV*)(((uint8*)pClipUV0) + dstSize);
00360 pClipUV2 = (CUV*)(((uint8*)pClipUV1) + dstSize);
00361 pClipUV3 = (CUV*)(((uint8*)pClipUV2) + dstSize);
00362 dstPtr+= 4*dstSize;
00363 }
00364 // next quad in
00365 pIniPos0 = (CVector*)(((uint8*)pIniPos0) + srcSize*4);
00366 pIniPos2 = (CVector*)(((uint8*)pIniPos0) + srcSize*2);
00367 srcPtr+= 4*srcSize;
00368 }
00369
00370 // update the rdrBuffer
00371 rdrBuffer.NumQuads+= nNumQuadClipped;
00372 }
00373 }
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
Special for interface. same as render2DClip but unproject the vertices using a frustum and a scale matrix Use the method CRenderStringBuffer::flush() to flush it all. Definition at line 378 of file computed_string.cpp. References Color, depth, NL3D::CVertexBuffer::getColorOff(), NL3D::CVertexBuffer::getNumVertices(), NL3D::CVertexBuffer::getTexCoordOff(), NL3D::CVertexBuffer::getVertexCoordPointer(), NL3D::CVertexBuffer::getVertexSize(), NL3D::IDriver::getWindowSize(), min, NL3D::CRenderStringBuffer::NumQuads, SelectSize, SelectStart, NL3D::CVertexBuffer::setNumVertices(), sint, NLMISC::CUV::U, uint, uint32, uint8, NLMISC::CUV::V, NL3D::CRenderStringBuffer::Vertices, NLMISC::CVector::x, x, XMax, XMin, NLMISC::CVector::y, NLMISC::CVector::z, z, ZMax, and ZMin. Referenced by NL3D::CTextContext::printClipAtUnProjected().
00380 {
00381 if (Vertices.getNumVertices() == 0)
00382 return;
00383 if(SelectSize==0)
00384 return;
00385
00386 // get window size
00387 uint32 wndWidth, wndHeight;
00388 driver.getWindowSize(wndWidth, wndHeight);
00389 // scale to window size.
00390 x*= wndWidth;
00391 z*= wndHeight;
00392 xmin*= wndWidth;
00393 xmax*= wndWidth;
00394 zmin*= wndHeight;
00395 zmax*= wndHeight;
00396
00397 // Test String Bound against clip window
00398 // If entirely out skip
00399 if (((x+XMin) > xmax) || ((x+XMax) < xmin) ||
00400 ((z+ZMin) > zmax) || ((z+ZMax) < zmin))
00401 return;
00402
00403 // test if entirely in.
00404 bool allIn;
00405 allIn= ((x+XMin) >= (xmin-0.001f)) && ((x+XMax) <= (xmax+0.001f)) &&
00406 ((z+ZMin) >= (zmin-0.001f)) && ((z+ZMax) <= (zmax+0.001f));
00407
00408
00409 // How many quad to render?
00410 uint nNumQuadSrc= Vertices.getNumVertices()/4;
00411 nNumQuadSrc= min(nNumQuadSrc, (uint)SelectSize);
00412
00413 // Enlarge dest Buffer if needed
00414 if( (rdrBuffer.NumQuads+nNumQuadSrc)*4 > rdrBuffer.Vertices.getNumVertices() )
00415 {
00416 rdrBuffer.Vertices.setNumVertices( (rdrBuffer.NumQuads+nNumQuadSrc)*4 );
00417 }
00418
00419 // prepare copy.
00420 sint ofsSrcUV= Vertices.getTexCoordOff();
00421 sint ofsDstUV= rdrBuffer.Vertices.getTexCoordOff();
00422 sint ofsDstColor= rdrBuffer.Vertices.getColorOff();
00423 uint8 *srcPtr= (uint8*)Vertices.getVertexCoordPointer();
00424 uint8 *dstPtr= (uint8*)rdrBuffer.Vertices.getVertexCoordPointer(rdrBuffer.NumQuads*4);
00425 sint srcSize= Vertices.getVertexSize();
00426 sint dstSize= rdrBuffer.Vertices.getVertexSize();
00427
00428 // decal src for selection
00429 srcPtr+= SelectStart*4 * srcSize;
00430
00431 uint8 *dstPtrBackup = dstPtr;
00432
00433 // **** clipping?
00434 if(allIn)
00435 {
00436 // copy All vertices
00437 uint numVerts= nNumQuadSrc*4;
00438 for(uint i=0;i<numVerts;i++)
00439 {
00440 // copy and translate pos
00441 ((CVector*)dstPtr)->x= x + ((CVector*)srcPtr)->x;
00442 ((CVector*)dstPtr)->z= z + ((CVector*)srcPtr)->z;
00443
00444 // uv
00445 *((CUV*)(dstPtr+ofsDstUV))= *((CUV*)(srcPtr+ofsSrcUV));
00446 // color
00447 *((CRGBA*)(dstPtr+ofsDstColor))= Color;
00448
00449 // next
00450 srcPtr+= srcSize;
00451 dstPtr+= dstSize;
00452 }
00453
00454 // update the rdrBuffer
00455 rdrBuffer.NumQuads+= nNumQuadSrc;
00456 }
00457 else
00458 {
00459 uint nNumQuadClipped= 0;
00460
00461 // the real number of vertices to comute (with selection)
00462 uint numVerts= nNumQuadSrc*4;
00463
00464 // clip into VerticesClipped
00465 CVector *pIniPos0 = (CVector*)srcPtr;
00466 CVector *pIniPos2 = (CVector*)(((uint8*)pIniPos0) + srcSize*2);
00467 CVector *pClipPos0 = (CVector*)dstPtr;
00468 CVector *pClipPos1 = (CVector*)(((uint8*)pClipPos0) + dstSize);
00469 CVector *pClipPos2 = (CVector*)(((uint8*)pClipPos1) + dstSize);
00470 CVector *pClipPos3 = (CVector*)(((uint8*)pClipPos2) + dstSize);
00471 CUV *pClipUV0 = (CUV*)(dstPtr + ofsDstUV );
00472 CUV *pClipUV1 = (CUV*)(((uint8*)pClipUV0) + dstSize);
00473 CUV *pClipUV2 = (CUV*)(((uint8*)pClipUV1) + dstSize);
00474 CUV *pClipUV3 = (CUV*)(((uint8*)pClipUV2) + dstSize);
00475 float ratio;
00476 for (uint32 i = 0; i < numVerts; i+=4)
00477 {
00478 if (((x+pIniPos0->x) > xmax) || ((x+pIniPos2->x) < xmin) ||
00479 ((z+pIniPos0->z) > zmax) || ((z+pIniPos2->z) < zmin))
00480 {
00481 // Totally clipped do nothing
00482 }
00483 else
00484 {
00485 // copy with no clip
00486 // v0
00487 *((CVector*) (dstPtr + dstSize*0))= *((CVector*) (srcPtr + srcSize*0));
00488 *((CUV*) (dstPtr + dstSize*0 + ofsDstUV))= *((CUV*)(srcPtr + srcSize*0 + ofsSrcUV));
00489 *((CRGBA*) (dstPtr + dstSize*0 + ofsDstColor))= Color;
00490 // v1
00491 *((CVector*) (dstPtr + dstSize*1))= *((CVector*) (srcPtr + srcSize*1));
00492 *((CUV*) (dstPtr + dstSize*1 + ofsDstUV))= *((CUV*)(srcPtr + srcSize*1 + ofsSrcUV));
00493 *((CRGBA*) (dstPtr + dstSize*1 + ofsDstColor))= Color;
00494 // v2
00495 *((CVector*) (dstPtr + dstSize*2))= *((CVector*) (srcPtr + srcSize*2));
00496 *((CUV*) (dstPtr + dstSize*2 + ofsDstUV))= *((CUV*)(srcPtr + srcSize*2 + ofsSrcUV));
00497 *((CRGBA*) (dstPtr + dstSize*2 + ofsDstColor))= Color;
00498 // v3
00499 *((CVector*) (dstPtr + dstSize*3))= *((CVector*) (srcPtr + srcSize*3));
00500 *((CUV*) (dstPtr + dstSize*3 + ofsDstUV))= *((CUV*)(srcPtr + srcSize*3 + ofsSrcUV));
00501 *((CRGBA*) (dstPtr + dstSize*3 + ofsDstColor))= Color;
00502
00503
00504 // translate dest
00505 pClipPos0->x += x; pClipPos1->x += x; pClipPos2->x += x; pClipPos3->x += x;
00506 pClipPos0->z += z; pClipPos1->z += z; pClipPos2->z += z; pClipPos3->z += z;
00507 if ((pClipPos0->x >= xmin) && (pClipPos0->z >= zmin) && (pClipPos2->x <= xmax) && (pClipPos2->z <= zmax))
00508 {
00509 // Not clipped
00510 }
00511 else
00512 {
00513 // Partially clipped
00514
00515 if (pClipPos0->x < xmin)
00516 {
00517 ratio = ((float)(xmin - pClipPos0->x))/((float)(pClipPos1->x - pClipPos0->x));
00518 pClipPos3->x = pClipPos0->x = xmin;
00519 pClipUV0->U += ratio*(pClipUV1->U - pClipUV0->U);
00520 pClipUV3->U += ratio*(pClipUV2->U - pClipUV3->U);
00521 }
00522
00523 if (pClipPos0->z < zmin)
00524 {
00525 ratio = ((float)(zmin - pClipPos0->z))/((float)(pClipPos3->z - pClipPos0->z));
00526 pClipPos1->z = pClipPos0->z = zmin;
00527 pClipUV0->V += ratio*(pClipUV3->V - pClipUV0->V);
00528 pClipUV1->V += ratio*(pClipUV2->V - pClipUV1->V);
00529 }
00530
00531 if (pClipPos2->x > xmax)
00532 {
00533 ratio = ((float)(xmax - pClipPos2->x))/((float)(pClipPos3->x - pClipPos2->x));
00534 pClipPos2->x = pClipPos1->x = xmax;
00535 pClipUV2->U += ratio*(pClipUV3->U - pClipUV2->U);
00536 pClipUV1->U += ratio*(pClipUV0->U - pClipUV1->U);
00537 }
00538
00539 if (pClipPos2->z > zmax)
00540 {
00541 ratio = ((float)(zmax - pClipPos2->z))/((float)(pClipPos1->z - pClipPos2->z));
00542 pClipPos2->z = pClipPos3->z = zmax;
00543 pClipUV2->V += ratio*(pClipUV1->V - pClipUV2->V);
00544 pClipUV3->V += ratio*(pClipUV0->V - pClipUV3->V);
00545 }
00546 }
00547
00548 // next quad out
00549 ++nNumQuadClipped;
00550 pClipPos0 = (CVector*)(((uint8*)pClipPos0) + dstSize*4);
00551 pClipPos1 = (CVector*)(((uint8*)pClipPos0) + dstSize);
00552 pClipPos2 = (CVector*)(((uint8*)pClipPos1) + dstSize);
00553 pClipPos3 = (CVector*)(((uint8*)pClipPos2) + dstSize);
00554 pClipUV0 = (CUV*)( ((uint8*)pClipUV0) + dstSize*4 );
00555 pClipUV1 = (CUV*)(((uint8*)pClipUV0) + dstSize);
00556 pClipUV2 = (CUV*)(((uint8*)pClipUV1) + dstSize);
00557 pClipUV3 = (CUV*)(((uint8*)pClipUV2) + dstSize);
00558 dstPtr+= 4*dstSize;
00559 }
00560 // next quad in
00561 pIniPos0 = (CVector*)(((uint8*)pIniPos0) + srcSize*4);
00562 pIniPos2 = (CVector*)(((uint8*)pIniPos0) + srcSize*2);
00563 srcPtr+= 4*srcSize;
00564 }
00565
00566 // update the rdrBuffer
00567 rdrBuffer.NumQuads+= nNumQuadClipped;
00568 }
00569
00570 const float OOW = 1.f / (float)wndWidth;
00571 const float OOH = 1.f / (float)wndHeight;
00572
00573 while (dstPtrBackup != dstPtr)
00574 {
00575 // preset unprojection
00576 CVector tmp;
00577 tmp.x = ((CVector*)dstPtrBackup)->x * OOW;
00578 tmp.y = ((CVector*)dstPtrBackup)->z * OOH;
00579 tmp.z = depth;
00580 // mul by user scale matrix
00581 tmp= scaleMatrix * tmp;
00582 // Unproject it
00583 *((CVector*)dstPtrBackup) = frustum.unProjectZ(tmp);
00584 dstPtrBackup += dstSize;
00585 }
00586
00587 }
|
|
||||||||||||||||
|
Render the unicode string in a driver, in 3D with a user matrix. NB: size of the string is first scaled by 1/windowHeight.
Definition at line 151 of file computed_string.cpp. References NL3D::IDriver::activeVertexBuffer(), Color, getHotSpotVector(), NL3D::CVertexBuffer::getNumVertices(), NL3D::IDriver::getWindowSize(), Material, matrix, min, NL3D::IDriver::renderQuads(), SelectSize, SelectStart, NL3D::CMaterial::setColor(), NL3D::IDriver::setupModelMatrix(), NL3D::CMaterial::setZFunc(), NL3D::CMaterial::setZWrite(), and uint32. Referenced by NL3D::CInstanceGroup::displayDebugClusters(), NL3D::CPSUtil::print(), and NL3D::CTextContextUser::render3D().
00152 {
00153 if (Vertices.getNumVertices() == 0)
00154 return;
00155
00156 // get window size
00157 uint32 wndWidth, wndHeight;
00158 driver.getWindowSize(wndWidth, wndHeight);
00159 // scale according to window height (backward compatibility)
00160 matrix.scale(1.0f/wndHeight);
00161
00162 // Computing hotspot translation vector
00163 CVector hotspotVector = getHotSpotVector(hotspot);
00164 matrix.translate(hotspotVector);
00165
00166 // render
00167 driver.setupModelMatrix(matrix);
00168 driver.activeVertexBuffer(Vertices);
00169
00170 // Rendering each primitive blocks
00171 Material->setZFunc (CMaterial::lessequal);
00172 Material->setZWrite (true);
00173 Material->setColor (Color);
00174 // Clamp for selection
00175 uint32 nNumQuad= Vertices.getNumVertices()/4;
00176 driver.renderQuads (*Material, SelectStart, min(nNumQuad, SelectSize) );
00177 }
|
|
|
|
Definition at line 87 of file computed_string.h. Referenced by NL3D::CFontManager::computeString(), render2D(), and render3D(). |
|
|
Definition at line 105 of file computed_string.h. Referenced by CComputedString(), render2D(), render2DClip(), render2DUnProjected(), and render3D(). |
|
|
Optionnal: each render*() method can draw a subset of letters. Default is 0/FFFFFFFF.
Definition at line 104 of file computed_string.h. Referenced by CComputedString(), render2D(), render2DClip(), render2DUnProjected(), and render3D(). |
|
|
The height of the string, in pixels (eg: 10).
Definition at line 92 of file computed_string.h. Referenced by CComputedString(), NL3D::CFontManager::computeString(), NL3D::CFontManager::computeStringInfo(), getHotSpotVector(), and NL3D::CTextContextUser::getStringInfo(). |
|
|
StringLine is the size from bottom of the whole string image to the hotspot in pixels. for instance if the hotspot is bottomLeft the imaginary line of the string "bpc" is under the b, under the loop of the p but over the leg of the p. So StringLine is a positive value in this case. It may be a negative value for the string "^" for example. Definition at line 101 of file computed_string.h. Referenced by NL3D::CFontManager::computeString(), NL3D::CFontManager::computeStringInfo(), and NL3D::CTextContextUser::getStringInfo(). |
|
|
The width of the string, in pixels (eg: 30).
Definition at line 90 of file computed_string.h. Referenced by CComputedString(), NL3D::CFontManager::computeString(), NL3D::CFontManager::computeStringInfo(), getHotSpotVector(), and NL3D::CTextContextUser::getStringInfo(). |
|
|
Definition at line 86 of file computed_string.h. Referenced by NL3D::CFontManager::computeString(). |
|
|
The BBox of all vertices. used for render2DClip().
Definition at line 94 of file computed_string.h. Referenced by NL3D::CFontManager::computeString(), render2DClip(), and render2DUnProjected(). |
|
|
The BBox of all vertices. used for render2DClip().
Definition at line 94 of file computed_string.h. Referenced by NL3D::CFontManager::computeString(), render2DClip(), and render2DUnProjected(). |
|
|
The BBox of all vertices. used for render2DClip().
Definition at line 94 of file computed_string.h. Referenced by NL3D::CFontManager::computeString(), render2DClip(), and render2DUnProjected(). |
|
|
The BBox of all vertices. used for render2DClip().
Definition at line 94 of file computed_string.h. Referenced by NL3D::CFontManager::computeString(), render2DClip(), and render2DUnProjected(). |
1.3.6