-Removed bullet
-Removed Soloud
Removed every instances of bullet usage.
Edited some UI stuff
This commit is contained in:
Antoine Pilote
2022-09-24 20:14:51 -04:00
parent 87bc79d0a1
commit 382802c62a
30 changed files with 139 additions and 1214 deletions

View File

@@ -33,6 +33,8 @@ public:
Ref<Nuake::File> nuakeFile = Nuake::FileSystem::GetFile(path);
component.mWrenScript = CreateRef<Nuake::WrenScript>(nuakeFile, true);
auto modules = component.mWrenScript->GetModules();
if (modules.size() > 0)
component.mModule = 0;
}
ImGui::EndDragDropTarget();
}
@@ -50,12 +52,26 @@ public:
ImGui::Text("Module");
ImGui::TableNextColumn();
// Todo: Automatically parse available modules. and offer a dropdown
//ImGuiHelper::DrawVec3("Rotation", &component.Rotation);
// Here we create a dropdown for every modules
auto wrenScript = component.mWrenScript;
if (wrenScript)
{
auto modules = wrenScript->GetModules();
std::vector<const char*> modulesC;
for (auto& m : modules)
{
modulesC.push_back(m.c_str());
}
static int currentModule = (int)component.mModule;
ImGui::Combo("##WrenModule", &currentModule, &modulesC[0], modules.size());
component.mModule = currentModule;
}
ImGui::TableNextColumn();
//ComponentTableReset(component.Class, "");
}
}

View File

@@ -151,24 +151,44 @@ namespace Nuake {
if (Selection.Type == EditorSelectionType::Entity && Selection.Entity == e)
base_flags |= ImGuiTreeNodeFlags_Selected;
ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, ImVec2{ 0.0f, 0.0f });
{
ImGui::TableNextColumn();
bool& isVisible = e.GetComponent<VisibilityComponent>().Visible;
char* visibilityIcon = isVisible ? ICON_FA_EYE : ICON_FA_EYE_SLASH;
ImGui::PushStyleColor(ImGuiCol_Button, { 0, 0, 0, 0 });
if (ImGui::Button(visibilityIcon, { 40, 40 }))
{
isVisible = !isVisible;
}
ImGui::PopStyleColor();
}
ImGui::PopStyleVar();
ImGui::TableNextColumn();
ImGui::TableNextColumn();
// Write in normal font.
ImGui::PushFont(normalFont);
// If has no childrens draw tree node leaf
if (parent.Children.size() <= 0)
{
base_flags |= ImGuiTreeNodeFlags_Leaf;
}
if(nameComponent.IsPrefab && e.HasComponent<PrefabComponent>())
ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0,255,0,255));
if (nameComponent.IsPrefab && e.HasComponent<PrefabComponent>())
{
ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255));
}
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(8, 8));
bool open = ImGui::TreeNodeEx(name.c_str(), base_flags);
ImGui::PopStyleVar();
if(nameComponent.IsPrefab && e.HasComponent<PrefabComponent>())
ImGui::PopStyleColor();
else

View File

@@ -0,0 +1,2 @@
#pragma once

View File

@@ -1,116 +0,0 @@
project "BulletCollision"
location "bullet3/src/BulletCollision"
kind "StaticLib"
staticruntime "on"
targetdir ("bullet3/bin/" .. outputdir .. "/%{prj.name}")
objdir ("bullet3/bin-obj/" .. outputdir .. "/%{prj.name}")
includedirs {
"bullet3/src",
}
defines
{
"BT_THREADSAFE=1",
"BT_USE_DOUBLE_PRECISION"
}
filter "system:windows"
systemversion "latest"
files
{
"bullet3/src/*.cpp",
"bullet3/src/*.h",
"bullet3/src/BulletCollision/BroadphaseCollision/*.cpp",
"bullet3/src/BulletCollision/BroadphaseCollision/*.h",
"bullet3/src/BulletCollision/CollisionDispatch/*.cpp",
"bullet3/src/BulletCollision/CollisionDispatch/*.h",
"bullet3/src/BulletCollision/CollisionShapes/*.cpp",
"bullet3/src/BulletCollision/CollisionShapes/*.h",
"bullet3/src/BulletCollision/Gimpact/*.cpp",
"bullet3/src/BulletCollision/Gimpact/*.h",
"bullet3/src/BulletCollision/NarrowPhaseCollision/*.cpp",
"bullet3/src/BulletCollision/NarrowPhaseCollision/*.h",
}
filter "configurations:Debug"
runtime "Debug"
symbols "on"
filter "configurations:Release"
runtime "Release"
optimize "on"
project "BulletDynamics"
location "bullet3/src/BulletDynamics"
kind "StaticLib"
staticruntime "on"
targetdir ("bullet3/bin/" .. outputdir .. "/%{prj.name}")
objdir ("bullet3/bin-obj/" .. outputdir .. "/%{prj.name}")
includedirs {
"bullet3/src",
}
defines
{
"BT_THREADSAFE=1",
"BT_USE_DOUBLE_PRECISION"
}
filter "system:windows"
systemversion "latest"
files
{
"bullet3/src/BulletDynamics/Dynamics/*.cpp",
"bullet3/src/BulletDynamics/Dynamics/*.h",
"bullet3/src/BulletDynamics/ConstraintSolver/*.cpp",
"bullet3/src/BulletDynamics/ConstraintSolver/*.h",
"bullet3/src/BulletDynamics/Featherstone/*.cpp",
"bullet3/src/BulletDynamics/Featherstone/*.h",
"bullet3/src/BulletDynamics/MLCPSolvers/*.cpp",
"bullet3/src/BulletDynamics/MLCPSolvers/*.h",
"bullet3/src/BulletDynamics/Vehicle/*.cpp",
"bullet3/src/BulletDynamics/Vehicle/*.h",
"bullet3/src/BulletDynamics/Character/*.cpp",
"bullet3/src/BulletDynamics/Character/*.h"
}
filter "configurations:Debug"
runtime "Debug"
symbols "on"
filter "configurations:Release"
runtime "Release"
optimize "on"
project "LinearMath"
location "bullet3/src/LinearMath"
kind "StaticLib"
staticruntime "on"
targetdir ("bullet3/bin/" .. outputdir .. "/%{prj.name}")
objdir ("bullet3/bin-obj/" .. outputdir .. "/%{prj.name}")
includedirs {
"bullet3/src"
}
filter "system:windows"
systemversion "latest"
files {
"bullet3/src/LinearMath/*.cpp",
"bullet3/src/LinearMath/*.h",
"bullet3/src/LinearMath/TaskScheduler/*.cpp",
"bullet3/src/LinearMath/TaskScheduler/*.h"
}
filter "configurations:Debug"
runtime "Debug"
symbols "on"
filter "configurations:Release"
runtime "Release"
optimize "on"

View File

