//******************************************************************************* void CWaterEnvMap::renderTestMesh(IDriver &driver) { doInit(); CMaterial testMat; testMat.setLighting(false); testMat.texEnvOpRGB(0, CMaterial::Modulate); testMat.texEnvArg0RGB(0, CMaterial::Texture, CMaterial::SrcColor); testMat.texEnvArg0RGB(1, CMaterial::Diffuse, CMaterial::SrcColor); testMat.texEnvOpAlpha(0, CMaterial::Replace); testMat.texEnvArg0Alpha(0, CMaterial::Constant, CMaterial::SrcAlpha); testMat.texConstantColor(0, CRGBA(255, 255, 255, 255)); testMat.setDoubleSided(true); testMat.setZWrite(false); testMat.setZFunc(CMaterial::always); // tmp : test cubemap driver.activeVertexProgram(&testMeshVP); driver.activeVertexBuffer(_TestVB); driver.activeIndexBuffer(_TestIB); driver.setConstantMatrix(0, IDriver::ModelViewProjection, IDriver::Identity); // tmp _MaterialPassThruZTest.setTexture(0, _EnvCubic); driver.setConstantMatrix(0, IDriver::ModelViewProjection, IDriver::Identity); driver.setConstant(4, 2.f, 1.f, 0.f, 0.f); //driver.renderTriangles(testMat, 0, TEST_VB_NUM_TRIS); driver.renderTriangles(_MaterialPassThruZTest, 0, TEST_VB_NUM_TRIS); driver.activeVertexProgram(NULL); }
void CDeform2d::doDeform(const TPoint2DVect &surf, IDriver *drv, IPerturbUV *uvp) { nlassert(uvp); typedef CQuadEffect::TPoint2DVect TPoint2DVect; TPoint2DVect dest; CQuadEffect::processPoly(surf, (float) _XGranularity, (float) _YGranularity, dest); uint realWidth = NLMISC::raiseToNextPowerOf2(_Width); uint realHeight= NLMISC::raiseToNextPowerOf2(_Height); // draw the poly contour /*for (uint k = 0; k < dest.size(); ++k) { CDRU::drawLine(dest[k].x, dest[k].y, dest[(k + 1) % dest.size()].x, dest[(k + 1) % dest.size()].y, *drv, CRGBA::Red); }*/ static CMaterial mat; mat.setDoubleSided(true); mat.setLighting(false); mat.setZFunc(CMaterial::always); /* mat.setColor(CRGBA::Red); mat.texEnvOpRGB(0, CMaterial::Add); */ static CVertexBuffer vb; vb.setName("CDeform2d"); vb.setVertexFormat(CVertexBuffer::PositionFlag | CVertexBuffer::TexCoord0Flag); drv->setFrustum(0, (float) _Width, 0, (float) _Height, -1, 1, false); drv->setupViewMatrix(CMatrix::Identity); drv->setupModelMatrix(CMatrix::Identity); const float iDu = 1.f / _Width; const float iDv = 1.f / _Height; const float widthRatio = _Width / (float) realWidth; const float heightRatio = _Height / (float) realHeight; float u, u2, v; float du, dv; TPoint2DVect::const_iterator it; // get back datas from frame buffer for (it = dest.begin(); it != dest.end(); ++it) { // todo hulud use the new render to texture interface // drv->copyFrameBufferToTexture(_Tex, 0, (uint32) it->x,(uint32) it->y, (uint32) it->x, (uint32) it->y, _XGranularity, _YGranularity); } /** setup the whole vertex buffer * we don't share vertices here, as we work with unaligned quads */ vb.setNumVertices((uint32)dest.size() << 2); mat.setTexture(0, _Tex); { CVertexBufferReadWrite vba; vb.lock (vba); uint k = 0; // current index in the vertex buffer for (it = dest.begin(); it != dest.end(); ++it, k += 4) { // \todo optimize this by a direct access to the vertex buffer (if needed) // blit data to frame buffer and apply deformations vba.setVertexCoord(k, NLMISC::CVector(it->x, 0, it->y)); vba.setVertexCoord(k + 1, NLMISC::CVector(it->x + _XGranularity, 0, it->y)); vba.setVertexCoord(k + 2, NLMISC::CVector(it->x + _XGranularity, 0, it->y + _YGranularity)); vba.setVertexCoord(k + 3, NLMISC::CVector(it->x , 0, it->y + _YGranularity)); // perturbation of the uv coordinates u = it->x * iDu; v = it->y * iDv; uvp->perturbUV(u, v, du, dv); vba.setTexCoord(k, 0, (u + du) * widthRatio, (v + dv) * heightRatio ); u2 = (it->x + _XGranularity) * iDu; uvp->perturbUV(u2, v, du, dv); vba.setTexCoord(k + 1, 0, (u2 + du) * widthRatio, (v + dv) * heightRatio ); v = (it->y + _YGranularity) * iDv; uvp->perturbUV(u2, v, du, dv); vba.setTexCoord(k + 2, 0, (u2 + du) * widthRatio, (v + dv) * heightRatio ); uvp->perturbUV(u, v, du, dv); vba.setTexCoord(k + 3, 0, (u + du) * widthRatio, (v + dv) * heightRatio ); } } drv->activeVertexBuffer(vb); drv->renderRawQuads(mat, 0, (uint32)dest.size()); }