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);
}
Пример #2
0
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();
}
Пример #3
0
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();
}
Пример #4
0
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;
}
Пример #5
0
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);
	}
}
Пример #6
0
eU32 eMesh::addVertex(const eVector3 &pos, const eColor &color)
{
    return addVertex(pos, eVector3(), eVector2(), color);
}
Пример #7
0
void eDeferredRenderer::renderQuad(const eRect &r, const eSize &size) const
{
    renderQuad(r, size, eVector2(1.0f, 1.0f), eVector2(0.0f, 0.0f));
}
Пример #8
0
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();
}
Пример #9
0
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]);
}