@@ -1,620 +0,0 @@
local WITH_SDL = 0
local WITH_SDL2 = 0
local WITH_SDL_STATIC = 0
local WITH_SDL2_STATIC = 0
local WITH_PORTAUDIO = 0
local WITH_OPENAL = 0
local WITH_XAUDIO2 = 0
local WITH_WINMM = 0
local WITH_WASAPI = 0
local WITH_ALSA = 0
local WITH_JACK = 0
local WITH_OSS = 0
local WITH_COREAUDIO = 0
local WITH_VITA_HOMEBREW = 0
local WITH_NOSOUND = 0
local WITH_MINIAUDIO = 0
local WITH_NULL = 1
local WITH_TOOLS = 0
if (os.is("Windows")) then
WITH_WINMM = 1
elseif (os.is("macosx")) then
WITH_COREAUDIO = 1
else
WITH_ALSA = 1
WITH_OSS = 1
end
-- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< --
local sdl_root = "/libraries/sdl"
local sdl2_root = "/libraries/sdl2"
local dxsdk_root = os.getenv("DXSDK_DIR") and os.getenv("DXSDK_DIR") or "C:/Program Files (x86)/Microsoft DirectX SDK (June 2010)"
local portaudio_root = "/libraries/portaudio"
local openal_root = "/libraries/openal"
-- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< --
local sdl_include = sdl_root .. "/include"
local sdl2_include = sdl2_root .. "/include"
local sdl2_lib_x86 = sdl2_root .. "/lib/x86"
local sdl2_lib_x64 = sdl2_root .. "/lib/x64"
local dxsdk_include = dxsdk_root .. "/include"
local portaudio_include = portaudio_root .. "/include"
local openal_include = openal_root .. "/include"
local buildroot = ""
if _ACTION then buildroot = _ACTION end
-- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< --
newoption {
trigger = "with-common-backends",
description = "Includes common backends in build"
}
newoption {
trigger = "with-openal",
description = "Include OpenAL backend in build"
}
newoption {
trigger = "with-sdl",
description = "Include SDL backend in build"
}
newoption {
trigger = "with-sdl2",
description = "Include SDL2 backend in build"
}
newoption {
trigger = "with-portaudio",
description = "Include PortAudio backend in build"
}
newoption {
trigger = "with-wasapi",
description = "Include WASAPI backend in build"
}
newoption {
trigger = "with-xaudio2",
description = "Include XAudio2 backend in build"
}
newoption {
trigger = "with-native-only",
description = "Only native backends (winmm/oss) in build (default)"
}
newoption {
trigger = "with-sdl-only",
description = "Only include sdl in build"
}
newoption {
trigger = "with-sdlstatic-only",
description = "Only include sdl that doesn't use dyndll in build"
}
newoption {
trigger = "with-sdl2-only",
description = "Only include sdl2 in build"
}
newoption {
trigger = "with-sdl2static-only",
description = "Only include sdl2 that doesn't use dyndll in build"
}
newoption {
trigger = "with-coreaudio",
description = "Include OS X CoreAudio backend in build"
}
newoption {
trigger = "with-vita-homebrew-only",
description = "Only include PS Vita homebrew backend in build"
}
newoption {
trigger = "with-tools",
description = "Include (optional) tools in build"
}
newoption {
trigger = "soloud-devel",
description = "Shorthand for options used while developing SoLoud"
}
newoption {
trigger = "with-nosound",
description = "Include nosound backend in build"
}
newoption {
trigger = "with-jack",
description = "Include JACK backend in build"
}
newoption {
trigger = "with-jack-only",
description = "Only include JACK backend in build"
}
newoption {
trigger = "with-miniaudio",
description = "Include MiniAudio in build"
}
newoption {
trigger = "with-miniaudio-only",
description = "Only include MiniAudio in build"
}
if _OPTIONS["soloud-devel"] then
WITH_SDL = 0
WITH_SDL2 = 1
WITH_SDL_STATIC = 0
WITH_SDL2_STATIC = 0
WITH_PORTAUDIO = 1
WITH_OPENAL = 1
WITH_XAUDIO2 = 0
WITH_WINMM = 0
WITH_WASAPI = 0
WITH_MINIAUDIO = 1
WITH_OSS = 1
WITH_NOSOUND = 1
if (os.is("Windows")) then
WITH_XAUDIO2 = 0
WITH_WINMM = 1
WITH_WASAPI = 1
WITH_OSS = 0
end
WITH_TOOLS = 1
end
if _OPTIONS["with-common-backends"] then
WITH_SDL = 1
WITH_SDL_STATIC = 0
WITH_SDL2_STATIC = 0
WITH_PORTAUDIO = 1
WITH_OPENAL = 1
WITH_XAUDIO2 = 0
WITH_WINMM = 0
WITH_WASAPI = 0
WITH_OSS = 1
WITH_NOSOUND = 1
WITH_MINIAUDIO = 0
if (os.is("Windows")) then
WITH_XAUDIO2 = 0
WITH_WINMM = 1
WITH_WASAPI = 1
WITH_OSS = 0
end
end
if _OPTIONS["with-xaudio2"] then
WITH_XAUDIO2 = 1
end
if _OPTIONS["with-openal"] then
WITH_OPENAL = 1
end
if _OPTIONS["with-portaudio"] then
WITH_PORTAUDIO = 1
end
if _OPTIONS["with-coreaudio"] then
WITH_COREAUDIO = 1
end
if _OPTIONS["with-sdl"] then
WITH_SDL = 1
end
if _OPTIONS["with-sdl2"] then
WITH_SDL2 = 1
end
if _OPTIONS["with-wasapi"] then
WITH_WASAPI = 1
end
if _OPTIONS["with-nosound"] then
WITH_NOSOUND = 1
end
if _OPTIONS["with-sdl-only"] then
WITH_SDL = 1
WITH_SDL2 = 0
WITH_SDL_STATIC = 0
WITH_SDL2_STATIC = 0
WITH_PORTAUDIO = 0
WITH_OPENAL = 0
WITH_XAUDIO2 = 0
WITH_WINMM = 0
WITH_WASAPI = 0
WITH_OSS = 0
WITH_NOSOUND = 0
WITH_MINIAUDIO = 0
end
if _OPTIONS["with-sdl2-only"] then
WITH_SDL = 0
WITH_SDL2 = 1
WITH_SDL_STATIC = 0
WITH_SDL2_STATIC = 0
WITH_PORTAUDIO = 0
WITH_OPENAL = 0
WITH_XAUDIO2 = 0
WITH_WINMM = 0
WITH_WASAPI = 0
WITH_OSS = 0
WITH_NOSOUND = 0
WITH_MINIAUDIO = 0
end
if _OPTIONS["with-sdlstatic-only"] then
WITH_SDL = 0
WITH_SDL2 = 0
WITH_SDL_STATIC = 1
WITH_PORTAUDIO = 0
WITH_OPENAL = 0
WITH_XAUDIO2 = 0
WITH_WINMM = 0
WITH_WASAPI = 0
WITH_OSS = 0
WITH_NOSOUND = 0
WITH_MINIAUDIO = 0
end
if _OPTIONS["with-sdl2static-only"] then
WITH_SDL = 0
WITH_SDL2 = 0
WITH_SDL_STATIC = 0
WITH_SDL2_STATIC = 1
WITH_PORTAUDIO = 0
WITH_OPENAL = 0
WITH_XAUDIO2 = 0
WITH_WINMM = 0
WITH_WASAPI = 0
WITH_OSS = 0
WITH_NOSOUND = 0
WITH_MINIAUDIO = 0
end
if _OPTIONS["with-sdl2static-only"] then
WITH_SDL = 0
WITH_SDL2 = 0
WITH_SDL_STATIC = 0
WITH_SDL2_STATIC = 1
WITH_PORTAUDIO = 0
WITH_OPENAL = 0
WITH_XAUDIO2 = 0
WITH_WINMM = 0
WITH_WASAPI = 0
WITH_OSS = 0
WITH_NOSOUND = 0
WITH_MINIAUDIO = 0
end
if _OPTIONS["with-vita-homebrew-only"] then
WITH_SDL = 0
WITH_SDL2 = 0
WITH_SDL_STATIC = 0
WITH_SDL2_STATIC = 0
WITH_PORTAUDIO = 0
WITH_OPENAL = 0
WITH_XAUDIO2 = 0
WITH_WINMM = 0
WITH_WASAPI = 0
WITH_OSS = 0
WITH_ALSA = 0
WITH_VITA_HOMEBREW = 1
WITH_NOSOUND = 0
WITH_MINIAUDIO = 0
premake.gcc.cc = "arm-vita-eabi-gcc"
premake.gcc.cxx = "arm-vita-eabi-g++"
premake.gcc.ar = "arm-vita-eabi-ar"
end
if _OPTIONS["with-jack"] then
WITH_JACK = 1
end
if _OPTIONS["with-jack-only"] then
WITH_SDL = 0
WITH_SDL2 = 0
WITH_SDL_STATIC = 0
WITH_SDL2_STATIC = 0
WITH_PORTAUDIO = 0
WITH_OPENAL = 0
WITH_XAUDIO2 = 0
WITH_WINMM = 0
WITH_WASAPI = 0
WITH_OSS = 0
WITH_ALSA = 0
WITH_VITA_HOMEBREW = 0
WITH_COREAUDIO = 0
WITH_JACK = 1
WITH_NOSOUND = 0
WITH_MINIAUDIO = 0
end
if _OPTIONS["with-miniaudio"] then
WITH_MINIAUDIO = 1
end
if _OPTIONS["with-miniaudio-only"] then
WITH_SDL = 0
WITH_SDL2 = 0
WITH_SDL_STATIC = 0
WITH_SDL2_STATIC = 0
WITH_PORTAUDIO = 0
WITH_OPENAL = 0
WITH_XAUDIO2 = 0
WITH_WINMM = 0
WITH_WASAPI = 0
WITH_OSS = 0
WITH_ALSA = 0
WITH_VITA_HOMEBREW = 0
WITH_COREAUDIO = 0
WITH_JACK = 0
WITH_NOSOUND = 0
WITH_MINIAUDIO = 1
end
if _OPTIONS["with-native-only"] then
WITH_SDL = 0
WITH_SDL2 = 0
WITH_SDL_STATIC = 0
WITH_SDL2_STATIC = 0
WITH_PORTAUDIO = 0
WITH_OPENAL = 0
WITH_XAUDIO2 = 0
WITH_WINMM = 0
WITH_WASAPI = 0
WITH_OSS = 0
WITH_MINIAUDIO = 0
WITH_NOSOUND = 0
if (os.is("Windows")) then
WITH_WINMM = 1
elseif (os.is("macosx")) then
WITH_COREAUDIO = 1
else
WITH_OSS = 1
end
end
if _OPTIONS["with-tools"] then
WITH_TOOLS = 1
end
print ("")
print ("Active options:")
print ("WITH_SDL = ", WITH_SDL)
print ("WITH_SDL2 = ", WITH_SDL2)
print ("WITH_PORTAUDIO = ", WITH_PORTAUDIO)
print ("WITH_OPENAL = ", WITH_OPENAL)
print ("WITH_XAUDIO2 = ", WITH_XAUDIO2)
print ("WITH_WINMM = ", WITH_WINMM)
print ("WITH_WASAPI = ", WITH_WASAPI)
print ("WITH_ALSA = ", WITH_ALSA)
print ("WITH_JACK = ", WITH_JACK)
print ("WITH_OSS = ", WITH_OSS)
print ("WITH_MINIAUDIO = ", WITH_MINIAUDIO)
print ("WITH_NOSOUND = ", WITH_NOSOUND)
print ("WITH_COREAUDIO = ", WITH_COREAUDIO)
print ("WITH_VITA_HOMEBREW = ", WITH_VITA_HOMEBREW)
print ("WITH_TOOLS = ", WITH_TOOLS)
print ("")
-- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< --
project "SoloudStatic"
kind "StaticLib"
targetdir "soloud/lib"
language "C++"
files
{
"soloud/src/audiosource/**.c*",
"soloud/src/filter/**.c*",
"soloud/src/core/**.c*"
}
includedirs
{
"soloud/src/**",
"soloud/include"
}
if (WITH_OPENAL == 1) then
defines {"WITH_OPENAL"}
files {
"soloud/src/backend/openal/**.c*"
}
includedirs {
"soloud/include",
openal_include
}
end
if (WITH_ALSA == 1) then
defines {"WITH_ALSA"}
files {
"soloud/src/backend/alsa/**.c*"
}
includedirs {
"soloud/include"
}
end
if (WITH_OSS == 1) then
defines {"WITH_OSS"}
files {
"soloud/src/backend/oss/**.c*"
}
includedirs {
"soloud/include"
}
end
if (WITH_MINIAUDIO == 1) then
defines {"WITH_MINIAUDIO"}
files {
"soloud/src/backend/miniaudio/**.c*"
}
includedirs {
"soloud/include"
}
end
if (WITH_NOSOUND == 1) then
defines {"WITH_NOSOUND"}
files {
"soloud/src/backend/nosound/**.c*"
}
includedirs {
"soloud/include"
}
end
if (WITH_COREAUDIO == 1) then
defines {"WITH_COREAUDIO"}
files {
"soloud/src/backend/coreaudio/**.c*"
}
includedirs {
"soloud/include"
}
end
if (WITH_PORTAUDIO == 1) then
defines {"WITH_PORTAUDIO"}
files {
"../src/backend/portaudio/**.c*"
}
includedirs {
"soloud/include",
portaudio_include
}
end
if (WITH_SDL == 1) then
defines { "WITH_SDL" }
files {
"soloud/src/backend/sdl/**.c*"
}
includedirs {
"../include",
sdl2_include
}
end
if (WITH_SDL2 == 1) then
defines { "WITH_SDL2" }
files {
"soloud/src/backend/sdl/**.c*"
}
includedirs {
"soloud/include",
sdl2_include
}
end
if (WITH_SDL_STATIC == 1) then
defines { "WITH_SDL_STATIC" }
files {
"../src/backend/sdl_static/**.c*"
}
includedirs {
"../include",
sdl_include
}
end
if (WITH_SDL2_STATIC == 1) then
defines { "WITH_SDL2_STATIC" }
files {
"../src/backend/sdl2_static/**.c*"
}
includedirs {
"../include",
sdl2_include
}
end
if (WITH_WASAPI == 1) then
defines { "WITH_WASAPI" }
files {
"../src/backend/wasapi/**.c*"
}
includedirs {
"../include"
}
end
if (WITH_XAUDIO2 == 1) then
defines {"WITH_XAUDIO2"}
files {
"../src/backend/xaudio2/**.c*"
}
includedirs {
"../include",
dxsdk_include
}
end
if (WITH_WINMM == 1) then
defines { "WITH_WINMM" }
files {
"../src/backend/winmm/**.c*"
}
includedirs {
"../include"
}
end
if (WITH_VITA_HOMEBREW == 1) then
defines { "WITH_VITA_HOMEBREW", "usleep=sceKernelDelayThread" }
files {
"../src/backend/vita_homebrew/**.c*"
}
includedirs {
"../include"
}
end
if (WITH_JACK == 1) then
defines { "WITH_JACK" }
links { "jack" }
files {
"../src/backend/jack/**.c*"
}
includedirs {
"../include"
}
end
if (WITH_NULL == 1) then
defines { "WITH_NULL" }
files {
"../src/backend/null/**.c*"
}
includedirs {
"../include"
}
end
targetname "soloud_static"

