Chapter 7
Инициализация или как написать приложение с нуля

7.6  Java-апплеты GL4Java

     GL4Java еще одна библиотека, которая связывает классы Java с динамическими модулями opengl32.dll и glu32.dll. Недостатков у этого варианта гораздо меньше, чем у предыдущего. Библиотека имеется под разные платформы. Под Windows имеется инсталлятор. GL4Java работает с динамическими библиотеками OpenGL, которые входят в стандартную поставку Microsoft Windows, в следствие чего, необходимый плагин занимает около 200Кб. Маленьким недостатком является требование java-машины версии 5.0.0.3186. Узнать версию вы можете в Internet Explorer'e, меню Ви->Консоль языка Java. GL4Java распространяется бесплатно, последнюю версию вы можете взять на сервере http://www.jausoft.com в разделе Products->GL4Java->Installation. Если этот плагин получит широкое распространение, а у него есть для этого все предпосылки, то написание java-апплетов с использованием OpenGL дело довольно перспективное.
     Теперь немного теории о том, как такие библиотеки устроены. Вообще, из Java-апплетов нельзя обращаться к локальному диску пользователя. И тут у вас может возникнуть вопрос, как же так получается, что из Интернета все-таки можно загрузить апплет, и он будет работать с динамическими библиотеками, установленными на вашем компьютере? Ведь в одном случае - это может быть OpenGL, а в другом - вирус, делающий низкоуровневое форматирование вашего диска и перезаписывающий BIOS. Ответ очень прост: у вас на машине имеются доверительные динамические библиотеки и java-классы, которые с ними взаимодействуют. Просто одних библиотек недостаточно. Из самого java-апплета вы можете загрузить только java-классы на машине пользователя, к которым прописан CLASSPATH. Последним, в свою очередь, разрешено взаимодействовать с динамическими библиотеками. В результате, получается, когда вы загружаете java-апплет с использованием OpenGL, то вся графика делается не на уровне виртуальной java-машины, а на уровне opengl32.dll, функционирование которой мало чем отличается от выполнения обычного исполняемого файла. Такие плагины, вообще говоря, являются потенциальной дырой для проникновения в вашу систему извне. Если вы работаете в многопользовательской операционной системе с разграничением доступа, то не запускайте подозрительных программ от имени администратора. Например, в Unix или WindowsNT, если вы запустите какой-нибудь вирус от имени пользователя, отформатировать жесткий диск ему не удастся, прав у пользователя таких нет. Администраторов-"лопухов", я здесь не рассматриваю.
     Теперь рассмотрим пример. У меня, среди прилагающихся программ, в дириктории template вы найдете поддириктории GL4Java. Здесь я привиду целиком исходный код с подробными комментариями.

// подключаем необходимые библиотеки
import gl4java.GLContext;
import gl4java.awt.GLCanvas;
import gl4java.awt.GLAnimCanvas;

// подключаем стандартные библиотеки java
import java.awt.*;
import java.awt.event.*;
import java.lang.Math;
import java.applet.*;

// код компонента OpenGL, который мы разместим на нашем апплете
// компонентами являются кнопки, поля ввода и прочие элементы управления
// их программирование очень схоже

class BaseGL extends GLAnimCanvas
{
// в конструктор передаются параметры размеров компонента
// w - шириша, h - высота
public BaseGL(int w, int h){super(w, h);}
// устанавливаем параметр контекста воспроизведения OpenGL
// мы будем использовать анимацию, и нам понадобится двойная буферизация
public void preInit(){doubleBuffer = true;}

// устанавливаем параметры сцены
public void init()
{
gl.glMatrixMode(GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrtho(-5,5,-5,5,2,12);
glu.gluLookAt( 0,0,5, 0,0,0, 0,1,0 );
gl.glMatrixMode(GL_MODELVIEW);
glj.gljCheckGL();
glj.gljMakeCurrent(false);
}


// функция display выглядит почти так же, как и в языке Си
// немного другие префиксы команд
public void display()
{
 gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

 gl.glRotated(5, 0,0,1);
 gl.glLineWidth(5);


 gl.glBegin(GL_LINES);

   gl.glColor3d(1,0,0);
   gl.glVertex2d(-2,0);
   gl.glVertex2d(2,0);

   gl.glColor3d(0,1,0);
   gl.glVertex2d(0,-2);
   gl.glVertex2d(0,2);

   gl.glColor3d(0,0,1);
   gl.glVertex3d(0,0,-2);
   gl.glVertex3d(0,0,2);
 gl.glEnd();

// этого своего рода аналог auxSwapBuffers
glj.gljSwap();
}//display

}


// теперь код апплета
public class BaseApp extends Applet
{
BaseGL baseGL = null;

String gljLib=null;
String glLib=null;
String gluLib=null;

public void init()
{
// Загружаем библиотеки, которые будут взаимодействовать c opengl32.dll
// эти библиотеки находятся на машине пользователя
 if(GLContext.loadNativeLibraries(gljLib, glLib, gluLib)==false)
  System.out.println("could not load native libs:"+
		     gljLib + ", " + glLib + ", " + gluLib);
 else
  System.out.println("load native libs:"+
	        gljLib + ", " + glLib + ", " + gluLib);


// устанавливаем алгоритм размещения компонентов на апплете
 setLayout(null);
// устанавливаем размеры самого апплета
 setSize(570,450);


// создаем компоненте OpenGL
 baseGL = new BaseGL(150,150);
// устанавливаем его границы
 baseGL.setBounds(120,0,450,450);
// присоединяем к апплету
 add(baseGL);
}


// далее стандартные методы апплета
public void start()
{
baseGL.start();
}

public void stop()
{
baseGL.stop();
}

public void destroy(){
		       baseGL.stop();
		       baseGL.cvsDispose();
                      }

}
Html-код для запуска данного апплета выглядит следующим образом:
<HTML>
<HEAD>
<TITLE>Base class for GL4Java</TITLE>
</HEAD>
<BODY>

<applet code="BaseApp.class" width=570 height=450></applet>

</BODY>
</HTML>

Исходный файл смотрите здесь. Html файл здесь.