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{};
info.finalPass = false;
// info.type = RenderPassType::RENDER_PASS_PRESTREAM;
// m_renderGraph->addRenderPass(*device, info);
info.type = RenderPassType::RENDER_PASS_PRESTREAM;
m_renderGraph->addRenderPass(*device, info);
for (int shadow_index = 0; shadow_index < shadow_buffer_count; 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 void loadXML(tinyxml2::XMLElement* e);
void render(RenderInfo& ri);
void render(RenderInfo& ri) override;
std::string getZone();
void setZone(const std::string& zone);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -44,9 +44,9 @@ void KRModel::InitNodeInfo(KrNodeInfo* nodeInfo)
{
KRNode::InitNodeInfo(nodeInfo);
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.mesh = -1;
nodeInfo->model.mesh = KR_NULL_HANDLE;
nodeInfo->model.receives_shadow = true;
nodeInfo->model.rim_color = Vector3::Zero();
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()
{
return "model";
@@ -197,7 +241,6 @@ void KRModel::loadModel()
void KRModel::render(KRNode::RenderInfo& ri)
{
if (m_lod_visible >= LOD_VISIBILITY_PRESTREAM && ri.renderPass->getType() == RenderPassType::RENDER_PASS_PRESTREAM) {
preStream(*ri.viewport);
}

View File

@@ -52,11 +52,13 @@ public:
KRModel(KRScene& scene, std::string name);
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();
KrResult update(const KrNodeInfo* nodeInfo) override;
virtual std::string getElementName();
virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent);
virtual void render(KRNode::RenderInfo& ri);
virtual void render(KRNode::RenderInfo& ri) override;
virtual hydra::AABB getBounds();

View File

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

View File

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

View File

@@ -38,13 +38,13 @@ class KRParticleSystem : public KRNode
public:
virtual ~KRParticleSystem();
virtual std::string getElementName() = 0;
virtual void loadXML(tinyxml2::XMLElement* e);
virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent);
virtual std::string getElementName() override = 0;
virtual void loadXML(tinyxml2::XMLElement* e) override;
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:
KRParticleSystem(KRScene& scene, std::string name);

View File

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

View File

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

View File

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

View File

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

View File

@@ -37,12 +37,14 @@ bool smoke_load()
enum
{
kSceneResourceHandle = 10,
kSkyboxTextureResourceHandle
kSkyboxTextureResourceHandle,
kCubeMeshResourceHandle
};
enum
{
kCameraNodeHandle = 10
kCameraNodeHandle = 10,
kCubeNodeHandle = 11
};
KrLoadResourceInfo load_resource_info = {};
@@ -63,6 +65,12 @@ bool smoke_load()
KrResult res = KrMapResource(&map_skybox_resource);
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
KrCreateSceneInfo create_scene_info = { KR_STRUCTURE_TYPE_CREATE_SCENE };
@@ -85,5 +93,18 @@ bool smoke_load()
res = KrCreateNode(&create_camera_info);
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;
}