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;
281 case 7: setStream<glm::mat4>(mesh, VertexDataType::Positions, VertexFormats::InstanceMat4f, data, count);
break;
283 case 98: mesh->
setIndexData(
static_cast<const uint16_t*
>(data), count);
285 case 99: mesh->
setIndexData(
static_cast<const uint32_t *
>(data),
static_cast<size_t>(count));
289 LOG_ERROR(logger,
"setMeshData: Unsupported mesh data stream index: %d", stream);
292 context->
engine->setDirty();
295const void * getMeshData(BridgeContext * ctx, ResourceId resourceId,
int stream,
int * count)
297 auto context =
static_cast<Context*
>(ctx);
298 MeshHandle mesh = context->meshManager->getHandle(resourceId);
300 ::logInvalidResource(
"getMeshData", resourceId);
306 const std::span<const uint32_t> indexes = mesh->getIndexes();
307 *count =
static_cast<int>(indexes.size());
308 return indexes.data();
310 else if (stream == 98) {
311 const std::span<const uint16_t> indexes = mesh->getIndexesU16();
312 *count =
static_cast<int>(indexes.size());
313 return indexes.data();
317 if (streamType == VertexDataType::Reserved) {
318 LOG_ERROR(logger,
"getMeshData: Unsupported mesh data stream index: %d", stream);
323 const auto & meshStream = mesh->
getStream(streamType);
324 *count =
static_cast<int>(meshStream.numElements);
325 return meshStream.data();
329void * mapMeshData(BridgeContext * ctx, ResourceId resourceId,
int stream,
int start,
int count)
331 auto context =
static_cast<Context*
>(ctx);
333 MeshHandle mesh = context->meshManager->getHandle(resourceId);
335 ::logInvalidResource(
"mapMeshData", resourceId);
341 case 0:
return mesh->
mapStream(VertexDataType::Positions, VertexFormats::Pos3f, start, count,
sizeof(glm::vec3));
342 case 1:
return mesh->
mapStream(VertexDataType::Normals, VertexFormats::Norm3f, start, count,
sizeof(glm::vec3));
343 case 2:
return mesh->
mapStream(VertexDataType::TexCoords0,VertexFormats::Tex2f, start, count,
sizeof(glm::vec2));
344 case 3:
return mesh->
mapStream(VertexDataType::Tangents, VertexFormats::Tang3f, start, count,
sizeof(glm::vec3));
345 case 4:
return mesh->
mapStream(VertexDataType::Colors0, VertexFormats::Color4f, start, count,
sizeof(glm::vec4));
346 case 5:
return mesh->
mapStream(VertexDataType::Positions, VertexFormats::InstancePos3f, start, count,
sizeof(glm::vec3));
347 case 6:
return mesh->
mapStream(VertexDataType::Colors0, VertexFormats::InstanceColor4f, start, count,
sizeof(glm::vec4));
348 case 7:
return mesh->
mapStream(VertexDataType::Positions, VertexFormats::InstanceMat4f, start, count,
sizeof(glm::mat4));
351 LOG_ERROR(logger,
"mapMeshData: Unsupported mesh data stream index: %d", stream);
355void unmapMeshData(BridgeContext * ctx, ResourceId resourceId,
int stream)
357 auto context =
static_cast<Context*
>(ctx);
358 MeshHandle mesh = context->meshManager->getHandle(resourceId);
360 ::logInvalidResource(
"unmapMeshData", resourceId);
365 if (streamType == VertexDataType::Reserved) {
366 LOG_ERROR(logger,
"unmapMeshData: Unsupported mesh data stream index: %d", stream);
369 mesh->
unmap(streamType);
370 context->
engine->setDirty();
374void setMeshPrimitiveType(BridgeContext * ctx, ResourceId resourceId,
int primitiveType)
376 auto context =
static_cast<Context*
>(ctx);
377 MeshHandle mesh = context->meshManager->getHandle(resourceId);
379 ::logInvalidResource(
"setMeshPrimitiveType", resourceId);
383 context->
engine->setDirty();
386void setMeshBoundingBox(BridgeContext * ctx, ResourceId resourceId,
const float * data)
388 auto context =
static_cast<Context*
>(ctx);
389 MeshHandle mesh = context->meshManager->getHandle(resourceId);
391 ::logInvalidResource(
"setMeshBoundingBox", resourceId);
396 Cogs::Geometry::BoundingBox bbox(std::span<const float, 6>(data, 6));
401 context->
engine->setDirty();
404ResourceId createAsset(BridgeContext * ctx,
const char * path,
int assetLoadFlags)
406 auto context =
static_cast<Context*
>(ctx);
407 const auto resourceId = context->assetManager->getNextResourceId();
410 context->
engine->setDirty();
412 return handle->
getId();
415void releaseAsset(BridgeContext* ctx, ResourceId resourceId)
417 auto context =
static_cast<Context*
>(ctx);
418 context->assetManager->release(resourceId);
421void setAssetField(BridgeContext * ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId,
const ResourceId resourceId)
423 auto context =
static_cast<Context*
>(ctx);
425 Cogs::setField(context, entityId, componentId, fieldId, handle);
428void releaseModel(BridgeContext * ctx, ResourceId resourceId)
430 auto context =
static_cast<Context*
>(ctx);
431 context->modelManager->release(resourceId);
434void setMeshField(BridgeContext * ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId,
const ResourceId resourceId)
436 auto context =
static_cast<Context*
>(ctx);
438 Cogs::setField(context, entityId, componentId, fieldId, handle);
441ResourceId getNextModelId(BridgeContext * ctx)
443 auto context =
static_cast<Context*
>(ctx);
444 return context->modelManager->getNextResourceId();
447ResourceId loadModel(BridgeContext * ctx,
const char * resourceName, ResourceId
id,
int modelLoadFlags)
449 auto context =
static_cast<Context*
>(ctx);
452 if (model->
getId() == NoResourceId) {
453 context->modelManager->setResourceId(model.
resolve(), context->modelManager->getNextResourceId());
455 context->
engine->setDirty();
457 return model->
getId();
460void setModelField(BridgeContext * ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId,
const ResourceId resourceId)
462 auto context =
static_cast<Context*
>(ctx);
464 Cogs::setField(context, entityId, componentId, fieldId, handle);
467ResourceId getNextTextureId(BridgeContext * ctx)
469 auto context =
static_cast<Context*
>(ctx);
470 return context->textureManager->getNextResourceId();
473void loadTexture(BridgeContext * ctx, ResourceId resourceId,
const char * resourceName,
int textureLoadFlags)
475 auto context =
static_cast<Context*
>(ctx);
476 context->textureManager->loadTexture(resourceName, resourceId,
TextureLoadFlags(textureLoadFlags));
477 context->
engine->setDirty();
480void loadTextureResource(BridgeContext * ctx, ResourceId resourceId,
const void * imageData,
int width,
int height,
int textureFormat,
int stride,
int textureLoadFlags)
482 auto context =
static_cast<Context*
>(ctx);
483 const Cogs::TextureFormat format =
static_cast<Cogs::TextureFormat
>(textureFormat);
484 context->textureManager->loadTexture2D(imageData, width, height, format, stride, resourceId,
TextureLoadFlags(textureLoadFlags));
485 context->
engine->setDirty();
488void loadRenderTextureResource(BridgeContext* ctx, ResourceId resourceId,
int width,
int height,
int textureFormat,
int textureLoadFlags)
490 auto context =
static_cast<Context*
>(ctx);
491 const Cogs::TextureFormat format =
static_cast<Cogs::TextureFormat
>(textureFormat);
492 const TextureHandle & handle = context->textureManager->loadTexture2D(
nullptr, width, height, format, 0, resourceId,
TextureLoadFlags(textureLoadFlags));
494 context->
engine->setDirty();
497void loadTextureVolumeResource(BridgeContext * ctx, ResourceId resourceId,
const void * imageData,
int width,
int height,
int depth,
int textureFormat,
int stride,
int textureLoadFlags)
499 auto context =
static_cast<Context*
>(ctx);
500 const Cogs::TextureFormat format =
static_cast<Cogs::TextureFormat
>(textureFormat);
501 context->textureManager->loadTexture(imageData, Cogs::ResourceDimensions::Texture3D, width, height, depth, 1, format, stride, resourceId,
TextureLoadFlags(textureLoadFlags));
502 context->
engine->setDirty();
505void loadExternalTextureResource(BridgeContext * ctx, ResourceId resourceId, intptr_t externalHandle,
int width,
int height,
int bpp,
int stride,
int textureLoadFlags)
507 auto context =
static_cast<Context*
>(ctx);
508 assert(stride == 0 &&
"Stride parameter is not passed on");
509 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));
510 context->
engine->setDirty();
515 bool validateTextureArgs(
int target,
int width,
int height,
int depth,
int layers)
517 bool unit_height =
true;
518 bool unit_depth =
true;
519 bool unit_layers =
true;
521 case int(Cogs::ResourceDimensions::Texture1D) :
523 case int(Cogs::ResourceDimensions::Texture1DArray) :
526 case int(Cogs::ResourceDimensions::Texture2D) :
529 case int(Cogs::ResourceDimensions::Texture2DArray) :
533 case int(Cogs::ResourceDimensions::Texture3D) :
537 case int(Cogs::ResourceDimensions::Texture3DArray) :
542 case int(Cogs::ResourceDimensions::TextureCube) :
545 case int(Cogs::ResourceDimensions::TextureCubeArray) :
549 case int(Cogs::ResourceDimensions::RenderBuffer) :
553 LOG_ERROR(logger,
"loadTexture: Illegal target");
558 LOG_ERROR(logger,
"loadTexture: IIlegal width %d", width);
561 if ((unit_height && height !=1) || (!unit_height && height < 1)) {
562 LOG_ERROR(logger,
"loadTexture: IIlegal height %d", height);
565 if ((unit_depth && depth != 1) || (!unit_depth && depth < 1)) {
566 LOG_ERROR(logger,
"loadTexture: IIlegal depth %d", depth);
569 if ((unit_layers && layers != 1) || (!unit_layers && layers < 1)) {
570 LOG_ERROR(logger,
"loadTexture: IIlegal layers %d", layers);
578void loadTextureResource2(BridgeContext * ctx, ResourceId resourceId,
const void * imageData,
int target,
int width,
int height,
int depth,
int layers,
int textureFormat,
int stride,
int textureLoadFlags)
580 auto context =
static_cast<Context*
>(ctx);
581 const Cogs::TextureFormat format =
static_cast<Cogs::TextureFormat
>(textureFormat);
582 if (!validateTextureArgs(target, width, height, depth, layers))
return;
584 context->textureManager->loadTexture(imageData,
static_cast<Cogs::ResourceDimensions
>(target), width, height, depth, layers, format, stride, resourceId,
TextureLoadFlags(textureLoadFlags));
585 context->
engine->setDirty();
588void loadExternalTextureResource2(BridgeContext * ctx, ResourceId resourceId, intptr_t externalHandle,
int target,
int width,
int height,
int depth,
int layers,
int textureFormat,
int stride,
int textureLoadFlags)
590 auto context =
static_cast<Context*
>(ctx);
591 const Cogs::TextureFormat format =
static_cast<Cogs::TextureFormat
>(textureFormat);
592 assert(stride == 0 &&
"Stride parameter is not passed on");
593 if (!validateTextureArgs(target, width, height, depth, layers))
return;
595 context->textureManager->loadExternalTexture(externalHandle,
static_cast<Cogs::ResourceDimensions
>(target), width, height, depth, layers, format, resourceId,
TextureLoadFlags(textureLoadFlags));
596 context->
engine->setDirty();
599void setTextureField(BridgeContext * ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId,
const ResourceId resourceId)
601 auto context =
static_cast<Context*
>(ctx);
603 Cogs::setField(context, entityId, componentId, fieldId, handle);
606void setTexturesField(BridgeContext* ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId,
const ResourceId* resourceIds,
int size)
609 std::vector<Cogs::Core::TextureHandle> handles(size);
610 for (
int i = 0; i < size; ++i) {
611 const ResourceId resourceId = resourceIds[i];
612 handles[i] = (resourceId == NoResourceId) ?
Cogs::Core::TextureHandle() : context->textureManager->getHandle(resourceId);
614 Cogs::assignField(context, entityId, componentId, fieldId, handles.data(), size);
617void setMaterialInstanceField(BridgeContext * ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId,
const ResourceId resourceId)
619 auto context =
static_cast<Context*
>(ctx);
621 Cogs::setField(context, entityId, componentId, fieldId, handle);
624void setMaterialInstancesField(BridgeContext* ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId,
const ResourceId* resourceIds,
int size)
626 auto context =
static_cast<Context*
>(ctx);
627 std::vector<Cogs::Core::MaterialInstanceHandle> handles(size);
628 for (
int i = 0; i < size; ++i) {
629 const ResourceId resourceId = resourceIds[i];
633 Cogs::assignField(context, entityId, componentId, fieldId, handles.data(), size);
636void setMaterialInstanceArrayField(BridgeContext * ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId,
const ResourceId resourceId,
int index)
638 auto context =
static_cast<Context*
>(ctx);
640 Cogs::setVectorField(context, entityId, componentId, fieldId, handle, index);
643void setMaterialInstanceOption(BridgeContext * ctx, ResourceId resourceId,
const char * name,
const char * value)
645 auto context =
static_cast<Context*
>(ctx);
647 if (!materialInstance) {
648 ::logInvalidResource(
"setMaterialInstanceOption", resourceId);
652 materialInstance->
setOption(name, value);
653 context->
engine->setDirty();
656void setMaterialInstanceProperty(BridgeContext * ctx, ResourceId resourceId,
const char * name,
const void * data,
const int sizeInBytes)
658 auto context =
static_cast<Context*
>(ctx);
660 if (!materialInstance) {
661 ::logInvalidResource(
"setMaterialInstanceProperty", resourceId);
665 materialInstance->setProperty(name, data,
static_cast<size_t>(sizeInBytes));
666 context->
engine->setDirty();
669CogsBool getMaterialInstanceProperty(BridgeContext * ctx, ResourceId resourceId,
const char * name,
void * data,
const int sizeInBytes)
671 auto context =
static_cast<Context*
>(ctx);
673 if (!materialInstance) {
674 ::logInvalidResource(
"getMaterialInstanceProperty", resourceId);
678 return materialInstance->getProperty(name, data,
static_cast<size_t>(sizeInBytes));
681int getMaterialInstancePropertyDataType(BridgeContext* ctx, ResourceId resourceId,
const char* name)
683 auto context =
static_cast<Context*
>(ctx);
685 if (!materialInstance) {
686 ::logInvalidResource(
"getMaterialInstancePropertyDataType", resourceId);
687 return static_cast<int>(MaterialDataType::Unknown);
693void setMaterialInstanceTexture(BridgeContext * ctx, ResourceId resourceId,
const char * name,
const ResourceId textureId)
695 auto context =
static_cast<Context*
>(ctx);
697 if (!materialInstance) {
698 ::logInvalidResource(
"setMaterialInstanceTexture", resourceId);
703 materialInstance->
setTextureProperty(key, context->textureManager->getHandle(textureId));
704 context->
engine->setDirty();
707void setMaterialInstanceTextureAddressMode(BridgeContext * ctx, ResourceId resourceId,
const char * name,
const char * mode)
709 auto context =
static_cast<Context*
>(ctx);
711 if (!materialInstance) {
712 ::logInvalidResource(
"setMaterialInstanceTextureAddressMode", resourceId);
717 context->
engine->setDirty();
720void setMaterialInstanceTextureFilterMode(BridgeContext* ctx, ResourceId resourceId,
const char* name,
const char* filterMode)
724 if (!materialInstance) {
725 ::logInvalidResource(
"setMaterialInstanceTextureFilterMode", resourceId);
730 context->
engine->setDirty();
733void setMaterialInstancePermutation(BridgeContext * ctx, ResourceId resourceId,
const char * name)
735 auto context =
static_cast<Context*
>(ctx);
737 if (!materialInstance) {
738 ::logInvalidResource(
"setMaterialInstancePermutation", resourceId);
742 materialInstance->setPermutation(name);
743 context->
engine->setDirty();
746void setMaterialInstanceVariant(BridgeContext * ctx, ResourceId resourceId,
const char * key,
const char * value)
748 auto context =
static_cast<Context*
>(ctx);
750 if (!materialInstance) {
751 ::logInvalidResource(
"setMaterialInstanceVariant", resourceId);
755 materialInstance->setVariant(key, value);
756 context->
engine->setDirty();
759const char * getMaterialInstanceVariant(BridgeContext * ctx, ResourceId resourceId,
const char * key)
761 auto context =
static_cast<Context*
>(ctx);
763 if (!materialInstance) {
764 ::logInvalidResource(
"getMaterialInstanceVariant", resourceId);
769 getMaterialInstanceVariantOutput = materialInstance->getVariant(key);
770 return getMaterialInstanceVariantOutput.data();
773void setMaterialInstanceFlags(BridgeContext * ctx, ResourceId resourceId,
int materialFlags)
775 auto context =
static_cast<Context*
>(ctx);
777 if (!materialInstance) {
778 ::logInvalidResource(
"setMaterialInstanceFlags", resourceId);
782 materialInstance->
instanceFlags =
static_cast<uint16_t
>(materialFlags);
783 context->
engine->setDirty();
786ResourceId getNextFontId(BridgeContext* ctx)
788 auto context =
static_cast<Context*
>(ctx);
789 return context->fontManager->getNextResourceId();
792ResourceId loadFont(BridgeContext* ctx,
const char* resourceName,
float size, ResourceId resourceId)
794 auto context =
static_cast<Context*
>(ctx);
797 return loaded->
getId();
800void releaseFont(BridgeContext* ctx, ResourceId resourceId)
802 auto context =
static_cast<Context*
>(ctx);
803 context->fontManager->release(resourceId);
806void addFontDependency(BridgeContext * ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId,
const ResourceId resourceId)
808 auto context =
static_cast<Context*
>(ctx);
810 Cogs::setField(context, entityId, componentId, fieldId, handle);
813void registerStringResource(BridgeContext * ctx,
const char * key,
const char * value)
815 auto context =
static_cast<Context*
>(ctx);
817 context->
engine->setDirty();
820void registerBinaryResource(BridgeContext* ctx,
const char* key,
const void* value,
int length)
822 auto context =
static_cast<Context*
>(ctx);
823 context->
resourceStore->addResource(key, value,
static_cast<size_t>(length));
826void addResourceArchive(BridgeContext* ctx,
const char* key, CogsBool prepend)
828 auto context =
static_cast<Context*
>(ctx);
829 context->
resourceStore->addResourceArchive(key, prepend != 0);
830 context->
engine->setDirty();
832CogsBool hasResource(BridgeContext* ctx,
const char* key)
834 auto context =
static_cast<Context*
>(ctx);
838ResourceId getMaterialInstance(BridgeContext * ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId)
840 auto context =
static_cast<Context*
>(ctx);
841 MaterialInstanceHandle& materialInstance = *Cogs::getField<MaterialInstanceHandle>(context, entityId, componentId, fieldId);
843 if (materialInstance) {
844 ResourceId
id = materialInstance->
getId();
846 if (
id == NoResourceId) {
847 id = context->materialInstanceManager->getNextResourceId();
849 context->materialInstanceManager->setResourceId(materialInstance.
resolve(),
id);
858int getMaterialInstances(BridgeContext * ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId, ResourceId * ids,
int idsCount)
860 auto context =
static_cast<Context*
>(ctx);
861 const auto & materialInstances = *Cogs::getField<std::vector<MaterialInstanceHandle>>(context, entityId, componentId, fieldId);
863 for (
size_t i = 0; i < static_cast<size_t>(idsCount); ++i) {
865 ResourceId
id = NoResourceId;
866 if (i < materialInstances.size()) {
871 if (materialInstance) {
872 id = materialInstance->
getId();
880 return static_cast<int>(materialInstances.size());
883void addSearchPath(BridgeContext * ctx,
const char * path)
885 auto context =
static_cast<Context*
>(ctx);
887 context->engine->setDirty();
890void purgeResource(BridgeContext * ctx,
const char * resourceName)
892 auto context =
static_cast<Context*
>(ctx);
894 context->engine->setDirty();
897void releaseTexture(BridgeContext * ctx, ResourceId resourceId)
899 auto context =
static_cast<Context*
>(ctx);
900 TextureHandle h = context->textureManager->release(resourceId);
902 Texture* texture = context->textureManager->get(h);
903 if (texture->externalHandle && texture->ownsExternalTexture.value ==
false) {
904 LOG_TRACE(logger,
"releaseTexture: Setting external handle of texture resource %d to 0", resourceId);
907 texture->externalHandle = 0;
908 texture->ownsExternalTexture =
true;
909 texture->setChanged();
912 context->engine->setDirty();
915ResourceId loadMaterial(BridgeContext * ctx,
const char * resourceName)
917 auto context =
static_cast<Context*
>(ctx);
918 const auto resourceId = context->materialManager->getNextResourceId();
920 MaterialHandle handle = context->materialManager->loadMaterial(resourceName, MaterialLoadFlags::None, resourceId);
922 context->materialManager->processLoading();
924 if (handle->
getId() == NoResourceId) {
925 context->materialManager->setResourceId(handle.
resolve(), resourceId);
927 context->engine->setDirty();
929 return handle->
getId();
932void setMaterialSharedProperty(BridgeContext* ctx, ResourceId materialId,
const char* name,
const void* data,
const int sizeInBytes)
934 auto context =
static_cast<Context*
>(ctx);
935 MaterialHandle material = context->materialManager->getHandle(materialId);
938 ::logInvalidResource(
"setMaterialSharedProperty(materialId)", materialId);
942 material->setProperty(name, data,
static_cast<size_t>(sizeInBytes));
943 context->engine->setDirty();
946void setMaterialsField(BridgeContext* ctx, EntityId entityId,
const ComponentId componentId,
const FieldId fieldId,
const ResourceId* resourceIds,
int size)
950 std::vector<Cogs::Core::MaterialHandle> handles(size);
951 for (
int i = 0; i < size; ++i) {
952 const ResourceId resourceId = resourceIds[i];
955 Cogs::assignField(context, entityId, componentId, fieldId, handles.data(), size);
958int getMaterialPropertyDataType(BridgeContext* ctx, ResourceId resourceId,
const char* name)
960 auto context =
static_cast<Context*
>(ctx);
961 MaterialHandle material = context->materialManager->getHandle(resourceId);
963 ::logInvalidResource(
"getMaterialPropertyDataType", resourceId);
964 return static_cast<int>(MaterialDataType::Unknown);
970ResourceId loadMaterialInstance(BridgeContext * ctx, ResourceId materialId)
972 auto context =
static_cast<Context*
>(ctx);
973 ResourceId resourceId = context->materialInstanceManager->getNextResourceId();
975 MaterialHandle material = context->materialManager->getHandle(materialId);
978 ::logInvalidResource(
"loadMaterialInstance(materialId)", materialId);
982 MaterialInstanceHandle materialInstance = context->materialInstanceManager->createMaterialInstance(material);
983 context->materialInstanceManager->setResourceId(materialInstance.
resolve(), resourceId);
984 context->
engine->setDirty();
989void releaseMaterialInstance(BridgeContext * ctx, ResourceId resourceId)
991 auto context =
static_cast<Context*
>(ctx);
992 context->materialInstanceManager->release(resourceId);
995const char * getMaterialInstanceName(BridgeContext * ctx, ResourceId materialInstanceId)
997 auto context =
static_cast<Context *
>(ctx);
998 MaterialInstanceHandle materialInstance = context->materialInstanceManager->getHandle(materialInstanceId);
999 if (materialInstance) {
1003 ::logInvalidResource(
"getMaterialInstanceName", materialInstanceId);
1007void setMaterialInstanceName(BridgeContext * ctx, ResourceId materialInstanceId,
const char * name)
1009 auto context =
static_cast<Context *
>(ctx);
1010 MaterialInstanceHandle materialInstance = context->materialInstanceManager->getHandle(materialInstanceId);
1011 if (materialInstance) {
1012 materialInstance->
setName(name);
1013 context->
engine->setDirty();
1016 ::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
PrimitiveType
Primitive types for interpreting vertex data sent to the graphics pipeline.
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.
@ RenderTarget
The texture can be used as a render target and drawn into.