View File

@@ -21,7 +21,7 @@ namespace Nuake
};
std::string msg = "[" + std::string(buff) + "]" + std::string(" - ") + log + "\n";
printf((msg).c_str());
std::cout << msg << std::endl;
if (m_Logs.size() >= MAX_LOG)
m_Logs.erase(m_Logs.begin());

View File

@@ -1,33 +1,7 @@
#include "BulletDebugDrawer.h"
#include "../../Rendering/Renderer.h"
#include <GL/glew.h>
namespace Nuake
{
void BulletDebugDrawer::drawLine(const btVector3& from, const btVector3& to, const btVector3& color)
{
TransformComponent tc = TransformComponent();
//tc.Translation = glm::vec3(from.x(), from.y(), from.z());
//tc.Scale = glm::vec3(1.0f);
//tc.Rotation = glm::vec3(0.0f);
glBegin(GL_LINES);
glColor3f((float)(color.x()), (float)(color.y()), (float)(color.z()));
glVertex3f((float)(from.x()), (float)(from.y()), (float)(from.z()));
glVertex3f((float)(to.x()), (float)(to.y()), (float)(to.z()));
glEnd();
//Renderer::DrawCube(tc, glm::vec4(color.x(), color.y(), color.z(), 1.0f));
}
void BulletDebugDrawer::drawContactPoint(const btVector3& PointOnB, const btVector3& normalOnB, btScalar distance, int lifeTime, const btVector3& color)
{
if (lifeTime > 3.0f)
return;
glBegin(GL_POINTS);
glColor3f(color.x(), color.y(), color.z());
glVertex3f(PointOnB.x(), PointOnB.y(), PointOnB.z());
glEnd();
}
}

