void eDeferredRenderer::renderQuad(const eRect &r, const eSize &size, eTexture2dDx11 *tex, const eVector2 &tileUv, const eVector2 &scrollUv) const { // set render states eRenderState &rs = eGfx->getRenderState(); rs.cullMode = eCULL_NONE; rs.depthTest = eFALSE; rs.viewport.set(0, 0, size.width, size.height); if (tex) rs.textures[0] = tex; // use default shaders if no other shaders set if (!rs.ps) rs.ps = m_psQuad; if (!rs.vs) rs.vs = m_vsQuad; // render quad const eCamera cam(0.0f, (eF32)size.width, 0.0f, (eF32)size.height, -1.0f, 1.0f); cam.activate(); eSimpleVtx *vp = nullptr; eGfx->beginLoadGeometry(m_geoQuad, 4, (ePtr *)&vp); { vp[0].set(eVector3((eF32)r.left, (eF32)r.top, 0.0f), eVector2(scrollUv.u, scrollUv.v+tileUv.v)); vp[1].set(eVector3((eF32)r.left, (eF32)r.bottom, 0.0f), eVector2(scrollUv.u, scrollUv.v)); vp[2].set(eVector3((eF32)r.right, (eF32)r.bottom, 0.0f), eVector2(scrollUv.u+tileUv.u, scrollUv.v)); vp[3].set(eVector3((eF32)r.right, (eF32)r.top, 0.0f), eVector2(scrollUv.u+tileUv.u, scrollUv.v+tileUv.v)); } eGfx->endLoadGeometry(m_geoQuad); eGfx->renderGeometry(m_geoQuad); }
void eMesh::_fillDynamicBuffers(ePtr param, eGeometry *geo) { ePROFILER_ZONE("Upload mesh"); DrawSection *ds = (DrawSection *)param; eASSERT(ds != eNULL); eASSERT(geo != eNULL); eVertex *vertices = eNULL; eU32 *indices = eNULL; geo->startFilling((ePtr *)&vertices, &indices); { if (ds->type == DrawSection::TYPE_POINTS) { eVector3 s, t; geo->getGraphics()->getBillboardVectors(s, t); const eVector3 normal = s^t; for (eU32 i=0, idxCount=0, vtxCount=0; i<ds->vertices.size(); i++) { const eVector3 r = s*ds->material->getPointSize(); const eVector3 u = t*ds->material->getPointSize(); const eVector3 pos = ds->vertices[i]->position; const eColor col = ds->vertices[i]->color; indices[idxCount++] = vtxCount+0; indices[idxCount++] = vtxCount+1; indices[idxCount++] = vtxCount+2; indices[idxCount++] = vtxCount+0; indices[idxCount++] = vtxCount+2; indices[idxCount++] = vtxCount+3; vertices[vtxCount++].set(pos-r-u, normal, eVector2(0.0f, 0.0f), col); vertices[vtxCount++].set(pos-r+u, normal, eVector2(0.0f, 1.0f), col); vertices[vtxCount++].set(pos+r+u, normal, eVector2(1.0f, 1.0f), col); vertices[vtxCount++].set(pos+r-u, normal, eVector2(1.0f, 0.0f), col); } } else { for (eU32 j=0; j<ds->vertices.size(); j++) { vertices[j] = *ds->vertices[j]; } eMemCopy(indices, &ds->indices[0], ds->indices.size()*sizeof(eU32)); } } geo->stopFilling(); }
void eDeferredRenderer::_renderShadowMap(const eCamera &cam, const eLight &light) { eStateManager::push(); eStateManager::bindVertexShader(m_vsShadow); eStateManager::bindPixelShader(m_psShadow); eStateManager::setCap(eCAP_ZBUFFER, eTRUE); eStateManager::setCap(eCAP_BLENDING, eFALSE); eStateManager::bindDepthTarget(eGraphicsApiDx9::TARGET_SCREEN); eStateManager::bindRenderTarget(0, m_deferredShadowMap); eStateManager::bindTexture(0, m_indirectionCm); eStateManager::bindTexture(1, m_unwrappedDistMap); eStateManager::bindTexture(2, eNULL); eStateManager::bindTexture(3, eNULL); eStateManager::bindTexture(4, eNULL); eStateManager::setTextureFilter(0, eTEXFILTER_NEAREST); eStateManager::setTextureFilter(1, eTEXFILTER_BILINEAR); eStateManager::setTextureAddressMode(0, eTEXADDRMODE_CLAMP); eStateManager::setTextureAddressMode(1, eTEXADDRMODE_CLAMP); eStateManager::setTextureAddressMode(2, eTEXADDRMODE_WRAP); eStateManager::apply(); m_gfx->clear(eCLEAR_COLORBUFFER, eColor::BLACK); if (light.getCastsAnyShadows()) { const eF32 nearZ = 0.1f; const eF32 farZ = light.getRange(); m_gfx->setPsConst(ePSCONST_SHADOW_MAP_SIZE, eVector2((eF32)m_unwrappedDistMap->getWidth(), (eF32)m_unwrappedDistMap->getHeight())); m_gfx->setPsConst(ePSCONST_SHADOW_PROJZ, eVector2(nearZ*farZ/(farZ-nearZ), farZ/(farZ-nearZ))); light.activate(m_gfx, cam.getViewMatrix()); _renderRenderJobs(m_allJobs, cam, eRenderJob::RENDER_ALL & ~eRenderJob::CASTSHADOW_OFF & ~eRenderJob::ALPHA_ON, eRenderJob::MATERIALS_OFF); } eStateManager::pop(); }
eLSystem::tState* eLSystem::getDefaultState(eF32 scale) { tState *state; state = &stack[0]; state->turtle.rotation = DEFAULT_ROTATION * this->m_initialRotation; // state->turtle.rotation = eQuat(); state->turtle.position = this->m_initialPosition; state->turtle.polyMatIdx = 0; state->turtle.texPos = eVector2(0.5f, 0.5f); state->turtle.texAngle = 0.0f; state->curPolyVertex = eNULL; state->parentState = eNULL; state->curBaseRotation = eQuat(); state->turtle.size = scale * this->m_sizePar; state->turtle.height = 1.0f; state->turtle.width =this->m_baseWidth; return state; }
void eLSystem::reset() { this->productions[0].clear(); // read axiom eS32 pos = 0; while(pos < (eS32)axiom.length()) { // read symbol tSymbol& symbol = this->productions[0].push(tSymbol()); symbol.symbol = axiom.at(pos++); this->setDefaultParams(symbol.symbol, &symbol.params[0], eNULL); symbol.texVecAngle = 0.0f; symbol.texVec = eVector2(0,0); symbol.mass = 1; // symbol.rotation = eQuat(); symbol.rotation = this->m_initialRotation; // read symbol params pos = readValInstanciation(axiom, pos, axiom.length(), eNULL, &symbol.params[0], eNULL); eASSERT(pos != -1); } }
eU32 eMesh::addVertex(const eVector3 &pos, const eColor &color) { return addVertex(pos, eVector3(), eVector2(), color); }
void eDeferredRenderer::renderQuad(const eRect &r, const eSize &size) const { renderQuad(r, size, eVector2(1.0f, 1.0f), eVector2(0.0f, 0.0f)); }
void eDeferredRenderer::renderQuad(const eRect &r, const eSize &size, const eVector2 &tileUv, const eVector2 &scrollUv) const { const eCamera cam(0.0f, (eF32)size.width, 0.0f, (eF32)size.height, -1.0f, 1.0f); cam.activate(m_gfx); eGeometry geo(4, 0, 2, eVTXTYPE_DEFAULT, eGeometry::TYPE_DYNAMIC, ePRIMTYPE_TRIANGLESTRIPS); eVertex *vertices = eNULL; geo.startFilling((ePtr *)&vertices, eNULL); { // +0.5 and -0.5 are required for offsetting screen-space // coordinates of quad a bit in order to compensate // for correct texel to pixel mapping in Direct3D9. vertices[0].set(eVector3((eF32)r.left-0.5f, (eF32)r.bottom+0.5f, 0.0f), eVector3(), eVector2(scrollUv.u, scrollUv.v), eColor::WHITE); vertices[1].set(eVector3((eF32)r.left-0.5f, (eF32)r.top+0.5f, 0.0f), eVector3(), eVector2(scrollUv.u, tileUv.v+scrollUv.v), eColor::WHITE); vertices[2].set(eVector3((eF32)r.right-0.5f, (eF32)r.bottom+0.5f, 0.0f), eVector3(), eVector2(tileUv.u+scrollUv.u, scrollUv.v), eColor::WHITE); vertices[3].set(eVector3((eF32)r.right-0.5f, (eF32)r.top+0.5f, 0.0f), eVector3(), eVector2(tileUv.u+scrollUv.u, tileUv.v+scrollUv.v), eColor::WHITE); } geo.stopFilling(); geo.render(); }
void eDeferredRenderer::renderTexturedQuad(const eRect &r, const eSize &size, eITexture2d *tex) const { renderTexturedQuad(r, size, tex, eVector2(1.0f, 1.0f), eVector2(0.0f, 0.0f)); }
void convert(const eMatrixHom &in, eMatrixHom2d &out) { double yaw = extractYaw(in); out.setIdentity(); out.rotate(yaw); out.translation() = eVector2(in.translation()[X], in.translation()[Y]); }