Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
	// 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;
	}
Example #4
0
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);
	}


}
Example #5
0
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 );
	}
}