/* * Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * SPDX-FileCopyrightText: Copyright (c) 2014-2022 NVIDIA CORPORATION * SPDX-License-Identifier: Apache-2.0 */ #pragma once #include #include #include #include /* @DOC_START # struct `nvh::PrimitiveMesh` - Common primitive type, made of vertices: position, normal and texture coordinates. - All primitives are triangles, and each 3 indices is forming a triangle. # struct `nvh::Node` - Structure to hold a reference to a mesh, with a material and transformation. Primitives that can be created: * Tetrahedron * Icosahedron * Octahedron * Plane * Cube * SphereUv * Cone * SphereMesh * Torus Node creator: returns the instance and the position * MengerSponge * SunFlower Other utilities * mergeNodes * removeDuplicateVertices * wobblePrimitive @DOC_END */ namespace nvh { struct PrimitiveVertex { glm::vec3 p; // Position glm::vec3 n; // Normal glm::vec2 t; // Texture Coordinates }; struct PrimitiveTriangle { glm::uvec3 v; // vertex indices }; struct PrimitiveMesh { std::vector vertices; // Array of all vertex std::vector triangles; // Indices forming triangles }; struct Node { glm::vec3 translation{}; // glm::quat rotation{}; // glm::vec3 scale{1.0F}; // glm::mat4 matrix{1}; // Added with the above transformations int material{0}; int mesh{-1}; glm::mat4 localMatrix() const { glm::mat4 translationMatrix = glm::translate(glm::mat4(1.0f), translation); glm::mat4 rotationMatrix = glm::mat4_cast(rotation); glm::mat4 scaleMatrix = glm::scale(glm::mat4(1.0f), scale); glm::mat4 combinedMatrix = translationMatrix * rotationMatrix * scaleMatrix * matrix; return combinedMatrix; } }; PrimitiveMesh createTetrahedron(); PrimitiveMesh createIcosahedron(); PrimitiveMesh createOctahedron(); PrimitiveMesh createPlane(int steps = 1, float width = 1.0F, float depth = 1.0F); PrimitiveMesh createCube(float width = 1.0F, float height = 1.0F, float depth = 1.0F); PrimitiveMesh createSphereUv(float radius = 0.5F, int sectors = 20, int stacks = 20); PrimitiveMesh createConeMesh(float radius = 0.5F, float height = 1.0F, int segments = 16); PrimitiveMesh createSphereMesh(float radius = 0.5F, int subdivisions = 3); PrimitiveMesh createTorusMesh(float majorRadius = 0.5F, float minorRadius = 0.25F, int majorSegments = 32, int minorSegments = 16); std::vector mengerSpongeNodes(int level = 3, float probability = -1.f, int seed = 1); std::vector sunflower(int seeds = 3000); // Utilities PrimitiveMesh mergeNodes(const std::vector& nodes, const std::vector meshes); PrimitiveMesh removeDuplicateVertices(const PrimitiveMesh& mesh, bool testNormal = true, bool testUv = true); PrimitiveMesh wobblePrimitive(const PrimitiveMesh& mesh, float amplitude = 0.05F); } // namespace nvh