Exemple #1
0
    void DiGBuffer::Create()
    {
        // create RTs
        DiString gbName;
        gbName = "_gb_0";

        DiTexturePtr tex;
        tex = DiAssetManager::GetInstance().CreateOrReplaceAsset<DiTexture>(gbName);
        tex->SetDimensions(0,0);
        tex->SetAdaptedRT(mParentWnd->GetRenderBuffer());
        tex->SetViewportScale(DiVec2(1,1));
        tex->SetFormat(PF_A32B32G32R32F);
        tex->SetResourceUsage(RU_NONE);
        tex->SetUsage(TU_RENDER_TARGET);
        tex->CreateTexture();
        tex->SetAddressing(AM_BORDER);

        DiRenderTarget* rt = tex->GetRenderTarget();    
        rt->SetShouldUpdate(false);
        //rt->SetDepthBufferPool(DiDepthBuffer::POOL_DEFAULT);

        //rt->AttachDepthBuffer(mParentWnd->GetRenderBuffer()->GetDepthBuffer());
    
        mTexture.push_back(tex);
        mRenderTargets.push_back(rt);

        // create materials
        mMaterial = DiMaterial::QuickCreate("gbuffer.vsh","gbuffer.psh");
        mMaterial->SetDepthWrite(TRUE);
        mMaterial->SetDepthCheck(TRUE);
    }
Exemple #2
0
    void DiPostEffectPass::BuildTexture( int scale, DiPixelFormat format )
    {
        DiString texname = mPassName + "_t";

        mQuadScale = scale;

        mTexture = DiAssetManager::GetInstance().CreateOrReplaceAsset<DiTexture>(texname);
        mTexture->SetDimensions(0,0);
        mTexture->SetAdaptedRT(mParent->GetPostEffectManager(
            )->GetRenderWindow()->GetRenderBuffer());
        mTexture->SetViewportScale(DiVec2(1,1));
        mTexture->SetFormat(format);
        mTexture->SetResourceUsage(RU_NONE);
        mTexture->SetUsage(TU_RENDER_TARGET);
        mTexture->CreateTexture();
        mTexture->SetAddressing(AM_BORDER);
        mRenderTarget = mTexture->GetRenderTarget();    
        mRenderTarget->SetShouldUpdate(false);
        mRenderTarget->SetDepthBufferPool(0);
    }
Exemple #3
0
    void DiMaterial::LoadShader(const DiString& vsname, const DiString& psname)
    {
        if (!DiShaderManager::GetInstancePtr())
            return;

        // no need to release these pointers since we have shader manager
        mVertexShader = DiShaderManager::GetInstance().LoadShader(vsname, SHADER_VERTEX, mShaderFlag);
        mPixelShader  = DiShaderManager::GetInstance().LoadShader(psname, SHADER_PIXEL , mShaderFlag);
        
        mVSName = vsname;
        mPSName = psname;

        mShaderParameter->LoadParameters();
        
        if(mShaderFlag & SHADER_FLAG_SHADOW_RECEIVER)
        {
            mShaderParameter->WriteTexture2D("shadowMap", "_shad_tex_0");
            mShaderParameter->WriteFloat2("invShadowMapSize", DiVec2(1/1024.0f, 1/1024.0f)); // todo
        }
    }
