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"
|
||||
|
||||
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;
|
||||
}
|
||||
|
@ -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 */
|
||||
|
@ -105,6 +105,7 @@ public:
|
||||
protected:
|
||||
SubMeshList submeshes;
|
||||
virtual void SetupMesh();
|
||||
friend class MeshCollisionShape;
|
||||
};
|
||||
|
||||
#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
|
||||
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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
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 |