Ver Fonte

Add crown::init()/shutdown() to better control the order of main systems initialization

Daniele Bartolini há 12 anos atrás
pai
commit
b5dbd99b34

+ 0 - 1
engine/Android.mk

@@ -39,7 +39,6 @@ LOCAL_SRC_FILES :=\
 	core/math/Vec3.cpp\
 	core/math/Vec4.cpp\
 \
-	core/mem/Allocator.cpp\
 	core/mem/HeapAllocator.cpp\
 	core/mem/LinearAllocator.cpp\
 	core/mem/ProxyAllocator.cpp\

+ 0 - 1
engine/CMakeLists.txt

@@ -191,7 +191,6 @@ set (STRINGS_HEADERS
 
 set (MEM_SRC
 	core/mem/Memory.cpp
-	core/mem/Allocator.cpp
 	core/mem/HeapAllocator.cpp
 	core/mem/LinearAllocator.cpp
 	core/mem/StackAllocator.cpp

+ 25 - 9
engine/Device.cpp

@@ -64,12 +64,14 @@ OTHER DEALINGS IN THE SOFTWARE.
 	#include "ApkFilesystem.h"
 #endif
 
+#define MAX_SUBSYSTEMS_HEAP 16 * 1024 * 1024
+
 namespace crown
 {
 
 //-----------------------------------------------------------------------------
 Device::Device() : 
-	m_allocator(m_subsystems_heap, MAX_SUBSYSTEMS_HEAP),
+	m_allocator(default_allocator(), MAX_SUBSYSTEMS_HEAP),
 
 	m_preferred_window_width(1000),
 	m_preferred_window_height(625),
@@ -191,7 +193,7 @@ void Device::init()
 	Log::d("Input manager created.");
 
 	// default_allocator, maybe it needs fix
-	m_window = CE_NEW(default_allocator(), OsWindow)(m_preferred_window_width, m_preferred_window_height, m_parent_window_handle);
+	m_window = CE_NEW(m_allocator, OsWindow)(m_preferred_window_width, m_preferred_window_height, m_parent_window_handle);
 
 	CE_ASSERT(m_window != NULL, "Unable to create the window");
 
@@ -200,8 +202,7 @@ void Device::init()
 	Log::d("Window created.");
 
 	// Create renderer
-	m_renderer = CE_NEW(default_allocator(), Renderer)(m_allocator);
-	CE_ASSERT_NOT_NULL(m_renderer);
+	m_renderer = CE_NEW(m_allocator, Renderer)(m_allocator);
 	m_renderer->init();
 	m_renderer_init_request = false;
 	Log::d("Renderer created.");
@@ -285,13 +286,13 @@ void Device::shutdown()
 	if (m_renderer)
 	{
 		m_renderer->shutdown();
-		CE_DELETE(default_allocator(), m_renderer);
+		CE_DELETE(m_allocator, m_renderer);
 	}
 
 	Log::i("Releasing Window...");
 	if (m_window)
 	{
-		CE_DELETE(default_allocator(), m_window);
+		CE_DELETE(m_allocator, m_window);
 	}
 
 	Log::i("Releasing ResourceManager...");
@@ -687,10 +688,26 @@ void Device::print_help_message()
 	"  --quit-after-init          Quit the engine immediately after the initialization.\n");
 }
 
-Device g_device;
+static Device* g_device = NULL;
+
+//-----------------------------------------------------------------------------
+void init()
+{
+	crown::memory::init();
+	crown::os::init_os();
+	g_device = CE_NEW(default_allocator(), Device);
+}
+
+//-----------------------------------------------------------------------------
+void shutdown()
+{
+	CE_DELETE(default_allocator(), g_device);
+	crown::memory::shutdown();
+}
+
 Device* device()
 {
-	return &g_device;
+	return g_device;
 }
 
 void nothing(float)
@@ -700,4 +717,3 @@ void nothing(float)
 }
 
 } // namespace crown
-

+ 2 - 3
engine/Device.h

@@ -32,8 +32,6 @@ OTHER DEALINGS IN THE SOFTWARE.
 #include "LinearAllocator.h"
 #include "Resource.h"
 
-#define MAX_SUBSYSTEMS_HEAP 1024 * 1024
-
 namespace crown
 {
 
@@ -150,7 +148,6 @@ private:
 private:
 
 	// Used to allocate all subsystems
-	uint8_t					m_subsystems_heap[MAX_SUBSYSTEMS_HEAP];
 	LinearAllocator			m_allocator;
 
 	// Preferred settings
@@ -207,6 +204,8 @@ private:
 	friend class MainThread;
 };
 
+CE_EXPORT void init();
+CE_EXPORT void shutdown();
 CE_EXPORT Device* device();
 
 } // namespace crown

+ 12 - 0
engine/os/android/AndroidDevice.cpp

