Move more SDL dependancies out of program, OpenGLCanvas for JNI and JNI methods.

This commit is contained in:
Simon Robertshaw 2012-05-31 10:24:44 +01:00
parent 708d52bcc5
commit e0c9dab8cb
17 changed files with 359 additions and 16 deletions

View File

@ -18,6 +18,7 @@ powder.exe: build/powder.exe
powder-release: build/powder-release powder-release: build/powder-release
powder: build/powder powder: build/powder
powder-x: build/powder-x powder-x: build/powder-x
powder-x.jnilib: build/powder-x.jnilib
build/powder-release.exe: CFLAGS += -DWIN32 -O3 -ftree-vectorize -msse2 -funsafe-math-optimizations -ffast-math -fomit-frame-pointer -funsafe-loop-optimizations -Wunsafe-loop-optimizations build/powder-release.exe: CFLAGS += -DWIN32 -O3 -ftree-vectorize -msse2 -funsafe-math-optimizations -ffast-math -fomit-frame-pointer -funsafe-loop-optimizations -Wunsafe-loop-optimizations
build/powder-release.exe: LFLAGS := -lmingw32 -lregex -lws2_32 -lSDLmain -lpthread -lSDL -lm -lbz2 -llua -lfftw3f-3 -mwindows build/powder-release.exe: LFLAGS := -lmingw32 -lregex -lws2_32 -lSDLmain -lpthread -lSDL -lm -lbz2 -llua -lfftw3f-3 -mwindows
@ -31,6 +32,8 @@ build/powder: LFLAGS := -lSDL -lm -lbz2 -llua -lfftw3f
#build/powder-x: LFLAGS := -lm -lbz2 -lfftw3f -framework SDL -framework Lua -framework Cocoa -framework OpenGL #build/powder-x: LFLAGS := -lm -lbz2 -lfftw3f -framework SDL -framework Lua -framework Cocoa -framework OpenGL
build/powder-x: CFLAGS += -DMACOSX -I/Library/Frameworks/SDL.framework/Headers -I/Library/Frameworks/Lua.framework/Headers -DPIX32BGRA build/powder-x: CFLAGS += -DMACOSX -I/Library/Frameworks/SDL.framework/Headers -I/Library/Frameworks/Lua.framework/Headers -DPIX32BGRA
build/powder-x: LFLAGS := -lm -lbz2 -lfftw3f -framework SDL -framework Lua -framework Cocoa build/powder-x: LFLAGS := -lm -lbz2 -lfftw3f -framework SDL -framework Lua -framework Cocoa
build/powder-x.jnilib: CFLAGS += -DMACOSX -DUSE_JNI -I/Library/Frameworks/Lua.framework/Headers -I/System/Library/Frameworks/JavaVM.framework/Headers -DOGLR -DPIX32OGL -DPIXALPHA
build/powder-x.jnilib: LFLAGS := -lm -lbz2 -lfftw3f -framework Lua -framework JavaVM -framework Cocoa -framework OpenGL
CFLAGS += -DGRAVFFT -DLUACONSOLE CFLAGS += -DGRAVFFT -DLUACONSOLE
@ -68,6 +71,14 @@ buildpaths-powder-x:
$(shell mkdir -p build/obj/powder-x/) $(shell mkdir -p build/obj/powder-x/)
$(shell mkdir -p $(sort $(dir $(patsubst build/obj/%.o,build/obj/powder-x/%.o,$(OBJS))))) $(shell mkdir -p $(sort $(dir $(patsubst build/obj/%.o,build/obj/powder-x/%.o,$(OBJS)))))
build/powder-x.jnilib: buildpaths-powder-x.jnilib generate $(patsubst build/obj/%.o,build/obj/powder-x.jnilib/%.o,$(OBJS))
$(CPPC) -dynamiclib $(CFLAGS) $(OFLAGS) $(LDFLAGS) $(patsubst build/obj/%.o,build/obj/powder-x.jnilib/%.o,$(OBJS)) src/powdertoyjava/OpenGLCanvasMacOS.mm $(LFLAGS) -o $@ -ggdb
build/obj/powder-x.jnilib/%.o: src/%.cpp $(HEADERS)
$(CPPC) -c $(CFLAGS) $(OFLAGS) -o $@ $< -ggdb
buildpaths-powder-x.jnilib:
$(shell mkdir -p build/obj/powder-x.jnilib/)
$(shell mkdir -p $(sort $(dir $(patsubst build/obj/%.o,build/obj/powder-x.jnilib/%.o,$(OBJS)))))
generate: $(GENERATEDSOURCES) generate: $(GENERATEDSOURCES)
touch generate touch generate
python generator.py python generator.py

