Пример #1
0
void Renderer::LoadJson()
{
	m_doc = m_jsonloader->CreateFrom(m_JsonData, m_JsonDataSize);
	
	if (m_doc)
	{
		root = m_doc->GetRoot();
		
		// Loop through the array of blocks
		for(int i = 0; i < root.size(); i++)
		{
			if(root[i]["blockType"].asString() == "PipelineTree")
			{
				m_RootName = root[i]["blockData"]["root"].asCString();
				
			} else if(root[i]["blockType"].asString() == "AuxComp") {
				/*
				 * Create AuxBlock
				 */
				Json::StyledWriter writer;
				Block* newauxblock = new AuxiliaryBlock(this, writer.write(root[i]).c_str());
				newauxblock->Initialize(&root[i]);
				
				// Add newly created aux block to the block list
				m_Blocks.insert( std::make_pair(root[i]["blockName"].asString(), newauxblock));
				
				
			} else if(root[i]["blockType"].asString() == "Root") {
				/*
				 * Create Root block
				 */
				Json::StyledWriter writer;
				Block* newrootblock = new RootBlock(this, writer.write(root[i]).c_str());
				newrootblock->Initialize(&root[i]);
				
				// Add newly created root block to the block list
				m_Blocks.insert( std::make_pair(root[i]["blockName"].asString(), newrootblock));
				
			} else if(root[i]["blockType"].asString() == "Post-Process") {
				/*
				 * Create Post-Process block
				 */
				Json::StyledWriter writer;
				Block* newppblock = new PostProcessBlock(this, writer.write(root[i]).c_str());
				newppblock->Initialize(&root[i]);

				// Add newly created post-process block to the block list
				m_Blocks.insert( std::make_pair(root[i]["blockName"].asString(), newppblock));

			} else if(root[i]["blockType"].asString() == "Render") {
				/*
				 * Create Geometry Rendering block
				 */
				Json::StyledWriter writer;
				Block* newrenderblock = new RenderBlock(this, writer.write(root[i]).c_str());
				newrenderblock->Initialize(&root[i]);

				// Add newly created rendering block to the block list
				m_Blocks.insert( std::make_pair(root[i]["blockName"].asString(), newrenderblock));

			} else {
				Kernel::GetInstance()->Log(m_LogTag | Logger::IS_CRITICAL, "Unknown block type: %s", root[i]["blockType"].asCString());

			}
		}
		
		// Lookup root node and set result specific data.
		if (m_RootName)
		{
			m_RootBlock = (RootBlock*)m_Blocks[m_RootName];
			m_Width = m_RootBlock->m_Width;
			m_Height = m_RootBlock->m_Height;
		}
		
		
	} else {
		Kernel::GetInstance()->Log(m_LogTag | Logger::IS_CRITICAL, "Error while loading JSON data.");
	}
}
Пример #2
0
//---------------------------------------------------------------------------
void ImageTessellator::Block::Initialize (ImageTessellator* pTess,
    int iBlock, int iX, int iY, int iStride, bool bEven)
{
    m_iX = iX;
    m_iY = iY;
    m_iStride = iStride;

    // get image intensities for 3x3 block
    int iOrigin = m_iX + pTess->m_iSize*m_iY;
    int iZ[9];
    iZ[0] = pTess->m_aiImage[iOrigin];
    iZ[1] = pTess->m_aiImage[iOrigin + m_iStride];
    iZ[2] = pTess->m_aiImage[iOrigin + 2*m_iStride];
    iOrigin += pTess->m_iSize*m_iStride;
    iZ[3] = pTess->m_aiImage[iOrigin];
    iZ[4] = pTess->m_aiImage[iOrigin + m_iStride];
    iZ[5] = pTess->m_aiImage[iOrigin + 2*m_iStride];
    iOrigin += pTess->m_iSize*m_iStride;
    iZ[6] = pTess->m_aiImage[iOrigin];
    iZ[7] = pTess->m_aiImage[iOrigin + m_iStride];
    iZ[8] = pTess->m_aiImage[iOrigin + 2*m_iStride];

    // compute delta values
    m_iDelta[0] = abs((iZ[0] - 2*iZ[1] + iZ[2])/2);
    m_iDelta[1] = abs((iZ[8] - 2*iZ[5] + iZ[2])/2);
    m_iDelta[2] = abs((iZ[8] - 2*iZ[7] + iZ[6])/2);
    m_iDelta[3] = abs((iZ[0] - 2*iZ[3] + iZ[6])/2);
    if ( bEven )
        m_iDelta[4] = abs((iZ[2] - 2*iZ[4] + iZ[6])/2);
    else
        m_iDelta[4] = abs((iZ[0] - 2*iZ[4] + iZ[8])/2);

    // set vertex dependencies
    int iTwoStride = 2*m_iStride;
    int iSizePlus1 = pTess->m_iSize+1;
    int iSizePlus2 = pTess->m_iSize+2;
    int iTwoSizePlus1 = 2*pTess->m_iSize+1;
    int iSizeTimesStride = pTess->m_iSize*m_iStride;
    int iSizePlus1TimesStride = iSizePlus1*m_iStride;
    int iSizePlus2TimesStride = iSizePlus2*m_iStride;
    int iSizeTimesTwoStride = pTess->m_iSize*iTwoStride;
    int iTwoSizePlus1TimesStride = iTwoSizePlus1*m_iStride;
    int iSizePlus1TimesTwoStride = iSizePlus1*iTwoStride;
    Vertex* pkVOrigin = pTess->m_akVertex + m_iX + pTess->m_iSize*m_iY;
    Vertex* apkVertex[9];
    apkVertex[0] = &pkVOrigin[0];
    apkVertex[1] = &pkVOrigin[m_iStride];
    apkVertex[2] = &pkVOrigin[iTwoStride];
    apkVertex[3] = &pkVOrigin[iSizeTimesStride];
    apkVertex[4] = &pkVOrigin[iSizePlus1TimesStride];
    apkVertex[5] = &pkVOrigin[iSizePlus2TimesStride];
    apkVertex[6] = &pkVOrigin[iSizeTimesTwoStride];
    apkVertex[7] = &pkVOrigin[iTwoSizePlus1TimesStride];
    apkVertex[8] = &pkVOrigin[iSizePlus1TimesTwoStride];

    apkVertex[1]->m_apkDependent[0] = apkVertex[4];
    apkVertex[3]->m_apkDependent[1] = apkVertex[4];
    apkVertex[5]->m_apkDependent[0] = apkVertex[4];
    apkVertex[7]->m_apkDependent[1] = apkVertex[4];
    if ( bEven )
    {
        apkVertex[4]->m_apkDependent[0] = apkVertex[6];
        apkVertex[4]->m_apkDependent[1] = apkVertex[2];
    }
    else
    {
        apkVertex[4]->m_apkDependent[0] = apkVertex[0];
        apkVertex[4]->m_apkDependent[1] = apkVertex[8];
    }

    // recurse on children (if any)
    if ( iStride > 1 )
    {
        // child stride is half the parent stride
        int iChildStride = iStride/2;

        // process child 00
        int iChild = 4*iBlock+1;
        Block* pkChild = &pTess->m_akBlock[iChild];
        pkChild->Initialize(pTess,iChild,iX,iY,iChildStride,true);
        m_iMin = pkChild->m_iMin;
        m_iMax = pkChild->m_iMax;

        // process child 01
        iChild++;
        pkChild++;
        pkChild->Initialize(pTess,iChild,iX+iStride,iY,iChildStride,
            false);
        if ( pkChild->m_iMin < m_iMin )
            m_iMin = pkChild->m_iMin;
        if ( pkChild->m_iMax > m_iMax )
            m_iMax = pkChild->m_iMax;

        // process child 10
        iChild++;
        pkChild++;
        pkChild->Initialize(pTess,iChild,iX,iY+iStride,iChildStride,
            false);
        if ( pkChild->m_iMin < m_iMin )
            m_iMin = pkChild->m_iMin;
        if ( pkChild->m_iMax > m_iMax )
            m_iMax = pkChild->m_iMax;

        // process child 11
        iChild++;
        pkChild++;
        pkChild->Initialize(pTess,iChild,iX+iStride,iY+iStride,
            iChildStride,true);
        if ( pkChild->m_iMin < m_iMin )
            m_iMin = pkChild->m_iMin;
        if ( pkChild->m_iMax > m_iMax )
            m_iMax = pkChild->m_iMax;
    }
    else
    {
        // compute z components of bounding box at leaf node of quadtree
        m_iMin = iZ[0];
        m_iMax = m_iMin;
        for (int i = 1; i < 9; i++)
        {
            int iTmp = iZ[i];
            if ( iTmp < m_iMin )
                m_iMin = iTmp;
            if ( iTmp > m_iMax )
                m_iMax = iTmp;
        }
    }
}