View File

@@ -1,20 +1,6 @@
#pragma once
#include "btBulletCollisionCommon.h"
namespace Nuake
{
class BulletDebugDrawer : public btIDebugDraw
{
void drawLine(const btVector3& from, const btVector3& to, const btVector3& color) override;
int getDebugMode() const override { return 1; }
void draw3dText(const btVector3& location, const char* textString) override {}
void reportErrorWarning(const char* warningString) override { };
void setDebugMode(int debugMode) {};
void drawContactPoint(const btVector3& PointOnB, const btVector3& normalOnB, btScalar distance, int lifeTime, const btVector3& color) override;
};
}

View File

@@ -12,184 +12,51 @@ namespace Nuake
m_bottomRoundedRegionYOffset = (height + radius) / 2.0f;
m_bottomYOffset = height / 2.0f + radius;
m_CollisionShape = new btCapsuleShape(radius, height);
btQuaternion quat = btQuaternion(0, 0, 0);
m_Transform = new btTransform();
m_Transform->setOrigin(btVector3(position.x, position.y, position.z));
m_Transform->setRotation(quat);
m_MotionState = new btDefaultMotionState(*m_Transform);
btVector3 inertia;
//m_CollisionShape->calculateLocalInertia(mass, inertia);
btRigidBody::btRigidBodyConstructionInfo rigidBodyCI(mass, m_MotionState, m_CollisionShape, inertia);
rigidBodyCI.m_friction = 0.0f;
//rigidBodyCI.m_additionalDamping = true;
//rigidBodyCI.m_additionalLinearDampingThresholdSqr= 1.0f;
//rigidBodyCI.m_additionalLinearDampingThresholdSqr = 0.5f;
rigidBodyCI.m_restitution = 0.0f;
rigidBodyCI.m_linearDamping = 0.0f;
m_Rigidbody = new btRigidBody(rigidBodyCI);
m_Rigidbody->setGravity(btVector3(0, 0, 0));
// Keep upright
m_Rigidbody->setAngularFactor(0.0f);
// No sleeping (or else setLinearVelocity won't work)
m_Rigidbody->setActivationState(DISABLE_DEACTIVATION);
//m_pPhysicsWorld->m_pDynamicsWorld->addRigidBody(m_pRigidBody);
// Ghost object that is synchronized with rigid body
m_GhostObject = new btPairCachingGhostObject();
m_GhostObject->setCollisionShape(m_CollisionShape);
// Specify filters manually, otherwise ghost doesn't collide with statics for some reason
//m_pPhysicsWorld->m_pDynamicsWorld->addCollisionObject(m_pGhostObject, btBroadphaseProxy::KinematicFilter, btBroadphaseProxy::StaticFilter | btBroadphaseProxy::DefaultFilter);
}
void CharacterController::SetEntity(Entity& ent)
{
m_Rigidbody->setUserIndex(ent.GetHandle());
m_GhostObject->setUserIndex(ent.GetHandle());
}
void CharacterController::MoveAndSlide(glm::vec3 velocity)
{
m_Rigidbody->setGravity(btVector3(0, 0, 0));
m_manualVelocity = velocity;
// Sync ghost with actually object
m_GhostObject->setWorldTransform(m_Rigidbody->getWorldTransform());
IsOnGround = false;
ParseGhostContacts();
UpdatePosition();
UpdateVelocity();
m_MotionState->getWorldTransform(m_motionTransform);
}
void CharacterController::ParseGhostContacts()
{
btManifoldArray manifoldArray;
btBroadphasePairArray& pairArray = m_GhostObject->getOverlappingPairCache()->getOverlappingPairArray();
int numPairs = pairArray.size();
m_hittingWall = false;
for (int i = 0; i < numPairs; i++)
{
manifoldArray.clear();
const btBroadphasePair& pair = pairArray[i];
btDiscreteDynamicsWorld* world = PhysicsManager::Get()->GetWorld()->GetDynamicWorld();
btBroadphasePair* collisionPair = world->getPairCache()->findPair(pair.m_pProxy0, pair.m_pProxy1);
if (collisionPair == NULL)
continue;
if (collisionPair->m_algorithm != NULL)
collisionPair->m_algorithm->getAllContactManifolds(manifoldArray);
for (int j = 0; j < manifoldArray.size(); j++)
{
btPersistentManifold* pManifold = manifoldArray[j];
// Skip the rigid body the ghost monitors
if (pManifold->getBody0() == m_Rigidbody)
continue;
for (int p = 0; p < pManifold->getNumContacts(); p++)
{
const btManifoldPoint& point = pManifold->getContactPoint(p);
if (point.getDistance() < 0.0f)
{
//const btVector3 &ptA = point.getPositionWorldOnA();
const btVector3& ptB = point.getPositionWorldOnB();
//const btVector3 &normalOnB = point.m_normalWorldOnB;
// If point is in rounded bottom region of capsule shape, it is on the ground
if (ptB.getY() < m_motionTransform.getOrigin().getY() - m_bottomRoundedRegionYOffset)
IsOnGround = true;
else
{
m_hittingWall = true;
m_surfaceHitNormals.push_back(glm::vec3(point.m_normalWorldOnB.x(), point.m_normalWorldOnB.y(), point.m_normalWorldOnB.z()));
}
}
}
}
}
}
void CharacterController::UpdatePosition()
{
// Ray cast, ignore rigid body
IgnoreBodyAndGhostCast rayCallBack_bottom(m_Rigidbody, m_GhostObject);
btVector3 from = m_Rigidbody->getWorldTransform().getOrigin();
btVector3 toBt = m_Rigidbody->getWorldTransform().getOrigin() - btVector3(0.0f, m_bottomYOffset + m_stepHeight, 0.0f);
PhysicsManager::Get()->GetWorld()->GetDynamicWorld()->rayTest(from, toBt, rayCallBack_bottom);
// Bump up if hit
if (rayCallBack_bottom.hasHit())
{
float previousY = m_Rigidbody->getWorldTransform().getOrigin().getY();
float t = rayCallBack_bottom.m_closestHitFraction;
float clamped = (1.0 - rayCallBack_bottom.m_closestHitFraction);
btVector3 vel(m_Rigidbody->getLinearVelocity());
if (vel.getY() < 0) // -magic number is to fix bouncing down a slope.
m_Rigidbody->getWorldTransform().getOrigin().setY(previousY - 0.14f + (m_bottomYOffset + m_stepHeight) * (clamped));
vel.setY(0.0f);
m_Rigidbody->setLinearVelocity(vel);
IsOnGround = true;
}
float testOffset = 0.07f;
// Ray cast, ignore rigid body
IgnoreBodyAndGhostCast rayCallBack_top(m_Rigidbody, m_GhostObject);
PhysicsManager::Get()->GetWorld()->GetDynamicWorld()->rayTest(m_Rigidbody->getWorldTransform().getOrigin(), m_Rigidbody->getWorldTransform().getOrigin() + btVector3(0.0f, m_bottomYOffset + testOffset, 0.0f), rayCallBack_top);
// Bump up if hit
if (rayCallBack_top.hasHit())
{
m_Rigidbody->getWorldTransform().setOrigin(m_previousPosition);
btVector3 vel(m_Rigidbody->getLinearVelocity());
vel.setY(0.0f);
m_Rigidbody->setLinearVelocity(vel);
}
m_previousPosition = m_Rigidbody->getWorldTransform().getOrigin();
}
void CharacterController::UpdateVelocity()
{
//m_manualVelocity.y = m_Rigidbody->getLinearVelocity().getY();
btVector3 grav = m_Rigidbody->getGravity();
btVector3 finalVel = btVector3(m_manualVelocity.x, m_manualVelocity.y, m_manualVelocity.z);
m_Rigidbody->setLinearVelocity(finalVel);
// Decelerate
//m_manualVelocity -= m_manualVelocity * m_deceleration * m_pPhysicsWorld->GetScene()->m_frameTimer.GetTimeMultiplier();

View File

@@ -2,9 +2,6 @@
#include "src/Core/Core.h"
#include "src/Core/Maths.h"
#include <btBulletDynamicsCommon.h>
#include <BulletCollision/CollisionDispatch/btGhostObject.h>
namespace Nuake
{
class Entity;
@@ -19,23 +16,16 @@ namespace Nuake
float m_stepHeight = 0.35f;
float m_MaxSlopeAngle = 45.0f;
btTransform* m_Transform;
btCollisionShape* m_CollisionShape;
btRigidBody* m_Rigidbody;
btPairCachingGhostObject* m_GhostObject;
btMotionState* m_MotionState;
//bool m_onJumpableGround; // A bit lower contact than just onGround
float m_bottomYOffset;
float m_bottomRoundedRegionYOffset;
btTransform m_motionTransform;
glm::vec3 m_manualVelocity;
std::vector<glm::vec3> m_surfaceHitNormals;
btVector3 m_previousPosition;
float m_jumpRechargeTimer;
CharacterController(float height, float radius, float mass, Vector3 position);

View File

@@ -1,7 +1,6 @@
#include "DynamicWorld.h"
#include "Rigibody.h"
#include "../Core/Core.h"
#include "BulletDebugDrawer.h"
#include <src/Vendors/glm/ext/quaternion_common.hpp>
#include <src/Core/Logger.h>
@@ -11,82 +10,47 @@ namespace Nuake
{
DynamicWorld::DynamicWorld() {
///collision configuration contains default setup for memory, collision setup. Advanced users can create their own configuration.
btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded)
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
///btDbvtBroadphase is a good general purpose broadphase. You can also try out btAxis3Sweep.
btBroadphaseInterface* overlappingPairCache = new btDbvtBroadphase();
///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded)
btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver;
dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher, overlappingPairCache, solver, collisionConfiguration);
dynamicsWorld->setDebugDrawer(new BulletDebugDrawer());
m_Bodies = std::map<btRigidBody*, Ref<RigidBody>>();
SetGravity(Vector3(0, -10000, 0));
}
void DynamicWorld::DrawDebug()
{
dynamicsWorld->debugDrawWorld();
}
void DynamicWorld::SetGravity(glm::vec3 g)
{
dynamicsWorld->setGravity(btVector3(g.x, g.y, g.z));
}
void DynamicWorld::AddRigidbody(Ref<RigidBody> rb)
{
btRigidBody* bt = rb->GetBulletRigidbody();
m_Bodies.emplace(std::pair<btRigidBody*, Ref<RigidBody>>(bt, rb));
dynamicsWorld->addRigidBody(rb->GetBulletRigidbody());
}
void DynamicWorld::AddGhostbody(Ref<GhostObject> gb)
{
dynamicsWorld->addCollisionObject(gb->GetBulletObject(), btBroadphaseProxy::SensorTrigger, btBroadphaseProxy::KinematicFilter);
}
void DynamicWorld::AddCharacterController(Ref<CharacterController> cc)
{
dynamicsWorld->addRigidBody(cc->m_Rigidbody);
// Specify filters manually, otherwise ghost doesn't collide with statics for some reason
dynamicsWorld->addCollisionObject(cc->m_GhostObject, btBroadphaseProxy::KinematicFilter, btBroadphaseProxy::SensorTrigger | btBroadphaseProxy::StaticFilter);
}
RaycastResult DynamicWorld::Raycast(glm::vec3 from, glm::vec3 to)
{
btVector3 btFrom(from.x, from.y, from.z);
btVector3 btTo(to.x, to.y, to.z);
ClosestRayResultCallback res(btFrom, btTo);
dynamicsWorld->rayTest(btFrom, btTo, res);
btVector3 localNormal;
if (res.m_collisionObject)
{
// TODO: Fix the godammn fucked up normal
localNormal = res.m_hitNormalWorld;
}
Vector3 localNorm = glm::vec3(localNormal.x(), localNormal.y(), localNormal.z());
Vector3 localNorm = glm::vec3(0,0,0);
//Logger::Log("normal: x:" + std::to_string(localNorm.x) + " y:" + std::to_string(localNorm.y )+ "z: " + std::to_string(localNorm.z));
res.m_closestHitFraction;
// Map bullet result to dto.
RaycastResult result{
glm::vec3(res.m_hitPointWorld.x(), res.m_hitPointWorld.y(), res.m_hitPointWorld.z()),
glm::vec3(res.m_hitPointWorld.x(), res.m_hitPointWorld.y(), res.m_hitPointWorld.z()),
glm::vec3(0,0,0),
glm::vec3(0,0,0),
localNorm
};
@@ -96,39 +60,13 @@ namespace Nuake
void DynamicWorld::StepSimulation(Timestep ts)
{
dynamicsWorld->stepSimulation(ts, 0);
for (int j = dynamicsWorld->getNumCollisionObjects() - 1; j >= 0; j--)
{
btCollisionObject* obj = dynamicsWorld->getCollisionObjectArray()[j];
btRigidBody* body = btRigidBody::upcast(obj);
btTransform trans;
if (body && body->getMotionState())
{
body->getMotionState()->getWorldTransform(trans);
if (m_Bodies.find(body) != m_Bodies.end())
m_Bodies[body]->UpdateTransform(trans);
}
else
{
trans = obj->getWorldTransform();
if (m_Bodies.find(body) != m_Bodies.end())
m_Bodies[body]->UpdateTransform(trans);
}
//printf("world pos object %d = %f,%f,%f\n", j, float(trans.getOrigin().getX()), float(trans.getOrigin().getY()), float(trans.getOrigin().getZ()));
}
}
void DynamicWorld::Clear()
{
for (int j = dynamicsWorld->getNumCollisionObjects() - 1; j >= 0; j--)
{
btCollisionObject* obj = dynamicsWorld->getCollisionObjectArray()[j];
dynamicsWorld->removeCollisionObject(obj);
}
m_Bodies.clear();
}
}

View File

@@ -1,5 +1,4 @@
#pragma once
#include <btBulletDynamicsCommon.h>
#include <glm/ext/vector_float3.hpp>
#include "Rigibody.h"
#include "src/Core/Timestep.h"
@@ -15,8 +14,6 @@ namespace Nuake
namespace Physics {
class DynamicWorld {
private:
btDiscreteDynamicsWorld* dynamicsWorld;
std::map<btRigidBody*, Ref<RigidBody>> m_Bodies;
public:
DynamicWorld();
@@ -33,7 +30,6 @@ namespace Nuake
void StepSimulation(Timestep ts);
void Clear();
btDiscreteDynamicsWorld* GetDynamicWorld() { return dynamicsWorld; }
};
}
}

