diff --git a/include/collada_scene.hpp b/include/collada_scene.hpp index a6baedf..1246aa6 100644 --- a/include/collada_scene.hpp +++ b/include/collada_scene.hpp @@ -5,14 +5,13 @@ namespace collada_scene { - struct lookat { + struct __attribute__((aligned(16))) lookat { XMVECTOR eye; XMVECTOR at; XMVECTOR up; }; - struct transform { - collada::transform_type type; + struct __attribute__((aligned(16))) transform { union { lookat lookat; XMMATRIX matrix; @@ -20,6 +19,7 @@ namespace collada_scene { XMVECTOR scale; XMVECTOR translate; }; + collada::transform_type type; }; struct node_instance { @@ -43,8 +43,8 @@ namespace collada_scene { HRESULT load_scene(collada::descriptor const * const descriptor); void render(); - typedef void (* const apply_node_func_t)(collada::node const * const node, - node_instance * node_instance); + typedef void (collada_scene::scene_state::* const apply_node_func_t)(collada::node const * const node, + node_instance * node_instance); private: HRESULT load_layouts(); @@ -54,6 +54,9 @@ namespace collada_scene { apply_node_func_t func); void apply_node_instances(apply_node_func_t func); + void allocate_node_instance(collada::node const * const node, + node_instance * node_instance); + void render_geometries(collada::instance_geometry const * const instance_geometries, int const instance_geometries_count); }; diff --git a/include/new.hpp b/include/new.hpp index 994787c..f4ead39 100644 --- a/include/new.hpp +++ b/include/new.hpp @@ -1,9 +1,7 @@ #pragma once -#include - template T * New(int elements) { - return (T *)malloc((sizeof (T)) * elements); + return (T *)_aligned_malloc((sizeof (T)) * elements, 16); } diff --git a/src/collada_scene.cpp b/src/collada_scene.cpp index d5a225e..07af7f1 100644 --- a/src/collada_scene.cpp +++ b/src/collada_scene.cpp @@ -71,7 +71,7 @@ namespace collada_scene { { int count = 1; for (int i = 0; i < node->nodes_count; i++) { - count += count_nodes(&node->nodes[i]); + count += count_nodes(node->nodes[i]); } return count; } @@ -98,7 +98,7 @@ namespace collada_scene { transform.scale = XMLoadFloat3((XMFLOAT3 *)&node->transforms[i].scale); break; case transform_type::TRANSLATE: - transform.translate = XMLoadFloat3((XMFLOAT3 *)&node->transforms[i].translate); + transform.translate = XMLoadFloat3((XMFLOAT3*)&node->transforms[i].translate); break; default: assert(false); @@ -106,8 +106,8 @@ namespace collada_scene { } } - static void allocate_node_instance(node const * const node, - node_instance * node_instance) + void scene_state::allocate_node_instance(node const * const node, + node_instance * node_instance) { node_instance->transforms = New(node->transforms_count); initialize_node_transforms(node, node_instance); @@ -117,11 +117,11 @@ namespace collada_scene { node_instance * node_instance, apply_node_func_t func) { - func(node, node_instance); + (this->*func)(node, node_instance); node_instance = &node_instance[1]; for (int i = 0; i < node->nodes_count; i++) { - node_instance = apply_node_instances1(&node->nodes[i], node_instance, func); + node_instance = apply_node_instances1(node->nodes[i], node_instance, func); } return node_instance; @@ -144,7 +144,7 @@ namespace collada_scene { m_nodeInstances = New(count); - apply_node_instances(allocate_node_instance); + apply_node_instances(&scene_state::allocate_node_instance); } HRESULT scene_state::load_scene(collada::descriptor const * const descriptor)