2
0

ShapeCreator.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. // SPDX-FileCopyrightText: 2022 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #include <TestFramework.h>
  4. #include <Utils/ShapeCreator.h>
  5. namespace ShapeCreator {
  6. ShapeRefC CreateTorusMesh(float inTorusRadius, float inTubeRadius, uint inTorusSegments, uint inTubeSegments)
  7. {
  8. uint cNumVertices = inTorusSegments * inTubeSegments;
  9. // Create torus
  10. MeshShapeSettings mesh;
  11. mesh.mTriangleVertices.reserve(cNumVertices);
  12. mesh.mIndexedTriangles.reserve(cNumVertices * 2);
  13. for (uint torus_segment = 0; torus_segment < inTorusSegments; ++torus_segment)
  14. {
  15. Mat44 rotation = Mat44::sRotation(Vec3::sAxisY(), float(torus_segment) * 2.0f * JPH_PI / inTorusSegments);
  16. for (uint tube_segment = 0; tube_segment < inTubeSegments; ++tube_segment)
  17. {
  18. // Create vertices
  19. float tube_angle = float(tube_segment) * 2.0f * JPH_PI / inTubeSegments;
  20. Vec3 pos = rotation * Vec3(inTorusRadius + inTubeRadius * Sin(tube_angle), inTubeRadius * Cos(tube_angle), 0);
  21. Float3 v;
  22. pos.StoreFloat3(&v);
  23. mesh.mTriangleVertices.push_back(v);
  24. // Create indices
  25. uint start_idx = torus_segment * inTubeSegments + tube_segment;
  26. mesh.mIndexedTriangles.emplace_back(start_idx, (start_idx + 1) % cNumVertices, (start_idx + inTubeSegments) % cNumVertices);
  27. mesh.mIndexedTriangles.emplace_back((start_idx + 1) % cNumVertices, (start_idx + inTubeSegments + 1) % cNumVertices, (start_idx + inTubeSegments) % cNumVertices);
  28. }
  29. }
  30. return mesh.Create().Get();
  31. }
  32. };