1#include "Foundation/Logging/Logger.h"
3#include "Components/Core/AssetComponent.h"
5#include "Systems/Core/AssetSystem.h"
7#include "Resources/MaterialManager.h"
8#include "Resources/TextureManager.h"
10#include "Services/Time.h"
12#include "ExtensionRegistry.h"
15#include "TwinCadModelSystem.h"
16#include "TwinVisualsSystem.h"
29 if (visualsSystem ==
nullptr || visualsSystem->globalTwinVisualsComponent ==
nullptr)
return;
30 TwinVisualsData& visualsData = visualsSystem->getData(visualsSystem->globalTwinVisualsComponent);
34 if (cadModelData.firstRun) {
41 cadModelData.firstRun =
false;
45 if (cadModelComp.hasChanged()) {
46 if (cadModelData.substance != cadModelComp.substance) {
47 cadModelData.substance = cadModelComp.substance;
48 if (cadModelData.substance.empty()) {
49 cadModelData.baseColor.clear(
context, visualsData);
50 cadModelData.normal.clear(
context, visualsData);
51 cadModelData.orm.clear(
context, visualsData);
54 cadModelData.baseColor.issue(
context, visualsData, cadModelData.substance +
"/SubstanceSet_baseColor.ktx2");
55 cadModelData.normal.issue(
context, visualsData, cadModelData.substance +
"/SubstanceSet_normal.ktx2");
56 cadModelData.orm.issue(
context, visualsData, cadModelData.substance +
"/SubstanceSet_orm.ktx2");
66 TwinVisualsSystem* visualsSystem = ExtensionRegistry::getExtensionSystem<TwinVisualsSystem>(context);
67 if (visualsSystem ==
nullptr || visualsSystem->globalTwinVisualsComponent ==
nullptr)
return;
68 TwinVisualsData& visualsData = visualsSystem->getData(visualsSystem->globalTwinVisualsComponent);
73 if (cadModelData.attributeMapGen != cadModelComp.attributeMap.getGeneration()) {
74 cadModelData.attributeMapGen = cadModelComp.attributeMap.getGeneration();
76 if (!cadModelComp.attributeMap.empty()) {
78 size_t slots = cadModelComp.attributeMap.size() / 4;
79 size_t rows = (slots + 4096 - 1) / 4096;
80 cadModelData.attributeMapData.resize(4 * 4096 * rows);
81 for (
size_t i = 0; i < 4 * slots; i++) {
82 cadModelData.attributeMapData[i] = cadModelComp.attributeMap[i];
85 ResourceId resourceId = NoResourceId;
86 if (cadModelData.attributeMap) {
87 resourceId = cadModelData.attributeMap->
getId();
89 cadModelData.attributeMap = context->textureManager->loadTexture2D(cadModelData.attributeMapData.data(),
90 4096,
static_cast<int>(rows),
91 TextureFormat::R8G8B8A8_UNORM, 0,
96 cadModelData.attributeMapData.clear();
99 cadModelData.materialInstance->
setTextureProperty(attributeMapKey, cadModelData.attributeMap);
105 if (cadModelComp.hasChanged()) {
106 cadModelData.needUpdate =
true;
108 cadModelData.baseColor.check(context, visualsData);
109 cadModelData.normal.check(context, visualsData);
110 cadModelData.orm.check(context, visualsData);
112 if(cadModelData.needUpdate && visualsData.currTextureLoadingState == TextureLoadingState::Ready) {
113 cadModelData.needUpdate =
false;
115 if (emissiveColorKey != NoProperty) {
116 cadModelData.materialInstance->
setVec3Property(emissiveColorKey, cadModelComp.emissiveColor);
119 if (diffuseColorKey != NoProperty) {
120 cadModelData.materialInstance->
setVec4Property(diffuseColorKey, cadModelComp.diffuseColor);
123 if (specularColorKey != NoProperty) {
124 cadModelData.materialInstance->
setVec3Property(specularColorKey, cadModelComp.specularColor);
127 if (specularPowerKey != NoProperty) {
128 cadModelData.materialInstance->
setFloatProperty(specularPowerKey, cadModelComp.specularPower);
131 if (metallicKey != NoProperty) {
132 cadModelData.materialInstance->
setFloatProperty(metallicKey, cadModelComp.metallic);
135 if (roughnessKey != NoProperty) {
136 cadModelData.materialInstance->
setFloatProperty(roughnessKey, cadModelComp.roughness);
139 if (substanceParamsKey != NoProperty) {
140 cadModelData.materialInstance->
setVec3Property(substanceParamsKey, cadModelComp.substanceParams);
143 if (parametersKey != NoProperty) {
144 cadModelData.materialInstance->
setVec4Property(parametersKey, cadModelComp.parameters);
147 if (clippingKey != NoProperty) {
148 cadModelData.materialInstance->
setVec4Property(clippingKey, cadModelComp.clipping);
151 if (minClippingKey != NoProperty) {
152 cadModelData.materialInstance->
setVec3Property(minClippingKey, cadModelComp.minClipping);
155 if (maxClippingKey != NoProperty) {
156 cadModelData.materialInstance->
setVec3Property(maxClippingKey, cadModelComp.maxClipping);
159 if (hasAttributeDataKey != NoProperty) {
160 cadModelData.materialInstance->
setBoolProperty(hasAttributeDataKey, cadModelComp.hasAttributeData);
163 if (surfaceVarianceTextureKey != NoProperty) {
164 cadModelData.materialInstance->
setTextureProperty(surfaceVarianceTextureKey, cadModelComp.surfaceVarianceTexture);
167 if (allowClippingVariantIndex != Material::NoVariantIndex) {
168 cadModelData.materialInstance->setVariant(allowClippingVariantIndex, cadModelComp.allowClipping);
171 if (customEffectVariantIndex != Material::NoVariantIndex) {
172 cadModelData.materialInstance->setVariant(customEffectVariantIndex, cadModelComp.customEffect);
175 if (selectionEffectVariantIndex != Material::NoVariantIndex) {
176 cadModelData.materialInstance->setVariant(selectionEffectVariantIndex, cadModelComp.selectionEffect);
179 if (surfaceVarianceVariantIndex != Material::NoVariantIndex) {
180 cadModelData.materialInstance->setVariant(surfaceVarianceVariantIndex, cadModelComp.surfaceVariance);
183 if (lightModelVariantIndex != Material::NoVariantIndex) {
184 cadModelData.materialInstance->setVariant(lightModelVariantIndex, (cadModelComp.pbrLighting ? std::string_view(
"PBR") : std::string_view(
"Phong")));
187 if (numSubstanceDefinitionMapsVariantIndex != Material::NoVariantIndex) {
188 cadModelData.materialInstance->setVariant(numSubstanceDefinitionMapsVariantIndex, cadModelComp.numSubstanceDefinitionMaps);
194 if (assetComp->material != cadModelData.materialInstance) {
195 assetComp->material = cadModelData.materialInstance;
196 assetComp->setChanged();
200 if (visualsData.presentTextures) {
201 if (baseColorMapKey != NoProperty) {
202 cadModelData.materialInstance->
setTextureProperty(baseColorMapKey, cadModelData.baseColor.present);
204 if (normalMapKey != NoProperty) {
205 cadModelData.materialInstance->
setTextureProperty(normalMapKey, cadModelData.normal.present);
207 if (occlusionRoughnessMetallicMapKey != NoProperty) {
208 cadModelData.materialInstance->
setTextureProperty(occlusionRoughnessMetallicMapKey, cadModelData.orm.present);
217 if (pool.size() == 0) {
219 material = context->materialManager->loadMaterial(
"TwinVisuals/TwinCadMaterial/AssetGeometry.material");
220 context->materialManager->processLoading();
222 attributeMapKey = material->getTextureKey(
"attributeMap");
223 emissiveColorKey = material->getVec3Key(
"emissiveColor");
224 diffuseColorKey = material->getVec4Key(
"diffuseColor");
225 specularColorKey = material->getVec3Key(
"specularColor");
226 specularPowerKey = material->getFloatKey(
"specularPower");
227 metallicKey = material->getFloatKey(
"metallic");
228 roughnessKey = material->getFloatKey(
"roughness");
229 substanceParamsKey = material->getVec3Key(
"substanceParams");
230 parametersKey = material->getVec4Key(
"parameters");
231 clippingKey = material->getVec4Key(
"clipping");
232 minClippingKey = material->getVec3Key(
"minClipping");
233 maxClippingKey = material->getVec3Key(
"maxClipping");
234 hasAttributeDataKey = material->getBoolKey(
"hasAttributeData");
235 surfaceVarianceTextureKey = material->getTextureKey(
"surfaceVarianceTexture");
236 baseColorMapKey = material->getTextureKey(
"baseColorMap");;
237 normalMapKey = material->getTextureKey(
"normalMap");;
238 occlusionRoughnessMetallicMapKey = material->getTextureKey(
"occlusionRoughnessMetallicMap");;
240 allowClippingVariantIndex = material->getVariantIndex(
"AllowClipping");
241 customEffectVariantIndex = material->getVariantIndex(
"CustomEffect");
242 selectionEffectVariantIndex = material->getVariantIndex(
"SelectionEffect");
243 surfaceVarianceVariantIndex = material->getVariantIndex(
"SurfaceVariance");
244 lightModelVariantIndex = material->getVariantIndex(
"LightModel");
245 numSubstanceDefinitionMapsVariantIndex = material->getVariantIndex(
"NumSubstanceDefinitionMaps");
248 assert(!rayPickExtension);
250 context->rayPicking->addPickable(rayPickExtension);
251 LOG_DEBUG(logger,
"First component created, registered raypick extension");
254 componentsCreated =
true;
259 data.materialInstance = context->materialInstanceManager->createMaterialInstance(material);
267 if (pool.size() == 0) {
269 assert(rayPickExtension);
270 context->rayPicking->removePickable(rayPickExtension);
271 delete rayPickExtension;
272 rayPickExtension =
nullptr;
274 LOG_DEBUG(logger,
"Last component destroyed, unregistered raypick extension");
ComponentType * getComponent() const
virtual ComponentHandle createComponent()
Create a new component instance.
Context * context
Pointer to the Context instance the system lives in.
virtual void destroyComponent(ComponentHandle)
Destroy the component held by the given handle.
void update()
Updates the system state to that of the current frame.
void preUpdate()
Run the pre-update method of the system.
ComponentPool< ComponentType > pool
Pool of components managed by the system.
A Context instance contains all the services, systems and runtime components needed to use Cogs.
Log implementation class.
Provides a weakly referenced view over the contents of a string.
Contains the Engine, Renderer, resource managers and other systems needed to run Cogs....
@ ForceSynchronous
Force loading the resource synchronously.
constexpr Log getLogger(const char(&name)[LEN]) noexcept
Handle to a Component instance.
ComponentType * resolveComponent() const
Instantiates an asset model into the scene.
void setFloatProperty(const VariableKey key, float value)
Set the float property with the given key to value.
void setVec3Property(const VariableKey key, glm::vec3 value)
Set the vec3 property with the given key to value.
void setTextureProperty(const StringView &key, TextureHandle value)
Set the texture property with the given key to the texture resource held by value.
void setVec4Property(const VariableKey key, glm::vec4 value)
Set the vec4 property with the given key to value.
void setBoolProperty(const VariableKey key, bool value)
Set the bool property with the given key to value.
ResourceId getId() const
Get the resource id of this instance.
static const ResourceHandle_t NoHandle
Handle representing a default (or none if default not present) resource.
ComponentHandle createComponent() override
void destroyComponent(ComponentHandle handle) override