View File

@@ -1,7 +1,5 @@
#include "GhostObject.h"
#include <dependencies/bullet3/src/BulletCollision/CollisionDispatch/btGhostObject.h>
#include <dependencies/bullet3/src/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h>
#include <dependencies/bullet3/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h>
#include <src/Core/Physics/PhysicsManager.h>
namespace Nuake
@@ -9,19 +7,11 @@ namespace Nuake
GhostObject::GhostObject(Vector3 position, Ref<Physics::PhysicShape> shape)
{
m_OverlappingEntities = std::vector<Entity>();
m_BulletObject = new btGhostObject();
btTransform transform = btTransform();
transform.setIdentity();
transform.setOrigin(btVector3(position.x, position.y, position.z));
m_BulletObject->setWorldTransform(transform);
m_BulletObject->setCollisionShape(shape->GetBulletShape());
}
int GhostObject::OverlappingCount()
{
return m_BulletObject->getNumOverlappingObjects();
return 0;
}
void GhostObject::ClearOverlappingList()
@@ -31,7 +21,6 @@ namespace Nuake
void GhostObject::SetEntityID(Entity ent)
{
m_BulletObject->setUserIndex(ent.GetHandle());
}
void GhostObject::ScanOverlap()
@@ -40,7 +29,7 @@ namespace Nuake
for (int i = 0; i < OverlappingCount(); i++)
{
int index = m_BulletObject->getOverlappingObject(i)->getUserIndex();
int index =0;
if (index == -1)
continue;
@@ -54,9 +43,4 @@ namespace Nuake
return m_OverlappingEntities;
}
// Internal use only.
btGhostObject* GhostObject::GetBulletObject()
{
return m_BulletObject;
}
}

