1#include "DumpStatsCommand.h"
3#include "Components/Core/MeshComponent.h"
4#include "Components/Core/MeshRenderComponent.h"
5#include "Components/Core/SceneComponent.h"
7#include "Resources/MeshManager.h"
8#include "Resources/MaterialManager.h"
9#include "Resources/TextureManager.h"
11#include "Foundation/Logging/Logger.h"
13#include <unordered_map>
29 size_t streamBytes = 0;
31 size_t numIndexes = 0;
33 std::unordered_map<Mesh *, uint32_t> usedMeshes;
34 std::unordered_map<MaterialInstance *, uint32_t> usedMaterials;
48 void writeMeshStats(ModelStats & stats, Mesh * mesh)
50 auto it = stats.usedMeshes.find(mesh);
52 if (it != stats.usedMeshes.end())
return;
54 stats.usedMeshes[mesh] = 0;
58 if (!mesh->getName().empty()) {
65 if (mesh->hasStream(type)) {
66 writeStream(stats, &mesh->getStream(type));
68 if (type == VertexDataType::Positions) {
69 stats.numVerts += mesh->getStream(type).numElements;
74 if (mesh->isIndexed()) {
77 stats.streamBytes += mesh->getIndexes().size() * 4;
79 stats.numIndexes += mesh->getIndexes().size();
83 void writeStats(Context * context, ModelStats & model, uint32_t , ComponentModel::Entity * entity)
89 if (!entity->getName().empty()) {
93 auto meshComponent = entity->getComponent<MeshComponent>();
95 if (meshComponent && meshComponent->meshHandle) {
96 auto mesh = meshComponent->meshHandle.resolve();
98 if (mesh && mesh->streams.size()) {
99 writeMeshStats(model, mesh);
102 auto renderComponent = entity->getComponent<MeshRenderComponent>();
104 if (renderComponent && renderComponent->material) {
105 auto material = renderComponent->material.resolve();
107 auto it = model.usedMaterials.find(material);
109 if (it == model.usedMaterials.end()) {
112 model.usedMaterials[material] = 0;
117 auto sceneComponent = entity->getComponent<SceneComponent>();
119 for (
auto & child : sceneComponent->children) {
120 writeStats(context, model, (uint32_t)-1, child.get());
129 writeStats(context, stats, (uint32_t)-1, context->store->getEntityPtr(entityId));
133 if (!title.empty()) {
134 LOG_TRACE(logger,
"%s", title.data());
136 LOG_TRACE(logger,
"Model Stats:");
139 LOG_TRACE(logger,
"----------------------------");
140 LOG_TRACE(logger,
"Nodes: %zd", stats.nodes);
141 LOG_TRACE(logger,
"Strings: %zd", stats.strings);
142 LOG_TRACE(logger,
"Materials: %zd", stats.materials);
143 LOG_TRACE(logger,
"Meshes: %zd", stats.meshes);
144 LOG_TRACE(logger,
"Streams: %zd", stats.streams);
145 LOG_TRACE(logger,
"Stream bytes: %zd", stats.streamBytes);
146 LOG_TRACE(logger,
"Num vertexes: %zd", stats.numVerts);
147 LOG_TRACE(logger,
"Num indexes: %zd", stats.numIndexes);
150void Cogs::Core::DumpStatsCommand::undo()
Log implementation class.
Contains the Engine, Renderer, resource managers and other systems needed to run Cogs....
StringView getOption(const std::vector< ParsedValue > &options, const StringView &key, const StringView &defaultValue="")
Find and get value of option in vector as a string. Return default if not found.
constexpr Log getLogger(const char(&name)[LEN]) noexcept
Contains a stream of data used by Mesh resources.
uint32_t numElements
Number of elements of the type given by format contained in data.
VertexFormatHandle format
A pointer to the format describing the contents of the byte buffer.
void apply() override
Run the command.
std::vector< ParsedValue > options
Options passed to the command when running in batch mode.
static constexpr size_t MaxStreams
Maximum number of data streams contained in a single Mesh resource.
EVertexDataType
Contains data types.