Implemented API for model node creation.

hello_cube smoke test now adds a model node and assigns the built-in cube model
This commit is contained in:
2024-09-21 23:32:38 -07:00
parent 3b9a5d6f81
commit 0a66f11ff0
17 changed files with 95 additions and 29 deletions

View File

@@ -190,8 +190,8 @@ KrResult KRSurface::createSwapChain()
RenderPassInfo info{}; RenderPassInfo info{};
info.finalPass = false; info.finalPass = false;
// info.type = RenderPassType::RENDER_PASS_PRESTREAM; info.type = RenderPassType::RENDER_PASS_PRESTREAM;
// m_renderGraph->addRenderPass(*device, info); m_renderGraph->addRenderPass(*device, info);
for (int shadow_index = 0; shadow_index < shadow_buffer_count; shadow_index++) { for (int shadow_index = 0; shadow_index < shadow_buffer_count; shadow_index++) {
info.depthAttachment.id = attachment_shadow_cascades[shadow_index]; info.depthAttachment.id = attachment_shadow_cascades[shadow_index];

View File

@@ -45,7 +45,7 @@ public:
virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent); virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent);
virtual void loadXML(tinyxml2::XMLElement* e); virtual void loadXML(tinyxml2::XMLElement* e);
void render(RenderInfo& ri); void render(RenderInfo& ri) override;
std::string getZone(); std::string getZone();
void setZone(const std::string& zone); void setZone(const std::string& zone);

View File

@@ -50,7 +50,7 @@ public:
virtual void loadXML(tinyxml2::XMLElement* e); virtual void loadXML(tinyxml2::XMLElement* e);
virtual void physicsUpdate(float deltaTime); virtual void physicsUpdate(float deltaTime);
void render(RenderInfo& ri); void render(RenderInfo& ri) override;
// ---- Audio Playback Controls ---- // ---- Audio Playback Controls ----

View File

@@ -48,7 +48,7 @@ public:
virtual void loadXML(tinyxml2::XMLElement* e); virtual void loadXML(tinyxml2::XMLElement* e);
virtual hydra::AABB getBounds(); virtual hydra::AABB getBounds();
void render(RenderInfo& ri); void render(RenderInfo& ri) override;
void setBindPose(const hydra::Matrix4& pose); void setBindPose(const hydra::Matrix4& pose);
const hydra::Matrix4& getBindPose(); const hydra::Matrix4& getBindPose();

View File

@@ -70,7 +70,7 @@ public:
float getAudioOcclusion(); float getAudioOcclusion();
void setAudioOcclusion(float audio_occlusion); void setAudioOcclusion(float audio_occlusion);
void render(RenderInfo& ri); void render(RenderInfo& ri) override;
private: private:
KRMesh* m_model; KRMesh* m_model;

View File

@@ -46,7 +46,7 @@ public:
hydra::Vector3 getLocalLightDirection(); hydra::Vector3 getLocalLightDirection();
hydra::Vector3 getWorldLightDirection(); hydra::Vector3 getWorldLightDirection();
virtual void render(RenderInfo& ri); virtual void render(RenderInfo& ri) override;
virtual hydra::AABB getBounds(); virtual hydra::AABB getBounds();
protected: protected:

View File

@@ -64,7 +64,7 @@ public:
void setFlareOcclusionSize(float occlusion_size); void setFlareOcclusionSize(float occlusion_size);
void deleteBuffers(); void deleteBuffers();
virtual void render(RenderInfo& ri); virtual void render(RenderInfo& ri) override;
int getShadowBufferCount(); int getShadowBufferCount();
int* getShadowTextures(); int* getShadowTextures();

View File

