aboutsummaryrefslogtreecommitdiff
path: root/tools/common/BlastDataExporter.cpp
blob: 622901ab8ca8dd5c3527a2039a22d4aa5bc5beac (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <BlastDataExporter.h>
#include "NvBlastExtPxManager.h"
#include <NvBlastExtAuthoringCollisionBuilder.h>
#include <Log.h>
#include "PsFileBuffer.h"
#include "NvBlastExtPxAsset.h"
#include "NvBlast.h"
#include <NvBlastTkAsset.h>

using namespace Nv::Blast;


ExtPxAsset* BlastDataExporter::createExtBlastAsset(std::vector<NvBlastBondDesc>& bondDescs, const std::vector<NvBlastChunkDesc>& chunkDescs,
	std::vector<ExtPxAssetDesc::ChunkDesc>& physicsChunks)
{
	ExtPxAssetDesc	descriptor;
	descriptor.bondCount = static_cast<uint32_t>(bondDescs.size());
	descriptor.bondDescs = bondDescs.data();
	descriptor.chunkCount = static_cast<uint32_t>(chunkDescs.size());
	descriptor.chunkDescs = chunkDescs.data();
	descriptor.bondFlags = nullptr;
	descriptor.pxChunks = physicsChunks.data();
	ExtPxAsset* asset = ExtPxAsset::create(descriptor, *mFramework);
	return asset;
}



NvBlastAsset* BlastDataExporter::createLlBlastAsset(std::vector<NvBlastBondDesc>& bondDescs, const std::vector<NvBlastChunkDesc>& chunkDescs)
{

	NvBlastAssetDesc assetDesc;
	assetDesc.bondCount = static_cast<uint32_t>(bondDescs.size());
	assetDesc.bondDescs = &bondDescs[0];

	assetDesc.chunkCount = static_cast<uint32_t>(chunkDescs.size());
	assetDesc.chunkDescs = &chunkDescs[0];


	std::vector<uint8_t> scratch(static_cast<unsigned int>(NvBlastGetRequiredScratchForCreateAsset(&assetDesc, m_log)));
	void* mem = _aligned_malloc(NvBlastGetAssetMemorySize(&assetDesc, m_log), 16);
	NvBlastAsset* asset = NvBlastCreateAsset(mem, &assetDesc, &scratch[0], m_log);
	return asset;
}

TkAsset* BlastDataExporter::createTkBlastAsset(const std::vector<NvBlastBondDesc>& bondDescs, const std::vector<NvBlastChunkDesc>& chunkDescs)
{
	TkAssetDesc desc;
	desc.bondCount = static_cast<uint32_t>(bondDescs.size());
	desc.bondDescs = bondDescs.data();
	desc.chunkCount = static_cast<uint32_t>(chunkDescs.size());
	desc.chunkDescs = chunkDescs.data();
	desc.bondFlags = nullptr;
	TkAsset* asset = mFramework->createAsset(desc);
	return asset;
};


bool BlastDataExporter::saveBlastLLAsset(const std::string& outputFilePath, const NvBlastAsset* asset)
{
	uint32_t assetSize = NvBlastAssetGetSize(asset, m_log);

	physx::PsFileBuffer fileBuf(outputFilePath.c_str(), physx::PxFileBuf::OPEN_WRITE_ONLY);
	if (!fileBuf.isOpen())
	{
		NVBLAST_LOG_ERROR(m_log, "Can't open output buffer. \n");
		return false;
	}
	fileBuf.write(asset, sizeof(char) * assetSize);
	fileBuf.close();
	return true;
}

bool BlastDataExporter::saveBlastTkAsset(const std::string& outputFilePath, const TkAsset* asset)
{
	physx::PsFileBuffer fileBuf(outputFilePath.c_str(), physx::PxFileBuf::OPEN_WRITE_ONLY);
	if (!fileBuf.isOpen())
	{
		NVBLAST_LOG_ERROR(m_log, "Can't open output buffer. \n");
		return false;
	}
	if (!asset->serialize(fileBuf))
	{
		NVBLAST_LOG_ERROR(m_log, "Serialization failed. \n");
		return false;
	}
	fileBuf.close();
	return true;
}

bool BlastDataExporter::saveBlastExtAsset(const std::string& outputFilePath, const ExtPxAsset* asset)
{
	physx::PsFileBuffer fileBuf(outputFilePath.c_str(), physx::PxFileBuf::OPEN_WRITE_ONLY);
	if (!fileBuf.isOpen())
	{
		NVBLAST_LOG_ERROR(m_log, "Can't open output buffer. \n");
		return false;
	}
	if (!asset->serialize(fileBuf, *mCooking))
	{
		NVBLAST_LOG_ERROR(m_log, "ExtPhysicsAsset serialization failed.\n");
		return false;
	}
	fileBuf.close();
	return true;
}