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."); } }
//--------------------------------------------------------------------------- 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; } } }