Exemple #4
0
    void DiSprite::UpdateGeometry(DiRenderTarget* rt)
    {
        if (mQuads.empty())
        {
            mPrimitiveCount = 0;
            return;
        }

        if (!rt)
            return;

        ReleaseSourceData();

        auto vb = Driver->CreateVertexBuffer();
        if (!vb)
            return;

        mSourceData.push_back(vb);

        mVerticesNum = 6 * mQuads.size();
        mPrimitiveCount = 2 * mQuads.size();
        uint32 vertSize = (3 + 2) * sizeof(float) + sizeof(ARGB);

        mSourceData[0]->Create(mVerticesNum*vertSize);
        uint8* lockedData = DI_NEW uint8[mVerticesNum*vertSize];

        uint32 w = (uint32)(rt->GetWidth() * rt->GetViewport().mWidth);
        uint32 h = (uint32)(rt->GetHeight() * rt->GetViewport().mHeight);

        DiVec2 invScreenSize;
        invScreenSize = DiVec2(1.0f / (float)w, 1.0f / (float)h);
    
        DiVec2 posAdjust(1, -1);

        float* dest = (float*)lockedData;
        if (!mMaterial || mMaterial->HasTexture())
        {
            for (auto it = mQuads.begin(); it != mQuads.end(); ++it)
            {
                DiQuadElement quad = *it;

                DiVec2 topLeft, bottomRight, topLeftUv, bottomRightUv;

                quad.top *= -1;
                quad.bottom *= -1;

                if (!quad.absCoord)
                {
                    quad.left *= (float)w;
                    quad.right *= (float)w;
                    quad.top *= (float)h;
                    quad.bottom *= (float)h;
                }

                topLeft = (DiVec2((float)quad.left, (float)quad.top)/*+DiVec2(0.5f,0.5f)*/) * invScreenSize*2;
                bottomRight = (DiVec2((float)quad.right, (float)quad.bottom)/*+DiVec2(0.5f,0.5f)*/) * invScreenSize*2;

                topLeft -= posAdjust;
                bottomRight -= posAdjust;

                topLeftUv = DiVec2((float)quad.leftUv, (float)quad.topUv);
                bottomRightUv = DiVec2((float)quad.rightUv, (float)quad.bottomUv);

                *dest++ = topLeft.x; *dest++ = topLeft.y; *dest++ = 0.0f;
                *((ARGB*)dest) = quad.topLeftColor; dest++;
                *dest++ = topLeftUv.x; *dest++ = topLeftUv.y;

                *dest++ = topLeft.x; *dest++ = bottomRight.y; *dest++ = 0.0f;
                *((ARGB*)dest) = quad.bottomLeftColor; dest++;
                *dest++ = topLeftUv.x; *dest++ = bottomRightUv.y;

                *dest++ = bottomRight.x; *dest++ = topLeft.y; *dest++ = 0.0f;
                *((ARGB*)dest) = quad.topRightColor; dest++;
                *dest++ = bottomRightUv.x; *dest++ = topLeftUv.y;

                *dest++ = bottomRight.x; *dest++ = topLeft.y; *dest++ = 0.0f;
                *((ARGB*)dest) = quad.topRightColor; dest++;
                *dest++ = bottomRightUv.x; *dest++ = topLeftUv.y;

                *dest++ = topLeft.x; *dest++ = bottomRight.y; *dest++ = 0.0f;
                *((ARGB*)dest) = quad.bottomLeftColor; dest++;
                *dest++ = topLeftUv.x; *dest++ = bottomRightUv.y;

                *dest++ = bottomRight.x; *dest++ = bottomRight.y; *dest++ = 0.0f;
                *((ARGB*)dest) = quad.bottomRightColor; dest++;
                *dest++ = bottomRightUv.x; *dest++ = bottomRightUv.y;
            }
        }
        else
        {
            for (auto it = mQuads.begin(); it != mQuads.end(); ++it)
            {
                DiQuadElement quad = *it;
                  quad.top *= -1;
                  quad.bottom *= -1;

                if (!quad.absCoord)
                {
                    quad.left *= (float)w;
                    quad.right *= (float)w;
                    quad.top *= (float)h;
                    quad.bottom *= (float)h;
                }

                DiVec2 topLeft, bottomRight, topLeftUV, bottomRightUV;
                topLeft = (DiVec2((float)quad.left, (float)quad.top)) * invScreenSize*2;
                bottomRight = (DiVec2((float)quad.right, (float)quad.bottom)) * invScreenSize*2;

                topLeft -= posAdjust;
                bottomRight -= posAdjust;

                *dest++ = topLeft.x; *dest++ = topLeft.y; *dest++ = 0.0f;
                *((ARGB*)dest) = quad.topLeftColor; dest++;
                dest += 2;

                *dest++ = topLeft.x; *dest++ = bottomRight.y; *dest++ = 0.0f;
                *((ARGB*)dest) = quad.bottomLeftColor; dest++;
                dest += 2;

                *dest++ = bottomRight.x; *dest++ = topLeft.y; *dest++ = 0.0f;
                *((ARGB*)dest) = quad.topRightColor; dest++;
                dest += 2;

                *dest++ = bottomRight.x; *dest++ = topLeft.y; *dest++ = 0.0f;
                *((ARGB*)dest) = quad.topRightColor; dest++;
                dest += 2;

                *dest++ = topLeft.x; *dest++ = bottomRight.y; *dest++ = 0.0f;
                *((ARGB*)dest) = quad.bottomLeftColor; dest++;
                dest += 2;

                *dest++ = bottomRight.x; *dest++ = bottomRight.y; *dest++ = 0.0f;
                *((ARGB*)dest) = quad.bottomRightColor; dest++;
                dest += 2;
            }
        }

        mSourceData[0]->WriteData(0, mVerticesNum*vertSize, lockedData);
        DI_DELETE[] lockedData;
        mSourceData[0]->SetStride(vertSize);
    }