@@ -44,9 +44,9 @@ void KRModel::InitNodeInfo(KrNodeInfo* nodeInfo)
{ {
KRNode::InitNodeInfo(nodeInfo); KRNode::InitNodeInfo(nodeInfo);
nodeInfo->model.faces_camera = false; nodeInfo->model.faces_camera = false;
nodeInfo->model.light_map_texture = -1; nodeInfo->model.light_map_texture = KR_NULL_HANDLE;
nodeInfo->model.lod_min_coverage = 0.0f; nodeInfo->model.lod_min_coverage = 0.0f;
nodeInfo->model.mesh = -1; nodeInfo->model.mesh = KR_NULL_HANDLE;
nodeInfo->model.receives_shadow = true; nodeInfo->model.receives_shadow = true;
nodeInfo->model.rim_color = Vector3::Zero(); nodeInfo->model.rim_color = Vector3::Zero();
nodeInfo->model.rim_power = 0.0f; nodeInfo->model.rim_power = 0.0f;
@@ -114,6 +114,50 @@ KRModel::~KRModel()
} }
KrResult KRModel::update(const KrNodeInfo* nodeInfo)
{
KrResult res = KRNode::update(nodeInfo);
if (res != KR_SUCCESS) {
return res;
}
m_faces_camera = nodeInfo->model.faces_camera;
m_min_lod_coverage = nodeInfo->model.lod_min_coverage;
m_receivesShadow = nodeInfo->model.receives_shadow;
m_rim_color = nodeInfo->model.rim_color;
m_rim_power = nodeInfo->model.rim_power;
KRTexture* light_map_texture = nullptr;
if (nodeInfo->model.light_map_texture != KR_NULL_HANDLE) {
res = m_pContext->getMappedResource<KRTexture>(nodeInfo->model.light_map_texture, &light_map_texture);
if (res != KR_SUCCESS) {
return res;
}
}
m_pLightMap = light_map_texture;
if (m_pLightMap) {
m_lightMap = m_pLightMap->getName();
} else {
m_lightMap = "";
}
KRMesh* mesh = nullptr;
if (nodeInfo->model.mesh != KR_NULL_HANDLE) {
res = m_pContext->getMappedResource<KRMesh>(nodeInfo->model.mesh, &mesh);
if (res != KR_SUCCESS) {
return res;
}
}
if (mesh != nullptr) {
m_models.clear();
m_model_name = mesh->getName();
} else {
m_models.clear();
m_model_name = "";
}
return KR_SUCCESS;
}
std::string KRModel::getElementName() std::string KRModel::getElementName()
{ {
return "model"; return "model";
@@ -197,7 +241,6 @@ void KRModel::loadModel()
void KRModel::render(KRNode::RenderInfo& ri) void KRModel::render(KRNode::RenderInfo& ri)
{ {
if (m_lod_visible >= LOD_VISIBILITY_PRESTREAM && ri.renderPass->getType() == RenderPassType::RENDER_PASS_PRESTREAM) { if (m_lod_visible >= LOD_VISIBILITY_PRESTREAM && ri.renderPass->getType() == RenderPassType::RENDER_PASS_PRESTREAM) {
preStream(*ri.viewport); preStream(*ri.viewport);
} }

View File

@@ -53,10 +53,12 @@ public:
KRModel(KRScene& scene, std::string instance_name, std::string model_name, std::string light_map, float lod_min_coverage, bool receives_shadow, bool faces_camera, hydra::Vector3 rim_color = hydra::Vector3::Zero(), float rim_power = 0.0f); KRModel(KRScene& scene, std::string instance_name, std::string model_name, std::string light_map, float lod_min_coverage, bool receives_shadow, bool faces_camera, hydra::Vector3 rim_color = hydra::Vector3::Zero(), float rim_power = 0.0f);
virtual ~KRModel(); virtual ~KRModel();
KrResult update(const KrNodeInfo* nodeInfo) override;
virtual std::string getElementName(); virtual std::string getElementName();
virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent); virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent);
virtual void render(KRNode::RenderInfo& ri); virtual void render(KRNode::RenderInfo& ri) override;
virtual hydra::AABB getBounds(); virtual hydra::AABB getBounds();

View File

@@ -677,7 +677,7 @@ KRNode* KRNode::LoadXML(KRScene& scene, tinyxml2::XMLElement* e)
return new_node; return new_node;
} }
void KRNode::render(const RenderInfo& ri) void KRNode::render(RenderInfo& ri)
{ {
if (m_lod_visible <= LOD_VISIBILITY_PRESTREAM) return; if (m_lod_visible <= LOD_VISIBILITY_PRESTREAM) return;

View File

@@ -209,7 +209,7 @@ public:
KRScene& getScene(); KRScene& getScene();
virtual void render(const RenderInfo& ri); virtual void render(RenderInfo& ri);
virtual void physicsUpdate(float deltaTime); virtual void physicsUpdate(float deltaTime);
virtual bool hasPhysics(); virtual bool hasPhysics();

View File

@@ -38,13 +38,13 @@ class KRParticleSystem : public KRNode
public: public:
virtual ~KRParticleSystem(); virtual ~KRParticleSystem();
virtual std::string getElementName() = 0; virtual std::string getElementName() override = 0;
virtual void loadXML(tinyxml2::XMLElement* e); virtual void loadXML(tinyxml2::XMLElement* e) override;
virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent); virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent) override;
virtual hydra::AABB getBounds() = 0; virtual hydra::AABB getBounds() override = 0;
virtual void render(RenderInfo& ri) = 0; virtual void render(RenderInfo& ri) override = 0;
protected: protected:
KRParticleSystem(KRScene& scene, std::string name); KRParticleSystem(KRScene& scene, std::string name);

