bool Renderable::load(const tinyxml2::XMLElement *pElement)
{
	pElement->QueryIntAttribute("order", &m_drawOrder);

	const tinyxml2::XMLElement* childElement = pElement->FirstChildElement("Texture");

	if(!childElement)
	{
		CORE_WARNING("No Texture element declared in Renderable component.");

		return false;
	}

	// Get file name
	std::string textureFile = make_string(childElement->GetText());

	if(textureFile.empty())
	{
		CORE_WARNING("No texture file defined in Renderable Component");
		return false;
	}

	// Trim whitespace
	trim(textureFile);

	sf::TexturePtr pTexture = TextureLocator::getObject()->get(textureFile);

	if(!pTexture)
	{
		CORE_ERROR("Failed to get texture: " + textureFile);
		return false;
	}

	TextureRegion tmpRegion(pTexture);

	childElement = pElement->FirstChildElement("Dimensions");

	if(childElement)
	{
		pElement->QueryFloatAttribute("width", &m_width);
		pElement->QueryFloatAttribute("height", &m_height);

        setWidth(m_width != 0 ? m_width / PhysicsLocator::PixelsPerMeter.x : 0);
        setHeight(m_height != 0 ? m_height / PhysicsLocator::PixelsPerMeter.y : 0);
	}

    m_textureRegion = tmpRegion;

    return true;
}
Beispiel #2
0
int32_t CoreUDPHandler::send(BinStream& bin_strm, const Inet_Addr& remote_addr)
{
    int32_t rc = sock_dgram_.send(bin_strm.get_rptr(), bin_strm.data_size(), remote_addr);
    if(rc < 0)
    {
        if(XEAGAIN == error_no() || XEINPROGRESS == error_no()) //插入一个写事件,防止SOCKET异常
        {
            CORE_WARNING("core udp send EAGAIN");
            REACTOR_INSTANCE()->register_handler(this, MASK_WRITE);

            bin_strm.rewind(true);
            return 0;
        }
        else
        {
            bin_strm.rewind(true);
            CORE_FATAL("core udp send failed, remote addr = " << remote_addr);
            return -1;
        }

        bin_strm.rewind(true);
    }

    THROTTLER()->add_udp_packet(bin_strm.data_size(), true);

    bin_strm.rewind(true);
    return rc;
}
void Connection_Manager::on_del_connection(CConnection* conn)
{
	if(conn->get_server_type() >= eDaemon_Server)
	{

		//BASE_GUARD(BaseThreadMutex, cf_mon, mutex_);
		CORE_WARNING("on del connection, sid = " << conn->get_server_id() << ", stype = " << GetServerName(conn->get_server_type()));

		Server_Node_Map::iterator it = nodes_.find(conn->get_server_id());
		if(it != nodes_.end())
		{
			it->second.conn = NULL;
			it->second.index = 0;

			it->second.strms.clear();

			if(it->second.daemon_del_)
			{
				if(notify_ != NULL)
				{
					notify_->on_server_dead(it->second.server_id, it->second.server_type);
				}

				nodes_.erase(it);
			}
		}
	}
}
Beispiel #4
0
int32_t CConnection::send(CCorePacket& packet, bool no_delay)
{
	int32_t ret = -1;

	GAIN_BINSTREAM(strm);

	*strm << packet;

	if(sbuffer_.remaining_length() < strm->data_size() + sizeof(uint32_t))
	{
		if(sbuffer_.length() < MAX_BUFFER_SIZE)//扩大TCP发送缓冲区,防止缓冲区太小造成发送包异常
		{
			sbuffer_.realloc_buffer(strm->data_size() + sizeof(uint32_t));
			CORE_WARNING("sbuffer realloc buffer, size = " << sbuffer_.length());
		}
		else //发送报文丢弃
		{
			CORE_ERROR("sbuffer is full, sbuffer.size = " << sbuffer_.length());
			RETURN_BINSTREAM(strm);

			return -1;
		}
	}

	THROTTLER()->add_tcp_packet(strm->data_size(), true);

	send_flag_ = true;

	if(sbuffer_.put(*strm))
	{
		if(no_delay)
		{
			sbuffer_.send(sock_stream_);
		}


		if(sbuffer_.data_length() > 0)
		{
			REACTOR_INSTANCE()->register_handler(this, MASK_WRITE);
		}
		else
		{
			REACTOR_INSTANCE()->remove_handler(this, MASK_WRITE);
		}

		ret = 0;
	}

	RETURN_BINSTREAM(strm);

	return ret;
}
bool Connection_Manager::on_add_connection(CConnection* conn)
{
	CORE_INFO("on add connection, sid = " << conn->get_server_id() << ", server type = " << GetServerName(conn->get_server_type()));
	if(conn->get_server_id() == 0)
	{
		return false;
	}

	if(conn->get_server_type() >= eDaemon_Server)
	{
		Server_Node_Map::iterator it = nodes_.find(conn->get_server_id());
		if(it != nodes_.end())
		{
			it->second.conn = conn;
			it->second.index = conn->get_index();
		
			for(StreamList::iterator list_it = it->second.strms.begin(); list_it != it->second.strms.end(); ++list_it)
			{
				if(!list_it->empty())
					conn->send(*list_it);
			}

			it->second.strms.clear();
		}
		else
		{
			Server_Node_t node;
			node.server_id = conn->get_server_id();
			node.server_type = conn->get_server_type();
			node.daemon_del_ = true;

			nodes_[conn->get_server_id()] = node;
			nodes_[conn->get_server_id()].index = conn->get_index();
			nodes_[conn->get_server_id()].conn = conn;
		}

		CORE_WARNING("on add connection, sid = " << conn->get_server_id() << ", stype = " << GetServerName(conn->get_server_type()));
		return true;
	}

	return false;
}
Beispiel #6
0
int32_t CConnection::send(const string& bin_stream)
{
	if(bin_stream.empty())
		return -1;

	uint32_t data_size = bin_stream.size();

	if(sbuffer_.remaining_length() < data_size + sizeof(uint32_t))
	{
		if(sbuffer_.length() < MAX_BUFFER_SIZE)//扩大TCP发送缓冲区,防止缓冲区太小造成发送包异常
		{
			sbuffer_.realloc_buffer(data_size + sizeof(uint32_t));
			CORE_WARNING("sbuffer realloc buffer, size = " << sbuffer_.length());
		}
		else //发送报文丢弃
		{
			CORE_ERROR("sbuffer is full, sbuffer.size = " << sbuffer_.length());
			return -1;
		}
	}

	send_flag_ = true;

	THROTTLER()->add_tcp_packet(data_size, true);

	if(sbuffer_.put(bin_stream))
	{
		if(sbuffer_.data_length() > 0)
		{
			REACTOR_INSTANCE()->register_handler(this, MASK_WRITE);
		}
		else
		{
			REACTOR_INSTANCE()->remove_handler(this, MASK_WRITE);
		}
	}

	return 0;
}