/// @par /// /// Spans will only be added for triangles that overlap the heightfield grid. /// /// @see rcHeightfield bool rcRasterizeTriangles(rcContext* ctx, const float* verts, const unsigned char* areas, const int nt, rcHeightfield& solid, const int flagMergeThr) { rcAssert(ctx); rcScopedTimer timer(ctx, RC_TIMER_RASTERIZE_TRIANGLES); const float ics = 1.0f/solid.cs; const float ich = 1.0f/solid.ch; // Rasterize triangles. for (int i = 0; i < nt; ++i) { const float* v0 = &verts[(i*3+0)*3]; const float* v1 = &verts[(i*3+1)*3]; const float* v2 = &verts[(i*3+2)*3]; // Rasterize. if (!rasterizeTri(v0, v1, v2, areas[i], solid, solid.bmin, solid.bmax, solid.cs, ics, ich, flagMergeThr)) { ctx->log(RC_LOG_ERROR, "rcRasterizeTriangles: Out of memory."); return false; } } return true; }
void PipeLine::drawTriMesh(void){ //FIXME visual culling VertexIterator::TriangleIterator allTriangles(curMesh_->triangleIterator()); for(auto& i:allTriangles ){ Float4* f1=i.f1_; Float4* f2=i.f2_; Float4* f3=i.f3_; //back face cull if( cullStateEnabled_ && backFaceCull(*f1,*f2,*f3) ) continue; assemblyV.reset(); assemblyV.clone(f1,0); assemblyV.clone(f2,1); assemblyV.clone(f3,2); // clip in clipspace lerp /* 剪裁空间内插值求交点 不需要透视矫正 */ int ret = clipTriangleInClipSpace(); if(ret == 3){ // Clip space TO screen space assemblyV.toScreen(uniforms_->viewPort_,assemblyV.NOTRICLIP); rasterizeTri(0,1,2); } else if(ret == 4){ // Clip space TO screen space assemblyV.toScreen(uniforms_->viewPort_,assemblyV.TRICLIPED); rasterizeTri(0,1,2); rasterizeTri(3,0,2); } else // ret == 0 continue; } }
/// @par /// /// No spans will be added if the triangle does not overlap the heightfield grid. /// /// @see rcHeightfield void rcRasterizeTriangle(rcContext* ctx, const float* v0, const float* v1, const float* v2, const unsigned char area, rcHeightfield& solid, const int flagMergeThr) { rcAssert(ctx); ctx->startTimer(RC_TIMER_RASTERIZE_TRIANGLES); const float ics = 1.0f/solid.cs; const float ich = 1.0f/solid.ch; rasterizeTri(v0, v1, v2, area, solid, solid.bmin, solid.bmax, solid.cs, ics, ich, flagMergeThr); ctx->stopTimer(RC_TIMER_RASTERIZE_TRIANGLES); }
void rcRasterizeTriangle(const float* v0, const float* v1, const float* v2, const unsigned char area, rcHeightfield& solid, const int flagMergeThr) { rcTimeVal startTime = rcGetPerformanceTimer(); const float ics = 1.0f/solid.cs; const float ich = 1.0f/solid.ch; rasterizeTri(v0, v1, v2, area, solid, solid.bmin, solid.bmax, solid.cs, ics, ich, flagMergeThr); rcTimeVal endTime = rcGetPerformanceTimer(); if (rcGetBuildTimes()) rcGetBuildTimes()->rasterizeTriangles += rcGetDeltaTimeUsec(startTime, endTime); }
/// @par /// /// No spans will be added if the triangle does not overlap the heightfield grid. /// /// @see rcHeightfield bool rcRasterizeTriangle(rcContext* ctx, const float* v0, const float* v1, const float* v2, const unsigned char area, rcHeightfield& solid, const int flagMergeThr) { rcAssert(ctx); rcScopedTimer timer(ctx, RC_TIMER_RASTERIZE_TRIANGLES); const float ics = 1.0f/solid.cs; const float ich = 1.0f/solid.ch; if (!rasterizeTri(v0, v1, v2, area, solid, solid.bmin, solid.bmax, solid.cs, ics, ich, flagMergeThr)) { ctx->log(RC_LOG_ERROR, "rcRasterizeTriangle: Out of memory."); return false; } return true; }
/// @par /// /// Spans will only be added for triangles that overlap the heightfield grid. /// /// @see rcHeightfield void rcRasterizeTriangles(rcContext* ctx, const float* verts, const unsigned char* areas, const int nt, rcHeightfield& solid, const int flagMergeThr) { rcAssert(ctx); ctx->startTimer(RC_TIMER_RASTERIZE_TRIANGLES); const float ics = 1.0f/solid.cs; const float ich = 1.0f/solid.ch; // Rasterize triangles. for (int i = 0; i < nt; ++i) { const float* v0 = &verts[(i*3+0)*3]; const float* v1 = &verts[(i*3+1)*3]; const float* v2 = &verts[(i*3+2)*3]; // Rasterize. rasterizeTri(v0, v1, v2, areas[i], solid, solid.bmin, solid.bmax, solid.cs, ics, ich, flagMergeThr); } ctx->stopTimer(RC_TIMER_RASTERIZE_TRIANGLES); }
void rcRasterizeTriangles(const float* verts, const unsigned char* areas, const int nt, rcHeightfield& solid, const int flagMergeThr) { rcTimeVal startTime = rcGetPerformanceTimer(); const float ics = 1.0f/solid.cs; const float ich = 1.0f/solid.ch; // Rasterize triangles. for (int i = 0; i < nt; ++i) { const float* v0 = &verts[(i*3+0)*3]; const float* v1 = &verts[(i*3+1)*3]; const float* v2 = &verts[(i*3+2)*3]; // Rasterize. rasterizeTri(v0, v1, v2, areas[i], solid, solid.bmin, solid.bmax, solid.cs, ics, ich, flagMergeThr); } rcTimeVal endTime = rcGetPerformanceTimer(); if (rcGetBuildTimes()) rcGetBuildTimes()->rasterizeTriangles += rcGetDeltaTimeUsec(startTime, endTime); }