BaseBlock * BaseBlock::create(BlockType type, cocos2d::Vec2 position) { BaseBlock * baseblock = new (std::nothrow) BaseBlock(); if (baseblock && baseblock->init(type,position)) { baseblock->autorelease(); return baseblock; } CC_SAFE_DELETE(baseblock); return nullptr; }
BaseBlock * BaseBlock::create(std::string fileNameStr, float attack, std::string m_name, Vec2 blockPos) { BaseBlock * block = new BaseBlock(); if (block && block->init(fileNameStr, attack, m_name, blockPos)) { block->autorelease(); return block; } CC_SAFE_DELETE(block); return nullptr; }
// take all provided params from other and apply to self // NOTE: this requires that "other" is of the same derived type as this bool BaseBlock::merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { bool some_param_changed = false; BlockDescriptor::all_params_list_t::const_iterator end_it = block_data.mAllParams.end(); for (BlockDescriptor::all_params_list_t::const_iterator it = block_data.mAllParams.begin(); it != end_it; ++it) { const Param* other_paramp = other.getParamFromHandle(it->mParamHandle); ParamDescriptor::merge_func_t merge_func = it->mMergeFunc; if (merge_func) { Param* paramp = getParamFromHandle(it->mParamHandle); some_param_changed |= merge_func(*paramp, *other_paramp, overwrite); } } return some_param_changed; }
void optimization::GraphHandler::recieveTuple(lookup::Env* env,pTuple p) { if (m_currentBlock == NULL) m_env = env; else assert ( m_env == env ); BaseBlock* newblock; switch( p->getOp() ) { case tuple::Tuple::JMP: m_currentBlock->addTuple(p); m_currentBlock->setGotoLabel( p->getSrc1() ); m_baseBlocks.push_back(m_currentBlock); m_currentBlock = createNewBaseBlock(); break; case tuple::Tuple::JE: case tuple::Tuple::JNE: case tuple::Tuple::JG: case tuple::Tuple::JGE: case tuple::Tuple::JL: case tuple::Tuple::JLE: m_currentBlock->addTuple(p); m_currentBlock->setGotoLabel( p->getTarget() ); newblock = createNewBaseBlock(); //相邻可达 m_currentBlock->addToBlock (newblock); newblock->addFromBlock(m_currentBlock); m_baseBlocks.push_back(m_currentBlock); m_currentBlock = newblock; break; case tuple::Tuple::RET: m_currentBlock->addTuple(p); m_baseBlocks.push_back(m_currentBlock); m_currentBlock = createNewBaseBlock(); break; case tuple::Tuple::LABEL: newblock = createNewBaseBlock(); //相邻可达 m_currentBlock->addToBlock( newblock ); newblock->addFromBlock(m_currentBlock); m_baseBlocks.push_back(m_currentBlock); m_currentBlock = newblock; m_currentBlock->setInLabel(p->getSrc1()); m_currentBlock->addTuple(p); break; case tuple::Tuple::FUNC: m_currentBlock = createNewBaseBlock(); m_currentBlock->addTuple(p); break; case tuple::Tuple::ENDP: case tuple::Tuple::MAINEND: m_baseBlocks.push_back(m_currentBlock); flushFunction(p); break; default: m_currentBlock->addTuple(p); } }
void Chunk::updateVisibility( ) { BaseBlock* b = nullptr; BaseBlock* cb = nullptr; short visFlags = 0; BlockList::iterator it; if( _hasChunkFlag( DataUpdated ) && getBlockCount() > 0 ) { size_t id = 0; mVisibleFaces = 0; ChunkScalar worldX = getX() * CHUNK_WIDTH; ChunkScalar worldY = getY() * CHUNK_HEIGHT; ChunkScalar worldZ = getZ() * CHUNK_WIDTH; ChunkScalar blockX = 0; ChunkScalar blockY = 0; ChunkScalar blockZ = 0; bool fc = getBlockCount() == CHUNK_SIZE; for( long z = 0; z < CHUNK_WIDTH; z++ ) { for( long y = 0; y < CHUNK_HEIGHT; y++ ) { for( long x = 0; x < CHUNK_WIDTH; x++ ) { id = BLOCK_INDEX_2( x, y, z ); b = mBlocks[id]; if( b == nullptr ) { continue; } if( fc && ( x > 0 && x < CHUNK_WIDTH-1 && y > 0 && y < CHUNK_HEIGHT-1 && z > 0 && z < CHUNK_WIDTH-1 ) ) { continue; } blockX = worldX + x; blockY = worldY + y; blockZ = worldZ + z; visFlags = 0; //Check All axes for adjacent blocks. CHECK_FACE( x < CHUNK_WIDTH-1, 1, 0, 0, FACE_RIGHT ); CHECK_FACE( x > 0, -1, 0, 0, FACE_LEFT ); CHECK_FACE( y < CHUNK_HEIGHT-1, 0, 1, 0, FACE_TOP ); CHECK_FACE( y > 0, 0,-1, 0, FACE_BOTTOM ); CHECK_FACE( z < CHUNK_WIDTH-1, 0, 0, 1, FACE_BACK ); CHECK_FACE( z > 0, 0, 0,-1, FACE_FORWARD ); if( b->getVisFlags() != visFlags ) { // Check to see if we need to change the VB data. if( visFlags > 0 && b->getVisFlags() == 0 ) { mVisibleBlocks.insert( BlockList::value_type( id, b ) ); } else if( visFlags == 0 && b->getVisFlags() > 0 ) { it = mVisibleBlocks.find( id ); mVisibleBlocks.erase( it ); } b->updateVisFlags(visFlags); } } } } _raiseChunkFlag( MeshInvalid ); } }