summaryrefslogtreecommitdiff
path: root/src/powdertoyjava
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2012-05-31 09:24:44 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2012-05-31 09:24:44 (GMT)
commite0c9dab8cb981172c5de81f5963e28db67f1b295 (patch)
treedd78e82f54a7ed87915a7d5100437cd42ac0c415 /src/powdertoyjava
parent708d52bcc5f0e13fa6540751e2402ccfdf02bec7 (diff)
downloadpowder-e0c9dab8cb981172c5de81f5963e28db67f1b295.zip
powder-e0c9dab8cb981172c5de81f5963e28db67f1b295.tar.gz
Move more SDL dependancies out of program, OpenGLCanvas for JNI and JNI methods.
Diffstat (limited to 'src/powdertoyjava')
-rw-r--r--src/powdertoyjava/OpenGLCanvasMacOS.h33
-rw-r--r--src/powdertoyjava/OpenGLCanvasMacOS.mm167
-rw-r--r--src/powdertoyjava/PowderToyJava.cpp82
-rw-r--r--src/powdertoyjava/PowderToyJava.h22
4 files changed, 304 insertions, 0 deletions
diff --git a/src/powdertoyjava/OpenGLCanvasMacOS.h b/src/powdertoyjava/OpenGLCanvasMacOS.h
new file mode 100644
index 0000000..3f3d68f
--- /dev/null
+++ b/src/powdertoyjava/OpenGLCanvasMacOS.h
@@ -0,0 +1,33 @@
+#import <jawt_md.h>
+
+#import <Cocoa/Cocoa.h>
+#import <AppKit/NSOpenGL.h>
+
+NSOpenGLPixelFormat* defaultPixelFormat();
+
+NSOpenGLContext* ensureContext(NSOpenGLContext* openGLContext, NSView *view);
+
+typedef struct {
+ JAWT* awt;
+ JAWT_DrawingSurface* ds;
+ JAWT_DrawingSurfaceInfo* dsi;
+ JAWT_MacOSXDrawingSurfaceInfo* dsi_mac;
+ NSView *view;
+ NSOpenGLContext* openGLContext;
+} ContextInfo;
+
+ContextInfo* getContext(JNIEnv *env, jobject canvas);
+
+void freeContext(JNIEnv *env, jobject canvas, ContextInfo* ci);
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ JNIEXPORT jboolean JNICALL Java_OpenGLCanvas_beginOpenGL(JNIEnv *env, jobject canvas);
+ JNIEXPORT void JNICALL Java_OpenGLCanvas_endOpenGL(JNIEnv *env, jobject canvas);
+ JNIEXPORT void JNICALL Java_OpenGLCanvas_updateOpenGL(JNIEnv *env, jobject canvas);
+ JNIEXPORT void JNICALL Java_OpenGLCanvas_allocOpenGL(JNIEnv *env, jobject canvas);
+ JNIEXPORT void JNICALL Java_OpenGLCanvas_releaseOpenGL(JNIEnv *env, jobject canvas);
+#ifdef __cplusplus
+}
+#endif \ No newline at end of file
diff --git a/src/powdertoyjava/OpenGLCanvasMacOS.mm b/src/powdertoyjava/OpenGLCanvasMacOS.mm
new file mode 100644
index 0000000..009c32e
--- /dev/null
+++ b/src/powdertoyjava/OpenGLCanvasMacOS.mm
@@ -0,0 +1,167 @@
+#include "OpenGLCanvasMacOS.h"
+
+static jfieldID ctxID = NULL;
+
+NSOpenGLPixelFormat* defaultPixelFormat()
+{
+ NSOpenGLPixelFormatAttribute attributes [] = {
+ NSOpenGLPFAWindow,
+ NSOpenGLPFADoubleBuffer,
+ NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute)16,
+ 0
+ };
+ return [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes];
+}
+
+NSOpenGLContext* ensureContext(NSOpenGLContext* openGLContext, NSView *view) {
+ NSOpenGLContext* _openGLContext = openGLContext;
+ if (!_openGLContext) {
+ NSOpenGLPixelFormat* pixelFormat = defaultPixelFormat();
+ _openGLContext = [[NSOpenGLContext alloc]
+ initWithFormat:pixelFormat
+ shareContext:nil];
+ [pixelFormat release];
+ }
+ if ([_openGLContext view] != view) {
+ [_openGLContext setView:view];
+ }
+ [_openGLContext makeCurrentContext];
+
+ return _openGLContext;
+}
+
+ContextInfo* getContext(JNIEnv *env, jobject canvas)
+{
+ if (!ctxID) {
+ jclass cls = env->GetObjectClass(canvas);
+ ctxID = env->GetFieldID(cls, "openGLContext", "J");
+ }
+
+ ContextInfo *ci = (ContextInfo *)(long)(env->GetLongField(canvas, ctxID));
+
+ if (!ci) {
+ ci = (ContextInfo *)calloc(sizeof(ContextInfo), 1);
+ ci->awt = (JAWT *)calloc(sizeof(JAWT), 1);
+ env->SetLongField(canvas, ctxID, (jlong)(long)ci);
+ }
+
+ return ci;
+}
+
+void freeContext(JNIEnv *env, jobject canvas, ContextInfo* ci)
+{
+ if (ci) {
+ free(ci->awt);
+ free(ci);
+ env->SetLongField(canvas, ctxID, 0L);
+ }
+}
+
+JNIEXPORT jboolean JNICALL Java_OpenGLCanvas_beginOpenGL(JNIEnv *env, jobject canvas)
+{
+ ContextInfo *ci = getContext(env, canvas);
+
+ // Lock the drawing surface
+ // You must lock EACH TIME before drawing
+ jint lock = ci->ds->Lock(ci->ds);
+ if (env->ExceptionOccurred()) {
+ env->ExceptionDescribe();
+ }
+ assert((lock & JAWT_LOCK_ERROR) == 0);
+
+ // Get the drawing surface info
+ ci->dsi = ci->ds->GetDrawingSurfaceInfo(ci->ds);
+
+ // Check DrawingSurfaceInfo. This can be NULL on Mac OS X
+ // if the windowing system is not ready
+ if (ci->dsi != NULL) {
+ // Get the platform-specific drawing info
+ // We will use this to get at Cocoa and CoreGraphics
+ // See <JavaVM/jawt_md.h>
+ ci->dsi_mac = (JAWT_MacOSXDrawingSurfaceInfo*)ci->dsi->platformInfo;
+ if (env->ExceptionOccurred()) {
+ env->ExceptionDescribe();
+ }
+
+ // Get the corresponding peer from the caller canvas
+ ci->view = ci->dsi_mac->cocoaViewRef;
+ ci->openGLContext = ensureContext(ci->openGLContext, ci->view);
+
+ return JNI_TRUE;
+ }
+
+ return JNI_FALSE;
+}
+
+JNIEXPORT void JNICALL Java_OpenGLCanvas_endOpenGL(JNIEnv *env, jobject canvas)
+{
+ ContextInfo *ci = getContext(env, canvas);
+
+ [ci->openGLContext flushBuffer];
+
+ // Free the DrawingSurfaceInfo
+ ci->ds->FreeDrawingSurfaceInfo(ci->dsi);
+ if (env->ExceptionOccurred()){
+ env->ExceptionDescribe();
+ }
+
+ // Unlock the drawing surface
+ // You must unlock EACH TIME when done drawing
+ ci->ds->Unlock(ci->ds);
+ if (env->ExceptionOccurred()) {
+ env->ExceptionDescribe();
+ }
+}
+
+JNIEXPORT void JNICALL Java_OpenGLCanvas_updateOpenGL(JNIEnv *env, jobject canvas)
+{
+ ContextInfo *ci = getContext(env, canvas);
+
+ [ci->openGLContext update];
+}
+
+JNIEXPORT void JNICALL Java_OpenGLCanvas_allocOpenGL(JNIEnv *env, jobject canvas)
+{
+ ContextInfo *ci = getContext(env, canvas);
+
+ jboolean result = JNI_FALSE;
+
+ // get the AWT
+ ci->awt->version = JAWT_VERSION_1_4;
+ result = JAWT_GetAWT(env, ci->awt);
+ if (env->ExceptionOccurred()) {
+ env->ExceptionDescribe();
+ }
+ assert(result != JNI_FALSE);
+
+ // Get the drawing surface. This can be safely cached.
+ // Anything below the DS (DSI, contexts, etc)
+ // can possibly change/go away and should not be cached.
+ ci->ds = ci->awt->GetDrawingSurface(env, canvas);
+ if (env->ExceptionOccurred()) {
+ env->ExceptionDescribe();
+ }
+ assert(ci->ds != NULL);
+
+ NSLog(@"Alloc Context %d", ci);
+}
+
+JNIEXPORT void JNICALL Java_OpenGLCanvas_releaseOpenGL(JNIEnv *env, jobject canvas)
+{
+ ContextInfo *ci = getContext(env, canvas);
+ NSLog(@"Release Context %d", ci);
+ if (ci->openGLContext) {
+ if ([ci->openGLContext view] /* == self */) {
+ [ci->openGLContext clearDrawable];
+ }
+ [ci->openGLContext release];
+ }
+
+ // Free the drawing surface (if not caching it)
+ ci->awt->FreeDrawingSurface(ci->ds);
+ if (env->ExceptionOccurred()) {
+ env->ExceptionDescribe();
+ }
+
+ freeContext(env, canvas, ci);
+} \ No newline at end of file
diff --git a/src/powdertoyjava/PowderToyJava.cpp b/src/powdertoyjava/PowderToyJava.cpp
new file mode 100644
index 0000000..969d9b2
--- /dev/null
+++ b/src/powdertoyjava/PowderToyJava.cpp
@@ -0,0 +1,82 @@
+#if defined(USE_JNI) && defined(MACOSX)
+
+#include <time.h>
+#include <iostream>
+#include <sstream>
+#include <string>
+
+#include "Config.h"
+#include "PowderToyJava.h"
+#include "Graphics.h"
+#if defined(LIN32) || defined(LIN64)
+#include "icon.h"
+#endif
+
+#include "game/GameController.h"
+
+using namespace std;
+
+GameController * gameController;
+ui::Engine * engine;
+
+int elapsedTime = 0, currentTime = 0, lastTime = 0, currentFrame = 0;
+float fps = 0, delta = 1.0f;
+
+JNIEXPORT void JNICALL Java_PowderToy_initialise(JNIEnv * env, jobject canvas)
+{
+ //InitWindowMac(env, canvas);
+
+ ui::Engine::Ref().g = new Graphics();
+
+ engine = &ui::Engine::Ref();
+ engine->Begin(XRES+BARSIZE, YRES+MENUSIZE);
+
+ gameController = new GameController();
+ engine->ShowWindow(gameController->GetView());
+ engine->SetFps(fps);
+}
+
+JNIEXPORT void JNICALL Java_PowderToy_tick(JNIEnv * env, jobject canvas)
+{
+ engine->Tick();
+}
+
+JNIEXPORT void JNICALL Java_PowderToy_draw(JNIEnv * env, jobject canvas)
+{
+ engine->Draw();
+ engine->g->Finalise();
+}
+
+JNIEXPORT void JNICALL Java_PowderToy_finish(JNIEnv * env, jobject canvas)
+{
+ ui::Engine::Ref().CloseWindow();
+ delete gameController;
+ delete ui::Engine::Ref().g;
+}
+
+JNIEXPORT jint JNICALL Java_PowderToy_getWidth(JNIEnv * env, jobject canvas)
+{
+ return XRES+BARSIZE;
+}
+
+JNIEXPORT jint JNICALL Java_PowderToy_getHeight(JNIEnv * env, jobject canvas)
+{
+ return YRES+MENUSIZE;
+}
+
+JNIEXPORT void JNICALL Java_PowderToy_mousePressed(JNIEnv * env, jobject canvas, jint mouseX, jint mouseY, jint mouseButton)
+{
+ engine->onMouseClick(mouseX, mouseY, mouseButton);
+}
+
+JNIEXPORT void JNICALL Java_PowderToy_mouseReleased(JNIEnv * env, jobject canvas, jint mouseX, jint mouseY, jint mouseButton)
+{
+ engine->onMouseUnclick(mouseX, mouseY, mouseButton);
+}
+
+JNIEXPORT void JNICALL Java_PowderToy_mouseMoved(JNIEnv * env, jobject canvas, jint mouseX, jint mouseY)
+{
+ engine->onMouseMove(mouseX, mouseY);
+}
+
+#endif
diff --git a/src/powdertoyjava/PowderToyJava.h b/src/powdertoyjava/PowderToyJava.h
new file mode 100644
index 0000000..be0b8b1
--- /dev/null
+++ b/src/powdertoyjava/PowderToyJava.h
@@ -0,0 +1,22 @@
+//#include </System/Library/Frameworks/JavaVM.framework/Headers/jni.h>
+#include </System/Library/Frameworks/JavaVM.framework/Headers/jni.h>
+
+#ifndef POWDERTOYJAVA
+#define POWDERTOYJAVA
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ JNIEXPORT void JNICALL Java_PowderToy_initialise(JNIEnv *, jobject);
+ JNIEXPORT void JNICALL Java_PowderToy_tick(JNIEnv *, jobject);
+ JNIEXPORT void JNICALL Java_PowderToy_draw(JNIEnv *, jobject);
+ JNIEXPORT void JNICALL Java_PowderToy_finish(JNIEnv *, jobject);
+ JNIEXPORT jint JNICALL Java_PowderToy_getWidth(JNIEnv * env, jobject canvas);
+ JNIEXPORT jint JNICALL Java_PowderToy_getHeight(JNIEnv * env, jobject canvas);
+ JNIEXPORT void JNICALL Java_PowderToy_mousePressed(JNIEnv * env, jobject canvas, jint mouseX, jint mouseY, jint mouseButton);
+ JNIEXPORT void JNICALL Java_PowderToy_mouseReleased(JNIEnv * env, jobject canvas, jint mouseX, jint mouseY, jint mouseButton);
+ JNIEXPORT void JNICALL Java_PowderToy_mouseMoved(JNIEnv * env, jobject canvas, jint mouseX, jint mouseY);
+#ifdef __cplusplus
+}
+#endif
+#endif \ No newline at end of file