1#include "VertexFormat.h"
4#include <unordered_map>
6#include "Foundation/HashFunctions.h"
7#include "Base/ResourceMap.h"
15 for (
size_t i = 0; i < vertexFormat.
elements.size(); ++i) {
16 auto & element = vertexFormat.
elements[i];
17 size = std::max(element.offset + (uint32_t)Cogs::getFormatInfo(element.format)->blockSize, size);
28 std::mutex vertexFormatsByHashMutex;
29 std::unordered_map<size_t, VertexFormatHandle> vertexFormatsByHash;
38 VertexFormatHandle VertexFormats::createVertexFormat(
const VertexElement * elements,
size_t count)
40 VertexFormat vertexFormat;
41 vertexFormat.
elements.assign(elements, elements + count);
45 auto& storage = getStorage();
46 std::lock_guard<std::mutex> lock(storage.vertexFormatsByHashMutex);
48 auto foundIt = storage.vertexFormatsByHash.find(formatHash);
50 if (foundIt != storage.vertexFormatsByHash.end()) {
51 return foundIt->second;
53 vertexFormat.hash = formatHash;
54 vertexFormat.size = calculateSize(vertexFormat);
55 auto handle = storage.vertexFormats.addResource(std::move(vertexFormat));
56 storage.vertexFormatsByHash[formatHash] = handle;
61 VertexFormatHandle VertexFormats::createVertexFormat(
const PackedVertexElement * packedElements,
size_t count)
63 VertexFormat vertexFormat;
65 for (
size_t i = 0; i < count; ++i) {
66 auto & packedElement = packedElements[i];
68 VertexElement element = {
71 packedElement.semantic,
72 packedElement.semanticIndex,
73 packedElement.inputType,
74 packedElement.instanceStep
77 offset += getFormatInfo(packedElement.format)->
blockSize;
79 vertexFormat.elements.emplace_back(element);
84 auto& storage = getStorage();
85 std::lock_guard<std::mutex> lock(storage.vertexFormatsByHashMutex);
87 auto foundIt = storage.vertexFormatsByHash.find(formatHash);
89 if (foundIt != storage.vertexFormatsByHash.end()) {
90 return foundIt->second;
92 vertexFormat.hash = formatHash;
93 vertexFormat.size = calculateSize(vertexFormat);
94 auto handle = storage.vertexFormats.addResource(std::move(vertexFormat));
95 storage.vertexFormatsByHash[formatHash] = handle;
100 const VertexFormat * VertexFormats::getVertexFormat(VertexFormatHandle handle)
102 return &getStorage().vertexFormats[handle];
109 case ElementSemantic::Position:
111 case ElementSemantic::Normal:
113 case ElementSemantic::Color:
115 case ElementSemantic::TextureCoordinate:
116 return "TextureCoordinate";
117 case ElementSemantic::Tangent:
119 case ElementSemantic::InstanceVector:
120 return "InstanceVector";
121 case ElementSemantic::InstanceMatrix:
122 return "InstanceMatrix";
123 case ElementSemantic::Semantic_Size:
Provides a weakly referenced view over the contents of a string.
Contains all Cogs related functionality.
constexpr size_t hash() noexcept
Simple getter function that returns the initial value for fnv1a hashing.