1#include "ResourceFunctions.h"
2#include "BridgeResourceType.h"
5#include "FieldSetter.h"
8#include "Resources/BufferManager.h"
9#include "Resources/MeshManager.h"
10#include "Resources/AssetManager.h"
11#include "Resources/ModelManager.h"
12#include "Resources/TextureManager.h"
13#include "Resources/FontManager.h"
14#include "Resources/ResourceStore.h"
16#include "Resources/MaterialInstance.h"
17#include "Resources/MaterialManager.h"
18#include "Resources/ModelManager.h"
20#include "Rendering/DataFormat.h"
22#include "Foundation/Logging/Logger.h"
32 constexpr std::array typeMap = {
33 VertexDataType::Positions,
34 VertexDataType::Normals,
35 VertexDataType::TexCoords0,
36 VertexDataType::Tangents,
37 VertexDataType::Colors0,
38 VertexDataType::Positions,
39 VertexDataType::Colors0
44 const size_t managedStreamIndex =
static_cast<size_t>(managedStreamId);
45 if (managedStreamIndex < typeMap.size()) {
46 return typeMap[managedStreamIndex];
49 return VertexDataType::Reserved;
53 void logInvalidResource(
const char* method,
const ResourceId resourceId)
55 LOG_ERROR(logger,
"%s: Invalid Resource id: %d", method, resourceId);
65 switch (resourceType) {
66 case BridgeResourceType::Asset:
67 return context->assetManager;
68 case BridgeResourceType::Buffer:
69 return context->bufferManager;
70 case BridgeResourceType::Font:
71 return context->fontManager;
72 case BridgeResourceType::Material:
73 return context->materialManager;
74 case BridgeResourceType::MaterialInstance:
75 return context->materialInstanceManager;
76 case BridgeResourceType::Mesh:
77 return context->meshManager;
78 case BridgeResourceType::Model:
79 return context->modelManager;
80 case BridgeResourceType::Texture:
81 return context->textureManager;
88 std::string getMaterialInstanceVariantOutput;
95void setResourceLoadCallback(BridgeContext * ctx, ::ResourceLoadCallback * callback)
97 auto context =
static_cast<Context*
>(ctx);
99 using ActualResourceLoadCallback = void (
Cogs::Core::Context* context,
int resourceType, ResourceId resourceId,
int code);
100 context->callbacks.resourceLoadCallback =
reinterpret_cast<ActualResourceLoadCallback*
>(callback);
103void setHierarchyChangeCallback(BridgeContext * ctx, ::HierarchyChangeCallback * callback)
105 auto context =
static_cast<Context*
>(ctx);
107 using ActualHierarchyChangeCallback = void (
Cogs::Core::Context* context, EntityId entityId);
108 context->callbacks.hierarchyChangeCallback =
reinterpret_cast<ActualHierarchyChangeCallback*
>(callback);
111void setReadbackCallback(BridgeContext * ctx, ::ReadbackCallback * callback)
113 auto context =
static_cast<Context*
>(ctx);
115 using ActualReadbackCallback = void (
Cogs::Core::Context* context,
const char* key,
const void* data,
int size);
116 context->callbacks.readbackCallback =
reinterpret_cast<ActualReadbackCallback*
>(callback);
119ResourceId findResource(BridgeContext* ctx,
int resourceType,
const char* resourceName)
122 const BridgeResourceType type =
static_cast<BridgeResourceType
>(resourceType);
129 if (handle.
getId() == NoResourceId && handle.get()) {
133 return handle.
getId();
136 LOG_ERROR(logger,
"findResource: Invalid Resource type: %d", resourceType);
141ResourceId getNextBufferId(BridgeContext * ctx)
143 auto context =
static_cast<Context*
>(ctx);
144 return context->bufferManager->getNextResourceId();
147void loadBuffer(BridgeContext * ctx,
int size,
const unsigned char * data, ResourceId resourceId,
int resourceLoadFlags)
149 auto context =
static_cast<Context*
>(ctx);
150 context->bufferManager->loadBuffer(size, data, resourceId,
static_cast<ResourceLoadFlags>(resourceLoadFlags));
151 context->
engine->setDirty();
154void resizeBuffer(BridgeContext * ctx,
const ResourceId resourceId,
int size)
156 auto context =
static_cast<Context*
>(ctx);
159 ::logInvalidResource(
"resizeBuffer", resourceId);
164 context->
engine->setDirty();
167void * mapBuffer(BridgeContext * ctx,
const ResourceId resourceId,
int flags)
169 auto context =
static_cast<Context*
>(ctx);
172 ::logInvalidResource(
"mapBuffer", resourceId);
176 return buffer->
map(flags);
179void unmapBuffer(BridgeContext * ctx,
const ResourceId resourceId)
181 auto context =
static_cast<Context*
>(ctx);
184 ::logInvalidResource(
"unmapBuffer", resourceId);
189 context->
engine->setDirty();
192void updateBufferRange(BridgeContext * ctx,
const ResourceId resourceId,
int offset,
int size,
const unsigned char * data)
194 auto context =
static_cast<Context*
>(ctx);
197 ::logInvalidResource(
"updateBufferRange", resourceId);
201 buffer->
set(offset, size, data);
202 context->
engine->setDirty();
205void invalidateBufferRange(BridgeContext * ctx,
const ResourceId resourceId,
int offset,
int size)
207 auto context =
static_cast<Context*
>(ctx);
210 ::logInvalidResource(
"invalidateBufferRange", resourceId);
215 context->
engine->setDirty();
218void setBufferField(BridgeContext * ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId,
const ResourceId resourceId)
220 auto context =
static_cast<Context*
>(ctx);
222 Cogs::setField(context, entityId, componentId, fieldId, handle);
225void releaseBuffer(BridgeContext* ctx, ResourceId resourceId)
227 auto context =
static_cast<Context*
>(ctx);
228 context->bufferManager->release(resourceId);
231ResourceId loadMesh(BridgeContext * ctx)
233 auto context =
static_cast<Context*
>(ctx);
234 const auto resourceId = context->meshManager->getNextResourceId();
236 auto & loadInfo = *context->meshManager->createLoadInfo();
237 loadInfo.resourceId = resourceId;
238 loadInfo.loadFlags = ResourceLoadFlags::ForceSynchronous;
240 MeshHandle mesh = context->meshManager->loadResource(&loadInfo);
241 context->
engine->setDirty();
246void releaseMesh(BridgeContext * ctx, ResourceId resourceId)
248 auto context =
static_cast<Context*
>(ctx);
249 context->meshManager->release(resourceId);
257 auto t =
static_cast<const T *
>(data);
258 mesh->
set(stream, format, t, t + count);
262void setMeshData(BridgeContext * ctx, ResourceId resourceId,
int stream,
const void * data,
int count)
264 auto context =
static_cast<Context*
>(ctx);
266 MeshHandle mesh = context->meshManager->getHandle(resourceId);
268 ::logInvalidResource(
"setMeshData", resourceId);
274 case 0: setStream<glm::vec3>(mesh, VertexDataType::Positions, VertexFormats::Pos3f, data, count);
break;
275 case 1: setStream<glm::vec3>(mesh, VertexDataType::Normals, VertexFormats::Norm3f, data, count);
break;
276 case 2: setStream<glm::vec2>(mesh, VertexDataType::TexCoords0,VertexFormats::Tex2f, data, count);
break;
277 case 3: setStream<glm::vec3>(mesh, VertexDataType::Tangents, VertexFormats::Tang3f, data, count);
break;
278 case 4: setStream<glm::vec4>(mesh, VertexDataType::Colors0, VertexFormats::Color4f, data, count);
break;
279 case 5: setStream<glm::vec3>(mesh, VertexDataType::Positions, VertexFormats::InstancePos3f, data, count);
break;
280 case 6: setStream<glm::vec4>(mesh, VertexDataType::Colors0, VertexFormats::InstanceColor4f, data, count);
break;
282 case 98: mesh->
setIndexData(
static_cast<const uint16_t*
>(data), count);
284 case 99: mesh->
setIndexData(
static_cast<const uint32_t *
>(data),
static_cast<size_t>(count));
288 LOG_ERROR(logger,
"setMeshData: Unsupported mesh data stream index: %d", stream);
291 context->
engine->setDirty();
294const void * getMeshData(BridgeContext * ctx, ResourceId resourceId,
int stream,
int * count)
296 auto context =
static_cast<Context*
>(ctx);
297 MeshHandle mesh = context->meshManager->getHandle(resourceId);
299 ::logInvalidResource(
"getMeshData", resourceId);
305 const std::span<const uint32_t> indexes = mesh->getIndexes();
306 *count =
static_cast<int>(indexes.size());
307 return indexes.data();
309 else if (stream == 98) {
310 const std::span<const uint16_t> indexes = mesh->getIndexesU16();
311 *count =
static_cast<int>(indexes.size());
312 return indexes.data();
316 if (streamType == VertexDataType::Reserved) {
317 LOG_ERROR(logger,
"getMeshData: Unsupported mesh data stream index: %d", stream);
322 const auto & meshStream = mesh->
getStream(streamType);
323 *count =
static_cast<int>(meshStream.numElements);
324 return meshStream.data();
328void * mapMeshData(BridgeContext * ctx, ResourceId resourceId,
int stream,
int start,
int count)
330 auto context =
static_cast<Context*
>(ctx);
332 MeshHandle mesh = context->meshManager->getHandle(resourceId);
334 ::logInvalidResource(
"mapMeshData", resourceId);
340 case 0:
return mesh->
mapStream(VertexDataType::Positions, VertexFormats::Pos3f, start, count,
sizeof(glm::vec3));
341 case 1:
return mesh->
mapStream(VertexDataType::Normals, VertexFormats::Norm3f, start, count,
sizeof(glm::vec3));
342 case 2:
return mesh->
mapStream(VertexDataType::TexCoords0,VertexFormats::Tex2f, start, count,
sizeof(glm::vec2));
343 case 3:
return mesh->
mapStream(VertexDataType::Tangents, VertexFormats::Tang3f, start, count,
sizeof(glm::vec3));
344 case 4:
return mesh->
mapStream(VertexDataType::Colors0, VertexFormats::Color4f, start, count,
sizeof(glm::vec4));
345 case 5:
return mesh->
mapStream(VertexDataType::Positions, VertexFormats::InstancePos3f, start, count,
sizeof(glm::vec3));
346 case 6:
return mesh->
mapStream(VertexDataType::Colors0, VertexFormats::InstanceColor4f, start, count,
sizeof(glm::vec4));
349 LOG_ERROR(logger,
"mapMeshData: Unsupported mesh data stream index: %d", stream);
353void unmapMeshData(BridgeContext * ctx, ResourceId resourceId,
int stream)
355 auto context =
static_cast<Context*
>(ctx);
356 MeshHandle mesh = context->meshManager->getHandle(resourceId);
358 ::logInvalidResource(
"unmapMeshData", resourceId);
363 if (streamType == VertexDataType::Reserved) {
364 LOG_ERROR(logger,
"unmapMeshData: Unsupported mesh data stream index: %d", stream);
367 mesh->
unmap(streamType);
368 context->
engine->setDirty();
372void setMeshPrimitiveType(BridgeContext * ctx, ResourceId resourceId,
int primitiveType)
374 auto context =
static_cast<Context*
>(ctx);
375 MeshHandle mesh = context->meshManager->getHandle(resourceId);
377 ::logInvalidResource(
"setMeshPrimitiveType", resourceId);
381 context->
engine->setDirty();
384void setMeshBoundingBox(BridgeContext * ctx, ResourceId resourceId,
const float * data)
386 auto context =
static_cast<Context*
>(ctx);
387 MeshHandle mesh = context->meshManager->getHandle(resourceId);
389 ::logInvalidResource(
"setMeshBoundingBox", resourceId);
394 Cogs::Geometry::BoundingBox bbox(std::span<const float, 6>(data, 6));
399 context->
engine->setDirty();
402ResourceId createAsset(BridgeContext * ctx,
const char * path,
int assetLoadFlags)
404 auto context =
static_cast<Context*
>(ctx);
405 const auto resourceId = context->assetManager->getNextResourceId();
408 context->
engine->setDirty();
410 return handle->
getId();
413void releaseAsset(BridgeContext* ctx, ResourceId resourceId)
415 auto context =
static_cast<Context*
>(ctx);
416 context->assetManager->release(resourceId);
419void setAssetField(BridgeContext * ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId,
const ResourceId resourceId)
421 auto context =
static_cast<Context*
>(ctx);
423 Cogs::setField(context, entityId, componentId, fieldId, handle);
426void releaseModel(BridgeContext * ctx, ResourceId resourceId)
428 auto context =
static_cast<Context*
>(ctx);
429 context->modelManager->release(resourceId);
432void setMeshField(BridgeContext * ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId,
const ResourceId resourceId)
434 auto context =
static_cast<Context*
>(ctx);
436 Cogs::setField(context, entityId, componentId, fieldId, handle);
439ResourceId getNextModelId(BridgeContext * ctx)
441 auto context =
static_cast<Context*
>(ctx);
442 return context->modelManager->getNextResourceId();
445ResourceId loadModel(BridgeContext * ctx,
const char * resourceName, ResourceId
id,
int modelLoadFlags)
447 auto context =
static_cast<Context*
>(ctx);
450 if (model->
getId() == NoResourceId) {
451 context->modelManager->setResourceId(model.
resolve(), context->modelManager->getNextResourceId());
453 context->
engine->setDirty();
455 return model->
getId();
458void setModelField(BridgeContext * ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId,
const ResourceId resourceId)
460 auto context =
static_cast<Context*
>(ctx);
462 Cogs::setField(context, entityId, componentId, fieldId, handle);
465ResourceId getNextTextureId(BridgeContext * ctx)
467 auto context =
static_cast<Context*
>(ctx);
468 return context->textureManager->getNextResourceId();
471void loadTexture(BridgeContext * ctx, ResourceId resourceId,
const char * resourceName,
int textureLoadFlags)
473 auto context =
static_cast<Context*
>(ctx);
474 context->textureManager->loadTexture(resourceName, resourceId,
TextureLoadFlags(textureLoadFlags));
475 context->
engine->setDirty();
478void loadTextureResource(BridgeContext * ctx, ResourceId resourceId,
const void * imageData,
int width,
int height,
int textureFormat,
int stride,
int textureLoadFlags)
480 auto context =
static_cast<Context*
>(ctx);
481 const Cogs::TextureFormat format =
static_cast<Cogs::TextureFormat
>(textureFormat);
482 context->textureManager->loadTexture2D(imageData, width, height, format, stride, resourceId,
TextureLoadFlags(textureLoadFlags));
483 context->
engine->setDirty();
486void loadRenderTextureResource(BridgeContext* ctx, ResourceId resourceId,
int width,
int height,
int textureFormat,
int textureLoadFlags)
488 auto context =
static_cast<Context*
>(ctx);
489 const Cogs::TextureFormat format =
static_cast<Cogs::TextureFormat
>(textureFormat);
490 const TextureHandle & handle = context->textureManager->loadTexture2D(
nullptr, width, height, format, 0, resourceId,
TextureLoadFlags(textureLoadFlags));
492 context->
engine->setDirty();
495void loadTextureVolumeResource(BridgeContext * ctx, ResourceId resourceId,
const void * imageData,
int width,
int height,
int depth,
int textureFormat,
int stride,
int textureLoadFlags)
497 auto context =
static_cast<Context*
>(ctx);
498 const Cogs::TextureFormat format =
static_cast<Cogs::TextureFormat
>(textureFormat);
499 context->textureManager->loadTexture(imageData, Cogs::ResourceDimensions::Texture3D, width, height, depth, 1, format, stride, resourceId,
TextureLoadFlags(textureLoadFlags));
500 context->
engine->setDirty();
503void loadExternalTextureResource(BridgeContext * ctx, ResourceId resourceId, intptr_t externalHandle,
int width,
int height,
int bpp,
int stride,
int textureLoadFlags)
505 auto context =
static_cast<Context*
>(ctx);
506 assert(stride == 0 &&
"Stride parameter is not passed on");
507 context->textureManager->loadExternalTexture(externalHandle, Cogs::ResourceDimensions::Texture2D, width, height, 1, 1, bpp == 4 ? Cogs::TextureFormat::R8G8B8A8_UNORM_SRGB : Cogs::TextureFormat::R8G8B8_UNORM, resourceId,
TextureLoadFlags(textureLoadFlags));
508 context->
engine->setDirty();
513 bool validateTextureArgs(
int target,
int width,
int height,
int depth,
int layers)
515 bool unit_height =
true;
516 bool unit_depth =
true;
517 bool unit_layers =
true;
519 case int(Cogs::ResourceDimensions::Texture1D) :
521 case int(Cogs::ResourceDimensions::Texture1DArray) :
524 case int(Cogs::ResourceDimensions::Texture2D) :
527 case int(Cogs::ResourceDimensions::Texture2DArray) :
531 case int(Cogs::ResourceDimensions::Texture3D) :
535 case int(Cogs::ResourceDimensions::Texture3DArray) :
540 case int(Cogs::ResourceDimensions::TextureCube) :
543 case int(Cogs::ResourceDimensions::TextureCubeArray) :
547 case int(Cogs::ResourceDimensions::RenderBuffer) :
551 LOG_ERROR(logger,
"loadTexture: Illegal target");
556 LOG_ERROR(logger,
"loadTexture: IIlegal width %d", width);
559 if ((unit_height && height !=1) || (!unit_height && height < 1)) {
560 LOG_ERROR(logger,
"loadTexture: IIlegal height %d", height);
563 if ((unit_depth && depth != 1) || (!unit_depth && depth < 1)) {
564 LOG_ERROR(logger,
"loadTexture: IIlegal depth %d", depth);
567 if ((unit_layers && layers != 1) || (!unit_layers && layers < 1)) {
568 LOG_ERROR(logger,
"loadTexture: IIlegal layers %d", layers);
576void loadTextureResource2(BridgeContext * ctx, ResourceId resourceId,
const void * imageData,
int target,
int width,
int height,
int depth,
int layers,
int textureFormat,
int stride,
int textureLoadFlags)
578 auto context =
static_cast<Context*
>(ctx);
579 const Cogs::TextureFormat format =
static_cast<Cogs::TextureFormat
>(textureFormat);
580 if (!validateTextureArgs(target, width, height, depth, layers))
return;
582 context->textureManager->loadTexture(imageData,
static_cast<Cogs::ResourceDimensions
>(target), width, height, depth, layers, format, stride, resourceId,
TextureLoadFlags(textureLoadFlags));
583 context->
engine->setDirty();
586void loadExternalTextureResource2(BridgeContext * ctx, ResourceId resourceId, intptr_t externalHandle,
int target,
int width,
int height,
int depth,
int layers,
int textureFormat,
int stride,
int textureLoadFlags)
588 auto context =
static_cast<Context*
>(ctx);
589 const Cogs::TextureFormat format =
static_cast<Cogs::TextureFormat
>(textureFormat);
590 assert(stride == 0 &&
"Stride parameter is not passed on");
591 if (!validateTextureArgs(target, width, height, depth, layers))
return;
593 context->textureManager->loadExternalTexture(externalHandle,
static_cast<Cogs::ResourceDimensions
>(target), width, height, depth, layers, format, resourceId,
TextureLoadFlags(textureLoadFlags));
594 context->
engine->setDirty();
597void setTextureField(BridgeContext * ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId,
const ResourceId resourceId)
599 auto context =
static_cast<Context*
>(ctx);
601 Cogs::setField(context, entityId, componentId, fieldId, handle);
604void setTexturesField(BridgeContext* ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId,
const ResourceId* resourceIds,
int size)
607 std::vector<Cogs::Core::TextureHandle> handles(size);
608 for (
int i = 0; i < size; ++i) {
609 const ResourceId resourceId = resourceIds[i];
610 handles[i] = (resourceId == NoResourceId) ?
Cogs::Core::TextureHandle() : context->textureManager->getHandle(resourceId);
612 Cogs::assignField(context, entityId, componentId, fieldId, handles.data(), size);
615void setMaterialInstanceField(BridgeContext * ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId,
const ResourceId resourceId)
617 auto context =
static_cast<Context*
>(ctx);
619 Cogs::setField(context, entityId, componentId, fieldId, handle);
622void setMaterialInstancesField(BridgeContext* ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId,
const ResourceId* resourceIds,
int size)
624 auto context =
static_cast<Context*
>(ctx);
625 std::vector<Cogs::Core::MaterialInstanceHandle> handles(size);
626 for (
int i = 0; i < size; ++i) {
627 const ResourceId resourceId = resourceIds[i];
631 Cogs::assignField(context, entityId, componentId, fieldId, handles.data(), size);
634void setMaterialInstanceArrayField(BridgeContext * ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId,
const ResourceId resourceId,
int index)
636 auto context =
static_cast<Context*
>(ctx);
638 Cogs::setVectorField(context, entityId, componentId, fieldId, handle, index);
641void setMaterialInstanceOption(BridgeContext * ctx, ResourceId resourceId,
const char * name,
const char * value)
643 auto context =
static_cast<Context*
>(ctx);
645 if (!materialInstance) {
646 ::logInvalidResource(
"setMaterialInstanceOption", resourceId);
650 materialInstance->
setOption(name, value);
651 context->
engine->setDirty();
654void setMaterialInstanceProperty(BridgeContext * ctx, ResourceId resourceId,
const char * name,
const void * data,
const int sizeInBytes)
656 auto context =
static_cast<Context*
>(ctx);
658 if (!materialInstance) {
659 ::logInvalidResource(
"setMaterialInstanceProperty", resourceId);
663 materialInstance->setProperty(name, data,
static_cast<size_t>(sizeInBytes));
664 context->
engine->setDirty();
667CogsBool getMaterialInstanceProperty(BridgeContext * ctx, ResourceId resourceId,
const char * name,
void * data,
const int sizeInBytes)
669 auto context =
static_cast<Context*
>(ctx);
671 if (!materialInstance) {
672 ::logInvalidResource(
"getMaterialInstanceProperty", resourceId);
676 return materialInstance->getProperty(name, data,
static_cast<size_t>(sizeInBytes));
679int getMaterialInstancePropertyDataType(BridgeContext* ctx, ResourceId resourceId,
const char* name)
681 auto context =
static_cast<Context*
>(ctx);
683 if (!materialInstance) {
684 ::logInvalidResource(
"getMaterialInstancePropertyDataType", resourceId);
685 return static_cast<int>(MaterialDataType::Unknown);
691void setMaterialInstanceTexture(BridgeContext * ctx, ResourceId resourceId,
const char * name,
const ResourceId textureId)
693 auto context =
static_cast<Context*
>(ctx);
695 if (!materialInstance) {
696 ::logInvalidResource(
"setMaterialInstanceTexture", resourceId);
701 materialInstance->
setTextureProperty(key, context->textureManager->getHandle(textureId));
702 context->
engine->setDirty();
705void setMaterialInstanceTextureAddressMode(BridgeContext * ctx, ResourceId resourceId,
const char * name,
const char * mode)
707 auto context =
static_cast<Context*
>(ctx);
709 if (!materialInstance) {
710 ::logInvalidResource(
"setMaterialInstanceTextureAddressMode", resourceId);
715 context->
engine->setDirty();
718void setMaterialInstanceTextureFilterMode(BridgeContext* ctx, ResourceId resourceId,
const char* name,
const char* filterMode)
722 if (!materialInstance) {
723 ::logInvalidResource(
"setMaterialInstanceTextureFilterMode", resourceId);
728 context->
engine->setDirty();
731void setMaterialInstancePermutation(BridgeContext * ctx, ResourceId resourceId,
const char * name)
733 auto context =
static_cast<Context*
>(ctx);
735 if (!materialInstance) {
736 ::logInvalidResource(
"setMaterialInstancePermutation", resourceId);
740 materialInstance->setPermutation(name);
741 context->
engine->setDirty();
744void setMaterialInstanceVariant(BridgeContext * ctx, ResourceId resourceId,
const char * key,
const char * value)
746 auto context =
static_cast<Context*
>(ctx);
748 if (!materialInstance) {
749 ::logInvalidResource(
"setMaterialInstanceVariant", resourceId);
753 materialInstance->setVariant(key, value);
754 context->
engine->setDirty();
757const char * getMaterialInstanceVariant(BridgeContext * ctx, ResourceId resourceId,
const char * key)
759 auto context =
static_cast<Context*
>(ctx);
761 if (!materialInstance) {
762 ::logInvalidResource(
"getMaterialInstanceVariant", resourceId);
767 getMaterialInstanceVariantOutput = materialInstance->getVariant(key);
768 return getMaterialInstanceVariantOutput.data();
771void setMaterialInstanceFlags(BridgeContext * ctx, ResourceId resourceId,
int materialFlags)
773 auto context =
static_cast<Context*
>(ctx);
775 if (!materialInstance) {
776 ::logInvalidResource(
"setMaterialInstanceFlags", resourceId);
780 materialInstance->
instanceFlags =
static_cast<uint16_t
>(materialFlags);
781 context->
engine->setDirty();
784ResourceId getNextFontId(BridgeContext* ctx)
786 auto context =
static_cast<Context*
>(ctx);
787 return context->fontManager->getNextResourceId();
790ResourceId loadFont(BridgeContext* ctx,
const char* resourceName,
float size, ResourceId resourceId)
792 auto context =
static_cast<Context*
>(ctx);
795 return loaded->
getId();
798void releaseFont(BridgeContext* ctx, ResourceId resourceId)
800 auto context =
static_cast<Context*
>(ctx);
801 context->fontManager->release(resourceId);
804void addFontDependency(BridgeContext * ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId,
const ResourceId resourceId)
806 auto context =
static_cast<Context*
>(ctx);
808 Cogs::setField(context, entityId, componentId, fieldId, handle);
811void registerStringResource(BridgeContext * ctx,
const char * key,
const char * value)
813 auto context =
static_cast<Context*
>(ctx);
815 context->
engine->setDirty();
818void registerBinaryResource(BridgeContext* ctx,
const char* key,
const void* value,
int length)
820 auto context =
static_cast<Context*
>(ctx);
821 context->
resourceStore->addResource(key, value,
static_cast<size_t>(length));
824void addResourceArchive(BridgeContext* ctx,
const char* key, CogsBool prepend)
826 auto context =
static_cast<Context*
>(ctx);
827 context->
resourceStore->addResourceArchive(key, prepend != 0);
828 context->
engine->setDirty();
830CogsBool hasResource(BridgeContext* ctx,
const char* key)
832 auto context =
static_cast<Context*
>(ctx);
836ResourceId getMaterialInstance(BridgeContext * ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId)
838 auto context =
static_cast<Context*
>(ctx);
839 MaterialInstanceHandle& materialInstance = *Cogs::getField<MaterialInstanceHandle>(context, entityId, componentId, fieldId);
841 if (materialInstance) {
842 ResourceId
id = materialInstance->
getId();
844 if (
id == NoResourceId) {
845 id = context->materialInstanceManager->getNextResourceId();
847 context->materialInstanceManager->setResourceId(materialInstance.
resolve(),
id);
856int getMaterialInstances(BridgeContext * ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId, ResourceId * ids,
int idsCount)
858 auto context =
static_cast<Context*
>(ctx);
859 const auto & materialInstances = *Cogs::getField<std::vector<MaterialInstanceHandle>>(context, entityId, componentId, fieldId);
861 for (
size_t i = 0; i < static_cast<size_t>(idsCount); ++i) {
863 ResourceId
id = NoResourceId;
864 if (i < materialInstances.size()) {
869 if (materialInstance) {
870 id = materialInstance->
getId();
878 return static_cast<int>(materialInstances.size());
881void addSearchPath(BridgeContext * ctx,
const char * path)
883 auto context =
static_cast<Context*
>(ctx);
885 context->engine->setDirty();
888void purgeResource(BridgeContext * ctx,
const char * resourceName)
890 auto context =
static_cast<Context*
>(ctx);
892 context->engine->setDirty();
895void releaseTexture(BridgeContext * ctx, ResourceId resourceId)
897 auto context =
static_cast<Context*
>(ctx);
898 TextureHandle h = context->textureManager->release(resourceId);
900 Texture* texture = context->textureManager->get(h);
901 if (texture->externalHandle && texture->ownsExternalTexture.value ==
false) {
902 LOG_TRACE(logger,
"releaseTexture: Setting external handle of texture resource %d to 0", resourceId);
905 texture->externalHandle = 0;
906 texture->ownsExternalTexture =
true;
907 texture->setChanged();
910 context->engine->setDirty();
913ResourceId loadMaterial(BridgeContext * ctx,
const char * resourceName)
915 auto context =
static_cast<Context*
>(ctx);
916 const auto resourceId = context->materialManager->getNextResourceId();
918 MaterialHandle handle = context->materialManager->loadMaterial(resourceName, MaterialLoadFlags::None, resourceId);
920 context->materialManager->processLoading();
922 if (handle->
getId() == NoResourceId) {
923 context->materialManager->setResourceId(handle.
resolve(), resourceId);
925 context->engine->setDirty();
927 return handle->
getId();
930void setMaterialSharedProperty(BridgeContext* ctx, ResourceId materialId,
const char* name,
const void* data,
const int sizeInBytes)
932 auto context =
static_cast<Context*
>(ctx);
933 MaterialHandle material = context->materialManager->getHandle(materialId);
936 ::logInvalidResource(
"setMaterialSharedProperty(materialId)", materialId);
940 material->setProperty(name, data,
static_cast<size_t>(sizeInBytes));
941 context->engine->setDirty();
944void setMaterialsField(BridgeContext* ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId,
const ResourceId* resourceIds,
int size)
948 std::vector<Cogs::Core::MaterialHandle> handles(size);
949 for (
int i = 0; i < size; ++i) {
950 const ResourceId resourceId = resourceIds[i];
953 Cogs::assignField(context, entityId, componentId, fieldId, handles.data(), size);
956int getMaterialPropertyDataType(BridgeContext* ctx, ResourceId resourceId,
const char* name)
958 auto context =
static_cast<Context*
>(ctx);
959 MaterialHandle material = context->materialManager->getHandle(resourceId);
961 ::logInvalidResource(
"getMaterialPropertyDataType", resourceId);
962 return static_cast<int>(MaterialDataType::Unknown);
968ResourceId loadMaterialInstance(BridgeContext * ctx, ResourceId materialId)
970 auto context =
static_cast<Context*
>(ctx);
971 ResourceId resourceId = context->materialInstanceManager->getNextResourceId();
973 MaterialHandle material = context->materialManager->getHandle(materialId);
976 ::logInvalidResource(
"loadMaterialInstance(materialId)", materialId);
980 MaterialInstanceHandle materialInstance = context->materialInstanceManager->createMaterialInstance(material);
981 context->materialInstanceManager->setResourceId(materialInstance.
resolve(), resourceId);
982 context->
engine->setDirty();
987void releaseMaterialInstance(BridgeContext * ctx, ResourceId resourceId)
989 auto context =
static_cast<Context*
>(ctx);
990 context->materialInstanceManager->release(resourceId);
993const char * getMaterialInstanceName(BridgeContext * ctx, ResourceId materialInstanceId)
995 auto context =
static_cast<Context *
>(ctx);
996 MaterialInstanceHandle materialInstance = context->materialInstanceManager->getHandle(materialInstanceId);
997 if (materialInstance) {
1001 ::logInvalidResource(
"getMaterialInstanceName", materialInstanceId);
1005void setMaterialInstanceName(BridgeContext * ctx, ResourceId materialInstanceId,
const char * name)
1007 auto context =
static_cast<Context *
>(ctx);
1008 MaterialInstanceHandle materialInstance = context->materialInstanceManager->getHandle(materialInstanceId);
1009 if (materialInstance) {
1010 materialInstance->
setName(name);
1011 context->
engine->setDirty();
1014 ::logInvalidResource(
"setMaterialInstanceName", materialInstanceId);
A Context instance contains all the services, systems and runtime components needed to use Cogs.
std::unique_ptr< class ResourceStore > resourceStore
ResourceStore service instance.
std::unique_ptr< class Engine > engine
Engine instance.
void setResourceId(ResourceBase *resource, ResourceId id) override
Assign the given id to a previously created resource.
ResourceId getNextResourceId() override
Get the next unique resource id.
Log implementation class.
Provides a weakly referenced view over the contents of a string.
constexpr const char * data() const noexcept
Get the sequence of characters referenced by the string view.
Contains the Engine, Renderer, resource managers and other systems needed to run Cogs....
ModelLoadFlags
Model loading flags. May be combined with resource loading flags.
ResourceLoadFlags
Flags for describing how to load a resource.
TextureLoadFlags
Texture loading flags. May be combined with resource load flags.
Cogs::Geometry::BoundingBox COGSCORE_DLL_API calculateBounds(Mesh *mesh)
Calculate a bounding box for the given mesh.
uint16_t VariableKey
Used to lookup material properties.
AssetLoadFlags
Asset and Scene loading flags. May be combined with resource loading flags.
constexpr Log getLogger(const char(&name)[LEN]) noexcept
void assignField(Cogs::Core::Context *context, EntityId entityId, const ComponentId componentId, const Cogs::Reflection::FieldId fieldId, const DataType *data, int count)
Assign value to a Component field.
void unmap()
Unmap the buffer, signaling writes to mapped buffer memory are done.
void invalidate(size_t offset, size_t size)
Invalidates buffer contents, signaling data should be updated/transfered to GPU.
void * map(uint32_t flags)
Map the buffer data backing storage, returning a writable pointer.
void resize(size_t size)
Resize the buffer to accomodate the given number of bytes.
void set(size_t offset, size_t size, const uint8_t *data)
void setOption(const StringView &key, const StringView &value)
Sets the option with the given key to a value parsed from the value string.
void setTextureAddressMode(const StringView &key, const StringView &addressMode)
Set texture address mode with textual name.
void setTextureProperty(const StringView &key, TextureHandle value)
Set the texture property with the given key to the texture resource held by value.
void setTextureFilterMode(const StringView &key, const StringView &filterMode)
Set texture filter mode with textual name.
Material * material
Material resource this MaterialInstance is created from.
uint16_t instanceFlags
Material instance flags.
MaterialDataType getPropertyDataType(const StringView &key)
Gets data type for the given property. Returns MaterialDataType::Unknown if not found.
void unmap(VertexDataType::EVertexDataType type)
Unmap the stream with the given vertex data type index.
uint8_t * mapStream(const VertexDataType::EVertexDataType type, VertexFormatHandle format, const size_t start, const size_t count, const size_t elementSize, bool resize=false)
Raw stream mapping method.
void setIndexData(const uint32_t *data, size_t count)
Convenience method for setting index data from a raw pointer to data and count number of elements.
void setBounds(Geometry::BoundingBox box)
Set custom bounds for the mesh.
void set(const VertexDataType::EVertexDataType type, VertexFormatHandle format, Element *begin, Element *end)
Set the data of the vertex stream indexed by type.
DataStream & getStream(const VertexDataType::EVertexDataType dataType)
Get the stream corresponding to the given dataType.
ResourceId getId() const
Get the resource id of this instance.
StringView getName() const
Get the name of the resource.
void setName(const StringView &name)
Set the user friendly name of the resource.
Resource handle base class handling reference counting of resources derived from ResourceBase.
ResourceId getId() const
Get the resource id of the held resource.
ResourceType * resolve() const
Resolve the handle, returning a pointer to the actual resource.
Texture resources contain raster bitmap data to use for texturing.
EVertexDataType
Contains data types.
EPrimitiveType
Primitive type enumeration.
@ RenderTarget
The texture can be used as a render target and drawn into.