View File

@@ -46,7 +46,7 @@ public:
virtual hydra::AABB getBounds(); virtual hydra::AABB getBounds();
virtual void render(RenderInfo& ri); virtual void render(RenderInfo& ri) override;
virtual void physicsUpdate(float deltaTime); virtual void physicsUpdate(float deltaTime);

View File

@@ -43,7 +43,7 @@ public:
virtual std::string getElementName(); virtual std::string getElementName();
virtual hydra::AABB getBounds(); virtual hydra::AABB getBounds();
virtual void render(RenderInfo& ri); virtual void render(RenderInfo& ri) override;
private: private:
void generateMesh(); void generateMesh();

View File

@@ -46,7 +46,7 @@ public:
virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent); virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent);
virtual void loadXML(tinyxml2::XMLElement* e); virtual void loadXML(tinyxml2::XMLElement* e);
void render(RenderInfo& ri); void render(RenderInfo& ri) override;
std::string getZone(); std::string getZone();
void setZone(const std::string& zone); void setZone(const std::string& zone);

View File

@@ -43,17 +43,17 @@ public:
KRSprite(KRScene& scene, std::string name); KRSprite(KRScene& scene, std::string name);
virtual ~KRSprite(); virtual ~KRSprite();
virtual std::string getElementName(); virtual std::string getElementName() override;
virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent); virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent) override;
virtual void loadXML(tinyxml2::XMLElement* e); virtual void loadXML(tinyxml2::XMLElement* e) override;
void setSpriteTexture(std::string sprite_texture); void setSpriteTexture(std::string sprite_texture);
void setSpriteAlpha(float alpha); void setSpriteAlpha(float alpha);
float getSpriteAlpha() const; float getSpriteAlpha() const;
virtual void render(RenderInfo& ri); virtual void render(RenderInfo& ri) override;
virtual hydra::AABB getBounds(); virtual hydra::AABB getBounds() override;
protected: protected:

View File

@@ -37,12 +37,14 @@ bool smoke_load()
enum enum
{ {
kSceneResourceHandle = 10, kSceneResourceHandle = 10,
kSkyboxTextureResourceHandle kSkyboxTextureResourceHandle,
kCubeMeshResourceHandle
}; };
enum enum
{ {
kCameraNodeHandle = 10 kCameraNodeHandle = 10,
kCubeNodeHandle = 11
}; };
KrLoadResourceInfo load_resource_info = {}; KrLoadResourceInfo load_resource_info = {};
@@ -64,6 +66,12 @@ bool smoke_load()
assert(res == KR_SUCCESS); assert(res == KR_SUCCESS);
*/ */
KrMapResourceInfo map_cube_mesh_resource = { KR_STRUCTURE_TYPE_MAP_RESOURCE };
map_cube_mesh_resource.pResourceName = "__cube";
map_cube_mesh_resource.resourceHandle = kCubeMeshResourceHandle;
res = KrMapResource(&map_cube_mesh_resource);
assert(res == KR_SUCCESS);
// Create a scene // Create a scene
KrCreateSceneInfo create_scene_info = { KR_STRUCTURE_TYPE_CREATE_SCENE }; KrCreateSceneInfo create_scene_info = { KR_STRUCTURE_TYPE_CREATE_SCENE };
create_scene_info.resourceHandle = kSceneResourceHandle; create_scene_info.resourceHandle = kSceneResourceHandle;
@@ -85,5 +93,18 @@ bool smoke_load()
res = KrCreateNode(&create_camera_info); res = KrCreateNode(&create_camera_info);
assert(res == KR_SUCCESS); assert(res == KR_SUCCESS);
// Add a cube to the scene
KrCreateNodeInfo create_cube_info = { KR_STRUCTURE_TYPE_CREATE_NODE };
res = KrInitNodeInfo(&create_cube_info.node, KR_STRUCTURE_TYPE_NODE_MODEL);
assert(res == KR_SUCCESS);
create_cube_info.relativeNodeHandle = KR_NULL_HANDLE;
create_cube_info.location = KR_SCENE_NODE_APPEND_CHILD;
create_cube_info.newNodeHandle = kCubeNodeHandle;
create_cube_info.sceneHandle = kSceneResourceHandle;
create_cube_info.node.pName = "my_cube";
create_cube_info.node.model.mesh = kCubeMeshResourceHandle;
res = KrCreateNode(&create_cube_info);
assert(res == KR_SUCCESS);
return true; return true;
} }