From 96dad8a849171bf36e52282768f7ec28add1fc48 Mon Sep 17 00:00:00 2001 From: Ed94 Date: Thu, 12 May 2022 08:18:55 -0400 Subject: [PATCH] following tut, bs happend. gdnative decided to hardcode the directories of is includes to godot_cpp for the directory of the fucking git repo. --- .gitmodules | 3 - Editor/main.tscn | 3 + Engine/gdnative_cpp | 1 - Source/.sconsign.dblite | Bin 0 -> 4889 bytes Source/SConstruct | 118 ++++++++++++++++++++++++++++++++++++++++ Source/gdexample.cpp | 37 +++++++++++++ Source/gdexample.h | 29 ++++++++++ Source/gdlibrary.h | 24 ++++++++ Source/vc140.idb | Bin 0 -> 11264 bytes Source/vc140.pdb | Bin 0 -> 82944 bytes 10 files changed, 211 insertions(+), 4 deletions(-) create mode 100644 Editor/main.tscn delete mode 160000 Engine/gdnative_cpp create mode 100644 Source/.sconsign.dblite create mode 100644 Source/SConstruct create mode 100644 Source/gdexample.cpp create mode 100644 Source/gdexample.h create mode 100644 Source/gdlibrary.h create mode 100644 Source/vc140.idb create mode 100644 Source/vc140.pdb diff --git a/.gitmodules b/.gitmodules index 8c36aad..a811e12 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ [submodule "Engine/gd"] path = Engine/gd url = https://github.com/godotengine/godot -[submodule "Engine/gdnative_cpp"] - path = Engine/gdnative_cpp - url = https://github.com/godotengine/godot-cpp diff --git a/Editor/main.tscn b/Editor/main.tscn new file mode 100644 index 0000000..5e1beb3 --- /dev/null +++ b/Editor/main.tscn @@ -0,0 +1,3 @@ +[gd_scene format=3 uid="uid://bqqewt05ne1ad"] + +[node name="main" type="Node"] diff --git a/Engine/gdnative_cpp b/Engine/gdnative_cpp deleted file mode 160000 index 95a2303..0000000 --- a/Engine/gdnative_cpp +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 95a2303e37fd28b20c2e53f82e867f5a08e1af53 diff --git a/Source/.sconsign.dblite b/Source/.sconsign.dblite new file mode 100644 index 0000000000000000000000000000000000000000..6744373ca07233e035c07fb461db15178b2db00a GIT binary patch literal 4889 zcmd^@yN}#N9LEoIA)CkLbpb&jZ~-XnCcxD^~#iB$aD3KsYq;Ocx<2P#)KUTK) zE{BK|L~BHW(?UZ-Lq$o$e}KdvfGCmZpi9Ge_wKTLkSIE?TWiN2zjnSmpZUG^?()53 zt4ovZPJ5wwb#yVRHZxVEkPnj_qOHTwF)Bq)E&C*PTQPI z6E!SMQNQ6H@-~v(6dRRiK#hkUqn^9lHpi~NQ{#tuWwSzV6O1Cn@yDNowBh?(aN*L{-JO)KDeEs=e7ZN0fmP|OkUpc6x?oQfkO>g_#@edV>yd3`Z5unuW4${?@1{;i}Ql|__Qo0T7pt8z*yno@fI0i|A=L}G2uc~p5K2zC;-S$b#3DeJF>L5Oj355kv5c$VtnP;K*5kOZB-iQK zKs1^Bi9^$=tSYG5{$Pse!v~0tY?N{|0^`LC4T)GvP#`P_WNDyGNVsDr7?H?lzI+6v z@7~@G>Ea$C6(zL&9}i5z&iC#x4LcW_qZ51sqZXVIH%uy_nKK|pxuDVp#%N=mWjVw0 zAHnFk*Jl|uC!j2ga*#<~7S&`@kQL?TKFJUy z2rvf-Lt?pNAx4x2S|DY(HXO~!`1{P9jGh6zPjex#&oGvOH6kQNA|a(U*!m`<8UYGt zM0|T{PQ>vH>bNiimm5tT(*Nh8B}W(pbw3^vhJX>Fv?lJVL^SYcwb(f=hYR%y=z4#+ zxZul>b14vV(AKREMtw}NkB#8mYBM9_ud{P9PIhwv^P@R6EA{3G23<3}xQ{qPQcC7hU4=*&mjnB7PQ5R8bCRw$ca`|C zl-Zhf{|Qu4mUM|!Ve7T^q#Da~t*XZ+DIy>Fe$)l7ah}wh(YlW6qDbBImFr^a5$rw~ zk*<`F;-ac=Ga9+p_WxbhKc&+JFY38V=@1iKIeORxl!5Zyrku^WjE0JNhUadKcK%`c M<=5WQE{bFCAD?;#hyVZp literal 0 HcmV?d00001 diff --git a/Source/SConstruct b/Source/SConstruct new file mode 100644 index 0000000..31eb96c --- /dev/null +++ b/Source/SConstruct @@ -0,0 +1,118 @@ +#!python +import os + +opts = Variables([], ARGUMENTS) + +# Gets the standard flags CC, CCX, etc. +env = DefaultEnvironment() + +ProjPath = os.path.abspath("../"); +print("Project Path: " + ProjPath); + +# Define our options +opts.Add(EnumVariable('target', "Compilation target", 'debug', ['d', 'debug', 'r', 'release'])) +opts.Add(EnumVariable('platform', "Compilation platform", '', ['', 'windows', 'x11', 'linux', 'osx'])) +opts.Add(EnumVariable('p', "Compilation target, alias for 'platform'", '', ['', 'windows', 'x11', 'linux', 'osx'])) +opts.Add(BoolVariable('use_llvm', "Use the LLVM / Clang compiler", 'no')) +opts.Add(PathVariable('target_path', 'The path where the lib is installed.', ProjPath + '/Engine/gdnative_cpp/bin')) +opts.Add(PathVariable('target_name', 'The library name.', 'libgdexample', PathVariable.PathAccept)) + +# Local dependency paths, adapt them to your setup +godot_headers_path = ProjPath + "/Engine/gdnative_cpp/godot-headers/" +cpp_bindings_path = ProjPath + "/Engine/gdnative_cpp/" +cpp_library = "libgodot-cpp" + +# only support 64 at this time.. +bits = 64 + +# Updates the environment with the option variables. +opts.Update(env) + +# Process some arguments +if env['use_llvm']: + env['CC'] = 'clang' + env['CXX'] = 'clang++' + +if env['p'] != '': + env['platform'] = env['p'] + +if env['platform'] == '': + print("No valid target platform selected.") + quit(); + +# For the reference: +# - CCFLAGS are compilation flags shared between C and C++ +# - CFLAGS are for C-specific compilation flags +# - CXXFLAGS are for C++-specific compilation flags +# - CPPFLAGS are for pre-processor flags +# - CPPDEFINES are for pre-processor defines +# - LINKFLAGS are for linking flags + +# Check our platform specifics +if env['platform'] == "osx": + env['target_path'] += 'osx/' + cpp_library += '.osx' + env.Append(CCFLAGS=['-arch', 'x86_64']) + env.Append(CXXFLAGS=['-std=c++17']) + env.Append(LINKFLAGS=['-arch', 'x86_64']) + if env['target'] in ('debug', 'd'): + env.Append(CCFLAGS=['-g', '-O2']) + else: + env.Append(CCFLAGS=['-g', '-O3']) + +elif env['platform'] in ('x11', 'linux'): + env['target_path'] += 'x11/' + cpp_library += '.linux' + env.Append(CCFLAGS=['-fPIC']) + env.Append(CXXFLAGS=['-std=c++17']) + if env['target'] in ('debug', 'd'): + env.Append(CCFLAGS=['-g3', '-Og']) + else: + env.Append(CCFLAGS=['-g', '-O3']) + +elif env['platform'] == "windows": + env['target_path'] += 'win64/' + cpp_library += '.windows' + # This makes sure to keep the session environment variables on windows, + # that way you can run scons in a vs 2017 prompt and it will find all the required tools + env.Append(ENV=os.environ) + + env.Append(CPPDEFINES=['WIN32', '_WIN32', '_WINDOWS', '_CRT_SECURE_NO_WARNINGS']) + env.Append(CCFLAGS=['-W3', '-GR']) + env.Append(CXXFLAGS='/std:c++17') + if env['target'] in ('debug', 'd'): + env.Append(CPPDEFINES=['_DEBUG']) + env.Append(CCFLAGS=['-EHsc', '-MDd', '-ZI']) + env.Append(LINKFLAGS=['-DEBUG']) + else: + env.Append(CPPDEFINES=['NDEBUG']) + env.Append(CCFLAGS=['-O2', '-EHsc', '-MD']) + +if env['target'] in ('debug', 'd'): + cpp_library += '.debug' +else: + cpp_library += '.release' + +cpp_library += '.' + str(bits) + +# make sure our binding library is properly includes +env.Append(CPPPATH=['.', godot_headers_path, cpp_bindings_path + 'include/', cpp_bindings_path + 'include/core/', cpp_bindings_path + 'include/gen/']) +env.Append(LIBPATH=[cpp_bindings_path + 'bin/']) +env.Append(LIBS=[cpp_library]) + +GDNative_Src = ProjPath + '/Engine/gdnative_cpp/src/*.cpp' +Src = ProjPath + "/Source/*.cpp" + +# tweak this if you want to use different folders, or more folders, to store your source code in. +env.Append(CPPPATH=[GDNative_Src]) +env.Append(CPPPATH=[Src]) +sources = Glob(GDNative_Src, Src) + + +print(sources); +library = env.SharedLibrary(target=env['target_path'] + env['target_name'] , source=sources) + +Default(library) + +# Generates help for the -h scons option. +Help(opts.GenerateHelpText(env)) diff --git a/Source/gdexample.cpp b/Source/gdexample.cpp new file mode 100644 index 0000000..a647824 --- /dev/null +++ b/Source/gdexample.cpp @@ -0,0 +1,37 @@ +#include "gdexample.h" + + +namespace godot { + +#pragma region GodotRT +void GDExample::_register_methods() +{ + register_method("_process", &GDExample::_process); +} + +void GDExample::_init() +{ + time_passed = 0.f; +} + +void GDExample::_process(float delta) +{ + time_passed += delta; + + Vector2 + newPos = Vector2( + 10.0 + (10.0 * sin(time_passed * 2.0)), + 10.0 + (10.0 * cos(time_passed * 1.5)) + ); + + set_position(newPos); +} +#pragma endregion GodotRT + +GDExample::GDExample() +{} + +GDExample::~GDExample() +{} + +} \ No newline at end of file diff --git a/Source/gdexample.h b/Source/gdexample.h new file mode 100644 index 0000000..a7a5d3d --- /dev/null +++ b/Source/gdexample.h @@ -0,0 +1,29 @@ +#pragma once + +#include +#include + +namespace godot { + +class GDExample : public Sprite +{ + GODOT_CLASS(GDExample, Sprite) + +public: + +#pragma region Data + float time_passed; +#pragma endregion Data + +#pragma region GodotRT + static void _register_methods(); + + void _init(); + void _process(float delta); +#pragma endregion GodotRT + + GDExample(); + ~GDExample(); +}; + +} \ No newline at end of file diff --git a/Source/gdlibrary.h b/Source/gdlibrary.h new file mode 100644 index 0000000..a6f13e1 --- /dev/null +++ b/Source/gdlibrary.h @@ -0,0 +1,24 @@ +#include "gdexample.h" + +#define gd_export(Type_) \ +extern "C" Type_ GDN_Export + +gd_export(void) +godot_gdnative_init(godot_gdnative_init_options* o) +{ + godot::Godot::gdnative_init(o); +} + +gd_export(void) +godot_gdnative_terminate(godot_gdnative_terminate_options* o) +{ + godot:Godot::gdnative_terminate(o); +} + +gd_export(void) +godot_nativescript_init(void* handle) +{ + godot::Godot::nativescript_init(handle); + + godot::register_class(); +} diff --git a/Source/vc140.idb b/Source/vc140.idb new file mode 100644 index 0000000000000000000000000000000000000000..5b5d207e733b156ec6e0f58d57b6061abe9cf990 GIT binary patch literal 11264 zcmeI2&2G~`5P;M2CsA>x>dA+KiYknqpwfok8jv_tqRMrp$XTzGCAQbvwVg!b4SGXJ zJOhu=BS$V=xgf+7&?EML}%phEB{=)}T>Dl%%93ToIe_?UYxD=8Mwv zDye5@ z=>&$yeWr}H-sZ+V(&eEmy2|MASP|PI!+31Vw9InZvY;gil`&DV>oTthPgF<-9;dqs zM*r8Fmb0JEG&0qAvDpSBt8Oi#VSCf19ktqY+D|2so{uV7*RYmVy7$}7l>zi3mklSwIL zBXIOnKb@nmO?zSS$IGVP13ZqlKYyz|+uh&zDpptC*M^Tabf4C7`LtJ=JT=~p$4CGP zoC5;aAVzq^U)r9C^$L8~eJDr(30zzP*DvnWaArsV3H*(~+JwQc6Dq>p!MP85R{(Mw zb_{y=&$N!c4X`w}V_*YYZLeh?-Xh>|-CM9ffQv)W1F(Mw=iWen1@t56Pq4cKx(9u$ fVDk#bUWW51NB{{S0VIF~kN^@u0!RP}oSDFH9ux)B literal 0 HcmV?d00001 diff --git a/Source/vc140.pdb b/Source/vc140.pdb new file mode 100644 index 0000000000000000000000000000000000000000..387f84b9b597987b591a354d14224cf149f4cf3c GIT binary patch literal 82944 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 bngPv#W