View File

@ -1,5 +1,4 @@
#include <cmath> #include <cmath>
#include "SDL.h"
#include <bzlib.h> #include <bzlib.h>
#include <string> #include <string>
#include "Config.h" #include "Config.h"

View File

@ -1,7 +1,6 @@
#ifndef GRAPHICS_H #ifndef GRAPHICS_H
#define GRAPHICS_H #define GRAPHICS_H
#include "SDL.h"
#include <string> #include <string>
#if defined(OGLR) #if defined(OGLR)
#include "OpenGLHeaders.h" #include "OpenGLHeaders.h"

View File

@ -9,7 +9,7 @@
#define KITTY_H_ #define KITTY_H_
#include <string> #include <string>
#include "SDL.h" #include "interface/Engine.h"
//#include "game/GameModel.h" //#include "game/GameModel.h"
class GameModel; class GameModel;

View File

@ -803,10 +803,10 @@ Thumbnail * Client::GetPreview(int saveID, int saveDate)
return new Thumbnail(saveID, saveDate, (pixel *)malloc((128*128) * PIXELSIZE), ui::Point(128, 128)); return new Thumbnail(saveID, saveDate, (pixel *)malloc((128*128) * PIXELSIZE), ui::Point(128, 128));
} }
std::vector<Comment*> * Client::GetComments(int saveID, int start, int count) std::vector<SaveComment*> * Client::GetComments(int saveID, int start, int count)
{ {
lastError = ""; lastError = "";
std::vector<Comment*> * commentArray = new std::vector<Comment*>(); std::vector<SaveComment*> * commentArray = new std::vector<SaveComment*>();
std::stringstream urlStream; std::stringstream urlStream;
char * data; char * data;
@ -827,7 +827,7 @@ std::vector<Comment*> * Client::GetComments(int saveID, int start, int count)
json::String tempUsername = commentsArray[j]["Username"]; json::String tempUsername = commentsArray[j]["Username"];
json::String tempComment = commentsArray[j]["Text"]; json::String tempComment = commentsArray[j]["Text"];
commentArray->push_back( commentArray->push_back(
new Comment( new SaveComment(
tempUserID.Value(), tempUserID.Value(),
tempUsername.Value(), tempUsername.Value(),
tempComment.Value() tempComment.Value()

View File

@ -63,7 +63,7 @@ public:
LoginStatus Login(string username, string password, User & user); LoginStatus Login(string username, string password, User & user);
void ClearThumbnailRequests(); void ClearThumbnailRequests();
std::vector<Save*> * SearchSaves(int start, int count, string query, string sort, string category, int & resultCount); std::vector<Save*> * SearchSaves(int start, int count, string query, string sort, string category, int & resultCount);
std::vector<Comment*> * GetComments(int saveID, int start, int count); std::vector<SaveComment*> * GetComments(int saveID, int start, int count);
Thumbnail * GetPreview(int saveID, int saveDate); Thumbnail * GetPreview(int saveID, int saveDate);
Thumbnail * GetThumbnail(int saveID, int saveDate); Thumbnail * GetThumbnail(int saveID, int saveDate);
Save * GetSave(int saveID, int saveDate); Save * GetSave(int saveID, int saveDate);

View File

@ -1,7 +1,6 @@
#pragma once #pragma once
#include <stack> #include <stack>
#include "SDL.h"
#include "Singleton.h" #include "Singleton.h"
#include "Platform.h" #include "Platform.h"
#include "Graphics.h" #include "Graphics.h"

View File

@ -1,3 +1,5 @@
#if defined(USES_SDL)
#define KEY_UP SDLK_UP #define KEY_UP SDLK_UP
#define KEY_DOWN SDLK_DOWN #define KEY_DOWN SDLK_DOWN
#define KEY_RIGHT SDLK_RIGHT #define KEY_RIGHT SDLK_RIGHT
@ -22,3 +24,32 @@
#define BUTTON_LEFT SDL_BUTTON_LEFT #define BUTTON_LEFT SDL_BUTTON_LEFT
#define BUTTON_MIDDLE SDL_BUTTON_MIDDLE #define BUTTON_MIDDLE SDL_BUTTON_MIDDLE
#define BUTTON_RIGHT SDL_BUTTON_RIGHT #define BUTTON_RIGHT SDL_BUTTON_RIGHT
#else
#define KEY_UP 1
#define KEY_DOWN 2
#define KEY_RIGHT 3
#define KEY_LEFT 4
#define KEY_HOME 5
#define KEY_END 6
#define KEY_BACKSPACE 7
#define KEY_DELETE 8
#define KEY_TAB 9
#define KEY_RETURN 10
#define KEY_ENTER 11
#define KEY_ESCAPE 12
#define KEY_CTRL 13
#define KEY_ALT 14
#define KEY_SHIFT 15
#define KEY_MOD_CONTROL 16
#define KEY_MOD_ALT 17
#define KEY_MOD_SHIFT 18
#define BUTTON_LEFT 19
#define BUTTON_MIDDLE 20
#define BUTTON_RIGHT 21
#endif

View File

@ -1,6 +1,6 @@
#pragma once #pragma once
typedef unsigned short Uint16;
/* ***** Platform-ness ***** */ /* ***** Platform-ness ***** */
#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32_LEAN_AND_MEAN) #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32_LEAN_AND_MEAN)

View File

@ -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

View File

@ -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);
}

View File

@ -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

View File

@ -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

View File

@ -8,13 +8,13 @@
#ifndef COMMENT_H_ #ifndef COMMENT_H_
#define COMMENT_H_ #define COMMENT_H_
class Comment class SaveComment
{ {
public: public:
int authorID; int authorID;
std::string authorName; std::string authorName;
std::string comment; std::string comment;
Comment(int userID, std::string username, std::string commentText): SaveComment(int userID, std::string username, std::string commentText):
authorID(userID), authorName(username), comment(commentText) authorID(userID), authorName(username), comment(commentText)
{ {
} }

View File

@ -56,7 +56,7 @@ void * PreviewModel::updateSavePreviewT()
void * PreviewModel::updateSaveCommentsT() void * PreviewModel::updateSaveCommentsT()
{ {
std::vector<Comment*> * tempComments = Client::Ref().GetComments(tSaveID, 0, 10); std::vector<SaveComment*> * tempComments = Client::Ref().GetComments(tSaveID, 0, 10);
updateSaveCommentsFinished = true; updateSaveCommentsFinished = true;
return tempComments; return tempComments;
} }
@ -139,7 +139,7 @@ Save * PreviewModel::GetSave()
return save; return save;
} }
std::vector<Comment*> * PreviewModel::GetComments() std::vector<SaveComment*> * PreviewModel::GetComments()
{ {
return saveComments; return saveComments;
} }

View File

@ -23,7 +23,7 @@ class PreviewModel {
vector<PreviewView*> observers; vector<PreviewView*> observers;
Save * save; Save * save;
Thumbnail * savePreview; Thumbnail * savePreview;
std::vector<Comment*> * saveComments; std::vector<SaveComment*> * saveComments;
void notifyPreviewChanged(); void notifyPreviewChanged();
void notifySaveChanged(); void notifySaveChanged();
void notifySaveCommentsChanged(); void notifySaveCommentsChanged();
@ -53,7 +53,7 @@ public:
PreviewModel(); PreviewModel();
Thumbnail * GetPreview(); Thumbnail * GetPreview();
Save * GetSave(); Save * GetSave();
std::vector<Comment*> * GetComments(); std::vector<SaveComment*> * GetComments();
void AddObserver(PreviewView * observer); void AddObserver(PreviewView * observer);
void UpdateSave(int saveID, int saveDate); void UpdateSave(int saveID, int saveDate);
void SetFavourite(bool favourite); void SetFavourite(bool favourite);

View File

@ -199,7 +199,7 @@ void PreviewView::NotifyCommentsChanged(PreviewModel * sender)
int currentY = 0; int currentY = 0;
ui::Label * tempUsername; ui::Label * tempUsername;
ui::Textblock * tempComment; ui::Textblock * tempComment;
std::vector<Comment*> * tempComments = sender->GetComments(); std::vector<SaveComment*> * tempComments = sender->GetComments();
if(tempComments) if(tempComments)
{ {
for(int i = 0; i < tempComments->size(); i++) for(int i = 0; i < tempComments->size(); i++)