summaryrefslogtreecommitdiff
path: root/src/powdertoyjava
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2012-06-20 12:40:18 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2012-06-20 12:40:18 (GMT)
commit2be9c925088c16beb144dd9932202416d00ff581 (patch)
tree51f8ccbf2b0b051890c5f5d12fa28a67635c06c2 /src/powdertoyjava
parent9769239af69695e9a7f8cf103a197695ecf691e0 (diff)
downloadpowder-2be9c925088c16beb144dd9932202416d00ff581.zip
powder-2be9c925088c16beb144dd9932202416d00ff581.tar.gz
OpenGL canvas for Windows, Notifications for main Game, Update checker in Client (+ other client triggered events)
Diffstat (limited to 'src/powdertoyjava')
-rw-r--r--src/powdertoyjava/OpenGLCanvasWin32.cpp169
-rw-r--r--src/powdertoyjava/OpenGLCanvasWin32.h35
-rw-r--r--src/powdertoyjava/PowderToyJava.cpp7
-rw-r--r--src/powdertoyjava/PowderToyJava.h5
4 files changed, 207 insertions, 9 deletions
diff --git a/src/powdertoyjava/OpenGLCanvasWin32.cpp b/src/powdertoyjava/OpenGLCanvasWin32.cpp
new file mode 100644
index 0000000..9df0a0b
--- /dev/null
+++ b/src/powdertoyjava/OpenGLCanvasWin32.cpp
@@ -0,0 +1,169 @@
+#if defined(USE_JNI) && defined(WIN32)
+#include "OpenGLCanvasWin32.h"
+
+static jfieldID ctxID = NULL;
+
+int defaultPixelFormat(PIXELFORMATDESCRIPTOR* pfd)
+{
+ ::ZeroMemory( pfd, sizeof( PIXELFORMATDESCRIPTOR ) );
+ pfd->nSize = sizeof( PIXELFORMATDESCRIPTOR );
+ pfd->nVersion = 1;
+ pfd->dwFlags = PFD_DRAW_TO_WINDOW |
+ PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
+ pfd->iPixelType = PFD_TYPE_RGBA;
+ pfd->cColorBits = 24;
+ pfd->cDepthBits = 16;
+ pfd->iLayerType = PFD_MAIN_PLANE;
+ return 0;
+}
+
+HGLRC ensureContext(JAWT_Win32DrawingSurfaceInfo* dsi_win, HGLRC hRC) {
+
+ if (!hRC) {
+ int iFormat;
+ PIXELFORMATDESCRIPTOR pfd;
+ defaultPixelFormat(&pfd);
+
+ iFormat = ChoosePixelFormat( dsi_win->hdc, &pfd );
+ SetPixelFormat( dsi_win->hdc, iFormat, &pfd );
+
+ hRC = wglCreateContext( dsi_win->hdc );
+ }
+ if (1 && wglGetCurrentDC() != dsi_win->hdc) {
+ wglMakeCurrent( dsi_win->hdc, hRC );
+ }
+
+ return hRC;
+}
+
+ContextInfo* getContext(JNIEnv *env, jobject canvas)
+{
+ ContextInfo *ci;
+ if (!ctxID) {
+ jclass cls = env->GetObjectClass(canvas);
+ ctxID = env->GetFieldID(cls, "openGLContext", "J");
+ }
+
+ 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)
+{
+ jint lock;
+ ContextInfo *ci = getContext(env, canvas);
+
+ // Get the drawing surface. This can be safely cached -- not in win32
+ // 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);
+
+ // Lock the drawing surface
+ // You must lock EACH TIME before drawing
+ 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_win = (JAWT_Win32DrawingSurfaceInfo*)ci->dsi->platformInfo;
+ if (env->ExceptionOccurred()) {
+ env->ExceptionDescribe();
+ }
+
+ // Get the corresponding peer from the caller canvas
+ ci->hRC = ensureContext(ci->dsi_win, ci->hRC);
+
+ return JNI_TRUE;
+ }
+
+ return JNI_FALSE;
+}
+
+JNIEXPORT void JNICALL Java_OpenGLCanvas_endOpenGL(JNIEnv *env, jobject canvas)
+{
+ ContextInfo *ci = getContext(env, canvas);
+
+ SwapBuffers( ci->dsi_win->hdc );
+
+ // 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();
+ }
+
+ // Free the drawing surface (if not caching it)
+ ci->awt->FreeDrawingSurface(ci->ds);
+ if (env->ExceptionOccurred()) {
+ env->ExceptionDescribe();
+ }
+}
+
+JNIEXPORT void JNICALL Java_OpenGLCanvas_updateOpenGL(JNIEnv *env, jobject canvas)
+{
+ ContextInfo *ci = getContext(env, canvas);
+
+ wglMakeCurrent( ci->dsi_win->hdc, ci->hRC );
+}
+
+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);
+}
+
+JNIEXPORT void JNICALL Java_OpenGLCanvas_releaseOpenGL(JNIEnv *env, jobject canvas)
+{
+ ContextInfo *ci = getContext(env, canvas);
+ if (ci->hRC) {
+ wglDeleteContext(ci->hRC);
+ }
+
+ freeContext(env, canvas, ci);
+}
+#endif
diff --git a/src/powdertoyjava/OpenGLCanvasWin32.h b/src/powdertoyjava/OpenGLCanvasWin32.h
new file mode 100644
index 0000000..bff6b20
--- /dev/null
+++ b/src/powdertoyjava/OpenGLCanvasWin32.h
@@ -0,0 +1,35 @@
+#ifdef USE_JNI
+#import <jawt_md.h>
+
+#include <windows.h>
+#include <assert.h>
+#include <gl/gl.h>
+
+int defaultPixelFormat(PIXELFORMATDESCRIPTOR* pfd);
+
+HGLRC ensureContext(JAWT_Win32DrawingSurfaceInfo* dsi_win, HGLRC hRC);
+
+typedef struct {
+ JAWT* awt;
+ JAWT_DrawingSurface* ds;
+ JAWT_DrawingSurfaceInfo* dsi;
+ JAWT_Win32DrawingSurfaceInfo* dsi_win;
+ HGLRC hRC;
+} 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
+#endif
diff --git a/src/powdertoyjava/PowderToyJava.cpp b/src/powdertoyjava/PowderToyJava.cpp
index 969d9b2..bcc9344 100644
--- a/src/powdertoyjava/PowderToyJava.cpp
+++ b/src/powdertoyjava/PowderToyJava.cpp
@@ -1,4 +1,4 @@
-#if defined(USE_JNI) && defined(MACOSX)
+#if defined(USE_JNI)
#include <time.h>
#include <iostream>
@@ -8,9 +8,6 @@
#include "Config.h"
#include "PowderToyJava.h"
#include "Graphics.h"
-#if defined(LIN32) || defined(LIN64)
-#include "icon.h"
-#endif
#include "game/GameController.h"
@@ -24,8 +21,6 @@ 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();
diff --git a/src/powdertoyjava/PowderToyJava.h b/src/powdertoyjava/PowderToyJava.h
index be0b8b1..d39a8a9 100644
--- a/src/powdertoyjava/PowderToyJava.h
+++ b/src/powdertoyjava/PowderToyJava.h
@@ -1,5 +1,4 @@
-//#include </System/Library/Frameworks/JavaVM.framework/Headers/jni.h>
-#include </System/Library/Frameworks/JavaVM.framework/Headers/jni.h>
+#include <jni.h>
#ifndef POWDERTOYJAVA
#define POWDERTOYJAVA
@@ -19,4 +18,4 @@ extern "C" {
#ifdef __cplusplus
}
#endif
-#endif \ No newline at end of file
+#endif