Added collision meshes from files

This commit is contained in:
Dane Johnson 2021-01-30 19:39:25 -06:00
parent f2591c16ab
commit 2e5e3cb01e
33 changed files with 156 additions and 36 deletions

View File

@ -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"
CollisionShape::CollisionShape() {
@ -15,3 +36,24 @@ BoxCollisionShape::BoxCollisionShape(float width, float height, float depth) {
CapsuleCollisionShape::CapsuleCollisionShape(float radius, float 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;
}

View File

@ -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
#define COLLISIONSHAPE_H
#include <btBulletDynamicsCommon.h>
#include "types.h"
#include "Mesh.h"
/**
Base collision shape, should not be instanced directly
*/
class CollisionShape {
public:
CollisionShape();
@ -16,17 +42,41 @@ private:
class SphereCollisionShape : public CollisionShape {
public:
/**
Creates a collision sphere with a defined radius
@param radius The radius
*/
SphereCollisionShape(float radius);
};
class BoxCollisionShape : public CollisionShape {
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);
};
class CapsuleCollisionShape: public CollisionShape {
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);
};
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 */

View File

@ -105,6 +105,7 @@ public:
protected:
SubMeshList submeshes;
virtual void SetupMesh();
friend class MeshCollisionShape;
};
#endif /* MESH_H */

View File

@ -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
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 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.
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
DESCRIPTION
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.
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.
*/
#include "Spatial.h"
#include "Util.h"
Name Spatial::GetType() const {return "Spatial";}
@ -32,6 +33,18 @@ void Spatial::SetTransform(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() {
return new Spatial;
}

View File

@ -46,6 +46,16 @@ public:
@param transform The transform property
*/
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

View File

@ -45,29 +45,29 @@ function init()
couch.Node.GetRoot():AddChild(light:Instance())
local skybox = couch.Skybox.FromFiles(
"skybox/px.png",
"skybox/nx.png",
"skybox/py.png",
"skybox/ny.png",
"skybox/pz.png",
"skybox/nz.png"
"../resources/skybox/px.png",
"../resources/skybox/nx.png",
"../resources/skybox/py.png",
"../resources/skybox/ny.png",
"../resources/skybox/pz.png",
"../resources/skybox/nz.png"
)
couch.Node.GetRoot():AddChild(skybox:Instance())
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.ambient = BLUE
material.diffuse = BLUE
physics_ball_mesh:SetMaterial(0, material)
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()
couch.Node.GetRoot():AddChild(physics_ball)
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.ambient = BLUE
material.diffuse = BLUE
@ -78,16 +78,16 @@ function init()
character_body:SetCollisionShape(couch.CapsuleCollisionShape(1.0, 1.0))
character_body:SetCharacter(true)
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()
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.ambient = RED
material.diffuse = RED
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:Translate(couch.Vector3(1.0, 0.0, 0.0))
cube_prefab:AddChild(orbiter)
@ -97,7 +97,7 @@ function init()
couch.Node.GetRoot():AddChild(die_cube)
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)
ball_prefab:SetMaterial(0, material)
ball = ball_prefab:Instance()
@ -105,12 +105,12 @@ function init()
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()
couch.Node.GetRoot():AddChild(trough)
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()
material = scaffold:GetMaterial(0)
material.alphaScissor = 0.9
@ -124,14 +124,18 @@ function init()
couch.Node.GetRoot():AddChild(scaffold)
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 = barn_prefab:Instance()
material = barn:GetMaterial(0)
local barn_prefab = couch.TexturedMesh("../resources/barn.obj", "../resources/paintedwood.jpg", "../resources/barnroof_lowres.png", "../resources/wood_lowres.png")
material = barn_prefab:GetMaterial(0)
material.cullBack = false
barn:SetMaterial(0, material)
material = barn:GetMaterial(1)
barn_prefab:SetMaterial(0, material)
material = barn_prefab:GetMaterial(1)
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)
barn:Translate(couch.Vector3(-15.0, 0.0, 0.0))
end
@ -202,7 +206,7 @@ function onmousemotion(_, _, relx, rely)
end
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()
ground_prefab_transform.position = couch.Vector3(0.0, -2.0, 0.0)

View File

Before

Width:  |  Height:  |  Size: 149 KiB

After

Width:  |  Height:  |  Size: 149 KiB

View File

Before

Width:  |  Height:  |  Size: 413 KiB

After

Width:  |  Height:  |  Size: 413 KiB

View File

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 62 KiB

View File

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

View File

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

Before

Width:  |  Height:  |  Size: 106 KiB

After

Width:  |  Height:  |  Size: 106 KiB

View File

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 92 KiB

View File

Before

Width:  |  Height:  |  Size: 106 KiB

After

Width:  |  Height:  |  Size: 106 KiB

View File

Before

Width:  |  Height:  |  Size: 106 KiB

After

Width:  |  Height:  |  Size: 106 KiB

View File

Before

Width:  |  Height:  |  Size: 107 KiB

After

Width:  |  Height:  |  Size: 107 KiB

View File

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 112 KiB

View File

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 71 KiB