View File

@@ -7,13 +7,11 @@
#include <Engine.h>
class btGhostObject;
namespace Nuake
{
class GhostObject {
private:
btGhostObject* m_BulletObject;
std::vector<Entity> m_OverlappingEntities;
public:
@@ -27,7 +25,5 @@ namespace Nuake
std::vector<Entity> GetOverlappingEntities();
// Internal use only.
btGhostObject* GetBulletObject();
};
}

View File

@@ -1,6 +1,5 @@
#include "PhysicsManager.h"
#include "PhysicsShapes.h"
#include "btBulletDynamicsCommon.h"
#include "../Core/Core.h"
namespace Nuake
@@ -33,9 +32,7 @@ namespace Nuake
RaycastResult PhysicsManager::Raycast(glm::vec3 from, glm::vec3 to)
{
btVector3 btFrom(from.x, from.y, from.z);
btVector3 btTo(to.x, to.y, to.z);
btCollisionWorld::ClosestRayResultCallback res(btFrom, btTo);
return m_World->Raycast(from, to);
@@ -52,7 +49,6 @@ namespace Nuake
m_World = new Physics::DynamicWorld();
m_World->SetGravity(glm::vec3(0, -3, 0));
m_World->GetDynamicWorld()->getBroadphase()->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());
m_IsRunning = false;
}

View File

@@ -13,7 +13,6 @@ namespace Nuake
private:
Physics::DynamicWorld* m_World;
bool m_IsRunning = false;
btAlignedObjectArray<btCollisionShape*> collisionShapes;
bool m_DrawDebug = false;
static PhysicsManager* m_Instance;

View File

@@ -1,5 +1,4 @@
#include "PhysicsShapes.h"
#include "btBulletDynamicsCommon.h"
#include "src/Rendering/Vertex.h"
namespace Nuake
@@ -9,19 +8,16 @@ namespace Nuake
Box::Box()
{
Size = glm::vec3(1);
bShape = new btBoxShape(btVector3(Size.x, Size.y, Size.z));
m_Type = BOX;
}
// Sphere
Box::Box(glm::vec3 size) {
Size = size;
bShape = new btBoxShape(btVector3(size.x, size.y, size.z));
m_Type = BOX;
}
Box::Box(float x, float y, float z) {
Size = glm::vec3(x, y, z);
bShape = new btBoxShape(btVector3(x, y, z));
m_Type = BOX;
}
@@ -33,13 +29,11 @@ namespace Nuake
// Sphere
Sphere::Sphere(float radius) {
Radius = radius;
bShape = new btSphereShape(Radius);
m_Type = SPHERE;
}
void Sphere::SetRadius(float radius) {
((btSphereShape*)bShape)->setUnscaledRadius(radius);
Radius = radius;
}
@@ -51,7 +45,6 @@ namespace Nuake
MeshShape::MeshShape(Ref<Mesh> mesh)
{
m_Mesh = mesh;
btTriangleMesh* trimesh = new btTriangleMesh();
auto& indices = mesh->GetIndices();
auto& vertices = mesh->GetVertices();
@@ -61,14 +54,9 @@ namespace Nuake
Vector3 tri2 = vertices[indices[i + 1]].position;
Vector3 tri3 = vertices[indices[i + 2]].position;
btVector3 btri1 = btVector3(tri1.x, tri1.y, tri1.z);
btVector3 btri2 = btVector3(tri2.x, tri2.y, tri2.z);
btVector3 btri3 = btVector3(tri3.x, tri3.y, tri3.z);
trimesh->addTriangle(btri1, btri2, btri3, false);
}
bShape = new btBvhTriangleMeshShape(trimesh, false, true);;
}
btCollisionShape* MeshShape::GetBulletShape()

View File

@@ -2,64 +2,12 @@
#include <glm/ext/vector_float3.hpp>
#include "CharacterController.h"
#include <BulletCollision/CollisionDispatch/btGhostObject.h>
namespace Nuake
{
namespace Physics
{
struct ClosestRayResultCallback : public btCollisionWorld::RayResultCallback
{
ClosestRayResultCallback(const btVector3& rayFromWorld, const btVector3& rayToWorld)
: m_rayFromWorld(rayFromWorld),
m_rayToWorld(rayToWorld)
{
}
btVector3 m_rayFromWorld; //used to calculate hitPointWorld from hitFraction
btVector3 m_rayToWorld;
btVector3 m_hitNormalWorld;
btVector3 m_hitPointWorld;
virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult, bool normalInWorldSpace)
{
//caller already does the filter on the m_closestHitFraction
btAssert(rayResult.m_hitFraction <= m_closestHitFraction);
m_closestHitFraction = rayResult.m_hitFraction;
m_collisionObject = rayResult.m_collisionObject;
m_hitNormalWorld = rayResult.m_hitNormalLocal;
m_hitPointWorld.setInterpolate3(m_rayFromWorld, m_rayToWorld, rayResult.m_hitFraction);
return rayResult.m_hitFraction;
}
};
class IgnoreBodyAndGhostCast :
public Physics::ClosestRayResultCallback
{
private:
btRigidBody* m_pBody;
btPairCachingGhostObject* m_pGhostObject;
public:
IgnoreBodyAndGhostCast(btRigidBody* pBody, btPairCachingGhostObject* pGhostObject)
: ClosestRayResultCallback(btVector3(0.0, 0.0, 0.0), btVector3(0.0, 0.0, 0.0)),
m_pBody(pBody), m_pGhostObject(pGhostObject)
{
}
btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult, bool normalInWorldSpace)
{
if (rayResult.m_collisionObject == m_pBody || rayResult.m_collisionObject == m_pGhostObject)
return 1.0f;
return ClosestRayResultCallback::addSingleResult(rayResult, normalInWorldSpace);
}
};
}

View File