@@ -32,6 +32,18 @@ OTHER DEALINGS IN THE SOFTWARE.
 namespace crown
 {
 
+//-----------------------------------------------------------------------------
+extern "C" JNIEXPORT void JNICALL Java_crown_android_CrownLib_initCrown(JNIEnv* /*env*/, jobject /*obj*/)
+{
+	crown::init();
+}
+
+//-----------------------------------------------------------------------------
+extern "C" JNIEXPORT void JNICALL Java_crown_android_CrownLib_shutdownCrown(JNIEnv* /*env*/, jobject /*obj*/)
+{
+	crown::shutdown();
+}
+
 //-----------------------------------------------------------------------------
 extern "C" JNIEXPORT void JNICALL Java_crown_android_CrownLib_initDevice(JNIEnv* /*env*/, jobject /*obj*/)
 {

+ 12 - 0
engine/os/android/java/CrownActivity.java

@@ -68,6 +68,9 @@ public class CrownActivity extends Activity
     {
         super.onCreate(savedInstanceState);
 
+        // Initializes low-level systems (memory, os etc.)
+        CrownLib.initCrown();
+
 		// init AssetManager
 		mAssetManager = getAssets();
 		CrownLib.initAssetManager(mAssetManager);
@@ -105,6 +108,15 @@ public class CrownActivity extends Activity
 		Log.i(TAG, "Crown Activity paused");
 	}
 
+//-----------------------------------------------------------------------------
+	public void onDestroy()
+	{
+		super.onDestroy();
+
+		CrownLib.shutdownDevice();
+		CrownLib.shutdownCrown();
+	}
+
 //-----------------------------------------------------------------------------
 	public boolean onTouchEvent(MotionEvent event)
 	{

+ 5 - 0
engine/os/android/java/CrownLib.java

@@ -36,9 +36,14 @@ public class CrownLib
 		System.loadLibrary("luajit-5.1");
 		System.loadLibrary("crown");
 	}
+
+	// Crown functions
+	public static native void		initCrown();
+	public static native void		shutdownCrown();
 	
 	// Device functions
 	public static native void 		initDevice();
+	public static native void		shutdownDevice();
 	public static native void		pauseDevice();
 	public static native void		unpauseDevice();
 	public static native void		stopDevice();

+ 4 - 3
engine/os/linux/main.cpp

@@ -39,8 +39,6 @@ static Thread thread("main-thread");
 
 int32_t main_thread(void* data)
 {
-	crown::os::init_os();
-
 	crown::Device* engine = crown::device();
 
 	MainArgs* args = (MainArgs*)data;
@@ -74,8 +72,11 @@ int32_t ce_main(void* args)
 
 int32_t main(int argc, char** argv)
 {
+	crown::init();
 	crown::MainArgs args;
 	args.argc = argc;
 	args.argv = argv;
-	return crown::ce_main(&args);
+	int32_t ret = crown::ce_main(&args);
+	crown::shutdown();
+	return ret;
 }

+ 20 - 2
engine/os/linux/main2.cpp

@@ -44,6 +44,7 @@ VertexBufferId quad_vb;
 
 UniformId u_albedo_0;
 UniformId u_lightmap_0;
+UniformId u_brightness;
 
 static float quad_vertices[] =
 {
@@ -106,10 +107,11 @@ static const char* texture_fragment =
 
 	"uniform sampler2D  u_albedo_0;"
 	"uniform sampler2D  u_lightmap_0;"
+	"uniform float      u_brightness;"
 
 	"void main(void)"
 	"{"
-	"	gl_FragColor = texture(u_albedo_0, tex_coord0) * texture(u_lightmap_0, tex_coord0) * color;"
+	"	gl_FragColor = texture(u_albedo_0, tex_coord0) * texture(u_lightmap_0, tex_coord0) * color * u_brightness;"
 	"}";
 
 void draw(float dt)
@@ -198,6 +200,20 @@ void draw(float dt)
 	r->set_texture(0, u_albedo_0, grass_texture, filter | TEXTURE_WRAP_CLAMP_EDGE);
 	r->set_texture(1, u_lightmap_0, lightmap_texture, filter | TEXTURE_WRAP_CLAMP_EDGE);
 
+	static float brightness = 1.0f;
+	if (device()->keyboard()->key_pressed(KC_UP))
+	{
+		brightness += 0.01f;
+	}
+	else if (device()->keyboard()->key_pressed(KC_DOWN))
+	{
+		brightness += -0.01f;
+	}
+	if (brightness > 1.0f)
+		brightness = 1.0f;
+
+	r->set_uniform(u_brightness, UNIFORM_FLOAT_1, &brightness, 1);
+
 	pose.set_translation(Vec3(0, 0, -1));
 	r->set_pose(pose);
 	r->commit(0);
@@ -205,7 +221,7 @@ void draw(float dt)
 
 int main(int argc, char** argv)
 {
-	os::init_os();
+	crown::init();
 
 	Device* engine = device();
 	engine->init(argc, argv);
@@ -241,6 +257,7 @@ int main(int argc, char** argv)
 
 	u_albedo_0 = r->create_uniform("u_albedo_0", UNIFORM_INTEGER_1, 1);
 	u_lightmap_0 = r->create_uniform("u_lightmap_0", UNIFORM_INTEGER_1, 1);
+	u_brightness = r->create_uniform("u_brightness", UNIFORM_FLOAT_1, 1);
 
 	default_program = r->create_gpu_program(default_vs, default_fs);
 	texture_program = r->create_gpu_program(default_vs, texture_fs);
@@ -269,4 +286,5 @@ int main(int argc, char** argv)
 	r->destroy_index_buffer(quad_ib);
 
 	engine->shutdown();
+	crown::shutdown();
 }