Added collision meshes from files
| @@ -1,3 +1,24 @@ | |||||||
|  | /* | ||||||
|  |   Dane Johnson <dane@danejohnson.org> | ||||||
|  |   | ||||||
|  |   LICENSE | ||||||
|  |   | ||||||
|  |   Couch  Copyright (C) 2021 Dane Johnson | ||||||
|  |  | ||||||
|  |   This program comes with ABSOLUTELY NO WARRANTY; without event the | ||||||
|  |   implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||||||
|  |   See the GNU General Public License for details at | ||||||
|  |   https://www.gnu.org/licenses/gpl-3.0.html | ||||||
|  |    | ||||||
|  |   This is free software, and you are welcome to redistribute it | ||||||
|  |   under the terms of the GNU General Public License as published | ||||||
|  |   by the Free Software Foundation; either version 3 of the License, | ||||||
|  |   or (at your option) any later version. | ||||||
|  |   | ||||||
|  |   DESCRIPTION | ||||||
|  |   | ||||||
|  |   Defines various collision shapes for rigidbodies and trigger areas | ||||||
|  | */ | ||||||
| #include "CollisionShape.h" | #include "CollisionShape.h" | ||||||
|  |  | ||||||
| CollisionShape::CollisionShape() { | CollisionShape::CollisionShape() { | ||||||
| @@ -15,3 +36,24 @@ BoxCollisionShape::BoxCollisionShape(float width, float height, float depth) { | |||||||
| CapsuleCollisionShape::CapsuleCollisionShape(float radius, float height) { | CapsuleCollisionShape::CapsuleCollisionShape(float radius, float height) { | ||||||
|   shape = new btCapsuleShape(radius, height); |   shape = new btCapsuleShape(radius, height); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | MeshCollisionShape::MeshCollisionShape(Mesh *mesh) { | ||||||
|  |   btCompoundShape *compoundShape = new btCompoundShape(); | ||||||
|  |  | ||||||
|  |   for (SubMesh *submesh : mesh->submeshes) { | ||||||
|  |     btTriangleIndexVertexArray *indexVertexArray = new btTriangleIndexVertexArray( | ||||||
|  |       submesh->indices.size(), | ||||||
|  |       (int*) &submesh->indices[0], | ||||||
|  |       sizeof(Index), | ||||||
|  |       submesh->vertices.size(), | ||||||
|  |       (float*) &submesh->vertices[0], | ||||||
|  |       sizeof(Vertex) | ||||||
|  |       ); | ||||||
|  |     compoundShape->addChildShape( | ||||||
|  |       btTransform::getIdentity(), | ||||||
|  |       new btBvhTriangleMeshShape(indexVertexArray, true) | ||||||
|  |       ); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   shape = compoundShape; | ||||||
|  | } | ||||||
|   | |||||||
| @@ -1,10 +1,36 @@ | |||||||
|  | /** | ||||||
|  |    @file | ||||||
|  |    @author Dane Johnson <dane@danejohnson.org> | ||||||
|  |   | ||||||
|  |    @section LICENSE | ||||||
|  |   | ||||||
|  |    Couch  Copyright (C) 2021 Dane Johnson | ||||||
|  |  | ||||||
|  |    This program comes with ABSOLUTELY NO WARRANTY; without event the | ||||||
|  |    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||||||
|  |    See the GNU General Public License for details at | ||||||
|  |    https://www.gnu.org/licenses/gpl-3.0.html | ||||||
|  |    | ||||||
|  |    This is free software, and you are welcome to redistribute it | ||||||
|  |    under the terms of the GNU General Public License as published | ||||||
|  |    by the Free Software Foundation; either version 3 of the License, | ||||||
|  |    or (at your option) any later version. | ||||||
|  |   | ||||||
|  |    @section DESCRIPTION | ||||||
|  |   | ||||||
|  |    Defines various collision shapes for rigidbodies and trigger areas | ||||||
|  | */ | ||||||
| #ifndef COLLISIONSHAPE_H | #ifndef COLLISIONSHAPE_H | ||||||
| #define COLLISIONSHAPE_H | #define COLLISIONSHAPE_H | ||||||
|  |  | ||||||
| #include <btBulletDynamicsCommon.h> | #include <btBulletDynamicsCommon.h> | ||||||
|  |  | ||||||
| #include "types.h" | #include "types.h" | ||||||
|  | #include "Mesh.h" | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |    Base collision shape, should not be instanced directly | ||||||
|  | */ | ||||||
| class CollisionShape { | class CollisionShape { | ||||||
| public: | public: | ||||||
|   CollisionShape(); |   CollisionShape(); | ||||||
| @@ -16,17 +42,41 @@ private: | |||||||
|  |  | ||||||
| class SphereCollisionShape : public CollisionShape { | class SphereCollisionShape : public CollisionShape { | ||||||
| public: | public: | ||||||
|  |   /** | ||||||
|  |      Creates a collision sphere with a defined radius | ||||||
|  |      @param radius The radius | ||||||
|  |   */ | ||||||
|   SphereCollisionShape(float radius); |   SphereCollisionShape(float radius); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| class BoxCollisionShape : public CollisionShape { | class BoxCollisionShape : public CollisionShape { | ||||||
| public: | public: | ||||||
|  |   /** | ||||||
|  |      Creates a collision cube with the desired width, height, and depth | ||||||
|  |      @param width The desired width | ||||||
|  |      @param height The desired height | ||||||
|  |      @param depth The desired depth | ||||||
|  |   */ | ||||||
|   BoxCollisionShape(float width, float height, float depth); |   BoxCollisionShape(float width, float height, float depth); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| class CapsuleCollisionShape: public CollisionShape { | class CapsuleCollisionShape: public CollisionShape { | ||||||
| public: | public: | ||||||
|  |   /** | ||||||
|  |      Creates a collision shape that is a cylinder with height, capped with a hemisphere of radius | ||||||
|  |      @param radius The hemisphere radius | ||||||
|  |      @param height The cylinder height | ||||||
|  |   */ | ||||||
|   CapsuleCollisionShape(float radius, float height); |   CapsuleCollisionShape(float radius, float height); | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | class MeshCollisionShape: public CollisionShape { | ||||||
|  | public: | ||||||
|  |   /** | ||||||
|  |      Creates a concave mesh with the same faces as mesh | ||||||
|  |      @param mesh The mesh who's faces to use | ||||||
|  |   */ | ||||||
|  |   MeshCollisionShape(Mesh *mesh); | ||||||
|  | }; | ||||||
|  |  | ||||||
| #endif /* COLLISIONSHAPE_H */ | #endif /* COLLISIONSHAPE_H */ | ||||||
|   | |||||||
| @@ -105,6 +105,7 @@ public: | |||||||
| protected: | protected: | ||||||
|   SubMeshList submeshes; |   SubMeshList submeshes; | ||||||
|   virtual void SetupMesh(); |   virtual void SetupMesh(); | ||||||
|  |   friend class MeshCollisionShape; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif /* MESH_H */ | #endif /* MESH_H */ | ||||||
|   | |||||||
| @@ -1,26 +1,27 @@ | |||||||
| /* | /* | ||||||
|    Dane Johnson <dane@danejohnson.org> |   Dane Johnson <dane@danejohnson.org> | ||||||
|   |   | ||||||
|    LICENSE |   LICENSE | ||||||
|   |   | ||||||
|    Couch  Copyright (C) 2021 Dane Johnson |   Couch  Copyright (C) 2021 Dane Johnson | ||||||
|  |  | ||||||
|    This program comes with ABSOLUTELY NO WARRANTY; without event the |   This program comes with ABSOLUTELY NO WARRANTY; without event the | ||||||
|    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |   implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||||||
|    See the GNU General Public License for details at |   See the GNU General Public License for details at | ||||||
|    https://www.gnu.org/licenses/gpl-3.0.html |   https://www.gnu.org/licenses/gpl-3.0.html | ||||||
|    |    | ||||||
|    This is free software, and you are welcome to redistribute it |   This is free software, and you are welcome to redistribute it | ||||||
|    under the terms of the GNU General Public License as published |   under the terms of the GNU General Public License as published | ||||||
|    by the Free Software Foundation; either version 3 of the License, |   by the Free Software Foundation; either version 3 of the License, | ||||||
|    or (at your option) any later version. |   or (at your option) any later version. | ||||||
|   |   | ||||||
|    DESCRIPTION |   DESCRIPTION | ||||||
|   |   | ||||||
|    A spatial is a node with a transform property, i.e. position, scale or rotation. |   A spatial is a node with a transform property, i.e. position, scale or rotation. | ||||||
|    They can be instanced on the scene tree as an anchor for some other nodes. |   They can be instanced on the scene tree as an anchor for some other nodes. | ||||||
| */ | */ | ||||||
| #include "Spatial.h" | #include "Spatial.h" | ||||||
|  | #include "Util.h" | ||||||
|  |  | ||||||
| Name Spatial::GetType() const {return "Spatial";} | Name Spatial::GetType() const {return "Spatial";} | ||||||
|  |  | ||||||
| @@ -32,6 +33,18 @@ void Spatial::SetTransform(Transform transform) { | |||||||
|   this->transform = transform; |   this->transform = transform; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | Transform Spatial::GetGlobalTransform() { | ||||||
|  |   Util::Die("Global transform is not implemented yet.\n" | ||||||
|  | 	    "I don't fully understand the maths yet!"); | ||||||
|  |   return Transform(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Spatial::SetGlobalTransform(Transform globalTransform)  { | ||||||
|  |   // TODO | ||||||
|  |   Util::Die("Global transform is not implemented yet.\n" | ||||||
|  | 	    "I don't fully understand the maths yet!"); | ||||||
|  | } | ||||||
|  |  | ||||||
| Spatial *Spatial::Create() { | Spatial *Spatial::Create() { | ||||||
|   return new Spatial; |   return new Spatial; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -46,6 +46,16 @@ public: | |||||||
|      @param transform The transform property |      @param transform The transform property | ||||||
|   */ |   */ | ||||||
|   void SetTransform(Transform transform); |   void SetTransform(Transform transform); | ||||||
|  |   /** | ||||||
|  |      Gets the translation with relation to the world origin | ||||||
|  |      @returns the global transform | ||||||
|  |   */ | ||||||
|  |   Transform GetGlobalTransform(); | ||||||
|  |   /** | ||||||
|  |      Sets the transform with relation to the world origin | ||||||
|  |      @param globalTransform The global transform property | ||||||
|  |   */ | ||||||
|  |   void SetGlobalTransform(Transform globalTransform); | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
|      Directly translates the spatial by offset |      Directly translates the spatial by offset | ||||||
|   | |||||||
| @@ -45,29 +45,29 @@ function init() | |||||||
|    couch.Node.GetRoot():AddChild(light:Instance()) |    couch.Node.GetRoot():AddChild(light:Instance()) | ||||||
|  |  | ||||||
|    local skybox = couch.Skybox.FromFiles( |    local skybox = couch.Skybox.FromFiles( | ||||||
|       "skybox/px.png", |       "../resources/skybox/px.png", | ||||||
|       "skybox/nx.png", |       "../resources/skybox/nx.png", | ||||||
|       "skybox/py.png", |       "../resources/skybox/py.png", | ||||||
|       "skybox/ny.png", |       "../resources/skybox/ny.png", | ||||||
|       "skybox/pz.png", |       "../resources/skybox/pz.png", | ||||||
|       "skybox/nz.png" |       "../resources/skybox/nz.png" | ||||||
|    ) |    ) | ||||||
|    couch.Node.GetRoot():AddChild(skybox:Instance()) |    couch.Node.GetRoot():AddChild(skybox:Instance()) | ||||||
|  |  | ||||||
|    local physics_ball_prefab = couch.Rigidbody() |    local physics_ball_prefab = couch.Rigidbody() | ||||||
|    local physics_ball_mesh = couch.Mesh.FromFile("ball.obj") |    local physics_ball_mesh = couch.Mesh.FromFile("../resources/ball.obj") | ||||||
|    material = physics_ball_mesh:GetMaterial(0) |    material = physics_ball_mesh:GetMaterial(0) | ||||||
|    material.ambient = BLUE |    material.ambient = BLUE | ||||||
|    material.diffuse = BLUE |    material.diffuse = BLUE | ||||||
|    physics_ball_mesh:SetMaterial(0, material) |    physics_ball_mesh:SetMaterial(0, material) | ||||||
|    physics_ball_prefab:AddChild(physics_ball_mesh); |    physics_ball_prefab:AddChild(physics_ball_mesh); | ||||||
|    physics_ball_prefab:Translate(couch.Vector3(0.0, 30.0, -10.0)) |    physics_ball_prefab:Translate(couch.Vector3(-14.0, 30.0, -5.0)) | ||||||
|    physics_ball = physics_ball_prefab:Instance() |    physics_ball = physics_ball_prefab:Instance() | ||||||
|    couch.Node.GetRoot():AddChild(physics_ball) |    couch.Node.GetRoot():AddChild(physics_ball) | ||||||
|  |  | ||||||
|    make_ground() |    make_ground() | ||||||
|  |  | ||||||
|    local character_prefab = couch.Mesh.FromFile("capsule.obj") |    local character_prefab = couch.Mesh.FromFile("../resources/capsule.obj") | ||||||
|    material = character_prefab:GetMaterial(0) |    material = character_prefab:GetMaterial(0) | ||||||
|    material.ambient = BLUE |    material.ambient = BLUE | ||||||
|    material.diffuse = BLUE |    material.diffuse = BLUE | ||||||
| @@ -78,16 +78,16 @@ function init() | |||||||
|    character_body:SetCollisionShape(couch.CapsuleCollisionShape(1.0, 1.0)) |    character_body:SetCollisionShape(couch.CapsuleCollisionShape(1.0, 1.0)) | ||||||
|    character_body:SetCharacter(true) |    character_body:SetCharacter(true) | ||||||
|    character_body:AddChild(character_prefab) |    character_body:AddChild(character_prefab) | ||||||
|    character_body:Translate(couch.Vector3(0.0, 3.0, 0.0)) |    character_body:Translate(couch.Vector3(-15.0, 3.0, 0.0)) | ||||||
|    character = character_body:Instance() |    character = character_body:Instance() | ||||||
|    couch.Node.GetRoot():AddChild(character) |    couch.Node.GetRoot():AddChild(character) | ||||||
|  |  | ||||||
|    local cube_prefab = couch.Mesh.FromFile("cube.obj") |    local cube_prefab = couch.Mesh.FromFile("../resources/cube.obj") | ||||||
|    material = cube_prefab:GetMaterial(0) |    material = cube_prefab:GetMaterial(0) | ||||||
|    material.ambient = RED |    material.ambient = RED | ||||||
|    material.diffuse = RED |    material.diffuse = RED | ||||||
|    cube_prefab:SetMaterial(0, material) |    cube_prefab:SetMaterial(0, material) | ||||||
|    local orbiter = couch.Mesh.FromFile("ball.obj") |    local orbiter = couch.Mesh.FromFile("../resources/ball.obj") | ||||||
|    orbiter:UniformScale(0.25); |    orbiter:UniformScale(0.25); | ||||||
|    orbiter:Translate(couch.Vector3(1.0, 0.0, 0.0)) |    orbiter:Translate(couch.Vector3(1.0, 0.0, 0.0)) | ||||||
|    cube_prefab:AddChild(orbiter) |    cube_prefab:AddChild(orbiter) | ||||||
| @@ -97,7 +97,7 @@ function init() | |||||||
|    couch.Node.GetRoot():AddChild(die_cube) |    couch.Node.GetRoot():AddChild(die_cube) | ||||||
|    die_cube:Translate(couch.Vector3(0.0, 0.0, 3.0)) |    die_cube:Translate(couch.Vector3(0.0, 0.0, 3.0)) | ||||||
|     |     | ||||||
|    local ball_prefab = couch.Mesh.FromFile("ball.obj") |    local ball_prefab = couch.Mesh.FromFile("../resources/ball.obj") | ||||||
|    material = ball_prefab:GetMaterial(0) |    material = ball_prefab:GetMaterial(0) | ||||||
|    ball_prefab:SetMaterial(0, material) |    ball_prefab:SetMaterial(0, material) | ||||||
|    ball = ball_prefab:Instance() |    ball = ball_prefab:Instance() | ||||||
| @@ -105,12 +105,12 @@ function init() | |||||||
|  |  | ||||||
|    ball:Translate(couch.Vector3(0.0, 3.0, 0.0)) |    ball:Translate(couch.Vector3(0.0, 3.0, 0.0)) | ||||||
|  |  | ||||||
|    local trough_prefab = couch.TexturedMesh("trough.obj", "wood_lowres.png") |    local trough_prefab = couch.TexturedMesh("../resources/trough.obj", "../resources/wood_lowres.png") | ||||||
|    trough = trough_prefab:Instance() |    trough = trough_prefab:Instance() | ||||||
|    couch.Node.GetRoot():AddChild(trough) |    couch.Node.GetRoot():AddChild(trough) | ||||||
|    trough:Translate(couch.Vector3(10.0, 0.0, 0.0)) |    trough:Translate(couch.Vector3(10.0, 0.0, 0.0)) | ||||||
|  |  | ||||||
|    local scaffold_prefab = couch.TexturedMesh("scaffold.obj", "grate_floor_lowres.png", "railing.png") |    local scaffold_prefab = couch.TexturedMesh("../resources/scaffold.obj", "../resources/grate_floor_lowres.png", "../resources/railing.png") | ||||||
|    local scaffold = scaffold_prefab:Instance() |    local scaffold = scaffold_prefab:Instance() | ||||||
|    material = scaffold:GetMaterial(0) |    material = scaffold:GetMaterial(0) | ||||||
|    material.alphaScissor = 0.9 |    material.alphaScissor = 0.9 | ||||||
| @@ -124,14 +124,18 @@ function init() | |||||||
|    couch.Node.GetRoot():AddChild(scaffold) |    couch.Node.GetRoot():AddChild(scaffold) | ||||||
|    scaffold:Translate(couch.Vector3(-3.0, 3.0, 0.0)) |    scaffold:Translate(couch.Vector3(-3.0, 3.0, 0.0)) | ||||||
|  |  | ||||||
|    local barn_prefab = couch.TexturedMesh("barn.obj", "paintedwood.jpg", "barnroof_lowres.png", "wood_lowres.png") |    local barn_prefab = couch.TexturedMesh("../resources/barn.obj", "../resources/paintedwood.jpg", "../resources/barnroof_lowres.png", "../resources/wood_lowres.png") | ||||||
|    local barn = barn_prefab:Instance() |    material = barn_prefab:GetMaterial(0) | ||||||
|    material = barn:GetMaterial(0) |  | ||||||
|    material.cullBack = false |    material.cullBack = false | ||||||
|    barn:SetMaterial(0, material) |    barn_prefab:SetMaterial(0, material) | ||||||
|    material = barn:GetMaterial(1) |    material = barn_prefab:GetMaterial(1) | ||||||
|    material.cullBack = false |    material.cullBack = false | ||||||
|    barn:SetMaterial(1, material) |    barn_prefab:SetMaterial(1, material) | ||||||
|  |    local barn_body = couch.Rigidbody() | ||||||
|  |    barn_body:SetCollisionShape(couch.MeshCollisionShape(barn_prefab)) | ||||||
|  |    barn_body:SetMass(0.0) | ||||||
|  |    barn_body:AddChild(barn_prefab) | ||||||
|  |    local barn = barn_body:Instance() | ||||||
|    couch.Node.GetRoot():AddChild(barn) |    couch.Node.GetRoot():AddChild(barn) | ||||||
|    barn:Translate(couch.Vector3(-15.0, 0.0, 0.0)) |    barn:Translate(couch.Vector3(-15.0, 0.0, 0.0)) | ||||||
| end | end | ||||||
| @@ -202,7 +206,7 @@ function onmousemotion(_, _, relx, rely) | |||||||
| end | end | ||||||
|  |  | ||||||
| function make_ground() | function make_ground() | ||||||
|    local ground_prefab = couch.TexturedMesh("ground.obj", "grass_lowres.png") |    local ground_prefab = couch.TexturedMesh("../resources/ground.obj", "../resources/grass_lowres.png") | ||||||
|     |     | ||||||
|    local ground_prefab_transform = ground_prefab:GetTransform() |    local ground_prefab_transform = ground_prefab:GetTransform() | ||||||
|    ground_prefab_transform.position = couch.Vector3(0.0, -2.0, 0.0) |    ground_prefab_transform.position = couch.Vector3(0.0, -2.0, 0.0) | ||||||
|   | |||||||
| Before Width: | Height: | Size: 149 KiB After Width: | Height: | Size: 149 KiB | 
| Before Width: | Height: | Size: 413 KiB After Width: | Height: | Size: 413 KiB | 
| Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB | 
| Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 48 KiB | 
| Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB | 
| Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB | 
| Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 106 KiB | 
| Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 92 KiB | 
| Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 106 KiB | 
| Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 106 KiB | 
| Before Width: | Height: | Size: 107 KiB After Width: | Height: | Size: 107 KiB | 
| Before Width: | Height: | Size: 112 KiB After Width: | Height: | Size: 112 KiB | 
| Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 71 KiB | 
 Dane Johnson
					Dane Johnson