@@ -2,9 +2,6 @@
#include "PhysicsShapes.h"
#include "../Core/Core.h"
#include <glm/ext/vector_float3.hpp>
class btTransform;
class btRigidBody;
class btVector3;
namespace Nuake
{
@@ -16,20 +13,17 @@ namespace Nuake
bool m_IsKinematic = false;
glm::vec3 m_InitialVel;
btRigidBody* m_Rigidbody;
Ref<PhysicShape> m_CollisionShape;
public:
btTransform* m_Transform;
float m_Mass;
RigidBody();
RigidBody(glm::vec3 position, Entity handle);
RigidBody(float mass, glm::vec3 position, Ref<PhysicShape> shape, glm::vec3 initialVel = glm::vec3(0, 0, 0));
btRigidBody* GetBulletRigidbody() const { return m_Rigidbody; }
void UpdateTransform(btTransform t);
void UpdateTransform();
glm::vec3 GetPosition() const;
glm::vec3 GetRotation() const;

View File

@@ -1,6 +1,5 @@
#include "PhysicsShapes.h"
#include "Rigibody.h"
#include <btBulletDynamicsCommon.h>
#include "../Core.h"
#include <glm/trigonometric.hpp>
#include <src/Scene/Entities/Entity.h>
@@ -11,9 +10,7 @@ namespace Nuake
{
RigidBody::RigidBody()
{
m_Transform = new btTransform();
m_Transform->setIdentity();
//m_Transform->setOrigin(btVector3(position.x, position.y, position.z));
}
RigidBody::RigidBody(glm::vec3 position, Entity handle)
@@ -21,100 +18,59 @@ namespace Nuake
Ref<Box> shape = CreateRef<Box>();
m_CollisionShape = shape;
m_Transform = new btTransform();
m_Transform->setIdentity();
m_Transform->setOrigin(btVector3(position.x, position.y, position.z));
m_Mass = 0.0f;
//rigidbody is dynamic if and only if mass is non zero, otherwise static
m_IsDynamic = (m_Mass != 0.0f);
btVector3 localInertia(0, 0, 0);
if (m_IsDynamic)
m_CollisionShape->GetBulletShape()->calculateLocalInertia(m_Mass, localInertia);
m_InitialVel = glm::vec3(0, 0, 0);
//using motionstate is optional, it provides interpolation capabilities, and only synchronizes 'active' objects
btDefaultMotionState* myMotionState = new btDefaultMotionState(*m_Transform);
btRigidBody::btRigidBodyConstructionInfo rbInfo(m_Mass, myMotionState, m_CollisionShape->GetBulletShape(), localInertia);
m_Rigidbody = new btRigidBody(rbInfo);
m_Rigidbody->setUserIndex(handle.GetHandle());
}
RigidBody::RigidBody(float mass, glm::vec3 position, Ref<PhysicShape> shape, glm::vec3 initialVel)
{
m_CollisionShape = shape;
m_Transform = new btTransform();
m_Transform->setIdentity();
m_Transform->setOrigin(btVector3(position.x, position.y, position.z));
m_Mass = mass;
//rigidbody is dynamic if and only if mass is non zero, otherwise static
m_IsDynamic = (m_Mass != 0.0f);
btVector3 localInertia(initialVel.x, initialVel.y, initialVel.z);
m_InitialVel = initialVel;
if (m_IsDynamic)
m_CollisionShape->GetBulletShape()->calculateLocalInertia(m_Mass, localInertia);
//using motionstate is optional, it provides interpolation capabilities, and only synchronizes 'active' objects
btDefaultMotionState* myMotionState = new btDefaultMotionState(*m_Transform);
btRigidBody::btRigidBodyConstructionInfo rbInfo(m_Mass, myMotionState, m_CollisionShape->GetBulletShape(), localInertia);
m_Rigidbody = new btRigidBody(rbInfo);
}
void RigidBody::SetShape(Ref<PhysicShape> shape)
{
m_Rigidbody->setCollisionShape(shape->GetBulletShape());
m_CollisionShape = shape;
}
void RigidBody::UpdateTransform(btTransform t)
void RigidBody::UpdateTransform()
{
m_Transform->setOrigin(t.getOrigin());
m_Transform->setRotation(t.getRotation());
m_Rigidbody->setWorldTransform(t);
}
glm::vec3 RigidBody::GetRotation() const {
auto q = m_Transform->getRotation();
btScalar x = 0, y = 0, z = 0;
q.getEulerZYX(z, y, x);
return glm::vec3(glm::degrees(x), glm::degrees(y), glm::degrees(z));
return { 0, 0, 0 };
}
void RigidBody::SetEntityID(Entity ent)
{
m_Rigidbody->setUserIndex(ent.GetHandle());
}
void RigidBody::SetKinematic(bool value)
{
if (value) // Kinematic bodies dont deactivate.
{
m_Rigidbody->setCollisionFlags(m_Rigidbody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
m_Rigidbody->setActivationState(DISABLE_DEACTIVATION);
}
else // Reenable deactivation.
{
m_Rigidbody->setCollisionFlags(m_Rigidbody->getCollisionFlags() ^ ~btCollisionObject::CF_KINEMATIC_OBJECT);
m_Rigidbody->setActivationState(WANTS_DEACTIVATION);
}
}
glm::vec3 RigidBody::GetPosition() const {
btVector3 btPos = m_Transform->getOrigin();
return glm::vec3(btPos.x(), btPos.y(), btPos.z());
return { 0, 0, 0 };
}
void RigidBody::SetMass(float m) { m_Rigidbody->setMassProps(m, btVector3(m_InitialVel.x, m_InitialVel.y, m_InitialVel.y)); m_Mass = m; }
void RigidBody::SetMass(float m) { }
void RigidBody::MoveAndSlide(glm::vec3 velocity)
{

View File

@@ -123,13 +123,13 @@ namespace Nuake {
RenderCommand::Disable(RendererEnum::FACE_CULL);
glCullFace(GL_BACK);
auto meshView = scene.m_Registry.view<TransformComponent, ModelComponent>();
auto quakeView = scene.m_Registry.view<TransformComponent, BSPBrushComponent>();
auto view = scene.m_Registry.view<TransformComponent, LightComponent>();
auto meshView = scene.m_Registry.view<TransformComponent, ModelComponent, VisibilityComponent>();
auto quakeView = scene.m_Registry.view<TransformComponent, BSPBrushComponent, VisibilityComponent>();
auto view = scene.m_Registry.view<TransformComponent, LightComponent, VisibilityComponent>();
for (auto l : view)
{
auto [lightTransform, light] = view.get<TransformComponent, LightComponent>(l);
if (light.Type != LightType::Directional || !light.CastShadows)
auto [lightTransform, light, visibility] = view.get<TransformComponent, LightComponent, VisibilityComponent>(l);
if (light.Type != LightType::Directional || !light.CastShadows || !visibility.Visible)
continue;
light.CalculateViewProjection(mView, mProjection);
@@ -142,8 +142,8 @@ namespace Nuake {
shader->SetUniformMat4f("u_LightTransform", light.mViewProjections[i]);
for (auto e : meshView)
{
auto [transform, mesh] = meshView.get<TransformComponent, ModelComponent>(e);
if (mesh.ModelResource != nullptr)
auto [transform, mesh, visibility] = meshView.get<TransformComponent, ModelComponent, VisibilityComponent>(e);
if (mesh.ModelResource != nullptr && visibility.Visible)
{
for (auto& m : mesh.ModelResource->GetMeshes())
Renderer::SubmitMesh(m, transform.GetGlobalTransform());
@@ -152,9 +152,9 @@ namespace Nuake {
for (auto e : quakeView)
{
auto [transform, model] = quakeView.get<TransformComponent, BSPBrushComponent>(e);
auto [transform, model, visibility] = quakeView.get<TransformComponent, BSPBrushComponent, VisibilityComponent>(e);
if (model.IsTransparent)
if (model.IsTransparent || !visibility.Visible)
continue;
for (Ref<Mesh>& m : model.Meshes)
@@ -181,12 +181,12 @@ namespace Nuake {
gBufferShader->SetUniformMat4f("u_Projection", mProjection);
gBufferShader->SetUniformMat4f("u_View", mView);
auto view = scene.m_Registry.view<TransformComponent, ModelComponent, ParentComponent>();
auto view = scene.m_Registry.view<TransformComponent, ModelComponent, ParentComponent, VisibilityComponent>();
for (auto e : view)
{
auto [transform, mesh, parent] = view.get<TransformComponent, ModelComponent, ParentComponent>(e);
auto [transform, mesh, parent, visibility] = view.get<TransformComponent, ModelComponent, ParentComponent, VisibilityComponent>(e);
if (mesh.ModelResource)
if (mesh.ModelResource && visibility.Visible)
{
for (auto& m : mesh.ModelResource->GetMeshes())
Renderer::SubmitMesh(m, transform.GetGlobalTransform());
@@ -197,12 +197,12 @@ namespace Nuake {
RenderCommand::Disable(RendererEnum::FACE_CULL);
Renderer::Flush(gBufferShader, false);
auto quakeView = scene.m_Registry.view<TransformComponent, BSPBrushComponent, ParentComponent>();
auto quakeView = scene.m_Registry.view<TransformComponent, BSPBrushComponent, ParentComponent, VisibilityComponent>();
for (auto e : quakeView)
{
auto [transform, model, parent] = quakeView.get<TransformComponent, BSPBrushComponent, ParentComponent>(e);
auto [transform, model, parent, visibility] = quakeView.get<TransformComponent, BSPBrushComponent, ParentComponent, VisibilityComponent>(e);
if (model.IsTransparent)
if (model.IsTransparent || !visibility.Visible)
continue;
for (auto& b : model.Meshes)

View File

@@ -1 +1,26 @@
#pragma once
#include "src/Resource/Serializable.h"
struct VisibilityComponent
{
bool Visible = true;
json Serialize()
{
BEGIN_SERIALIZE();
SERIALIZE_VAL(Visible);
END_SERIALIZE();
}
bool Deserialize(std::string str)
{
BEGIN_DESERIALIZE();
if (j.contains("Visible"))
{
Visible = j["Visible"];
}
return true;
}
};

View File

@@ -33,10 +33,8 @@ namespace Nuake {
}
void SyncWithTransform(TransformComponent& tc)
{
btVector3 pos = CharacterController->m_motionTransform.getOrigin();
glm::vec3 finalPos = glm::vec3(pos.x(), pos.y(), pos.z());
tc.SetLocalPosition(finalPos);
}
};
}

View File

@@ -57,14 +57,7 @@ namespace Nuake {
if (!m_Rigidbody)
return;
btTransform newTransform;
newTransform.setIdentity();
//newTransform.setOrigin(btVector3(tc->Translation.x, tc->Translation.t, tc->Translation.z));
btQuaternion quat;
//quat.setEulerZYX(tc->Rotation.x, tc->Rotation.y, tc->Rotation.z);
newTransform.setRotation(quat);
m_Rigidbody->UpdateTransform(newTransform);
}
void RigidBodyComponent::DrawShape(TransformComponent* tc)

View File

@@ -34,6 +34,7 @@ namespace Nuake
SERIALIZE_OBJECT_REF_LBL("NameComponent", GetComponent<NameComponent>());
SERIALIZE_OBJECT_REF_LBL("ParentComponent", GetComponent<ParentComponent>());
SERIALIZE_OBJECT_REF_LBL("TransformComponent", GetComponent<TransformComponent>());
SERIALIZE_OBJECT_REF_LBL("VisibilityComponent", GetComponent<VisibilityComponent>());
if (HasComponent<CameraComponent>())
SERIALIZE_OBJECT_REF_LBL("CameraComponent", GetComponent<CameraComponent>());
if (HasComponent<QuakeMapComponent>())
@@ -57,6 +58,11 @@ namespace Nuake
{
BEGIN_DESERIALIZE();
DESERIALIZE_COMPONENT(TransformComponent);
DESERIALIZE_COMPONENT(VisibilityComponent)
else
{
AddComponent<VisibilityComponent>();
}
DESERIALIZE_COMPONENT(NameComponent);
DESERIALIZE_COMPONENT(ParentComponent);
DESERIALIZE_COMPONENT(CameraComponent);

View File

@@ -191,14 +191,14 @@ namespace Nuake {
{
Entity entity = { m_Registry.create(), this };
entity.AddComponent<TransformComponent>();
entity.AddComponent<ParentComponent>();
entity.AddComponent<VisibilityComponent>();
NameComponent& nameComponent = entity.AddComponent<NameComponent>();
nameComponent.Name = name;
nameComponent.ID = id;
ParentComponent& parentComponent = entity.AddComponent<ParentComponent>();
Logger::Log("Created entity: " + nameComponent.Name + "\n");
Logger::Log("Created entity: " + nameComponent.Name, LOG_TYPE::VERBOSE);
return entity;
}
@@ -214,7 +214,7 @@ namespace Nuake {
for (auto& c : copyChildrens)
{
Logger::Log("Deleting... entity" + std::to_string(c.GetHandle()));
Logger::Log("Deleting entity " + std::to_string(c.GetHandle()));
DestroyEntity(c);
}
@@ -318,10 +318,12 @@ namespace Nuake {
}
CopyComponent<ParentComponent>(sceneCopy->m_Registry, this->m_Registry);
CopyComponent<VisibilityComponent>(sceneCopy->m_Registry, this->m_Registry);
CopyComponent<TransformComponent>(sceneCopy->m_Registry, this->m_Registry);
CopyComponent<LightComponent>(sceneCopy->m_Registry, this->m_Registry);
CopyComponent<ModelComponent>(sceneCopy->m_Registry, this->m_Registry);
CopyComponent<CameraComponent>(sceneCopy->m_Registry, this->m_Registry);
CopyComponent<WrenScriptComponent>(sceneCopy->m_Registry, this->m_Registry);
return sceneCopy;
}

View File

@@ -225,7 +225,6 @@ namespace Nuake {
void Window::Update(Timestep ts)
{
// TODO: have event here?
m_Scene->Update(ts);
}

View File

@@ -1,2 +1,2 @@
premake5 vs2019
premake5 vs2022
pause

View File

@@ -11,9 +11,7 @@ outputdir = "%{cfg.buildcfg}-%{cfg.system}-%{cfg.architecture}"
include "Nuake/dependencies/glfw_p5.lua"
include "Nuake/dependencies/assimp_p5.lua"
include "Nuake/dependencies/bullet_p5.lua"
include "Nuake/dependencies/freetype_p5.lua"
include "Nuake/dependencies/soloud_p5.lua"
project "Nuake"
location "Nuake"
@@ -55,21 +53,16 @@ project "Nuake"
"%{prj.name}/../Nuake/src/Vendors",
"%{prj.name}/../Nuake/Dependencies/GLEW/include",
"%{prj.name}/../Nuake/Dependencies/GLFW/include",
"%{prj.name}/../Nuake/Dependencies/bullet3/src",
"%{prj.name}/../Nuake/Dependencies/assimp/include",
"%{prj.name}/../Nuake/Dependencies/build",
"%{prj.name}/../Nuake/src/Vendors/msdfgen/include",
"%{prj.name}/../Nuake/src/Vendors/msdfgen/freetype/include",
"%{prj.name}/../Nuake/src/Vendors/msdfgen",
"%{prj.name}/../Nuake/src/Vendors/wren/src/include",
"%(prj.name}/../Nuake/Dependencies/soloud/include"
}
links
{
"BulletCollision",
"BulletDynamics",
"LinearMath",
"Freetype"
}
@@ -106,7 +99,6 @@ project "Editor"
"%{prj.name}/../Nuake/src/Vendors",
"%{prj.name}/../Nuake/Dependencies/GLEW/include",
"%{prj.name}/../Nuake/Dependencies/GLFW/include",
"%{prj.name}/../Nuake/Dependencies/bullet3/src",
"%{prj.name}/../Nuake/Dependencies/assimp/include",
"%{prj.name}/../Nuake/Dependencies/build",
"%{prj.name}/../Nuake/src/Vendors/msdfgen"
@@ -130,10 +122,7 @@ project "Editor"
"GLFW",
"assimp",
"glew32s.lib",
"opengl32.lib",
"BulletCollision",
"BulletDynamics",
"LinearMath",
"opengl32.lib",
"Freetype"
}