*** empty log message ***

This commit is contained in:
Caspian Rychlik-Prince 2003-03-28 19:02:24 +00:00
parent 895c751ec6
commit 4924c564d5
11 changed files with 168 additions and 76 deletions

View File

@ -48,11 +48,6 @@ import java.util.Arrays;
public final class Display {
static {
System.loadLibrary(Sys.getLibraryName());
init();
}
/** Has the display been created? */
private static boolean created;
@ -79,6 +74,11 @@ public final class Display {
/** MacOSX platform */
public static final int PLATFORM_AGL = 2;
static {
System.loadLibrary(Sys.getLibraryName());
init();
}
/**
* No construction allowed.
*/

View File

@ -26,8 +26,11 @@ public abstract class Window {
System.loadLibrary(Sys.getLibraryName());
}
/** Whether we have a window already */
/** The currently created window */
private static Window currentWindow;
/** Whether the window is currently created, ie. has a native peer */
private boolean created;
/** The window's native data structure. On Win32 this is an HWND. */
private int handle;
@ -66,7 +69,7 @@ public abstract class Window {
* In this abstract base class, no actual window peer is constructed. This should be
* done in specialised derived classes.
*
* Only one Window can be constructed at a time; to create another Window you must
* Only one Window can be created() at a time; to create another Window you must
* first destroy() the first window.
*
* @param title The window's title
@ -76,15 +79,12 @@ public abstract class Window {
* @throws RuntimeException if you attempt to create more than one window at the same time
*/
protected Window(String title, int x, int y, int width, int height) {
if (currentWindow != null)
throw new RuntimeException("Only one LWJGL window may be instantiated at any one time.");
this.title = title;
this.x = x;
this.y = y;
this.width = width;
this.height = height;
currentWindow = this;
}
/**
@ -164,14 +164,40 @@ public abstract class Window {
*/
private native void swapBuffers();
/**
* Create the window.
*/
public final void create() throws Exception {
if (currentWindow != null)
throw new RuntimeException("Only one LWJGL window may be instantiated at any one time.");
doCreate();
currentWindow = this;
created = true;
}
/**
* Create the window (derived classes).
* @throws Exception
*/
protected abstract void doCreate() throws Exception;
/**
* Destroy the window.
*/
public void destroy() {
currentWindow = null;
public final void destroy() {
if (!created)
return;
doDestroy();
nDestroy();
currentWindow = null;
created = false;
}
/**
* Destroy the window (derived classes)
*/
protected abstract void doDestroy();
/**
* Natively destroy the window
*/
@ -185,10 +211,10 @@ public abstract class Window {
}
/**
* @return true if a window has been created
* @return true if the window's native peer has been created
*/
public static boolean isCreated() {
return currentWindow != null;
public final boolean isCreated() {
return created;
}
/**
@ -197,4 +223,20 @@ public abstract class Window {
*/
public final native void tick();
/* (non-Javadoc)
* @see java.lang.Object#finalize()
*/
protected void finalize() throws Throwable {
super.finalize();
destroy();
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString() {
return "Window["+title+"]";
}
}

View File

@ -35,7 +35,6 @@ package org.lwjgl.input;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import org.lwjgl.*;
import org.lwjgl.Sys;
/**
@ -249,8 +248,6 @@ public class Keyboard {
public static void create() throws Exception {
if (created)
return;
if (!Window.isCreated())
throw new Exception("The display has not yet been created.");
if (!nCreate())
throw new Exception("The keyboard could not be created.");
created = true;

View File

@ -101,8 +101,6 @@ public class Mouse {
public static void create() throws Exception {
if (created)
return;
if (!Window.isCreated())
throw new Exception("The display has not yet been created.");
if (!nCreate())
throw new Exception("The mouse could not be created.");
created = true;

View File

@ -51,16 +51,37 @@ import org.lwjgl.Window;
* @author cix_foo <cix_foo@users.sourceforge.net>
* @version $Revision$
*/
public abstract class BaseGL extends Window {
public class BaseGL extends Window {
static {
System.loadLibrary(Sys.getLibraryName());
}
/** The current rendering context */
private static BaseGL currentContext;
//private static BaseGL currentContext;
/** Has the GL been created yet? */
private boolean created;
/** Handle to the native GL rendering context */
protected int handle;
/** Color bits */
protected final int color;
/** Alpha bits */
protected final int alpha;
/** Depth bits */
protected final int depth;
/** Stencil bits */
protected final int stencil;
private int x, y;
/** Fullscreen */
protected final boolean fullscreen;
/**
* Construct a windowed instance of GL. If the underlying OS does not
@ -78,7 +99,14 @@ public abstract class BaseGL extends Window {
public BaseGL(String title, int x, int y, int width, int height, int bpp, int alpha, int depth, int stencil) throws Exception {
super(title, x, y, width, height);
nCreate(title, x, y, width, height, false, bpp, alpha, depth, stencil);
this.x = x;
this.y = y;
this.color = bpp;
this.alpha = alpha;
this.depth = depth;
this.stencil = stencil;
this.fullscreen = false;
}
/**
@ -92,33 +120,44 @@ public abstract class BaseGL extends Window {
public BaseGL(String title, int bpp, int alpha, int depth, int stencil) throws Exception {
super(title, 0, 0, Display.getWidth(), Display.getHeight());
nCreate(title, 0, 0, Display.getWidth(), Display.getHeight(), true, bpp, alpha, depth, stencil);
this.x = 0;
this.y = 0;
this.color = bpp;
this.alpha = alpha;
this.depth = depth;
this.stencil = stencil;
this.fullscreen = true;
}
protected void doCreate() throws Exception {
nCreate(x, y, getWidth(), getHeight(), color, alpha, depth, stencil, fullscreen);
}
/**
* Native method to create a windowed GL
*/
private native void nCreate(String title, int x, int y, int width, int height, boolean fullscreen, int bpp, int alpha, int depth, int stencil) throws Exception;
/**
* Finalizer, marked final. Ensures the window is destroyed.
*/
public final void finalize() throws Throwable {
super.finalize();
destroy();
}
/* (non-Javadoc)
* @see org.lwjgl.Window#destroy()
*/
public void destroy() {
// Do native destroy first
super.destroy();
}
private native void nCreate(
int x,
int y,
int width,
int height,
int bpp,
int alpha,
int depth,
int stencil,
boolean fullscreen) throws Exception;
/* (non-Javadoc)
* @see org.lwjgl.Window#doDestroy()
*/
protected void doDestroy() {
nDestroyGL();
}
/**
* Natively destroy any GL-related stuff
*/
private native void nDestroy();
private native void nDestroyGL();
}

View File

@ -62,7 +62,6 @@ public class GL extends CoreGL implements GLConstants {
*/
public GL(String title, int x, int y, int width, int height, int bpp, int alpha, int depth, int stencil) throws Exception {
super(title, x, y, width, height, bpp, alpha, depth, stencil);
determineAvailableExtensions();
}
/**
@ -75,9 +74,18 @@ public class GL extends CoreGL implements GLConstants {
*/
public GL(String title, int bpp, int alpha, int depth, int stencil) throws Exception {
super(title, bpp, alpha, depth, stencil);
}
/* (non-Javadoc)
* @see org.lwjgl.opengl.BaseGL#doCreate()
*/
protected void doCreate() throws Exception {
super.doCreate();
determineAvailableExtensions();
}
public native void activeStencilFaceEXT(int face);
public native void activeTextureARB(int texture);
@ -1573,7 +1581,7 @@ public class GL extends CoreGL implements GLConstants {
/**
* Determine which extensions are available
*/
private void determineAvailableExtensions() {
public void determineAvailableExtensions() {
determineAvailableWGLExtensions();

View File

@ -8,21 +8,20 @@
extern "C" {
#endif
/* Inaccessible static: currentWindow */
/* Inaccessible static: currentContext */
/*
* Class: org_lwjgl_opengl_BaseGL
* Method: nCreate
* Signature: (Ljava/lang/String;IIIIZIIII)V
* Signature: (IIIIIIIIZ)V
*/
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_BaseGL_nCreate
(JNIEnv *, jobject, jstring, jint, jint, jint, jint, jboolean, jint, jint, jint, jint);
(JNIEnv *, jobject, jint, jint, jint, jint, jint, jint, jint, jint, jboolean);
/*
* Class: org_lwjgl_opengl_BaseGL
* Method: nDestroy
* Method: nDestroyGL
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_BaseGL_nDestroy
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_BaseGL_nDestroyGL
(JNIEnv *, jobject);
#ifdef __cplusplus

View File

@ -58,7 +58,7 @@
extern HDC hdc; // Device context
extern LPDIRECTINPUT lpdi; // DirectInput
extern bool isFullScreen; // Whether we're fullscreen or not
extern bool isMinimized; // Whether we're minimized or not
#endif /* _PRIVATE_WINDOW_H_ */
/*

View File

@ -191,17 +191,17 @@ JNIEXPORT void JNICALL Java_org_lwjgl_Display_setDisplayMode
(JNIEnv * env, jclass clazz, jobject mode)
{
jfieldID fid_width = env->GetFieldID(clazz, "width", "I");
jfieldID fid_height = env->GetFieldID(clazz, "height", "I");
jfieldID fid_bpp = env->GetFieldID(clazz, "bpp", "I");
jfieldID fid_freq = env->GetFieldID(clazz, "freq", "I");
jclass cls_displayMode = env->FindClass("org/lwjgl/DisplayMode");
jfieldID fid_width = env->GetFieldID(cls_displayMode, "width", "I");
jfieldID fid_height = env->GetFieldID(cls_displayMode, "height", "I");
jfieldID fid_bpp = env->GetFieldID(cls_displayMode, "bpp", "I");
jfieldID fid_freq = env->GetFieldID(cls_displayMode, "freq", "I");
int width = env->GetIntField(mode, fid_width);
int height = env->GetIntField(mode, fid_height);
int bpp = env->GetIntField(mode, fid_bpp);
int freq = env->GetIntField(mode, fid_freq);
DEVMODE devmode;
devmode.dmSize = sizeof(DEVMODE);
devmode.dmBitsPerPel = bpp;
@ -229,6 +229,7 @@ JNIEXPORT void JNICALL Java_org_lwjgl_Display_setDisplayMode
printf("Failed to set display mode using dual monitors\n");
#endif
throwException(env, "Failed to set display mode.");
return;
}
}
@ -245,13 +246,12 @@ JNIEXPORT void JNICALL Java_org_lwjgl_Display_setDisplayMode
freq = GetDeviceCaps(screenDC, VREFRESH);
if (freq <= 1)
freq = 0; // Unknown
ReleaseDC(NULL, screenDC);
DeleteDC(screenDC);
jclass jclass_DisplayMode = env->FindClass("org/lwjgl/DisplayMode");
jmethodID ctor = env->GetMethodID(jclass_DisplayMode, "<init>", "(IIII)V");
jobject newMode = env->NewObject(jclass_DisplayMode, ctor, width, height, bpp, freq);
jfieldID fid_mode= env->GetStaticFieldID(clazz, "mode", "[org/lwjgl/DisplayMode;");
env->SetStaticObjectField(clazz, fid_mode, newMode);
jmethodID ctor = env->GetMethodID(cls_displayMode, "<init>", "(IIII)V");
jobject newMode = env->NewObject(cls_displayMode, ctor, width, height, bpp, freq);
jfieldID fid_initialMode = env->GetStaticFieldID(clazz, "mode", "Lorg/lwjgl/DisplayMode;");
env->SetStaticObjectField(clazz, fid_initialMode, newMode);
env->DeleteLocalRef(newMode);
}
@ -302,9 +302,12 @@ JNIEXPORT void JNICALL Java_org_lwjgl_Display_init
(JNIEnv * env, jclass clazz)
{
// Determine the current screen resolution
// Get the screen
HDC screenDC = CreateCompatibleDC(NULL);
if (!screenDC) {
printf("Couldn't get screen DC!\n");
return;
}
// Get the device caps
int width = GetDeviceCaps(screenDC, HORZRES);
int height = GetDeviceCaps(screenDC, VERTRES);
@ -312,13 +315,12 @@ JNIEXPORT void JNICALL Java_org_lwjgl_Display_init
int freq = GetDeviceCaps(screenDC, VREFRESH);
if (freq <= 1)
freq = 0; // Unknown
ReleaseDC(NULL, screenDC);
DeleteDC(screenDC);
jclass jclass_DisplayMode = env->FindClass("org/lwjgl/DisplayMode");
jmethodID ctor = env->GetMethodID(jclass_DisplayMode, "<init>", "(IIII)V");
jobject newMode = env->NewObject(jclass_DisplayMode, ctor, width, height, bpp, freq);
jfieldID fid_initialMode = env->GetFieldID(clazz, "initialMode", "[org/lwjgl/DisplayMode;");
jfieldID fid_initialMode = env->GetStaticFieldID(clazz, "mode", "Lorg/lwjgl/DisplayMode;");
env->SetStaticObjectField(clazz, fid_initialMode, newMode);
env->DeleteLocalRef(newMode);
}

View File

@ -48,6 +48,7 @@ HWND hwnd = NULL; // Handle to the window
HDC hdc = NULL; // Device context
LPDIRECTINPUT lpdi = NULL; // DirectInput
bool isFullScreen = false; // Whether we're fullscreen or not
bool isMinimized = false; // Whether we're minimized or not
JNIEnv * environment; // Cached environment
jobject window; // Cached Java Window instance handle
extern HINSTANCE dll_handle; // Handle to the LWJGL dll
@ -169,11 +170,11 @@ LRESULT CALLBACK lwjglWindowProc(HWND hWnd,
break;
case WM_ACTIVATE:
{
bool isMinimized = false;
switch(LOWORD(wParam)) {
case WA_ACTIVE:
case WA_CLICKACTIVE:
environment->SetBooleanField(window, environment->GetFieldID(environment->GetObjectClass(window), "minimized", "Z"), false);
isMinimized = false;
break;
case WA_INACTIVE:
environment->SetBooleanField(window, environment->GetFieldID(environment->GetObjectClass(window), "minimized", "Z"), true);
@ -222,6 +223,7 @@ bool registerWindow()
printf("Failed to register window class\n");
return false;
}
printf("Window registered\n");
oneShotInitialised = true;
}
@ -373,8 +375,8 @@ void handleMessages(JNIEnv * env, jobject obj)
0, // first message
0, // last message
PM_REMOVE // removal options
)) {
))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
};

View File

@ -43,22 +43,24 @@
#include "org_lwjgl_opengl_BaseGL.h"
#include "extgl.h"
#include "Window.h"
#include "jni.h"
HGLRC hglrc = NULL; // OpenGL rendering context
/*
* Class: org_lwjgl_opengl_BaseGL
* Method: nCreate
* Signature: (Ljava/lang/String;IIIIZ)V
* Signature: (Ljava/lang/String;IIIIIIIIZ)V
*/
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_BaseGL_nCreate
(JNIEnv * env, jobject obj, jstring title, jint x, jint y, jint width, jint height, jboolean fullscreen, jint bpp, jint alpha, jint depth, jint stencil)
(JNIEnv * env, jobject obj,
jstring title, jint x, jint y, jint width, jint height, jint bpp, jint alpha, jint depth, jint stencil, jboolean fullscreen)
{
// 1. Create a window
const char * titleString = env->GetStringUTFChars(title, NULL);
if (!createWindow(titleString, x, y, width, height, fullscreen == JNI_TRUE ? true : false)) {
env->ReleaseStringUTFChars(title, titleString);
env->ReleaseStringUTFChars((jstring) title, titleString);
closeWindow();
throwException(env, "Failed to create the window.");
return;
@ -156,16 +158,16 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_BaseGL_nCreate
// 4. Initialise other things now
if (extgl_Open() != 0) {
closeWindow();
throwException(env, "Failed to open extgl");
closeWindow();
return;
}
// Create a rendering context
hglrc = wglCreateContext(hdc);
if (hglrc == NULL) {
closeWindow();
throwException(env, "Failed to create OpenGL rendering context");
closeWindow();
return;
}
@ -189,13 +191,16 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_BaseGL_nCreate
* Method: nDestroy
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_BaseGL_nDestroy
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_BaseGL_nDestroyGL
(JNIEnv * env, jobject obj)
{
wglMakeCurrent(NULL, NULL);
// Delete the rendering context
if (hglrc != NULL)
if (hglrc != NULL) {
wglDeleteContext(hglrc);
hglrc = NULL;
}
extgl_Close();
}