home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip Special: HTML & Java
/
Chip-Special_1997-01_HTML-a-Java.bin
/
javasdk
/
sdk-java.exe
/
SDKJava.cab
/
Samples
/
directX
/
d3drm
/
Viewer
/
ViewFrame.java
< prev
Encoding:
Amiga
Atari
Commodore
DOS
FM Towns/JPY
Macintosh
Macintosh JP
NeXTSTEP
RISC OS/Acorn
UTF-8
Wrap
Java Source
|
1996-10-10
|
34.3 KB
|
1,230 lines
import java.awt.*;
import java.awt.peer.ComponentPeer;
import java.applet.*;
import java.io.FilenameFilter;
import java.io.File;
import com.ms.com.*;
import com.ms.awt.*;
import com.ms.awt.peer.*;
import com.ms.directX.*;
class FrameMoveData implements IUnknown
{
float time;
d3drmAnimationSet anim;
}
public class ViewFrame extends Frame implements IFrameMoveCallback, ddConstants, MenuXConstants,
ILoadTextureCallback
{
//////////////////////////////////////////////////////////////////////////
public void callbackFrameMove(d3drmFrame obj, IUnknown punk, float delta)
{
FrameMoveData fmd = (FrameMoveData)punk;
fmd.anim.SetTime(fmd.time);
fmd.time += delta;
}
//////////////////////////////////////////////////////////////////////////
void setAnimationCallback(d3drmFrame frame, d3drmAnimationSet animset)
{
FrameMoveData fmd = new FrameMoveData();
fmd.time = 0;
fmd.anim = animset;
frame.AddMoveCallback((IFrameMoveCallback)this, fmd);
}
//////////////////////////////////////////////////////////////////////////
public final int MENU_FILE_ABOUT = 1 ;
public final int MENU_FILE_OPEN = 2 ;
public final int MENU_FILE_OPEN_ANIMSET = 3 ;
public final int MENU_FILE_OPEN_FRAME = 4 ;
public final int MENU_FILE_EXIT = 5 ;
public final int MENU_EDIT_CUT = 6 ;
public final int MENU_EDIT_COPY = 7 ;
public final int MENU_EDIT_PASTE = 8 ;
public final int MENU_EDIT_DELETE = 9 ;
public final int MENU_EDIT_COLOR = 10;
public final int MENU_EDIT_BOXES = 11;
public final int MENU_QUALITY_LIGHTING = 12; // first in menu
public final int MENU_QUALITY_POINTS = 13;
public final int MENU_QUALITY_WIREFRAME = 14;
public final int MENU_QUALITY_SOLID = 15;
public final int MENU_QUALITY_FLAT = 16;
public final int MENU_QUALITY_GOURAUD = 17;
public final int MENU_QUALITY_PHONG = 18;
public final int MENU_MODEL_MONO = 19;
public final int MENU_MODEL_RGB = 20;
public final int MENU_DITHER = 21;
public final int MENU_TEXTURE_FILTERING = 22;
public final int MENU_LIGHT_DIRECTIONAL = 23;
public final int MENU_LIGHT_PARALLEL_POINT = 24;
public final int MENU_LIGHT_POINT = 25;
public final int MENU_LIGHT_SPOT = 26;
MenuItemX items[] =
{
new MenuItemX("" , 0, POPUP),
new MenuItemX("" , MENU_FILE_ABOUT, 0),
new MenuItemX("" , MENU_FILE_OPEN, 0),
new MenuItemX("" , MENU_FILE_OPEN_ANIMSET, 0),
new MenuItemX("" , MENU_FILE_OPEN_FRAME, SEPARATOR_NEXT),
new MenuItemX("" , MENU_FILE_EXIT, ENDMENU),
new MenuItemX("" , 0, POPUP),
new MenuItemX("" , MENU_EDIT_CUT, 0),
new MenuItemX("" , MENU_EDIT_COPY, 0),
new MenuItemX("" , MENU_EDIT_PASTE, 0),
new MenuItemX("" , MENU_EDIT_DELETE, SEPARATOR_NEXT),
new MenuItemX("" , MENU_EDIT_COLOR, SEPARATOR_NEXT),
new MenuItemX("" , MENU_EDIT_BOXES, ENDMENU),
new MenuItemX("" , 0, POPUP),
new MenuItemX("" , MENU_QUALITY_LIGHTING, CHECKED + SEPARATOR_NEXT),
new MenuItemX("" , MENU_QUALITY_POINTS, 0),
new MenuItemX("" , MENU_QUALITY_WIREFRAME, 0),
new MenuItemX("" , MENU_QUALITY_SOLID, CHECKED+SEPARATOR_NEXT),
new MenuItemX("" , MENU_QUALITY_FLAT, CHECKED),
new MenuItemX("" , MENU_QUALITY_GOURAUD, 0),
new MenuItemX("" , MENU_QUALITY_PHONG, SEPARATOR_NEXT),
new MenuItemX("" , MENU_MODEL_MONO, CHECKED),
new MenuItemX("" , MENU_MODEL_RGB, SEPARATOR_NEXT),
new MenuItemX("" , MENU_DITHER, 0),
new MenuItemX("" , MENU_TEXTURE_FILTERING, ENDMENU),
new MenuItemX("" , 0, POPUP),
new MenuItemX("" , MENU_LIGHT_DIRECTIONAL, 0),
new MenuItemX("" , MENU_LIGHT_PARALLEL_POINT, 0),
new MenuItemX("" , MENU_LIGHT_POINT, 0),
new MenuItemX("" , MENU_LIGHT_SPOT, ENDMENU)
};
int m_menuItems = 30;
d3drm lpd3drm;
ddClipper lpddclipper;
AppInfo info;
int hwnd;
SelectionDude sel;
int last_x, last_y; // mouse positions
FlickViewer f = null;
TestGraph tg;
//////////////////////////////////////////////////////////////////////////
void dealWithBoxes()
{
// int checked = (sel.ToggleBoxes() != 0) ?CHECKED :UNCHECKED;
// MenuX menu = GetAMenu(1);
// menu.CheckMenuItem(MENU_EDIT_BOXES, BY_COMMAND | checked);
sel.ToggleBoxes();
}
//////////////////////////////////////////////////////////////////////////
int ShadeModeToMenuItem(int sm)
{
switch (sm)
{
case D3DRMSHADE_FLAT:
return 6; //MENU_QUALITY_FLAT;
case D3DRMSHADE_GOURAUD:
return 7 ; //MENU_QUALITY_GOURAUD;
case D3DRMSHADE_PHONG:
return 8; // MENU_QUALITY_PHONG;
}
return -1;
}
//////////////////////////////////////////////////////////////////////////
void SetShadeMode(int sm)
{
int quality = info.dev.GetQuality();
int oldsm = (int)(quality & D3DRMSHADE_MASK);
MenuX menu = GetAMenu(2);
menu.CheckMenuItem(ShadeModeToMenuItem(oldsm), UNCHECKED | BY_POSITION);
menu.CheckMenuItem(ShadeModeToMenuItem(sm), CHECKED | BY_POSITION);
quality = (quality & ~D3DRMSHADE_MASK) | sm;
info.dev.SetQuality(quality);
}
//////////////////////////////////////////////////////////////////////////
String OpenNewFile(String title)
{
FileDialog fileDialog = new FileDialog(this, title, FileDialog.LOAD);
// set the fileNameFilter in this FileDialog object
FileName fileName = new FileName("~/", "*.x");
fileDialog.setFilenameFilter(fileName);
// set the directory in the FileDialog object
fileDialog.setDirectory("C:\\dxsdk\\sdk\\media");
// set the file in the FileDialog object
fileDialog.setFile("*.x");
// show this fileDialog to the screen
fileDialog.show();
return fileDialog.getFile();
}
//////////////////////////////////////////////////////////////////////////
ViewFrame(String s, TestGraph t)
{
super(s);
tg = t;
}
//////////////////////////////////////////////////////////////////////////
//
// cant do anything in the constructor, no window created yet!
//
public FlickViewer startDirect(Applet theApp, String menuSet[])
{
setBackground(Color.black);
ComponentPeer p = getPeer();
ComponentPeerX peer = (ComponentPeerX)p;
if( peer == null )
{
setTitle("Cant retrieve peer!");
return null;
}
hwnd = peer.gethwnd();
if( menuSet == null )
setMenuBar(new MenuBarX(items, m_menuItems, theApp, "menuString"));
else
setMenuBar(new MenuBarX(items, m_menuItems, menuSet));
lpd3drm = new d3drm();
lpddclipper = new ddClipper();
info = new AppInfo();
info.model = D3DCOLOR_MONO;
sel = new SelectionDude(lpd3drm);
lpddclipper.SetHWnd(0, hwnd);
CreateDevice();
activateApp();
resizeViewport();
f = new FlickViewer(Thread.NORM_PRIORITY, info, sel);
return f;
}
//////////////////////////////////////////////////////////////////////////
MenuX GetAMenu(int m)
{
MenuBarX bar = (MenuBarX)getMenuBar();
return (MenuX)bar.getMenu(m);
}
//////////////////////////////////////////////////////////////////////////
int FillModeToMenuItem(int fm)
{
switch (fm)
{
case D3DRMFILL_POINTS:
return 2 ; //MENU_QUALITY_POINTS;
case D3DRMFILL_WIREFRAME:
return 3 ; // MENU_QUALITY_WIREFRAME;
case D3DRMFILL_SOLID:
return 4 ; // MENU_QUALITY_SOLID;
}
return -1;
}
//////////////////////////////////////////////////////////////////////////
void SetFillMode( int fm)
{
int quality = info.dev.GetQuality();
int oldfm = (int)(quality & D3DRMFILL_MASK);
MenuX menu = GetAMenu(2);
if( menu.CheckMenuItem(FillModeToMenuItem(oldfm), UNCHECKED | BY_POSITION) == false)
setTitle("Couldn't find item to uncheck");
else if (menu.CheckMenuItem(FillModeToMenuItem(fm), CHECKED | BY_POSITION) == false)
setTitle("Couldn't find item to check");
quality = (quality & ~D3DRMFILL_MASK) | fm;
info.dev.SetQuality(quality);
}
//////////////////////////////////////////////////////////////////////////
void SetModel( int model)
{
int oldModel = info.model;
if (oldModel == model)
return ;
info.model = model;
RebuildDevice(info.dev.GetWidth(), info.dev.GetHeight());
// MenuX menu = GetAMenu(2);
// menu.CheckMenuItem(9 + (int) oldModel, UNCHECKED | BY_POSITION);
// menu.CheckMenuItem(9 + (int) model, CHECKED | BY_POSITION);
}
//////////////////////////////////////////////////////////////////////////
void ToggleDither()
{
int dither = info.dev.GetDither();
int checked;
dither = (dither == 0) ?1 :0;
info.dev.SetDither(dither);
MenuX menu = GetAMenu(2);
if (dither != 0)
checked = CHECKED;
else
checked = UNCHECKED;
menu.CheckMenuItem(13, checked | BY_POSITION);
}
//////////////////////////////////////////////////////////////////////////
void ToggleTextureFiltering()
{
int tq = info.dev.GetTextureQuality();
int checked;
if (tq == D3DRMTEXTURE_NEAREST)
tq = D3DRMTEXTURE_LINEAR;
else
tq = D3DRMTEXTURE_NEAREST;
info.dev.SetTextureQuality(tq);
MenuX menu = GetAMenu(2);
if (tq == D3DRMTEXTURE_LINEAR)
checked = CHECKED;
else
checked = UNCHECKED;
menu.CheckMenuItem(14, checked | BY_POSITION);
}
//////////////////////////////////////////////////////////////////////////
void CreateLight(int wparam)
{
d3drmMeshBuilder builder = null;
d3drmLight light = null;
d3drmFrame frame = null;
builder = lpd3drm.CreateMeshBuilder();
if (wparam == MENU_LIGHT_DIRECTIONAL)
{
builder.LoadFromFileByPos(tg.getFileName("camera.x"), 0, 0, null, null);
builder.SetQuality(D3DRMRENDER_UNLITFLAT);
light = lpd3drm.CreateLightRGB(D3DRMLIGHT_DIRECTIONAL, 1.0F, 1.0F, 1.0F);
}
else if (wparam == MENU_LIGHT_PARALLEL_POINT)
{
builder.LoadFromFileByPos(tg.getFileName("sphere2.x"), 0, 0, null, null);
builder.SetQuality(D3DRMRENDER_UNLITFLAT);
builder.Scale(0.2F, 0.2F, 0.2F);
light = lpd3drm.CreateLightRGB (D3DRMLIGHT_PARALLELPOINT,
1.0F, 1.0F, 1.0F);
}
else if (wparam == MENU_LIGHT_POINT)
{
builder.LoadFromFileByPos(tg.getFileName("sphere2.x"), 0, 0, null, null);
builder.SetQuality(D3DRMRENDER_UNLITFLAT);
builder.Scale( 0.2F, 0.2F, 0.2F);
light = lpd3drm.CreateLightRGB (D3DRMLIGHT_POINT,
1.0F, 1.0F, 1.0F);
} else if (wparam == MENU_LIGHT_SPOT)
{
builder.LoadFromFileByPos(tg.getFileName("camera.x"), 0, 0, null, null);
builder.SetQuality(D3DRMRENDER_UNLITFLAT);
light = lpd3drm.CreateLightRGB( D3DRMLIGHT_SPOT, 1.0F,1.0F,1.0F);
}
frame = lpd3drm.CreateFrame(info.scene);
frame.SetPosition(info.camera,0.0F,0.0F,10.0F);
frame.AddVisualMeshBuilder(builder);
frame.AddLight(light);
}
//////////////////////////////////////////////////////////////////////////
void ToggleLighting()
{
int quality = info.dev.GetQuality();
int mode = (int)(quality & D3DRMLIGHT_MASK);
if (mode == D3DRMLIGHT_ON)
mode = D3DRMLIGHT_OFF;
else
mode = D3DRMLIGHT_ON;
MenuX menu = GetAMenu(2);
menu.CheckMenuItem(0, (mode == D3DRMLIGHT_ON ?CHECKED :UNCHECKED) | BY_POSITION);
quality = (quality & ~D3DRMLIGHT_MASK) | mode;
info.dev.SetQuality(quality);
}
//////////////////////////////////////////////////////////////////////////
void activateApp()
{
d3drmFrame sFrame = sel.SelectedFrame();
d3drmMeshBuilder sVisual = sel.SelectedVisual();
d3drmWinDevice windev = info.dev.Getd3drmWinDevice();
windev.HandleActivate(1);
}
//////////////////////////////////////////////////////////////////////////
// compatibility with the Viewer.CPP demo.
float D3DDivide( float a, float b)
{
return (float)((double) (a) / (double) (b));
}
float D3DMultiply( float a, float b)
{
return ((a) * (b));
}
//////////////////////////////////////////////////////////////////////////
void LoadFrameHierarchy(String filename)
{
d3drmFrame lpFrame;
lpFrame = lpd3drm.CreateFrame(info.scene);
lpFrame.LoadFromFileByPos(filename, 0, 0, (ILoadTextureCallback)this, null);
ScaleScene(lpFrame);
}
//////////////////////////////////////////////////////////////////////////
void LoadAnimationSet(String filename)
{
d3drmAnimationSet lpAnimSet;
d3drmFrame lpFrame;
//
// Create a new parent frame for the animation, load it, and set up
// the callback
//
lpFrame = lpd3drm.CreateFrame(info.scene);
lpAnimSet = lpd3drm.CreateAnimationSet();
lpAnimSet.LoadFromFileByPos(filename, 0, 0, (ILoadTextureCallback)this, null, lpFrame);
ScaleScene(lpFrame);
setAnimationCallback(lpFrame, lpAnimSet);
}
//////////////////////////////////////////////////////////////////////////
void ScaleScene( d3drmFrame frame)
{
//
// Some trickery form the RL2 viewer to scale a scene down to
// managable proportions
//
d3drmMeshBuilder mbuilder;
d3drmBox box = new d3drmBox();
float maxDim = 0.0F;
mbuilder = lpd3drm.CreateMeshBuilder();
mbuilder.AddFrame(frame);
mbuilder.GetBox(box);
maxDim = box.maxx - box.minx;
if (box.maxy - box.miny > maxDim)
maxDim = box.maxy - box.miny;
if (box.maxz - box.minz > maxDim)
maxDim = box.maxz - box.minz;
frame.AddScale(D3DRMCOMBINE_BEFORE, D3DDivide(8.0F, maxDim),
D3DDivide(8.0F, maxDim), D3DDivide(8.0F, maxDim));
frame.SetPosition(info.scene, 0.0F, 0.0F, 15.0F);
}
//////////////////////////////////////////////////////////////////////////
//
// Place an object in front of the camera.
//
void PlaceMesh( d3drmMeshBuilder mesh)
{
d3drmFrame frame;
frame = lpd3drm.CreateFrame(info.scene);
frame.AddVisualMeshBuilder(mesh);
frame.SetPosition(info.camera, 0.0F, 0.0F, 15.0F);
}
//////////////////////////////////////////////////////////////////////////
//
// Regenerate the device if the color model changes or the window
// size changes.
//
private void RebuildDevice(int width, int height)
{
int old_dither = info.dev.GetDither();
int old_quality = info.dev.GetQuality();
int old_shades = info.dev.GetShades();
GuidData g;
d3d d = new d3d();
try
{
g = new GuidData();
d.FindDeviceForColorModel(info.model, g);
}
catch( ComException ce)
{
g = FullFind(info.model, d);
}
info.dev = lpd3drm.CreateDeviceFromClipper(lpddclipper, g, width, height);
info.dev.SetDither(old_dither);
info.dev.SetQuality(old_quality);
info.dev.SetShades(old_shades);
width = info.dev.GetWidth();
height = info.dev.GetHeight();
info.view = lpd3drm.CreateViewport(info.dev,info.camera,0,0,width,height);
info.view.SetBack(400.0F);
}
//////////////////////////////////////////////////////////////////////////
static final int DDBD_1 = 0x00004000;
static final int DDBD_2 = 0x00002000;
static final int DDBD_4 = 0x00001000;
static final int DDBD_8 = 0x00000800;
static final int DDBD_16 = 0x00000400;
static final int DDBD_24 = 0x00000200;
static final int DDBD_32 = 0x00000100;
int bppToddbd(int bpp)
{
switch(bpp)
{
case 1: return DDBD_1;
case 2: return DDBD_2;
case 4: return DDBD_4;
case 8: return DDBD_8;
case 16: return DDBD_16;
case 24: return DDBD_24;
case 32: return DDBD_32;
}
return 0;
}
//////////////////////////////////////////////////////////////////////////
GuidData FullFind(int cm, d3d lpD3d)
{
int bpp = lpD3d.SystemBpp();
d3dFindDeviceSearch search = new d3dFindDeviceSearch();
d3dFindDeviceResult result = new d3dFindDeviceResult();
search.dwFlags = 1; // D3DFDS_COLORMODEL;
search.dcmColorModel = (cm == D3DCOLOR_MONO) ? D3DCOLOR_MONO : D3DCOLOR_RGB;
lpD3d.FindDevice(search, result);
/*
* If the device found is hardware but cannot support the current
* bit depth, then fall back to software rendering.
*/
if ((result.HwFlags != 0) && !((result.HwdwDeviceRenderBitDepth & bppToddbd(bpp))!=0))
{
search.dwFlags |= 4; //D3DFDS_HARDWARE;
search.bHardware = 0;
result = new d3dFindDeviceResult(); // clean out result
lpD3d.FindDevice(search, result);
}
GuidData g = new GuidData();
g.data1 = result.data1;
g.data2 = result.data2;
g.data3 = result.data3;
g.data4 = result.data4;
g.data5 = result.data5;
return g;
}
//////////////////////////////////////////////////////////////////////////
//
// this is the only interesting thing that happens on WM_SIZE in windows
//
// HWND win, AppInfo* info, int width, int height)
//
private void resizeViewport()
{
Dimension s = size();
int view_width = info.view.GetWidth();
int view_height = info.view.GetHeight();
int dev_width = info.dev.GetWidth();
int dev_height = info.dev.GetHeight();
if (view_width == s.width && view_height == s.height)
return ;
if (s.width <= dev_width && s.height <= dev_height)
{
info.view = lpd3drm.CreateViewport(info.dev, info.camera, 0, 0, s.width, s.height);
info.view.SetBack(400.0F);
}
RebuildDevice(s.width, s.height);
}
//////////////////////////////////////////////////////////////////////////
/*
public boolean RightMouseDown(Event e, int x, int y)
{
static HCURSOR oldCursor = NULL;
AppInfo *info;
LPDIRECT3DRMFRAME sFrame = sel.SelectedFrame();
LPDIRECT3DRMMESHBUILDER sVisual = sel.SelectedVisual();
info = (AppInfo *) GetWindowLong(win, 0);
active_window = info;
{
HCURSOR hCur;
int x = LOWORD(lparam);
int y = HIWORD(lparam);
last_x = x;
last_y = y;
FindAndSelectVisual(info.view, x, y);
f.right_drag = TRUE;
SetCapture(win);
//
// change to a groovy cursor
//
hCur = LoadCursor(NULL, IDC_ARROW);
if (hCur) oldCursor = SetCursor(hCur);
else oldCursor = NULL;
}
break;
}
*/
//////////////////////////////////////////////////////////////////////////
/*
public boolean RightMouseUp(Event e, int x, int y)
{
static HCURSOR oldCursor = NULL;
AppInfo *info;
LPDIRECT3DRMFRAME sFrame = sel.SelectedFrame();
LPDIRECT3DRMMESHBUILDER sVisual = sel.SelectedVisual();
info = (AppInfo *) GetWindowLong(win, 0);
active_window = info;
f.right_drag = FALSE;
ReleaseCapture();
if (oldCursor) SetCursor(oldCursor);
break;
}
*/
//////////////////////////////////////////////////////////////////////////
public boolean mouseDown(Event e, int x, int y)
{
d3drmFrame sFrame = sel.SelectedFrame();
d3drmMeshBuilder sVisual = sel.SelectedVisual();
last_x = x;
last_y = y;
sel.FindAndSelectVisual(info.view, x, y);
if( (e.modifiers & 4) != 0 )
{
// right mouse button
f.right_drag = true;
}
else
{
// left mouse button
f.left_drag = true;
}
return true;
}
//////////////////////////////////////////////////////////////////////////
public boolean mouseUp(Event e, int x, int y)
{
if( (e.modifiers & 4) != 0 )
{
// right mouse button
f.right_drag = false;
}
else
{
// left mouse button
f.left_drag = false;
}
return true;
}
//////////////////////////////////////////////////////////////////////////
public boolean mouseDrag(Event e, int x, int y)
{
float delta_x, delta_y;
d3drmFrame sFrame = sel.SelectedFrame();
if( sFrame != null )
{
if( ((e.modifiers & 4) != 0) && f.right_drag )
{
// right mouse button
d3dvector p1 = new d3dvector();
d3drmvector4d p2 = new d3drmvector4d();
d3drmMeshBuilder sVisual = sel.SelectedVisual();
delta_x = SIGN_EXTEND(x) - last_x;
delta_y = SIGN_EXTEND(y) - last_y;
last_x = SIGN_EXTEND(x);
last_y = SIGN_EXTEND(y);
sFrame.GetPosition(info.scene, p1);
info.view.Transform(p2, p1);
p2.x += D3DMultiply( (float)delta_x, p2.w);
p2.y += D3DMultiply( (float)delta_y, p2.w);
info.view.InverseTransform(p1, p2);
sFrame.SetPosition(info.scene, p1.x, p1.y, p1.z);
}
else if( ((e.modifiers & 4)==0) && f.left_drag )
{
// left mouse button
d3drmMeshBuilder sVisual = sel.SelectedVisual();
delta_x = SIGN_EXTEND(x) - last_x;
delta_y = -SIGN_EXTEND(y) - last_y;
last_x = SIGN_EXTEND(x);
last_y = SIGN_EXTEND(y);
double radius = 50;
double delta_r = Math.sqrt(delta_x * delta_x + delta_y * delta_y);
double denom = Math.sqrt(radius * radius + delta_r * delta_r);
if (delta_r != 0 && denom != 0)
{
sFrame.SetRotation( info.camera, D3DDivide(delta_y, (float)delta_r),
D3DDivide(-delta_x, (float)delta_r), 0.0F,
D3DDivide((float)delta_r, (float)denom) );
}
}
}
return true;
}
//////////////////////////////////////////////////////////////////////////
public boolean keyUp(Event e, int key)
{
d3drmFrame sFrame = sel.SelectedFrame();
d3drmMeshBuilder sVisual = sel.SelectedVisual();
switch (key)
{
case 't':
case 'T':
case 'r':
case 'R':
case Event.UP:
case Event.DOWN:
case Event.LEFT:
case Event.RIGHT:
info.camera.SetVelocity(info.scene, 0.0F, 0.0F, 0.0F, 0);
break;
case 'z':
case 'Z':
case 'x':
case 'X':
if (sFrame != null)
sFrame.SetVelocity(info.scene, 0.0F, 0.0F, 0.0F, 0);
break;
}
return true;
}
//////////////////////////////////////////////////////////////////////////
public boolean keyDown(Event e, int key)
{
d3drmFrame sFrame = sel.SelectedFrame();
d3drmMeshBuilder sVisual = sel.SelectedVisual();
d3dvector dir = new d3dvector();
d3dvector up = new d3dvector();
d3dvector right = new d3dvector();
info.camera.GetOrientation(info.scene, dir, up);
lpd3drm.d3drmVectorCrossProduct(right, up, dir);
up.x /= 4.0F;
up.y /= 4.0F;
up.z /= 4.0F;
right.x /= 4.0F;
right.y /= 4.0F;
right.z /= 4.0F;
switch(key)
{
case 't':
case 'T':
info.camera.SetVelocity(info.scene, dir.x, dir.y, dir.z, 0);
break;
case 'y':
case 'Y':
info.camera.SetVelocity(info.scene, -100.0F * dir.x,-100.0F * dir.y, -100.0F * dir.z, 0);
//
// fall through
case 'r':
case 'R':
info.camera.SetVelocity(info.scene, -dir.x, -dir.y, -dir.z, 0);
break;
case 'e':
case 'E':
info.camera.SetVelocity(info.scene, 100.0F * dir.x, 100.0F * dir.y, 100.0F * dir.z, 0);
case Event.UP:
setTitle("Moving up!");
info.camera.SetVelocity(info.scene, up.x, up.y, up.z, 0);
break;
case Event.DOWN:
info.camera.SetVelocity(info.scene, -up.x, -up.y, -up.z, 0);
break;
case Event.RIGHT:
info.camera.SetVelocity(info.scene, right.x, right.y, right.z, 0);
break;
case Event.LEFT:
info.camera.SetVelocity(info.scene, -right.x, -right.y, -right.z, 0);
break;
case 'x':
case 'X':
if (sFrame == null)
new MessageBox(this, 0, "Please select a Frame first!");
else
sFrame.SetVelocity(info.scene, dir.x, dir.y, dir.z, 0);
break;
case 'Z':
if (sFrame == null)
new MessageBox(this, 0, "Please select a Frame first!");
else
sFrame.SetVelocity(info.scene, -dir.x, -dir.y, -dir.z, 0);
break;
case '-':
if (sFrame == null)
new MessageBox(this, 0, "Please select a Frame first!");
else
{
sVisual.Scale(0.9F, 0.9F, 0.9F);
sel.SelectVisual(sVisual, sFrame);
}
break;
case '+':
if (sFrame == null)
new MessageBox(this, 0, "Please select a Frame first!");
else
{
sVisual.Scale(1.1F, 1.1F, 1.1F);
sel.SelectVisual(sVisual, sFrame);
}
break;
}
return true;
}
//////////////////////////////////////////////////////////////////////////
//
// Create the device and viewport.
//
// uses global this and info
//
void CreateDevice()
{
Dimension s = size();
GuidData g = new GuidData();
d3d d = new d3d();
d.FindDeviceForColorModel(info.model, g);
info.dev = lpd3drm.CreateDeviceFromClipper(lpddclipper, g, s.width, s.height);
switch (d.SystemBpp())
{
case 1:
info.dev.SetShades(4);
lpd3drm.SetDefaultTextureShades(4);
break;
case 16:
info.dev.SetShades(32);
lpd3drm.SetDefaultTextureColors(64);
lpd3drm.SetDefaultTextureShades(32);
info.dev.SetDither(0);
break;
case 24:
case 32:
info.dev.SetShades(256);
lpd3drm.SetDefaultTextureColors(64);
lpd3drm.SetDefaultTextureShades(256);
info.dev.SetDither(0);
break;
default:
info.dev.SetDither(0);
}
CreateScene();
info.view = lpd3drm.CreateViewport(info.dev, info.camera, 0, 0, info.dev.GetWidth(),
info.dev.GetHeight());
info.view.SetBack(5000.0F);
}
//////////////////////////////////////////////////////////////////////////
public d3drmTexture callbackLoadTexture(String name, IUnknown args)
{
int ext = name.lastIndexOf(".");
if (ext != -1)
{
String fileExtension = name.substring(ext);
fileExtension.toLowerCase();
if( fileExtension.equals(".ppm") == false )
return lpd3drm.LoadTexture(name);
}
return null;
}
//////////////////////////////////////////////////////////////////////////
void CreateScene()
{
d3drmFrame frame;
d3drmFrame light;
d3drmMeshBuilder builder;
d3drmLight light1;
d3drmLight light2;
d3drmMaterial mat;
info.scene = lpd3drm.CreateFrame(null);
light1 = lpd3drm.CreateLightRGB(D3DRMLIGHT_DIRECTIONAL, 1.0F, 1.0F, 1.0F);
light2 = lpd3drm.CreateLightRGB(D3DRMLIGHT_AMBIENT, 0.1F, 0.1F, 0.1F);
light = lpd3drm.CreateFrame(info.scene);
light.SetPosition(info.scene, 2.0F, 2.0F, 5.0F);
light.SetOrientation(info.scene, -1.0F, -1.0F, 1.0F, 0.0F, 1.0F, 0.0F);
light.AddLight(light1);
info.scene.AddLight(light2);
builder = lpd3drm.CreateMeshBuilder();
builder.LoadFromFileByPos(tg.getFileName("camera.x"), 0, 0, null, null);
builder.SetQuality(D3DRMRENDER_UNLITFLAT);
light.AddVisualMeshBuilder(builder);
frame = lpd3drm.CreateFrame(info.scene);
frame.SetRotation(info.scene, 0.0F, 1.0F, 0.0F, -0.02F);
frame.SetPosition(info.scene, 0.0F, 0.0F, 10.0F);
builder = lpd3drm.CreateMeshBuilder();
builder.LoadFromFileByPos(tg.getFileName("mslogo.x"), 0, 0, (ILoadTextureCallback)this, null);
builder.SetColorRGB(0.8F, 0.8F, 0.8F);
mat = lpd3drm.CreateMaterial(10.0F);
builder.SetMaterial(mat);
frame.AddVisualMeshBuilder(builder);
info.camera = lpd3drm.CreateFrame(info.scene);
info.camera.SetPosition(info.scene, 0.0F, 0.0F, 0.0F);
}
//////////////////////////////////////////////////////////////////////////
public void Paint(Graphics g)
{
if( f != null )
{
d3drmFrame sFrame = sel.SelectedFrame();
d3drmMeshBuilder sVisual = sel.SelectedVisual();
if (info != null)
{
d3drmWinDevice windev = info.dev.Getd3drmWinDevice();
windev.HandlePaint(((GraphicsX)g).gethdc());
}
}
else
g.drawString("Not set up yet", 10, 10);
}
//////////////////////////////////////////////////////////////////////////
public boolean action(Event e, Object o)
{
if( o instanceof String )
{
d3drmFrame sFrame = sel.SelectedFrame();
d3drmMeshBuilder sVisual = sel.SelectedVisual();
String file;
int key = ((MenuBarX)getMenuBar()).getItemID((String)o);
if( key != -1 )
{
switch(key)
{
case MENU_LIGHT_DIRECTIONAL:
case MENU_LIGHT_PARALLEL_POINT:
case MENU_LIGHT_POINT:
case MENU_LIGHT_SPOT:
CreateLight(key);
break;
case MENU_FILE_EXIT :
dispose();
break;
case MENU_FILE_ABOUT:
new MessageBox(this, 0, "Viewer - by David Silver");
break;
case MENU_FILE_OPEN:
d3drmMeshBuilder builder;
file = OpenNewFile("Open a Mesh file");
if (file != null)
{
builder = lpd3drm.CreateMeshBuilder();
builder.LoadFromFileByPos(file, 0, 0, (ILoadTextureCallback)this, null);
PlaceMesh(builder);
}
break;
case MENU_FILE_OPEN_ANIMSET:
file = OpenNewFile("Open Animation ...");
if (file != null)
LoadAnimationSet(file);
break;
case MENU_FILE_OPEN_FRAME:
file = OpenNewFile("Open Frame ...");
if (file != null)
LoadFrameHierarchy(file);
break;
case MENU_EDIT_CUT:
sel.CutVisual();
break;
case MENU_EDIT_COPY:
sel.CopyVisual();
break;
case MENU_EDIT_PASTE:
sel.PasteVisual(info.scene);
break;
case MENU_EDIT_DELETE:
sel.DeleteVisual();
break;
case MENU_EDIT_COLOR:
if (sFrame == null)
break;
// note, we just reset the same colour here, there is no ChooseColor
// yet in Java.
d3drmMeshBuilder mesh = sVisual.Getd3drmMeshBuilder();
if (sel.SelectedLight() != null)
{
int c = sel.SelectedLight().GetColor();
mesh.SetColor(c);
sel.SelectedLight().SetColor(c);
}
else
{
int c;
if (mesh.GetFaceCount() != 0)
{
d3drmFaceArray faces;
d3drmFace face;
faces = mesh.GetFaces();
face = faces.GetElement(0);
c = face.GetColor();
}
else
c = lpd3drm.d3drmCreateColorRGB(0.0F, 0.0F, 0.0F);
mesh.SetColor(c);
}
break;
case MENU_EDIT_BOXES:
dealWithBoxes();
break;
case MENU_QUALITY_LIGHTING:
ToggleLighting();
break;
case MENU_QUALITY_POINTS:
SetFillMode(D3DRMFILL_POINTS);
break;
case MENU_QUALITY_WIREFRAME:
SetFillMode(D3DRMFILL_WIREFRAME);
break;
case MENU_QUALITY_SOLID:
SetFillMode(D3DRMFILL_SOLID);
break;
case MENU_QUALITY_FLAT:
SetShadeMode(D3DRMSHADE_FLAT);
break;
case MENU_QUALITY_GOURAUD:
SetShadeMode(D3DRMSHADE_GOURAUD);
break;
case MENU_QUALITY_PHONG:
SetShadeMode(D3DRMSHADE_PHONG);
break;
case MENU_MODEL_MONO:
SetModel(D3DCOLOR_MONO);
break;
case MENU_MODEL_RGB:
SetModel(D3DCOLOR_RGB);
break;
case MENU_DITHER:
ToggleDither();
break;
case MENU_TEXTURE_FILTERING:
ToggleTextureFiltering();
break;
}
invalidate();
}
}
return false;
}
//////////////////////////////////////////////////////////////////////////
// needed to allow window close
public boolean handleEvent(Event e)
{
if (e.id == Event.WINDOW_DESTROY)
{
// exit the program
// System.exit(0);
dispose();
return true;
}
// it's good form to let the super class look at any
// unhandled events
return super.handleEvent(e);
}
//////////////////////////////////////////////////////////////////////////
int SIGN_EXTEND(int w)
{
return ((((int)(w)) << 16) >> 16);
}
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
class FileName implements FilenameFilter
{
public String path;
public String fileName;
FileName(String p, String n)
{
path = p;
fileName = n;
}
public boolean accept(File dir, String name)
{
if(path.equals(dir.getPath()) && name.equals(fileName))
{
return true;
}
return false;
}
}