static void SendData( CFunctor **pData, unsigned int nCount )
{
	da::protobuf::GameData pbGameData;
	pbGameData.set_map_name(STRING(gpGlobals->mapname));

#ifdef _DEBUG
	pbGameData.set_debug(true);
#else
	pbGameData.set_debug(false);
#endif

	const ConVar* pHostname = cvar->FindVar( "hostname" );
	pbGameData.set_server_name(pHostname->GetString());

	pbGameData.set_timestamp((unsigned)time(NULL));

	da::protobuf::PlayerPositions* pPlayerPositions = pbGameData.mutable_positions();

	const CUtlVector<Vector>& avecPlayerPositions = g_DataManager.GetPlayerPositions();

	auto pPositions = pPlayerPositions->mutable_position();
	pPositions->Reserve(avecPlayerPositions.Count());

	size_t iDataSize = avecPlayerPositions.Count();

	for (size_t i = 0; i < iDataSize; i++)
		FillProtoBufVector(pPositions->Add(), avecPlayerPositions[i]);

	g_DataManager.ClearData();

	std::string sError;
	if (!DASendData(pbGameData, sError))
		Msg("Error sending game data: %s", sError.c_str());
}
Beispiel #2
0
bool CToyUtil::Write(const tstring& sFilename)
{
	CalculateVisibleAreas();

	for (size_t i = m_asMaterials.size()-1; i < m_asMaterials.size(); i--)
	{
		// Must have at least one vertex or you get the boot.
		if (!m_aaflData[i].size())
		{
			m_aaflData.erase(m_aaflData.begin()+i);
			m_asMaterials.erase(m_asMaterials.begin()+i);
			//m_asCopyTextures.erase(m_asCopyTextures.begin()+i);
		}
	}

	// Copy textures to the destination folders.
/*	for (size_t i = 0; i < m_asTextures.size(); i++)
	{
		if (!m_asCopyTextures[i].length())
			continue;

		if (!m_asTextures[i].length())
			continue;

		if (!CopyFileTo(m_asCopyTextures[i], m_asTextures[i], true))
			TError("Couldn't copy texture '" + m_asCopyTextures[i] + "' to '" + m_asTextures[i] + "'.\n");
	}*/

	tinker::protobuf::Toy pbToy;

	tinker::protobuf::ToyBase* pToyBase = pbToy.mutable_base();

	FillProtoBufAABB(pToyBase->mutable_physics_bounds(), m_aabbPhysBounds);
	FillProtoBufAABB(pToyBase->mutable_visual_bounds(), m_aabbVisBounds);

	tinker::protobuf::ToyMesh* pToyMesh = m_asMaterials.size()?pbToy.mutable_mesh():nullptr;
	for (size_t i = 0; i < m_asMaterials.size(); i++)
	{
		auto* pBaseMaterial = pToyBase->add_material();
		auto* pMeshMaterial = pToyMesh->add_material();

		pBaseMaterial->set_name(m_asMaterials[i].c_str());
		pBaseMaterial->set_vertex_size_bytes(GetVertexSizeInBytes());
		pBaseMaterial->set_vertex_count(m_aaflData[i].size()/(GetVertexSizeInBytes()/sizeof(float)));
		pBaseMaterial->set_uv_offset(GetVertexUVOffsetInBytes());
		pBaseMaterial->set_normal_offset(GetVertexNormalOffsetInBytes());
		pBaseMaterial->set_tangent_offset(GetVertexTangentOffsetInBytes());
		pBaseMaterial->set_bitangent_offset(GetVertexBitangentOffsetInBytes());

		auto* pData = pMeshMaterial->mutable_data();
		pMeshMaterial->mutable_data()->Reserve(m_aaflData[i].size());

		auto* aflData = m_aaflData[i].data();
		size_t iDataSize = m_aaflData[i].size();

		for (size_t j = 0; j < iDataSize; j++)
			pData->AddAlreadyReserved(aflData[j]);
	}

	tinker::protobuf::ToyPhys* pToyPhys = (m_aiPhysIndices.size()||m_atrsPhysBoxes.size())?pbToy.mutable_phys():nullptr;
	if (m_aiPhysIndices.size())
	{
		if (!m_bConcaveAllowed)
		{
			CConvexHullGenerator c(m_avecPhysVerts);
			m_aiPhysIndices = c.GetConvexTriangles();
			pToyPhys->set_concave(false);
		}
		else
			pToyPhys->set_concave(true);

		auto* pIndices = pToyPhys->mutable_index();
		auto* pVerts = pToyPhys->mutable_vert();

		TAssert(m_aiPhysIndices.size()%3==0);

		pIndices->Reserve(m_aiPhysIndices.size());

		auto* aiData = m_aiPhysIndices.data();
		size_t iDataSize = m_aiPhysIndices.size();

		for (size_t i = 0; i < iDataSize; i++)
			pIndices->AddAlreadyReserved(aiData[i]);

		pVerts->Reserve(m_avecPhysVerts.size()*3);

		auto* aflData = m_avecPhysVerts.data();
		iDataSize = m_avecPhysVerts.size();

		for (size_t i = 0; i < iDataSize; i++)
		{
			pVerts->AddAlreadyReserved(aflData[i].x);
			pVerts->AddAlreadyReserved(aflData[i].y);
			pVerts->AddAlreadyReserved(aflData[i].z);
		}
	}

	if (m_atrsPhysBoxes.size())
	{
		auto* pBoxen = pToyPhys->mutable_box();

		pBoxen->Reserve(m_atrsPhysBoxes.size());

		for (size_t i = 0; i < m_atrsPhysBoxes.size(); i++)
		{
			auto* pBox = pBoxen->Add();
			FillProtoBufVector(pBox->mutable_translation(), m_atrsPhysBoxes[i].m_vecTranslation);
			FillProtoBufEAngle(pBox->mutable_rotation(), m_atrsPhysBoxes[i].m_angRotation);
			FillProtoBufVector(pBox->mutable_scaling(), m_atrsPhysBoxes[i].m_vecScaling);
		}
	}

	for (size_t i = 0; i < m_asSceneAreas.size(); i++)
	{
		auto* pArea = pbToy.add_area();

		FillProtoBufAABB(pArea->mutable_size(), m_asSceneAreas[i].m_aabbArea);
		pArea->set_file(m_asSceneAreas[i].m_sFileName.c_str());

		for (size_t j = 0; j < m_asSceneAreas[i].m_aiVisibleAreas.size(); j++)
			pArea->add_neighbor(m_asSceneAreas[i].m_aiVisibleAreas[j]);
	}

	std::fstream output(sFilename.c_str(), std::ios::out | std::ios::trunc | std::ios::binary);

	TAssert(!!output);
	if (!output)
		return false;

	if (!pbToy.SerializeToOstream(&output))
		return false;

	return true;
}
Beispiel #3
0
void FillProtoBufAABB(tinker::protobuf::AABB* pAABB, const AABB& aabbFill)
{
	FillProtoBufVector(pAABB->mutable_min(), aabbFill.m_vecMins);
	FillProtoBufVector(pAABB->mutable_max(), aabbFill.m_vecMaxs);
}