diff --git a/CMakeLists.txt b/CMakeLists.txt index 5904ce5..86bde16 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,7 +15,7 @@ cmake_policy(SET CMP0015 NEW) set(GUI text.cpp) set(UTILS util.cpp) -set(MATH quaternion.cpp vector.cpp matrix.cpp ray.cpp) +set(MATH quaternion.cpp vector.cpp matrix.cpp rayCaster.cpp) set(RENDER lineRenderer.cpp particleEmitter.cpp camera.cpp light.cpp material.cpp mesh.cpp meshData.cpp model.cpp node.cpp quad.cpp box.cpp root.cpp shader.cpp texture.cpp) set(ANIM animationController.cpp animationChannel.cpp animation.cpp animatable.cpp keyframeChannel.cpp driver.cpp) set(ARMATURE skeleton.cpp bone.cpp ikSolver.cpp) @@ -121,8 +121,8 @@ if(BUILD_SAMPLES) add_executable(particleEmitterSample particleEmitterSample.cpp) target_link_libraries(particleEmitterSample ${LIB_NAME}) - add_executable(raySample raySample.cpp) - target_link_libraries(raySample ${LIB_NAME}) + add_executable(rayCasterSample rayCasterSample.cpp) + target_link_libraries(rayCasterSample ${LIB_NAME}) add_executable(pbrSample pbrSample.cpp) target_link_libraries(pbrSample ${LIB_NAME}) diff --git a/ray.h b/ray.h deleted file mode 100644 index 5c7d40b..0000000 --- a/ray.h +++ /dev/null @@ -1,22 +0,0 @@ -#include "vector.h" -#include "util.h" - -#include - -namespace vb01{ - class Node; - class Mesh; - - class Ray{ - public: - struct CollisionResult{ - Vector3 pos, norm; - float distance; - Mesh *mesh = nullptr; - }; - static void retrieveCollisions(Vector3, Vector3, Node*, std::vector&, const float = .0); - static void castRay(Vector3, Vector3, Node*, std::vector&, const float); - static void sortResults(std::vector&); - }; - -} diff --git a/ray.cpp b/rayCaster.cpp similarity index 66% rename from ray.cpp rename to rayCaster.cpp index 5030b5d..342dc1e 100644 --- a/ray.cpp +++ b/rayCaster.cpp @@ -1,22 +1,38 @@ #include -#include "ray.h" +#include "rayCaster.h" #include "mesh.h" #include "node.h" using namespace std; namespace vb01{ - void Ray::retrieveCollisions(Vector3 rayPos, Vector3 rayDir, Node *node, std::vector &results, const float rayLength){ - castRay(rayPos, rayDir, node, results, rayLength); - - for(Node *c : node->getChildren()) - retrieveCollisions(rayPos, rayDir, c, results, rayLength); + vector RayCaster::cast(Vector3 rayPos, Vector3 rayDir, Node *node, const float rayLength){ + return cast(rayPos, rayDir, vector{node}, rayLength); } - void Ray::castRay(Vector3 rayPos, Vector3 rayDir, Node *node, vector &results, float rayLength){ + vector RayCaster::cast(Vector3 rayPos, Vector3 rayDir, vector nodes, const float rayLength){ + vector results; + + for(Node *node : nodes){ + vector descendants = vector{node}; + node->getDescendants(descendants); + + for(Node *desc : descendants){ + vector res = retrieveCollisions(rayPos, rayDir, desc, rayLength); + results.insert(results.end(), res.begin(), res.end()); + } + } + + if(!results.empty()) sortResults(results); + + return results; + } + + vector RayCaster::retrieveCollisions(Vector3 rayPos, Vector3 rayDir, Node *node, float rayLength){ Vector3 pos = node->localToGlobalPosition(Vector3::VEC_ZERO); Quaternion rot = node->localToGlobalOrientation(Quaternion::QUAT_W); + vector results; for(Mesh *m : node->getMeshes()){ const int numVerts = m->getMeshBase().numTris * 3; @@ -64,14 +80,15 @@ namespace vb01{ } } } + + return results; } - void Ray::sortResults(std::vector &results){ - if(!results.empty()) - for(int i = 0; i < results.size(); i++){ - for(int i2 = i; i2 < results.size(); i2++) - if(results[i].distance > results[i2].distance) - swap(results[i], results[i2]); - } + void RayCaster::sortResults(std::vector &results){ + for(int i = 0; i < results.size(); i++){ + for(int j = i; j < results.size(); j++) + if(results[i].distance > results[j].distance) + swap(results[i], results[j]); + } } } diff --git a/rayCaster.h b/rayCaster.h new file mode 100644 index 0000000..2e8deb8 --- /dev/null +++ b/rayCaster.h @@ -0,0 +1,25 @@ +#include "vector.h" +#include "util.h" + +#include + +namespace vb01{ + class Node; + class Mesh; + + class RayCaster{ + public: + struct CollisionResult{ + Vector3 pos, norm; + float distance; + Mesh *mesh = nullptr; + }; + + static std::vector cast(Vector3, Vector3, Node*, const float = .0); + static std::vector cast(Vector3, Vector3, std::vector, const float = .0); + private: + static std::vector retrieveCollisions(Vector3, Vector3, Node*, const float); + static void sortResults(std::vector&); + }; + +} diff --git a/raySample.cpp b/rayCasterSample.cpp similarity index 93% rename from raySample.cpp rename to rayCasterSample.cpp index 536258e..5439610 100644 --- a/raySample.cpp +++ b/rayCasterSample.cpp @@ -3,7 +3,7 @@ #include "material.h" #include "assetManager.h" #include "lineRenderer.h" -#include "ray.h" +#include "rayCaster.h" using namespace std; using namespace vb01; @@ -76,11 +76,9 @@ int main(){ * Casts an infinite ray that checks for collision against meshes under * the icoshpere model node and paints it red upon collision */ - vector results; - Ray::retrieveCollisions(rayStart, rayEnd - rayStart, sphModel, results); - Ray::sortResults(results); mat->setVec4Uniform("diffuseColor", Vector4::VEC_L); + vector results = RayCaster::cast(rayStart, rayEnd - rayStart, sphModel); if(!results.empty()) mat->setVec4Uniform("diffuseColor", Vector4(1, 0, 0, 1)); diff --git a/samples/models/sphere.xml b/samples/models/sphere.xml index 7bb6797..f866172 100644 --- a/samples/models/sphere.xml +++ b/samples/models/sphere.xml @@ -1,288 +1,288 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - + + + - - - - + + + + - - - - - + + + + + - - - - - + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - + + + + + - - - - + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + - + - - - - + + + + - - - - - - + + + + + + - - - - - - - + + + + + + + - - - - - + + + + + - - + + - - - - - - - + + + + + + + - - - - + + + + - + - - + + - - - + + + - + - - + + - - - - + + + + - - - - - + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - + - - - - - - - - + + + + + + + + - - + + - - - - + + + + - - - - - - - - - + + + + + + + + + \ No newline at end of file