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()); }
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; }
void FillProtoBufAABB(tinker::protobuf::AABB* pAABB, const AABB& aabbFill) { FillProtoBufVector(pAABB->mutable_min(), aabbFill.m_vecMins); FillProtoBufVector(pAABB->mutable_max(), aabbFill.m_vecMaxs); }