moved files to trunk directory
git-svn-id: svn://anubis/dwscr/trunk@83 5bef9df8-b654-44bb-925b-0ff18baa8f8c
This commit is contained in:
parent
78092ee118
commit
68d41e9c63
42
LoadFile/LoadFile.cc
Normal file
42
LoadFile/LoadFile.cc
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <string>
|
||||||
|
#include "LoadFile.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
const char * filename;
|
||||||
|
unsigned char * data;
|
||||||
|
int length;
|
||||||
|
} fileref_t;
|
||||||
|
|
||||||
|
/* The data section is generated by a perl script. The contents of the
|
||||||
|
* included file are part of this logical program unit, which is why it
|
||||||
|
* is directly included instead of compiling it separately.
|
||||||
|
*/
|
||||||
|
#include "LoadFile-gen.inc"
|
||||||
|
|
||||||
|
const static int numFiles = sizeof(LoadFileData)/sizeof(fileref_t);
|
||||||
|
|
||||||
|
static std::map< std::string, fileref_t * > * LoadFileMap = NULL;
|
||||||
|
|
||||||
|
void * LoadFile(const char * filename, unsigned int * length)
|
||||||
|
{
|
||||||
|
if (LoadFileMap == NULL)
|
||||||
|
{
|
||||||
|
LoadFileMap = new std::map< std::string, fileref_t * >();
|
||||||
|
for (int i = 0; i < numFiles; i++)
|
||||||
|
{
|
||||||
|
(*LoadFileMap)[std::string(LoadFileData[i].filename)] = &LoadFileData[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::map< std::string, fileref_t * >::iterator it =
|
||||||
|
LoadFileMap->find(std::string(filename));
|
||||||
|
|
||||||
|
if (it == LoadFileMap->end())
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
*length = it->second->length;
|
||||||
|
return it->second->data;
|
||||||
|
}
|
||||||
|
|
2
LoadFile/LoadFile.h
Normal file
2
LoadFile/LoadFile.h
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
|
||||||
|
void * LoadFile(const char * filename, unsigned int * length);
|
17
LoadFile/Makefile
Normal file
17
LoadFile/Makefile
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
GENLOADFILE := perl genLoadFile.pl
|
||||||
|
LOGO_PATH := ../logo
|
||||||
|
LOADFILES += dwlogo.obj
|
||||||
|
LOADFILES += dwlogo.mtl
|
||||||
|
ABSLOADFILES := $(foreach lf,$(LOADFILES),$(LOGO_PATH)/$(lf))
|
||||||
|
|
||||||
|
all: LoadFile.o
|
||||||
|
|
||||||
|
LoadFile.o: LoadFile.cc LoadFile-gen.inc
|
||||||
|
$(CXX) -c -o $@ $< $(CPPFLAGS) $(CXXFLAGS)
|
||||||
|
|
||||||
|
LoadFile-gen.inc: genLoadFile.pl $(ABSLOADFILES)
|
||||||
|
$(GENLOADFILE) --root=$(LOGO_PATH) $(LOADFILES)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-$(RM) -f *~ *.o LoadFile-gen.inc
|
58
LoadFile/genLoadFile.pl
Executable file
58
LoadFile/genLoadFile.pl
Executable file
@ -0,0 +1,58 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Getopt::Long;
|
||||||
|
|
||||||
|
my $root = '.';
|
||||||
|
GetOptions('root=s' => \$root);
|
||||||
|
|
||||||
|
my @fileList = @ARGV;
|
||||||
|
if ($#fileList < 0)
|
||||||
|
{
|
||||||
|
print "$0 <fileList>\n";
|
||||||
|
exit(42);
|
||||||
|
}
|
||||||
|
|
||||||
|
my %fileData;
|
||||||
|
my $index = 0;
|
||||||
|
|
||||||
|
open(OUTPUT, '>', 'LoadFile-gen.inc');
|
||||||
|
chdir($root);
|
||||||
|
foreach my $fileName (@fileList)
|
||||||
|
{
|
||||||
|
local $/;
|
||||||
|
open(FILE, '<', $fileName);
|
||||||
|
my $fileContents = <FILE>;
|
||||||
|
close(FILE);
|
||||||
|
my $length = length($fileContents);
|
||||||
|
my @fileContents = split(//, $fileContents);
|
||||||
|
my $cname = "dat$index";
|
||||||
|
print OUTPUT "\nstatic unsigned char ${cname}[] = {\n";
|
||||||
|
for (my $byteNum = 0; $byteNum <= $#fileContents; $byteNum++)
|
||||||
|
{
|
||||||
|
print OUTPUT " " if ($byteNum % 12 == 0);
|
||||||
|
printf OUTPUT ("0x%02x", ord($fileContents[$byteNum]));
|
||||||
|
print OUTPUT ", " unless ($byteNum == $#fileContents);
|
||||||
|
print OUTPUT "\n" if ($byteNum % 12 == 11);
|
||||||
|
}
|
||||||
|
print OUTPUT "\n};\n";
|
||||||
|
$index++;
|
||||||
|
$fileData{$fileName} = [$cname, $length];
|
||||||
|
}
|
||||||
|
|
||||||
|
print OUTPUT "\nfileref_t LoadFileData[] = {\n";
|
||||||
|
|
||||||
|
my @fileNames = keys(%fileData);
|
||||||
|
for (my $fileIndex = 0; $fileIndex <= $#fileNames; $fileIndex++)
|
||||||
|
{
|
||||||
|
my $fileName = $fileNames[$fileIndex];
|
||||||
|
printf OUTPUT (' {"%s", %s, %s}',
|
||||||
|
$fileName,
|
||||||
|
$fileData{$fileName}->[0],
|
||||||
|
$fileData{$fileName}->[1]);
|
||||||
|
print OUTPUT "," unless ($fileIndex == $#fileNames);
|
||||||
|
print OUTPUT "\n";
|
||||||
|
}
|
||||||
|
print OUTPUT "};\n";
|
||||||
|
close(OUTPUT);
|
74
Makefile
Normal file
74
Makefile
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
|
||||||
|
# Author: Josh Holtrop
|
||||||
|
# DornerWorks screensaver
|
||||||
|
|
||||||
|
# set this to compile in "debug" mode
|
||||||
|
#DEBUG := 1
|
||||||
|
# set this to be in "window mode" - i.e. do not hide mouse
|
||||||
|
# cursor and grab input
|
||||||
|
#WINDOW_MODE := 1
|
||||||
|
|
||||||
|
OBJS = dwscr.o wfobj/WFObj.o LoadFile/LoadFile.o ss/ss.a
|
||||||
|
TARGET = dwscr
|
||||||
|
export CXXFLAGS := -O2 -Wall
|
||||||
|
export CPPFLAGS
|
||||||
|
ifdef DEBUG
|
||||||
|
CPPFLAGS += -DDEBUG
|
||||||
|
endif
|
||||||
|
ifdef WINDOW_MODE
|
||||||
|
CPPFLAGS += -DWINDOW_MODE
|
||||||
|
endif
|
||||||
|
ifdef WIN32
|
||||||
|
export CP := copy
|
||||||
|
export MV := rename
|
||||||
|
export CC := mingw32-gcc
|
||||||
|
export CXX := mingw32-g++
|
||||||
|
SDL_BASE := C:\apps\SDL-1.2.13
|
||||||
|
ODE_BASE := C:\apps\ode-0.9
|
||||||
|
export CPPFLAGS += -I$(SDL_BASE)\include -I$(ODE_BASE)\include -D_GNU_SOURCE=1 -Dmain=SDL_main
|
||||||
|
LDFLAGS += -L$(SDL_BASE)\lib -L$(ODE_BASE)\lib\releasedll -lopengl32 -lglu32 -lmingw32 -mwindows -lSDLmain -lSDL -lode
|
||||||
|
TARGET := $(TARGET).exe
|
||||||
|
SSNAME := dwscr.scr
|
||||||
|
INSTALLDIR := C:\WINDOWS
|
||||||
|
OBJS += displayinfo-win32.o
|
||||||
|
else
|
||||||
|
export CP := cp
|
||||||
|
export MV := mv
|
||||||
|
export CC := gcc
|
||||||
|
export CXX := g++
|
||||||
|
export AR := ar
|
||||||
|
export CPPFLAGS += `sdl-config --cflags` `ode-config --cflags`
|
||||||
|
LDFLAGS += `sdl-config --libs` `ode-config --libs` -lGL -lGLU
|
||||||
|
OBJS += displayinfo.o
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
all: $(TARGET)
|
||||||
|
|
||||||
|
$(TARGET): $(OBJS)
|
||||||
|
$(CXX) -o $@ $(OBJS) $(LDFLAGS)
|
||||||
|
|
||||||
|
.PHONY: wfobj/WFObj.o
|
||||||
|
wfobj/WFObj.o:
|
||||||
|
$(MAKE) -C wfobj
|
||||||
|
|
||||||
|
.PHONY: LoadFile/LoadFile.o
|
||||||
|
LoadFile/LoadFile.o:
|
||||||
|
$(MAKE) -C LoadFile
|
||||||
|
|
||||||
|
.PHONY: ss/ss.a
|
||||||
|
ss/ss.a:
|
||||||
|
$(MAKE) -C ss
|
||||||
|
|
||||||
|
ifdef WIN32
|
||||||
|
.PHONY: install
|
||||||
|
install:
|
||||||
|
$(CP) $(TARGET) $(INSTALLDIR)\$(SSNAME)
|
||||||
|
endif
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
$(MAKE) -C wfobj clean
|
||||||
|
$(MAKE) -C LoadFile clean
|
||||||
|
$(MAKE) -C ss clean
|
||||||
|
-$(RM) -f *~ *.o $(TARGET)
|
55
displayinfo-win32.cc
Normal file
55
displayinfo-win32.cc
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
|
||||||
|
/* Author: Josh Holtrop
|
||||||
|
* DornerWorks screensaver
|
||||||
|
* This Windows-specific module will get the screen size
|
||||||
|
* and return the number of monitors present. Right now the
|
||||||
|
* screensaver will only work properly with two identically
|
||||||
|
* sized monitors...
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <windows.h>
|
||||||
|
#include "displayinfo.h"
|
||||||
|
|
||||||
|
static int numMonitors = 0;
|
||||||
|
|
||||||
|
void getDisplaySize(int * width, int * height)
|
||||||
|
{
|
||||||
|
std::string nullStr = "";
|
||||||
|
int w = 0;
|
||||||
|
int h = 0;
|
||||||
|
|
||||||
|
/* loop through the display devices to get their dimensions */
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
DISPLAY_DEVICE dev;
|
||||||
|
dev.cb = sizeof(DISPLAY_DEVICE);
|
||||||
|
if (!EnumDisplayDevices(NULL, i, &dev, 0))
|
||||||
|
break;
|
||||||
|
/* we only want real display devices to matter */
|
||||||
|
if (dev.DeviceID != nullStr)
|
||||||
|
{
|
||||||
|
HDC hdc = CreateDC(TEXT("DISPLAY"), dev.DeviceString, NULL, NULL);
|
||||||
|
if (hdc != NULL)
|
||||||
|
{
|
||||||
|
numMonitors++;
|
||||||
|
w += GetDeviceCaps(hdc, HORZRES);
|
||||||
|
int thisHeight = GetDeviceCaps(hdc, VERTRES);
|
||||||
|
if (thisHeight > h)
|
||||||
|
h = thisHeight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* only update width and height if we have valid data */
|
||||||
|
if (w != 0 && h != 0)
|
||||||
|
{
|
||||||
|
*width = w;
|
||||||
|
*height = h;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int getNumMonitors()
|
||||||
|
{
|
||||||
|
return numMonitors;
|
||||||
|
}
|
30
displayinfo.cc
Normal file
30
displayinfo.cc
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
|
||||||
|
/* Author: Josh Holtrop
|
||||||
|
* DornerWorks screensaver
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "displayinfo.h"
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
|
||||||
|
void getDisplaySize(int * width, int * height)
|
||||||
|
{
|
||||||
|
Display * display;
|
||||||
|
if ((display = XOpenDisplay(NULL)) == NULL)
|
||||||
|
{
|
||||||
|
/* fall back on hard-coded defaults */
|
||||||
|
*width = 1600;
|
||||||
|
*height = 1200;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int screen_num = DefaultScreen(display);
|
||||||
|
*width = DisplayWidth(display, screen_num);
|
||||||
|
*height = DisplayHeight(display, screen_num);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int getNumMonitors()
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
9
displayinfo.h
Normal file
9
displayinfo.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
/* Author: Josh Holtrop
|
||||||
|
* DornerWorks screensaver
|
||||||
|
* Common interface for obtaining display information from either
|
||||||
|
* Windows or linux
|
||||||
|
*/
|
||||||
|
|
||||||
|
void getDisplaySize(int * width, int * height);
|
||||||
|
int getNumMonitors();
|
97
dwscr.cc
Normal file
97
dwscr.cc
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
|
||||||
|
/* Author: Josh Holtrop
|
||||||
|
* DornerWorks screensaver
|
||||||
|
* This was a for-fun project I started working on in November '07
|
||||||
|
* because I like 3D graphics. I modeled the DornerWorks logo in
|
||||||
|
* blender, exported it to an Alias WaveFront object and material
|
||||||
|
* file, wrote an Alias Wavefront object loader, and then wrapped
|
||||||
|
* some OpenGL and ODE logic around it for various screensaver modes
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#include <SDL/SDL.h>
|
||||||
|
#include <SDL/SDL_syswm.h>
|
||||||
|
#include "displayinfo.h"
|
||||||
|
#include "ss/SSMain.h"
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#define PROGNAME "dwscr"
|
||||||
|
#define DEFAULT_WIDTH 1024
|
||||||
|
#define DEFAULT_HEIGHT 768
|
||||||
|
|
||||||
|
/* main function, called upon program invocation */
|
||||||
|
int main(int argc, char * argv[])
|
||||||
|
{
|
||||||
|
const string startString = "/s";
|
||||||
|
#ifdef WIN32
|
||||||
|
bool start = false;
|
||||||
|
#else
|
||||||
|
bool start = true;
|
||||||
|
#endif
|
||||||
|
SDL_Surface * sdlSurface;
|
||||||
|
int width = DEFAULT_WIDTH;
|
||||||
|
int height = DEFAULT_HEIGHT;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
start = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* make the SDL window appear in the top-left corner of the screen */
|
||||||
|
putenv("SDL_VIDEO_WINDOW_POS=0,0");
|
||||||
|
|
||||||
|
/* do not disable power management (this will allow monitors
|
||||||
|
* to power off at the normally configured timeout) */
|
||||||
|
putenv("SDL_VIDEO_ALLOW_SCREENSAVER=1");
|
||||||
|
|
||||||
|
/* extremely simple command-line argument handling */
|
||||||
|
for (int i = 1; i < argc; i++)
|
||||||
|
{
|
||||||
|
if (startString == argv[i])
|
||||||
|
start = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!start)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
getDisplaySize(&width, &height);
|
||||||
|
|
||||||
|
/* initialize SDL library */
|
||||||
|
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER))
|
||||||
|
{
|
||||||
|
cerr << "Error initializing video!" << endl;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1);
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
||||||
|
|
||||||
|
/* Enable multisampling */
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4);
|
||||||
|
|
||||||
|
if ((sdlSurface = SDL_SetVideoMode(width, height, 0,
|
||||||
|
SDL_HWSURFACE
|
||||||
|
#ifndef WINDOW_MODE
|
||||||
|
| SDL_NOFRAME
|
||||||
|
#endif
|
||||||
|
| SDL_OPENGL)) == NULL)
|
||||||
|
{
|
||||||
|
cerr << "Error setting video mode!" << endl;
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_WM_SetCaption("dwscr", "dwscr");
|
||||||
|
#ifndef WINDOW_MODE
|
||||||
|
SDL_WM_GrabInput(SDL_GRAB_ON);
|
||||||
|
SDL_ShowCursor(SDL_DISABLE);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* after our window is created and SDL and OpenGL are initialized,
|
||||||
|
* start the main screensaver functionality */
|
||||||
|
SSMain ss(width, height, getNumMonitors(), sdlSurface);
|
||||||
|
ss.run();
|
||||||
|
|
||||||
|
SDL_Quit();
|
||||||
|
return 0;
|
||||||
|
}
|
BIN
logo/dwlogo.blend
Normal file
BIN
logo/dwlogo.blend
Normal file
Binary file not shown.
22
logo/dwlogo.mtl
Normal file
22
logo/dwlogo.mtl
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# Blender3D MTL File: dwlogo.blend
|
||||||
|
# Material Count: 2
|
||||||
|
newmtl Material.002
|
||||||
|
Ns 96.078431
|
||||||
|
Ka 0.396 0.392 0.078
|
||||||
|
Kd 0.396 0.392 0.078
|
||||||
|
Ks 0.2 0.2 0.2
|
||||||
|
Ni 1.000000
|
||||||
|
d 1.000000
|
||||||
|
illum 2
|
||||||
|
|
||||||
|
|
||||||
|
newmtl Material.001
|
||||||
|
Ns 96.078431
|
||||||
|
Ka 0.000000 0.326 0.341
|
||||||
|
Kd 0.000000 0.326 0.341
|
||||||
|
Ks 0.2 0.2 0.2
|
||||||
|
Ni 1.000000
|
||||||
|
d 1.000000
|
||||||
|
illum 2
|
||||||
|
|
||||||
|
|
645
logo/dwlogo.obj
Normal file
645
logo/dwlogo.obj
Normal file
@ -0,0 +1,645 @@
|
|||||||
|
# Blender3D v245 OBJ File: dwlogo.blend
|
||||||
|
# www.blender3d.org
|
||||||
|
mtllib dwlogo.mtl
|
||||||
|
v -1.967500 3.292557 0.000000
|
||||||
|
v -1.539864 2.771481 0.000000
|
||||||
|
v -1.222102 2.176990 0.000000
|
||||||
|
v -1.026424 1.531928 0.000000
|
||||||
|
v -0.969990 1.037352 0.000000
|
||||||
|
v -0.578603 1.035548 0.000000
|
||||||
|
v 0.007450 -0.426248 0.000000
|
||||||
|
v 1.376684 3.048505 0.000000
|
||||||
|
v 2.744326 -0.341223 0.000000
|
||||||
|
v 3.879164 2.783177 0.000000
|
||||||
|
v 4.794436 2.784227 0.000000
|
||||||
|
v 4.794755 3.733678 0.000000
|
||||||
|
v -2.503128 3.729895 0.000000
|
||||||
|
v -2.503128 3.729895 0.500000
|
||||||
|
v 4.794755 3.733678 0.500000
|
||||||
|
v 4.794436 2.784227 0.500000
|
||||||
|
v 3.879164 2.783177 0.500000
|
||||||
|
v 2.744326 -0.341223 0.500000
|
||||||
|
v 1.376684 3.048505 0.500000
|
||||||
|
v 0.007450 -0.426248 0.500000
|
||||||
|
v -0.578603 1.035548 0.500000
|
||||||
|
v -0.969990 1.037352 0.500000
|
||||||
|
v -1.026424 1.531928 0.500000
|
||||||
|
v -1.222102 2.176990 0.500000
|
||||||
|
v -1.539864 2.771481 0.500000
|
||||||
|
v -1.967500 3.292557 0.500000
|
||||||
|
vn 0.000000 0.000000 -1.000000
|
||||||
|
vn -0.928184 -0.372121 0.000000
|
||||||
|
vn -0.000518 1.000000 0.000000
|
||||||
|
vn 1.000000 -0.000336 0.000000
|
||||||
|
vn 0.001147 -0.999999 0.000000
|
||||||
|
vn 0.939920 -0.341396 0.000000
|
||||||
|
vn -0.927364 -0.374160 0.000000
|
||||||
|
vn 0.930373 -0.366615 0.000000
|
||||||
|
vn -0.004611 -0.999989 0.000000
|
||||||
|
vn 0.000000 0.000000 1.000000
|
||||||
|
g Cube.005_Cube.006_Material.002
|
||||||
|
usemtl Material.002
|
||||||
|
s off
|
||||||
|
f 11//1 13//1 12//1
|
||||||
|
f 8//1 1//1 13//1
|
||||||
|
f 11//1 8//1 13//1
|
||||||
|
f 2//1 1//1 8//1
|
||||||
|
f 3//1 2//1 8//1
|
||||||
|
f 6//1 3//1 8//1
|
||||||
|
f 7//1 6//1 8//1
|
||||||
|
f 10//1 9//1 8//1
|
||||||
|
f 11//1 10//1 8//1
|
||||||
|
f 6//1 4//1 3//1
|
||||||
|
f 6//1 5//1 4//1
|
||||||
|
f 7//2 20//2 21//2 6//2
|
||||||
|
f 13//3 14//3 15//3 12//3
|
||||||
|
f 12//4 15//4 16//4 11//4
|
||||||
|
f 11//5 16//5 17//5 10//5
|
||||||
|
f 10//6 17//6 18//6 9//6
|
||||||
|
f 9//7 18//7 19//7 8//7
|
||||||
|
f 8//8 19//8 20//8 7//8
|
||||||
|
f 6//9 21//9 22//9 5//9
|
||||||
|
f 14//10 16//10 15//10
|
||||||
|
f 26//10 19//10 14//10
|
||||||
|
f 19//10 16//10 14//10
|
||||||
|
f 25//10 19//10 26//10
|
||||||
|
f 25//10 24//10 19//10
|
||||||
|
f 24//10 21//10 19//10
|
||||||
|
f 21//10 20//10 19//10
|
||||||
|
f 18//10 17//10 19//10
|
||||||
|
f 17//10 16//10 19//10
|
||||||
|
f 23//10 21//10 24//10
|
||||||
|
f 22//10 21//10 23//10
|
||||||
|
v 2.768149 -1.634091 0.000000
|
||||||
|
v 1.384947 1.793045 0.000000
|
||||||
|
v 0.012920 -1.618155 0.000000
|
||||||
|
v -0.883670 0.580436 0.000000
|
||||||
|
v -0.972935 0.581641 0.000000
|
||||||
|
v -1.028585 0.087289 0.000000
|
||||||
|
v -1.218865 -0.539980 0.000000
|
||||||
|
v -1.527863 -1.118075 0.000000
|
||||||
|
v -1.943704 -1.624779 0.000000
|
||||||
|
v -2.450409 -2.040621 0.000000
|
||||||
|
v -2.782750 -2.236504 0.000000
|
||||||
|
v 4.806163 -2.230783 0.000000
|
||||||
|
v 4.807395 2.336444 0.000000
|
||||||
|
v 4.206083 2.335061 0.000000
|
||||||
|
v 4.206083 2.335061 0.500000
|
||||||
|
v 4.807395 2.336444 0.500000
|
||||||
|
v 4.806163 -2.230783 0.500000
|
||||||
|
v -2.782750 -2.236504 0.500000
|
||||||
|
v -2.450409 -2.040621 0.500000
|
||||||
|
v -1.943704 -1.624779 0.500000
|
||||||
|
v -1.527863 -1.118075 0.500000
|
||||||
|
v -1.218865 -0.539980 0.500000
|
||||||
|
v -1.028585 0.087289 0.500000
|
||||||
|
v -0.972935 0.581641 0.500000
|
||||||
|
v -0.883670 0.580436 0.500000
|
||||||
|
v 0.012920 -1.618155 0.500000
|
||||||
|
v 1.384947 1.793045 0.500000
|
||||||
|
v 2.768149 -1.634091 0.500000
|
||||||
|
vn 0.000754 -1.000000 0.000000
|
||||||
|
vn -0.940203 0.340614 0.000000
|
||||||
|
vn -0.002300 0.999997 0.000000
|
||||||
|
vn 1.000000 -0.000270 0.000000
|
||||||
|
vn 0.013502 0.999909 0.000000
|
||||||
|
vn 0.925965 0.377610 0.000000
|
||||||
|
vn -0.927767 0.373159 0.000000
|
||||||
|
vn 0.927320 0.374269 0.000000
|
||||||
|
g Cube.004_Cube.005_Material.001
|
||||||
|
usemtl Material.001
|
||||||
|
s off
|
||||||
|
f 38//1 40//1 39//1
|
||||||
|
f 38//1 27//1 40//1
|
||||||
|
f 27//1 29//1 28//1
|
||||||
|
f 30//1 32//1 31//1
|
||||||
|
f 29//1 32//1 30//1
|
||||||
|
f 29//1 33//1 32//1
|
||||||
|
f 29//1 34//1 33//1
|
||||||
|
f 29//1 35//1 34//1
|
||||||
|
f 27//1 35//1 29//1
|
||||||
|
f 27//1 36//1 35//1
|
||||||
|
f 36//1 27//1 38//1
|
||||||
|
f 38//1 37//1 36//1
|
||||||
|
f 38//11 43//11 44//11 37//11
|
||||||
|
f 27//12 54//12 41//12 40//12
|
||||||
|
f 40//13 41//13 42//13 39//13
|
||||||
|
f 39//14 42//14 43//14 38//14
|
||||||
|
f 31//15 50//15 51//15 30//15
|
||||||
|
f 30//16 51//16 52//16 29//16
|
||||||
|
f 29//17 52//17 53//17 28//17
|
||||||
|
f 54//18 27//18 28//18 53//18
|
||||||
|
f 41//10 43//10 42//10
|
||||||
|
f 54//10 43//10 41//10
|
||||||
|
f 52//10 54//10 53//10
|
||||||
|
f 49//10 51//10 50//10
|
||||||
|
f 49//10 52//10 51//10
|
||||||
|
f 48//10 52//10 49//10
|
||||||
|
f 47//10 52//10 48//10
|
||||||
|
f 46//10 52//10 47//10
|
||||||
|
f 46//10 54//10 52//10
|
||||||
|
f 45//10 54//10 46//10
|
||||||
|
f 45//10 43//10 54//10
|
||||||
|
f 44//10 43//10 45//10
|
||||||
|
v -3.414269 0.996186 0.000000
|
||||||
|
v -3.360440 0.922096 0.000000
|
||||||
|
v -3.332140 0.834999 0.000000
|
||||||
|
v -3.332140 0.743420 0.000000
|
||||||
|
v -3.360440 0.656322 0.000000
|
||||||
|
v -3.414269 0.582233 0.000000
|
||||||
|
v -3.488358 0.528404 0.000000
|
||||||
|
v -3.575455 0.500104 0.000000
|
||||||
|
v -3.667035 0.500104 0.000000
|
||||||
|
v -3.754132 0.528404 0.000000
|
||||||
|
v -3.828222 0.582233 0.000000
|
||||||
|
v -3.882050 0.656322 0.000000
|
||||||
|
v -3.910350 0.743420 0.000000
|
||||||
|
v -3.910350 0.834999 0.000000
|
||||||
|
v -3.882050 0.922097 0.000000
|
||||||
|
v -3.828221 0.996186 0.000000
|
||||||
|
v -3.754131 1.050015 0.000000
|
||||||
|
v -3.667034 1.078314 0.000000
|
||||||
|
v -3.575454 1.078314 0.000000
|
||||||
|
v -3.488358 1.050014 0.000000
|
||||||
|
v -3.488358 1.050014 0.500000
|
||||||
|
v -3.575454 1.078314 0.500000
|
||||||
|
v -3.667034 1.078314 0.500000
|
||||||
|
v -3.754131 1.050015 0.500000
|
||||||
|
v -3.828221 0.996186 0.500000
|
||||||
|
v -3.882050 0.922097 0.500000
|
||||||
|
v -3.910350 0.834999 0.500000
|
||||||
|
v -3.910350 0.743420 0.500000
|
||||||
|
v -3.882050 0.656322 0.500000
|
||||||
|
v -3.828222 0.582233 0.500000
|
||||||
|
v -3.754132 0.528404 0.500000
|
||||||
|
v -3.667035 0.500104 0.500000
|
||||||
|
v -3.575455 0.500104 0.500000
|
||||||
|
v -3.488358 0.528404 0.500000
|
||||||
|
v -3.414269 0.582233 0.500000
|
||||||
|
v -3.360440 0.656322 0.500000
|
||||||
|
v -3.332140 0.743420 0.500000
|
||||||
|
v -3.332140 0.834999 0.500000
|
||||||
|
v -3.360440 0.922096 0.500000
|
||||||
|
v -3.414269 0.996186 0.500000
|
||||||
|
g Cube.003_Cube.004_Material.002
|
||||||
|
usemtl Material.002
|
||||||
|
s off
|
||||||
|
f 73//1 71//1 72//1
|
||||||
|
f 74//1 71//1 73//1
|
||||||
|
f 74//1 70//1 71//1
|
||||||
|
f 55//1 70//1 74//1
|
||||||
|
f 55//1 69//1 70//1
|
||||||
|
f 69//1 55//1 56//1
|
||||||
|
f 56//1 68//1 69//1
|
||||||
|
f 57//1 68//1 56//1
|
||||||
|
f 57//1 67//1 68//1
|
||||||
|
f 58//1 67//1 57//1
|
||||||
|
f 58//1 66//1 67//1
|
||||||
|
f 59//1 66//1 58//1
|
||||||
|
f 59//1 65//1 66//1
|
||||||
|
f 60//1 65//1 59//1
|
||||||
|
f 60//1 64//1 65//1
|
||||||
|
f 61//1 64//1 60//1
|
||||||
|
f 61//1 63//1 64//1
|
||||||
|
f 62//1 63//1 61//1
|
||||||
|
f 78//10 76//10 77//10
|
||||||
|
f 78//10 75//10 76//10
|
||||||
|
f 79//10 75//10 78//10
|
||||||
|
f 79//10 94//10 75//10
|
||||||
|
f 80//10 94//10 79//10
|
||||||
|
f 80//10 93//10 94//10
|
||||||
|
f 81//10 93//10 80//10
|
||||||
|
f 81//10 92//10 93//10
|
||||||
|
f 82//10 92//10 81//10
|
||||||
|
f 82//10 91//10 92//10
|
||||||
|
f 83//10 91//10 82//10
|
||||||
|
f 83//10 90//10 91//10
|
||||||
|
f 84//10 90//10 83//10
|
||||||
|
f 84//10 89//10 90//10
|
||||||
|
f 85//10 89//10 84//10
|
||||||
|
f 85//10 88//10 89//10
|
||||||
|
f 86//10 88//10 85//10
|
||||||
|
f 86//10 87//10 88//10
|
||||||
|
v -2.327900 2.981822 0.000000
|
||||||
|
v -1.946631 2.517246 0.000000
|
||||||
|
v -1.663324 1.987213 0.000000
|
||||||
|
v -1.488863 1.412095 0.000000
|
||||||
|
v -1.441604 0.586849 0.000000
|
||||||
|
v -1.488863 0.215889 0.000000
|
||||||
|
v -1.663323 -0.359229 0.000000
|
||||||
|
v -1.946631 -0.889262 0.000000
|
||||||
|
v -2.327900 -1.353839 0.000000
|
||||||
|
v -2.792477 -1.735108 0.000000
|
||||||
|
v -3.322510 -2.018416 0.000000
|
||||||
|
v -3.897629 -2.192876 0.000000
|
||||||
|
v -4.747342 -2.200104 0.000000
|
||||||
|
v -4.747336 3.727444 0.000000
|
||||||
|
v -3.550383 3.725241 0.000000
|
||||||
|
v -3.322504 3.646397 0.000000
|
||||||
|
v -2.792472 3.363088 0.000000
|
||||||
|
v -3.110140 1.315794 0.000000
|
||||||
|
v -2.962800 1.105371 0.000000
|
||||||
|
v -2.943537 1.031374 0.000000
|
||||||
|
v -2.924606 0.589536 0.000000
|
||||||
|
v -3.027266 0.368530 0.000000
|
||||||
|
v -3.208907 0.186889 0.000000
|
||||||
|
v -3.441719 0.078327 0.000000
|
||||||
|
v -3.697621 0.055938 0.000000
|
||||||
|
v -3.945747 0.122423 0.000000
|
||||||
|
v -4.156171 0.269763 0.000000
|
||||||
|
v -4.303511 0.480187 0.000000
|
||||||
|
v -4.369996 0.728313 0.000000
|
||||||
|
v -4.347608 0.984215 0.000000
|
||||||
|
v -4.239046 1.217027 0.000000
|
||||||
|
v -4.057405 1.398669 0.000000
|
||||||
|
v -3.824593 1.507231 0.000000
|
||||||
|
v -3.568691 1.529619 0.000000
|
||||||
|
v -3.320565 1.463135 0.000000
|
||||||
|
v -1.442270 1.039348 0.000000
|
||||||
|
v -1.442270 1.039348 0.500000
|
||||||
|
v -3.320565 1.463135 0.500000
|
||||||
|
v -3.568691 1.529619 0.500000
|
||||||
|
v -3.824593 1.507231 0.500000
|
||||||
|
v -4.057405 1.398669 0.500000
|
||||||
|
v -4.239046 1.217027 0.500000
|
||||||
|
v -4.347608 0.984215 0.500000
|
||||||
|
v -4.369996 0.728313 0.500000
|
||||||
|
v -4.303511 0.480187 0.500000
|
||||||
|
v -4.156171 0.269763 0.500000
|
||||||
|
v -3.945747 0.122423 0.500000
|
||||||
|
v -3.697621 0.055938 0.500000
|
||||||
|
v -3.441719 0.078327 0.500000
|
||||||
|
v -3.208907 0.186889 0.500000
|
||||||
|
v -3.027266 0.368530 0.500000
|
||||||
|
v -2.924606 0.589536 0.500000
|
||||||
|
v -2.943537 1.031374 0.500000
|
||||||
|
v -2.962800 1.105371 0.500000
|
||||||
|
v -3.110140 1.315794 0.500000
|
||||||
|
v -2.792472 3.363088 0.500000
|
||||||
|
v -3.322504 3.646397 0.500000
|
||||||
|
v -3.550383 3.725241 0.500000
|
||||||
|
v -4.747336 3.727444 0.500000
|
||||||
|
v -4.747342 -2.200104 0.500000
|
||||||
|
v -3.897629 -2.192876 0.500000
|
||||||
|
v -3.322510 -2.018416 0.500000
|
||||||
|
v -2.792477 -1.735108 0.500000
|
||||||
|
v -2.327900 -1.353839 0.500000
|
||||||
|
v -1.946631 -0.889262 0.500000
|
||||||
|
v -1.663323 -0.359229 0.500000
|
||||||
|
v -1.488863 0.215889 0.500000
|
||||||
|
v -1.441604 0.586849 0.500000
|
||||||
|
v -1.488863 1.412095 0.500000
|
||||||
|
v -1.663324 1.987213 0.500000
|
||||||
|
v -1.946631 2.517246 0.500000
|
||||||
|
v -2.327900 2.981822 0.500000
|
||||||
|
vn 0.001812 0.999998 0.000000
|
||||||
|
vn 0.005311 -0.999986 0.000000
|
||||||
|
vn -1.000000 0.000001 0.000000
|
||||||
|
vn 0.001840 0.999998 0.000000
|
||||||
|
vn 0.008506 -0.999964 0.000000
|
||||||
|
g Cylinder.001_Cylinder.001_Material.001
|
||||||
|
usemtl Material.001
|
||||||
|
s off
|
||||||
|
f 124//1 107//1 108//1
|
||||||
|
f 125//1 124//1 108//1
|
||||||
|
f 126//1 125//1 108//1
|
||||||
|
f 109//1 126//1 108//1
|
||||||
|
f 110//1 126//1 109//1
|
||||||
|
f 111//1 126//1 110//1
|
||||||
|
f 95//1 126//1 111//1
|
||||||
|
f 126//1 95//1 96//1
|
||||||
|
f 127//1 126//1 96//1
|
||||||
|
f 128//1 127//1 96//1
|
||||||
|
f 97//1 128//1 96//1
|
||||||
|
f 98//1 128//1 97//1
|
||||||
|
f 98//1 129//1 128//1
|
||||||
|
f 98//1 112//1 129//1
|
||||||
|
f 130//1 112//1 98//1
|
||||||
|
f 130//1 113//1 112//1
|
||||||
|
f 130//1 114//1 113//1
|
||||||
|
f 123//1 107//1 124//1
|
||||||
|
f 122//1 107//1 123//1
|
||||||
|
f 99//1 116//1 115//1
|
||||||
|
f 100//1 116//1 99//1
|
||||||
|
f 121//1 107//1 122//1
|
||||||
|
f 100//1 117//1 116//1
|
||||||
|
f 120//1 107//1 121//1
|
||||||
|
f 101//1 117//1 100//1
|
||||||
|
f 101//1 118//1 117//1
|
||||||
|
f 119//1 107//1 120//1
|
||||||
|
f 101//1 119//1 118//1
|
||||||
|
f 101//1 107//1 119//1
|
||||||
|
f 102//1 107//1 101//1
|
||||||
|
f 103//1 107//1 102//1
|
||||||
|
f 104//1 107//1 103//1
|
||||||
|
f 105//1 107//1 104//1
|
||||||
|
f 106//1 107//1 105//1
|
||||||
|
f 115//19 146//19 162//19 99//19
|
||||||
|
f 130//20 131//20 147//20 114//20
|
||||||
|
f 107//21 154//21 153//21 108//21
|
||||||
|
f 108//22 153//22 152//22 109//22
|
||||||
|
f 106//23 155//23 154//23 107//23
|
||||||
|
f 154//10 137//10 153//10
|
||||||
|
f 137//10 136//10 153//10
|
||||||
|
f 136//10 135//10 153//10
|
||||||
|
f 135//10 152//10 153//10
|
||||||
|
f 135//10 151//10 152//10
|
||||||
|
f 135//10 150//10 151//10
|
||||||
|
f 135//10 166//10 150//10
|
||||||
|
f 135//10 165//10 166//10
|
||||||
|
f 135//10 134//10 165//10
|
||||||
|
f 134//10 133//10 165//10
|
||||||
|
f 133//10 164//10 165//10
|
||||||
|
f 133//10 163//10 164//10
|
||||||
|
f 132//10 163//10 133//10
|
||||||
|
f 149//10 163//10 132//10
|
||||||
|
f 149//10 131//10 163//10
|
||||||
|
f 148//10 131//10 149//10
|
||||||
|
f 147//10 131//10 148//10
|
||||||
|
f 154//10 138//10 137//10
|
||||||
|
f 154//10 139//10 138//10
|
||||||
|
f 145//10 162//10 146//10
|
||||||
|
f 145//10 161//10 162//10
|
||||||
|
f 154//10 140//10 139//10
|
||||||
|
f 144//10 161//10 145//10
|
||||||
|
f 154//10 141//10 140//10
|
||||||
|
f 144//10 160//10 161//10
|
||||||
|
f 143//10 160//10 144//10
|
||||||
|
f 154//10 142//10 141//10
|
||||||
|
f 142//10 160//10 143//10
|
||||||
|
f 154//10 160//10 142//10
|
||||||
|
f 154//10 159//10 160//10
|
||||||
|
f 154//10 158//10 159//10
|
||||||
|
f 154//10 157//10 158//10
|
||||||
|
f 154//10 156//10 157//10
|
||||||
|
f 154//10 155//10 156//10
|
||||||
|
v -1.967500 3.292557 0.000000
|
||||||
|
v -1.539864 2.771481 0.000000
|
||||||
|
v -1.222102 2.176990 0.000000
|
||||||
|
v -1.026424 1.531928 0.000000
|
||||||
|
v -0.969990 1.037352 0.000000
|
||||||
|
v -2.503128 3.729895 0.000000
|
||||||
|
v -2.503128 3.729895 0.500000
|
||||||
|
v -0.969990 1.037352 0.500000
|
||||||
|
v -1.026424 1.531928 0.500000
|
||||||
|
v -1.222102 2.176990 0.500000
|
||||||
|
v -1.539864 2.771481 0.500000
|
||||||
|
v -1.967500 3.292557 0.500000
|
||||||
|
vn -0.706198 -0.707968 0.000000
|
||||||
|
vn -0.632435 -0.774590 0.000000
|
||||||
|
vn -0.993530 -0.113346 0.000000
|
||||||
|
vn -0.979247 -0.202643 0.000000
|
||||||
|
vn -0.923856 -0.382672 0.000000
|
||||||
|
vn -0.831446 -0.555559 0.000000
|
||||||
|
g Cube.002_Cube.003_Material.002
|
||||||
|
usemtl Material.002
|
||||||
|
s 1
|
||||||
|
f 167//24 178//24 173//25 172//25
|
||||||
|
f 171//26 174//26 175//27 170//27
|
||||||
|
f 170//27 175//27 176//28 169//28
|
||||||
|
f 169//28 176//28 177//29 168//29
|
||||||
|
f 178//24 167//24 168//29 177//29
|
||||||
|
v -3.414269 0.996186 0.000000
|
||||||
|
v -3.360440 0.922096 0.000000
|
||||||
|
v -3.332140 0.834999 0.000000
|
||||||
|
v -3.332140 0.743420 0.000000
|
||||||
|
v -3.360440 0.656322 0.000000
|
||||||
|
v -3.414269 0.582233 0.000000
|
||||||
|
v -3.488358 0.528404 0.000000
|
||||||
|
v -3.575455 0.500104 0.000000
|
||||||
|
v -3.667035 0.500104 0.000000
|
||||||
|
v -3.754132 0.528404 0.000000
|
||||||
|
v -3.828222 0.582233 0.000000
|
||||||
|
v -3.882050 0.656322 0.000000
|
||||||
|
v -3.910350 0.743420 0.000000
|
||||||
|
v -3.910350 0.834999 0.000000
|
||||||
|
v -3.882050 0.922097 0.000000
|
||||||
|
v -3.828221 0.996186 0.000000
|
||||||
|
v -3.754131 1.050015 0.000000
|
||||||
|
v -3.667034 1.078314 0.000000
|
||||||
|
v -3.575454 1.078314 0.000000
|
||||||
|
v -3.488358 1.050014 0.000000
|
||||||
|
v -3.488358 1.050014 0.500000
|
||||||
|
v -3.575454 1.078314 0.500000
|
||||||
|
v -3.667034 1.078314 0.500000
|
||||||
|
v -3.754131 1.050015 0.500000
|
||||||
|
v -3.828221 0.996186 0.500000
|
||||||
|
v -3.882050 0.922097 0.500000
|
||||||
|
v -3.910350 0.834999 0.500000
|
||||||
|
v -3.910350 0.743420 0.500000
|
||||||
|
v -3.882050 0.656322 0.500000
|
||||||
|
v -3.828222 0.582233 0.500000
|
||||||
|
v -3.754132 0.528404 0.500000
|
||||||
|
v -3.667035 0.500104 0.500000
|
||||||
|
v -3.575455 0.500104 0.500000
|
||||||
|
v -3.488358 0.528404 0.500000
|
||||||
|
v -3.414269 0.582233 0.500000
|
||||||
|
v -3.360440 0.656322 0.500000
|
||||||
|
v -3.332140 0.743420 0.500000
|
||||||
|
v -3.332140 0.834999 0.500000
|
||||||
|
v -3.360440 0.922096 0.500000
|
||||||
|
v -3.414269 0.996186 0.500000
|
||||||
|
vn 0.707083 0.707083 0.000000
|
||||||
|
vn 0.453963 0.890988 0.000000
|
||||||
|
vn 0.156407 0.987671 0.000000
|
||||||
|
vn -0.156407 0.987671 0.000000
|
||||||
|
vn -0.453963 0.890988 0.000000
|
||||||
|
vn -0.707083 0.707083 0.000000
|
||||||
|
vn -0.890988 0.453993 0.000000
|
||||||
|
vn -0.987671 0.156407 0.000000
|
||||||
|
vn -0.987671 -0.156407 0.000000
|
||||||
|
vn -0.890988 -0.453963 0.000000
|
||||||
|
vn -0.707083 -0.707083 0.000000
|
||||||
|
vn -0.453963 -0.890988 0.000000
|
||||||
|
vn -0.156407 -0.987671 0.000000
|
||||||
|
vn 0.156407 -0.987671 0.000000
|
||||||
|
vn 0.453963 -0.890988 0.000000
|
||||||
|
vn 0.707083 -0.707083 0.000000
|
||||||
|
vn 0.890988 -0.453963 0.000000
|
||||||
|
vn 0.987671 -0.156407 0.000000
|
||||||
|
vn 0.987671 0.156407 0.000000
|
||||||
|
vn 0.890988 0.453963 0.000000
|
||||||
|
g Cube.001_Cube.002_Material.002
|
||||||
|
usemtl Material.002
|
||||||
|
s 1
|
||||||
|
f 218//30 179//30 198//31 199//31
|
||||||
|
f 197//32 200//32 199//31 198//31
|
||||||
|
f 196//33 201//33 200//32 197//32
|
||||||
|
f 195//34 202//34 201//33 196//33
|
||||||
|
f 194//35 203//35 202//34 195//34
|
||||||
|
f 193//36 204//36 203//35 194//35
|
||||||
|
f 192//37 205//37 204//36 193//36
|
||||||
|
f 191//38 206//38 205//37 192//37
|
||||||
|
f 190//39 207//39 206//38 191//38
|
||||||
|
f 189//40 208//40 207//39 190//39
|
||||||
|
f 188//41 209//41 208//40 189//40
|
||||||
|
f 187//42 210//42 209//41 188//41
|
||||||
|
f 186//43 211//43 210//42 187//42
|
||||||
|
f 185//44 212//44 211//43 186//43
|
||||||
|
f 184//45 213//45 212//44 185//44
|
||||||
|
f 183//46 214//46 213//45 184//45
|
||||||
|
f 182//47 215//47 214//46 183//46
|
||||||
|
f 181//48 216//48 215//47 182//47
|
||||||
|
f 180//49 217//49 216//48 181//48
|
||||||
|
f 179//30 218//30 217//49 180//49
|
||||||
|
v -0.972935 0.581641 0.000000
|
||||||
|
v -1.028585 0.087289 0.000000
|
||||||
|
v -1.218865 -0.539980 0.000000
|
||||||
|
v -1.527863 -1.118075 0.000000
|
||||||
|
v -1.943704 -1.624779 0.000000
|
||||||
|
v -2.450409 -2.040621 0.000000
|
||||||
|
v -2.782750 -2.236504 0.000000
|
||||||
|
v -2.782750 -2.236504 0.500000
|
||||||
|
v -2.450409 -2.040621 0.500000
|
||||||
|
v -1.943704 -1.624779 0.500000
|
||||||
|
v -1.527863 -1.118075 0.500000
|
||||||
|
v -1.218865 -0.539980 0.500000
|
||||||
|
v -1.028585 0.087289 0.500000
|
||||||
|
v -0.972935 0.581641 0.500000
|
||||||
|
vn -0.507767 0.861476 0.000000
|
||||||
|
vn -0.572771 0.819697 0.000000
|
||||||
|
vn -0.831446 0.555559 0.000000
|
||||||
|
vn -0.923856 0.382672 0.000000
|
||||||
|
vn -0.979400 0.201910 0.000000
|
||||||
|
vn -0.993713 0.111850 0.000000
|
||||||
|
g Cube_Cube.001_Material.001
|
||||||
|
usemtl Material.001
|
||||||
|
s 1
|
||||||
|
f 225//50 226//50 227//51 224//51
|
||||||
|
f 224//51 227//51 228//35 223//35
|
||||||
|
f 223//35 228//35 229//52 222//52
|
||||||
|
f 222//52 229//52 230//53 221//53
|
||||||
|
f 221//53 230//53 231//54 220//54
|
||||||
|
f 232//55 219//55 220//54 231//54
|
||||||
|
v -2.327900 2.981822 0.000000
|
||||||
|
v -1.946631 2.517246 0.000000
|
||||||
|
v -1.663324 1.987213 0.000000
|
||||||
|
v -1.488863 1.412095 0.000000
|
||||||
|
v -1.441604 0.586849 0.000000
|
||||||
|
v -1.488863 0.215889 0.000000
|
||||||
|
v -1.663323 -0.359229 0.000000
|
||||||
|
v -1.946631 -0.889262 0.000000
|
||||||
|
v -2.327900 -1.353839 0.000000
|
||||||
|
v -2.792477 -1.735108 0.000000
|
||||||
|
v -3.322510 -2.018416 0.000000
|
||||||
|
v -3.897629 -2.192876 0.000000
|
||||||
|
v -3.550383 3.725241 0.000000
|
||||||
|
v -3.322504 3.646397 0.000000
|
||||||
|
v -2.792472 3.363088 0.000000
|
||||||
|
v -3.110140 1.315794 0.000000
|
||||||
|
v -2.962800 1.105371 0.000000
|
||||||
|
v -2.943537 1.031374 0.000000
|
||||||
|
v -2.924606 0.589536 0.000000
|
||||||
|
v -3.027266 0.368530 0.000000
|
||||||
|
v -3.208907 0.186889 0.000000
|
||||||
|
v -3.441719 0.078327 0.000000
|
||||||
|
v -3.697621 0.055938 0.000000
|
||||||
|
v -3.945747 0.122423 0.000000
|
||||||
|
v -4.156171 0.269763 0.000000
|
||||||
|
v -4.303511 0.480187 0.000000
|
||||||
|
v -4.369996 0.728313 0.000000
|
||||||
|
v -4.347608 0.984215 0.000000
|
||||||
|
v -4.239046 1.217027 0.000000
|
||||||
|
v -4.057405 1.398669 0.000000
|
||||||
|
v -3.824593 1.507231 0.000000
|
||||||
|
v -3.568691 1.529619 0.000000
|
||||||
|
v -3.320565 1.463135 0.000000
|
||||||
|
v -1.442270 1.039348 0.000000
|
||||||
|
v -1.442270 1.039348 0.500000
|
||||||
|
v -3.320565 1.463135 0.500000
|
||||||
|
v -3.568691 1.529619 0.500000
|
||||||
|
v -3.824593 1.507231 0.500000
|
||||||
|
v -4.057405 1.398669 0.500000
|
||||||
|
v -4.239046 1.217027 0.500000
|
||||||
|
v -4.347608 0.984215 0.500000
|
||||||
|
v -4.369996 0.728313 0.500000
|
||||||
|
v -4.303511 0.480187 0.500000
|
||||||
|
v -4.156171 0.269763 0.500000
|
||||||
|
v -3.945747 0.122423 0.500000
|
||||||
|
v -3.697621 0.055938 0.500000
|
||||||
|
v -3.441719 0.078327 0.500000
|
||||||
|
v -3.208907 0.186889 0.500000
|
||||||
|
v -3.027266 0.368530 0.500000
|
||||||
|
v -2.924606 0.589536 0.500000
|
||||||
|
v -2.943537 1.031374 0.500000
|
||||||
|
v -2.962800 1.105371 0.500000
|
||||||
|
v -3.110140 1.315794 0.500000
|
||||||
|
v -2.792472 3.363088 0.500000
|
||||||
|
v -3.322504 3.646397 0.500000
|
||||||
|
v -3.550383 3.725241 0.500000
|
||||||
|
v -3.897629 -2.192876 0.500000
|
||||||
|
v -3.322510 -2.018416 0.500000
|
||||||
|
v -2.792477 -1.735108 0.500000
|
||||||
|
v -2.327900 -1.353839 0.500000
|
||||||
|
v -1.946631 -0.889262 0.500000
|
||||||
|
v -1.663323 -0.359229 0.500000
|
||||||
|
v -1.488863 0.215889 0.500000
|
||||||
|
v -1.441604 0.586849 0.500000
|
||||||
|
v -1.488863 1.412095 0.500000
|
||||||
|
v -1.663324 1.987213 0.500000
|
||||||
|
v -1.946631 2.517246 0.500000
|
||||||
|
v -2.327900 2.981822 0.500000
|
||||||
|
vn 0.978118 0.207892 0.000000
|
||||||
|
vn 0.992248 0.124027 0.000000
|
||||||
|
vn -0.422590 -0.906308 0.000000
|
||||||
|
vn -0.087130 -0.996185 0.000000
|
||||||
|
vn 0.258797 -0.965911 0.000000
|
||||||
|
vn 0.573565 -0.819147 0.000000
|
||||||
|
vn 0.819147 -0.573565 0.000000
|
||||||
|
vn 0.965911 -0.258797 0.000000
|
||||||
|
vn 0.996185 0.087130 0.000000
|
||||||
|
vn 0.906278 0.422590 0.000000
|
||||||
|
vn 0.422590 0.906278 0.000000
|
||||||
|
vn 0.087130 0.996185 0.000000
|
||||||
|
vn -0.258797 0.965911 0.000000
|
||||||
|
vn -0.573565 0.819147 0.000000
|
||||||
|
vn -0.819575 0.572954 0.000000
|
||||||
|
vn -0.906919 0.421277 0.000000
|
||||||
|
vn -0.967742 -0.251930 0.000000
|
||||||
|
vn -0.907804 -0.419385 0.000000
|
||||||
|
vn 0.555559 0.831446 0.000000
|
||||||
|
vn 0.400403 0.916318 0.000000
|
||||||
|
vn 0.326945 0.945006 0.000000
|
||||||
|
vn 0.382672 -0.923856 0.000000
|
||||||
|
vn 0.290262 -0.956938 0.000000
|
||||||
|
vn 0.555559 -0.831446 0.000000
|
||||||
|
vn 0.831446 -0.555559 0.000000
|
||||||
|
vn 0.923856 -0.382672 0.000000
|
||||||
|
vn 0.977874 -0.209052 0.000000
|
||||||
|
vn 0.991974 -0.126347 0.000000
|
||||||
|
vn 0.923856 0.382672 0.000000
|
||||||
|
vn 0.831446 0.555559 0.000000
|
||||||
|
g Cylinder_Cylinder_Material.001
|
||||||
|
usemtl Material.001
|
||||||
|
s 1
|
||||||
|
f 236//56 297//56 267//57 266//57
|
||||||
|
f 248//40 285//40 268//58 265//58
|
||||||
|
f 265//58 268//58 269//59 264//59
|
||||||
|
f 264//59 269//59 270//60 263//60
|
||||||
|
f 263//60 270//60 271//61 262//61
|
||||||
|
f 262//61 271//61 272//62 261//62
|
||||||
|
f 261//62 272//62 273//63 260//63
|
||||||
|
f 260//63 273//63 274//64 259//64
|
||||||
|
f 259//64 274//64 275//65 258//65
|
||||||
|
f 258//65 275//65 276//30 257//30
|
||||||
|
f 257//30 276//30 277//66 256//66
|
||||||
|
f 256//66 277//66 278//67 255//67
|
||||||
|
f 255//67 278//67 279//68 254//68
|
||||||
|
f 254//68 279//68 280//69 253//69
|
||||||
|
f 253//69 280//69 281//70 252//70
|
||||||
|
f 252//70 281//70 282//71 251//71
|
||||||
|
f 250//72 283//72 284//73 249//73
|
||||||
|
f 249//73 284//73 285//40 248//40
|
||||||
|
f 300//30 233//30 247//74 286//74
|
||||||
|
f 246//75 287//75 286//74 247//74
|
||||||
|
f 245//76 288//76 287//75 246//75
|
||||||
|
f 243//77 290//77 289//78 244//78
|
||||||
|
f 242//79 291//79 290//77 243//77
|
||||||
|
f 241//45 292//45 291//79 242//79
|
||||||
|
f 240//80 293//80 292//45 241//45
|
||||||
|
f 239//81 294//81 293//80 240//80
|
||||||
|
f 238//82 295//82 294//81 239//81
|
||||||
|
f 237//83 296//83 295//82 238//82
|
||||||
|
f 235//84 298//84 297//56 236//56
|
||||||
|
f 234//85 299//85 298//84 235//84
|
||||||
|
f 233//30 300//30 299//85 234//85
|
1
make-win32.bat
Executable file
1
make-win32.bat
Executable file
@ -0,0 +1 @@
|
|||||||
|
mingw32-make WIN32=1 %*
|
112
ss/LogoBox.cpp
Normal file
112
ss/LogoBox.cpp
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
|
||||||
|
/* Author: Josh Holtrop
|
||||||
|
* DornerWorks screensaver
|
||||||
|
* This module can be used to create "LogoBox" objects
|
||||||
|
* which consist of a 3D DW logo and possibly have a
|
||||||
|
* mass and boundary associated with them if physics
|
||||||
|
* is being used
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <GL/gl.h>
|
||||||
|
#include <ode/ode.h>
|
||||||
|
#include "../wfobj/WFObj.hh"
|
||||||
|
#include "LogoBox.h"
|
||||||
|
#include "../LoadFile/LoadFile.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
static GLuint _logoList = 0;
|
||||||
|
static float _logoAABB[6];
|
||||||
|
static GLuint _drawList;
|
||||||
|
|
||||||
|
/* construct a LogoBox object
|
||||||
|
* The first time the constructor is called it loads the
|
||||||
|
* Alias Wavefront object model. Subsequent calls will
|
||||||
|
* reuse the same module. If physics are being used
|
||||||
|
* (world and space are not NULL), then the constructor
|
||||||
|
* initializes an ODE body and geometry for each
|
||||||
|
* constructed logo.
|
||||||
|
*/
|
||||||
|
LogoBox::LogoBox(dWorldID world, dSpaceID space)
|
||||||
|
{
|
||||||
|
if (_logoList == 0)
|
||||||
|
{
|
||||||
|
WFObj obj;
|
||||||
|
if (obj.load("dwlogo.obj", NULL, &LoadFile))
|
||||||
|
{
|
||||||
|
_logoList = obj.render();
|
||||||
|
const float * aabb = obj.getAABB();
|
||||||
|
memcpy(_logoAABB, aabb, sizeof(_logoAABB));
|
||||||
|
|
||||||
|
float c_x = (_logoAABB[0] + _logoAABB[3]) / 2.0f;
|
||||||
|
float c_y = (_logoAABB[1] + _logoAABB[4]) / 2.0f;
|
||||||
|
float c_z = (_logoAABB[2] + _logoAABB[5]) / 2.0f;
|
||||||
|
_drawList = glGenLists(1);
|
||||||
|
glNewList(_drawList, GL_COMPILE);
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef(-c_x, -c_y, -c_z);
|
||||||
|
glCallList(_logoList);
|
||||||
|
glPopMatrix();
|
||||||
|
glEndList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_body = 0;
|
||||||
|
m_geom = 0;
|
||||||
|
|
||||||
|
if (world != 0)
|
||||||
|
{
|
||||||
|
dMass mass;
|
||||||
|
|
||||||
|
m_body = dBodyCreate(world);
|
||||||
|
dMassSetBox(&mass, 1.0, getWidth(), getDepth(), getHeight());
|
||||||
|
dBodySetMass(m_body, &mass);
|
||||||
|
|
||||||
|
if (space != 0)
|
||||||
|
{
|
||||||
|
m_geom = dCreateBox(space, getWidth(), getDepth(), getHeight());
|
||||||
|
dGeomSetBody(m_geom, m_body);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clean up ODE resources */
|
||||||
|
LogoBox::~LogoBox()
|
||||||
|
{
|
||||||
|
if (m_geom)
|
||||||
|
{
|
||||||
|
dGeomDestroy(m_geom);
|
||||||
|
}
|
||||||
|
if (m_body)
|
||||||
|
{
|
||||||
|
dBodyDestroy(m_body);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LogoBox::draw()
|
||||||
|
{
|
||||||
|
glCallList(_drawList);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return a pointer to the axis-aligned bounding box for a DW logo */
|
||||||
|
const float * const LogoBox::getAABB() const
|
||||||
|
{
|
||||||
|
return _logoAABB;
|
||||||
|
}
|
||||||
|
|
||||||
|
float LogoBox::getWidth() const
|
||||||
|
{
|
||||||
|
return _logoAABB[3] - _logoAABB[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
float LogoBox::getHeight() const
|
||||||
|
{
|
||||||
|
return _logoAABB[5] - _logoAABB[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
float LogoBox::getDepth() const
|
||||||
|
{
|
||||||
|
return _logoAABB[4] - _logoAABB[1];
|
||||||
|
}
|
||||||
|
|
31
ss/LogoBox.h
Normal file
31
ss/LogoBox.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
|
||||||
|
/* Author: Josh Holtrop
|
||||||
|
* DornerWorks screensaver
|
||||||
|
* The LogoBox class
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LOGOBOX_H
|
||||||
|
#define LOGOBOX_H
|
||||||
|
|
||||||
|
#include <GL/gl.h>
|
||||||
|
#include <ode/ode.h>
|
||||||
|
|
||||||
|
class LogoBox
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
LogoBox(dWorldID world = 0, dSpaceID space = 0);
|
||||||
|
~LogoBox();
|
||||||
|
void draw();
|
||||||
|
const float * const getAABB() const;
|
||||||
|
float getWidth() const;
|
||||||
|
float getHeight() const;
|
||||||
|
float getDepth() const;
|
||||||
|
dBodyID getBody() { return m_body; }
|
||||||
|
dGeomID getGeom() { return m_geom; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
dBodyID m_body;
|
||||||
|
dGeomID m_geom;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
15
ss/Makefile
Normal file
15
ss/Makefile
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
OBJS := SSMain.o
|
||||||
|
OBJS += SSMode.o
|
||||||
|
OBJS += LogoBox.o
|
||||||
|
OBJS += PlainSpin.o
|
||||||
|
OBJS += TumblingLogos.o
|
||||||
|
OBJS += Towers.o
|
||||||
|
AROBJS := $(foreach o,$(OBJS),ss.a($(o)))
|
||||||
|
|
||||||
|
all: ss.a
|
||||||
|
|
||||||
|
ss.a: $(AROBJS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-$(RM) -f *~ *.o *.a
|
46
ss/PlainSpin.cc
Normal file
46
ss/PlainSpin.cc
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
/* Author: Josh Holtrop
|
||||||
|
* DornerWorks screensaver
|
||||||
|
* This module implements a very simple screensaver mode.
|
||||||
|
* It just creates a DW logo and then continuously spins around it.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <GL/gl.h>
|
||||||
|
#include <GL/glu.h>
|
||||||
|
#include "PlainSpin.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
/* construct screensaver mode and do some basic OpenGL setup */
|
||||||
|
PlainSpin::PlainSpin(SSMain * _SSMain) : SSMode(_SSMain)
|
||||||
|
{
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glLoadIdentity();
|
||||||
|
gluPerspective(60.0,
|
||||||
|
(double)m_SSMain->getWidth()
|
||||||
|
/ (double)m_SSMain->getHeight()
|
||||||
|
/ (double)m_SSMain->getNumMonitors(),
|
||||||
|
0.01,
|
||||||
|
1000.01);
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* called every time this screensaver mode should redraw the screen */
|
||||||
|
void PlainSpin::update()
|
||||||
|
{
|
||||||
|
SSMode::update();
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
int numMonitors = m_SSMain->getNumMonitors();
|
||||||
|
int width = m_SSMain->getWidth();
|
||||||
|
int height = m_SSMain->getHeight();
|
||||||
|
for (int i = 0; i < numMonitors; i++)
|
||||||
|
{
|
||||||
|
glViewport(i*width/numMonitors, 0, width/numMonitors, height);
|
||||||
|
glLoadIdentity();
|
||||||
|
gluLookAt(0, 0, 12, 0, 0, 0, 0, 1, 0);
|
||||||
|
glRotatef(m_elapsed/33.0f, 0, 1, 0);
|
||||||
|
m_logoBox.draw();
|
||||||
|
}
|
||||||
|
SDL_GL_SwapBuffers();
|
||||||
|
}
|
23
ss/PlainSpin.h
Normal file
23
ss/PlainSpin.h
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
|
||||||
|
/* Author: Josh Holtrop
|
||||||
|
* DornerWorks screensaver
|
||||||
|
* A simple spinning logo screensaver mode object
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PLAINSPIN_H
|
||||||
|
#define PLAINSPIN_H
|
||||||
|
|
||||||
|
#include "SSMain.h"
|
||||||
|
#include "SSMode.h"
|
||||||
|
#include "LogoBox.h"
|
||||||
|
|
||||||
|
class PlainSpin : public SSMode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PlainSpin(SSMain * _SSMain);
|
||||||
|
void update();
|
||||||
|
protected:
|
||||||
|
LogoBox m_logoBox;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
151
ss/SSMain.cc
Normal file
151
ss/SSMain.cc
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
|
||||||
|
/* Author: Josh Holtrop
|
||||||
|
* DornerWorks screensaver
|
||||||
|
* This module implements the main functionality of the DW screensaver.
|
||||||
|
* It is responsible for handling input and timer events, as well
|
||||||
|
* as instantiating and rotating through the various screensaver modes
|
||||||
|
* that have been implemented.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h> /* srand() */
|
||||||
|
#include <time.h> /* time() */
|
||||||
|
#include <GL/gl.h>
|
||||||
|
#include <GL/glu.h>
|
||||||
|
#include <SDL/SDL.h>
|
||||||
|
#include "SSMain.h"
|
||||||
|
#include "PlainSpin.h"
|
||||||
|
#include "TumblingLogos.h"
|
||||||
|
#include "Towers.h"
|
||||||
|
|
||||||
|
/* switch to the next screensaver mode after this many milliseconds */
|
||||||
|
#define SSMODE_TIMEOUT_MSEC (1000*45)
|
||||||
|
|
||||||
|
static SDL_Event event;
|
||||||
|
|
||||||
|
/* create the main screensaver object */
|
||||||
|
SSMain::SSMain(int width, int height, int numMonitors, SDL_Surface * sdlSurface)
|
||||||
|
: m_width (width), m_height (height),
|
||||||
|
m_numMonitors (numMonitors), m_sdlSurface (sdlSurface),
|
||||||
|
m_mode(NULL), m_drawing(false)
|
||||||
|
{
|
||||||
|
/* set up some common OpenGL defaults */
|
||||||
|
glShadeModel(GL_SMOOTH);
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
glEnable(GL_LIGHTING);
|
||||||
|
glEnable(GL_LIGHT0);
|
||||||
|
glEnable(GL_CULL_FACE);
|
||||||
|
GLfloat ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};
|
||||||
|
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
|
||||||
|
|
||||||
|
/* setup redraw SDL event structure */
|
||||||
|
event.type = SDL_USEREVENT;
|
||||||
|
event.user.code = 0;
|
||||||
|
|
||||||
|
srand(time(NULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* called by SDL when the update timer expires */
|
||||||
|
Uint32 SSMain::updateCallback(Uint32 interval, void * param)
|
||||||
|
{
|
||||||
|
SSMain * ssmain = (SSMain *) param;
|
||||||
|
return ssmain->updateCallback(interval);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* member update function to be called by our registered
|
||||||
|
* SDL callback non-member function */
|
||||||
|
Uint32 SSMain::updateCallback(Uint32 interval)
|
||||||
|
{
|
||||||
|
if (!m_drawing)
|
||||||
|
{
|
||||||
|
SDL_PushEvent(&event);
|
||||||
|
}
|
||||||
|
return interval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* called to begin the screensaver,
|
||||||
|
* exits when the screensaver should terminate */
|
||||||
|
void SSMain::run()
|
||||||
|
{
|
||||||
|
Uint32 elapsed_msec;
|
||||||
|
Uint32 lastChanged_msec = 0;
|
||||||
|
SDL_Event event;
|
||||||
|
|
||||||
|
/* initially set the screensaver mode */
|
||||||
|
m_mode = startMode();
|
||||||
|
|
||||||
|
/* register a screen redrawing SDL event */
|
||||||
|
SDL_AddTimer(12, &updateCallback, this);
|
||||||
|
|
||||||
|
/* draw the screen */
|
||||||
|
update();
|
||||||
|
|
||||||
|
/* main event loop */
|
||||||
|
while (SDL_WaitEvent(&event))
|
||||||
|
{
|
||||||
|
elapsed_msec = SDL_GetTicks(); /* get the time the event occurred at */
|
||||||
|
if (elapsed_msec - lastChanged_msec > SSMODE_TIMEOUT_MSEC)
|
||||||
|
{
|
||||||
|
delete m_mode;
|
||||||
|
m_mode = startMode();
|
||||||
|
lastChanged_msec = elapsed_msec;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (event.type)
|
||||||
|
{
|
||||||
|
#ifndef WINDOW_MODE
|
||||||
|
case SDL_KEYDOWN: /* terminate screensaver upon */
|
||||||
|
#endif
|
||||||
|
case SDL_QUIT: /* key press or quit event */
|
||||||
|
goto RET;
|
||||||
|
case SDL_MOUSEBUTTONDOWN:
|
||||||
|
if (event.button.button == 1)
|
||||||
|
{
|
||||||
|
delete m_mode;
|
||||||
|
m_mode = startMode();
|
||||||
|
lastChanged_msec = elapsed_msec;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SDL_USEREVENT:
|
||||||
|
if (event.user.code == 0)
|
||||||
|
{
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RET:
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return a new screensaver mode object to start displaying */
|
||||||
|
SSMode * SSMain::startMode()
|
||||||
|
{
|
||||||
|
static int mode = 0;
|
||||||
|
const int numModes = 3;
|
||||||
|
|
||||||
|
mode++;
|
||||||
|
if (mode >= numModes)
|
||||||
|
mode = 0;
|
||||||
|
|
||||||
|
switch (mode)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
return new PlainSpin(this);
|
||||||
|
case 1:
|
||||||
|
return new Towers(this);
|
||||||
|
default:
|
||||||
|
return new TumblingLogos(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* call the update function to redraw the screen from the
|
||||||
|
* currently active screensaver mode.
|
||||||
|
* Uses a pseudo-semaphore to block new redraw requests
|
||||||
|
* from coming in while current ones are being serviced.
|
||||||
|
*/
|
||||||
|
void SSMain::update()
|
||||||
|
{
|
||||||
|
m_drawing = true;
|
||||||
|
m_mode->update();
|
||||||
|
m_drawing = false;
|
||||||
|
}
|
41
ss/SSMain.h
Normal file
41
ss/SSMain.h
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
|
||||||
|
/* Author: Josh Holtrop
|
||||||
|
* DornerWorks screensaver
|
||||||
|
* The main screensaver module
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SSMAIN_H
|
||||||
|
#define SSMAIN_H
|
||||||
|
|
||||||
|
#include <GL/gl.h>
|
||||||
|
#include <SDL/SDL.h>
|
||||||
|
|
||||||
|
class SSMode;
|
||||||
|
|
||||||
|
#include "SSMode.h"
|
||||||
|
|
||||||
|
class SSMain
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SSMain(int width, int height, int numMonitors, SDL_Surface * sdlSurface);
|
||||||
|
void run();
|
||||||
|
int getWidth() { return m_width; }
|
||||||
|
int getHeight() { return m_height; }
|
||||||
|
int getNumMonitors() { return m_numMonitors; }
|
||||||
|
SDL_Surface * getSurface() { return m_sdlSurface; }
|
||||||
|
Uint32 updateCallback(Uint32 interval);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static Uint32 updateCallback(Uint32 interval, void * param);
|
||||||
|
void update();
|
||||||
|
SSMode * startMode();
|
||||||
|
|
||||||
|
int m_width;
|
||||||
|
int m_height;
|
||||||
|
int m_numMonitors;
|
||||||
|
SDL_Surface * m_sdlSurface;
|
||||||
|
SSMode * m_mode;
|
||||||
|
bool m_drawing;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
51
ss/SSMode.cc
Normal file
51
ss/SSMode.cc
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
|
||||||
|
/* Author: Josh Holtrop
|
||||||
|
* DornerWorks screensaver
|
||||||
|
* SSMode is base class that provides common functionality for
|
||||||
|
* screensaver modes. It should be extended by a screensaver
|
||||||
|
* mode implementing class.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SSMode.h"
|
||||||
|
|
||||||
|
SSMode::SSMode(SSMain * _SSMain)
|
||||||
|
: m_SSMain(_SSMain)
|
||||||
|
{
|
||||||
|
m_startTick = SDL_GetTicks();
|
||||||
|
}
|
||||||
|
|
||||||
|
SSMode::~SSMode()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/* update the number of elapsed milliseconds */
|
||||||
|
void SSMode::update()
|
||||||
|
{
|
||||||
|
Uint32 ticks = SDL_GetTicks();
|
||||||
|
m_elapsed = ticks - m_startTick;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* push an OpenGL matrix onto the matrix stack for a given
|
||||||
|
* ODE body position and rotation */
|
||||||
|
void SSMode::pushTransform(const float pos[3], const float R[12])
|
||||||
|
{
|
||||||
|
GLfloat matrix[16];
|
||||||
|
matrix[0] = R[0];
|
||||||
|
matrix[1] = R[4];
|
||||||
|
matrix[2] = R[8];
|
||||||
|
matrix[3] = 0;
|
||||||
|
matrix[4] = R[1];
|
||||||
|
matrix[5] = R[5];
|
||||||
|
matrix[6] = R[9];
|
||||||
|
matrix[7] = 0;
|
||||||
|
matrix[8] = R[2];
|
||||||
|
matrix[9] = R[6];
|
||||||
|
matrix[10] = R[10];
|
||||||
|
matrix[11] = 0;
|
||||||
|
matrix[12] = pos[0];
|
||||||
|
matrix[13] = pos[1];
|
||||||
|
matrix[14] = pos[2];
|
||||||
|
matrix[15] = 1;
|
||||||
|
glPushMatrix();
|
||||||
|
glMultMatrixf(matrix);
|
||||||
|
}
|
31
ss/SSMode.h
Normal file
31
ss/SSMode.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
|
||||||
|
/* Author: Josh Holtrop
|
||||||
|
* DornerWorks screensaver
|
||||||
|
* A base class for deriving concrete screensaver mode implementations
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SSMODE_H
|
||||||
|
#define SSMODE_H
|
||||||
|
|
||||||
|
#include <SDL/SDL.h>
|
||||||
|
#include <GL/gl.h>
|
||||||
|
|
||||||
|
class SSMain;
|
||||||
|
|
||||||
|
#include "SSMain.h"
|
||||||
|
|
||||||
|
class SSMode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SSMode(SSMain * _SSMain);
|
||||||
|
virtual ~SSMode();
|
||||||
|
virtual void update();
|
||||||
|
void pushTransform(const float pos[3], const float R[12]);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
SSMain * m_SSMain;
|
||||||
|
Uint32 m_startTick;
|
||||||
|
Uint32 m_elapsed;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
302
ss/Towers.cc
Normal file
302
ss/Towers.cc
Normal file
@ -0,0 +1,302 @@
|
|||||||
|
|
||||||
|
/* Author: Josh Holtrop
|
||||||
|
* DornerWorks screensaver
|
||||||
|
* A slightly more interesting screensaver mode involving
|
||||||
|
* towers of DW logos with randomly disappearing ones
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h> /* fmax(), sin() */
|
||||||
|
#include <stdlib.h> /* rand() */
|
||||||
|
#include <GL/gl.h>
|
||||||
|
#include <GL/glu.h>
|
||||||
|
#include "Towers.h"
|
||||||
|
#include <ode/ode.h>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#define WORLD_STEP 0.001
|
||||||
|
/* time at beginning of mode to not remove any logos (msec) */
|
||||||
|
#define WAIT_TIME 6000
|
||||||
|
/* amount of time to wait before removing another logo (msec) */
|
||||||
|
#define REMOVE_TIME 3000
|
||||||
|
#define GROUND_ALPHA 0.5
|
||||||
|
|
||||||
|
Towers::Towers(SSMain * _SSMain) : SSMode(_SSMain)
|
||||||
|
{
|
||||||
|
/* set up our specific openGL settings */
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glLoadIdentity();
|
||||||
|
gluPerspective(60.0,
|
||||||
|
(double)m_SSMain->getWidth()
|
||||||
|
/ (double)m_SSMain->getHeight()
|
||||||
|
/ (double)m_SSMain->getNumMonitors(),
|
||||||
|
0.01,
|
||||||
|
1000.01);
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
|
||||||
|
/* create the ground texture */
|
||||||
|
float tex[] = {1.0, 0.0, 0.0, GROUND_ALPHA,
|
||||||
|
1.0, 1.0, 1.0, GROUND_ALPHA,
|
||||||
|
1.0, 1.0, 1.0, GROUND_ALPHA,
|
||||||
|
1.0, 0.0, 0.0, GROUND_ALPHA};
|
||||||
|
glGenTextures(1, &m_groundTexture);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, m_groundTexture);
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, 4, 2, 2, 0, GL_RGBA, GL_FLOAT, tex);
|
||||||
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
|
||||||
|
/* create the ODE world */
|
||||||
|
createWorld();
|
||||||
|
|
||||||
|
m_lastElapsed = 0;
|
||||||
|
m_logoToRemove = -1;
|
||||||
|
m_logosList = glGenLists(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Towers::~Towers()
|
||||||
|
{
|
||||||
|
int sz = m_logos.size();
|
||||||
|
for (int i = 0; i < sz; i++)
|
||||||
|
{
|
||||||
|
delete m_logos[i];
|
||||||
|
}
|
||||||
|
dJointGroupDestroy(m_contactJointGroup);
|
||||||
|
dWorldDestroy(m_world);
|
||||||
|
dSpaceDestroy(m_space);
|
||||||
|
glDeleteTextures(1, &m_groundTexture);
|
||||||
|
glDeleteLists(m_logosList, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Towers::createWorld()
|
||||||
|
{
|
||||||
|
/* set up the ODE world and collision space */
|
||||||
|
m_world = dWorldCreate();
|
||||||
|
// dWorldSetCFM(m_world, 1e-5);
|
||||||
|
dWorldSetGravity(m_world, 0, -9.81, 0);
|
||||||
|
dWorldSetERP(m_world, 0.8);
|
||||||
|
m_space = dHashSpaceCreate(0);
|
||||||
|
// dVector3 center = {0, 10, 0};
|
||||||
|
// dVector3 extents = {100, 40, 100};
|
||||||
|
// m_space = dQuadTreeSpaceCreate(0, center, extents, 5);
|
||||||
|
m_contactJointGroup = dJointGroupCreate(0);
|
||||||
|
|
||||||
|
double lHeight = 0.0;
|
||||||
|
const double towerBaseOffset = 0.0;
|
||||||
|
const int towerHeight = 6;
|
||||||
|
const double towerSpacing = 10.0;
|
||||||
|
const double logoTierSpacing = 3.75;
|
||||||
|
bool turn = false;
|
||||||
|
for (double xoffset = -towerSpacing;
|
||||||
|
xoffset < towerSpacing*1.1;
|
||||||
|
xoffset += towerSpacing*2.0)
|
||||||
|
{
|
||||||
|
for (double zoffset = -towerSpacing;
|
||||||
|
zoffset < towerSpacing*1.1;
|
||||||
|
zoffset += towerSpacing*2.0)
|
||||||
|
{
|
||||||
|
double towerOffset = 0.0;
|
||||||
|
for (int i = 0;
|
||||||
|
i < towerHeight;
|
||||||
|
i++, towerOffset += lHeight, turn = !turn)
|
||||||
|
{
|
||||||
|
double localXOffset = 0.0;
|
||||||
|
double localZOffset = 0.0;
|
||||||
|
if (turn)
|
||||||
|
localXOffset = -logoTierSpacing;
|
||||||
|
else
|
||||||
|
localZOffset = -logoTierSpacing;
|
||||||
|
for (int i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
LogoBox * lb = new LogoBox(m_world, m_space);
|
||||||
|
if (lHeight == 0.0)
|
||||||
|
lHeight = lb->getDepth();
|
||||||
|
dMatrix3 rotation;
|
||||||
|
dRFromEulerAngles(rotation,
|
||||||
|
0,
|
||||||
|
turn ? M_PI_2 : 0,
|
||||||
|
0);
|
||||||
|
dBodySetRotation(lb->getBody(), rotation);
|
||||||
|
dBodySetPosition(lb->getBody(),
|
||||||
|
xoffset + localXOffset,
|
||||||
|
towerBaseOffset + towerOffset + lb->getDepth()/2.0,
|
||||||
|
zoffset + localZOffset);
|
||||||
|
m_logos.push_back(lb);
|
||||||
|
|
||||||
|
if (turn)
|
||||||
|
localXOffset += logoTierSpacing * 2;
|
||||||
|
else
|
||||||
|
localZOffset += logoTierSpacing * 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
turn = !turn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* create ground plane */
|
||||||
|
dCreatePlane(m_space, 0, 1, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Towers::update()
|
||||||
|
{
|
||||||
|
SSMode::update();
|
||||||
|
|
||||||
|
if (m_lastElapsed == 0)
|
||||||
|
m_lastElapsed = m_elapsed;
|
||||||
|
|
||||||
|
if (m_logoToRemove == -1 && m_elapsed > WAIT_TIME)
|
||||||
|
{
|
||||||
|
if (m_logos.size() > 0)
|
||||||
|
{
|
||||||
|
m_lastRemoveTime = m_elapsed;
|
||||||
|
m_logoToRemove = rand() % m_logos.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (m_elapsed - m_lastRemoveTime > REMOVE_TIME)
|
||||||
|
{
|
||||||
|
if (m_logoToRemove >= 0)
|
||||||
|
{
|
||||||
|
std::vector<LogoBox *>::iterator it = m_logos.begin();
|
||||||
|
for (int i = 0; i < m_logoToRemove; i++)
|
||||||
|
it++;
|
||||||
|
delete *it;
|
||||||
|
m_logos.erase(it);
|
||||||
|
m_logoToRemove = (m_logos.size() > 0) ? rand() % m_logos.size() : -1;
|
||||||
|
m_lastRemoveTime = m_elapsed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Uint32 delta = m_elapsed - m_lastElapsed;
|
||||||
|
for (unsigned int i = 0; i < delta / 2; i++)
|
||||||
|
worldStep();
|
||||||
|
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
int numMonitors = m_SSMain->getNumMonitors();
|
||||||
|
int width = m_SSMain->getWidth();
|
||||||
|
int height = m_SSMain->getHeight();
|
||||||
|
bool drewLogos = false;
|
||||||
|
for (int i = 0; i < numMonitors; i++)
|
||||||
|
{
|
||||||
|
glViewport(i*width/numMonitors, 0, width/numMonitors, height);
|
||||||
|
glLoadIdentity();
|
||||||
|
gluLookAt(0, 30, 55, /* eye position */
|
||||||
|
0, 12, 0, /* focal point */
|
||||||
|
0, 1, 0); /* up vector */
|
||||||
|
glRotatef(m_elapsed/60.0f, 0, 1, 0); /* rotate view over time */
|
||||||
|
|
||||||
|
/* draw logo reflection */
|
||||||
|
glPushAttrib(GL_POLYGON_BIT);
|
||||||
|
glFrontFace(GL_CW); /* polygon vertex order reversed when
|
||||||
|
reflecting across a plane */
|
||||||
|
glPushMatrix();
|
||||||
|
glScalef(1.0, -1.0, 1.0);
|
||||||
|
if (drewLogos)
|
||||||
|
glCallList(m_logosList);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
glNewList(m_logosList, GL_COMPILE_AND_EXECUTE);
|
||||||
|
drawLogos();
|
||||||
|
glEndList();
|
||||||
|
drewLogos = true;
|
||||||
|
}
|
||||||
|
glPopMatrix();
|
||||||
|
glPopAttrib();
|
||||||
|
|
||||||
|
drawGround();
|
||||||
|
|
||||||
|
/* draw logos normally */
|
||||||
|
// drawLogos();
|
||||||
|
glCallList(m_logosList);
|
||||||
|
}
|
||||||
|
SDL_GL_SwapBuffers();
|
||||||
|
|
||||||
|
m_lastElapsed = m_elapsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Towers::drawLogos()
|
||||||
|
{
|
||||||
|
/* draw the logos */
|
||||||
|
int sz = m_logos.size();
|
||||||
|
for (int i = 0; i < sz; i++)
|
||||||
|
{
|
||||||
|
dBodyID body = m_logos[i]->getBody();
|
||||||
|
pushTransform(dBodyGetPosition(body),
|
||||||
|
dBodyGetRotation(body));
|
||||||
|
if (i == m_logoToRemove)
|
||||||
|
{
|
||||||
|
float amt = fabsf(sin(1.9*M_PI*
|
||||||
|
(m_elapsed-m_lastRemoveTime)/REMOVE_TIME));
|
||||||
|
GLfloat emission[] = {0.0, 0.0, amt, 1.0};
|
||||||
|
glPushAttrib(GL_LIGHTING_BIT);
|
||||||
|
glMaterialfv(GL_FRONT, GL_EMISSION, emission);
|
||||||
|
}
|
||||||
|
m_logos[i]->draw();
|
||||||
|
if (i == m_logoToRemove)
|
||||||
|
{
|
||||||
|
glPopAttrib();
|
||||||
|
}
|
||||||
|
glPopMatrix();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Towers::drawGround()
|
||||||
|
{
|
||||||
|
const float gs = 120; /* ground size */
|
||||||
|
const float tt = 20; /* texture tiles */
|
||||||
|
glPushAttrib(GL_ENABLE_BIT);
|
||||||
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
glNormal3f(0, 1, 0);
|
||||||
|
glTexCoord2f(0, 0);
|
||||||
|
glVertex3f(-gs, 0, gs);
|
||||||
|
glTexCoord2f(tt, 0);
|
||||||
|
glVertex3f(gs, 0, gs);
|
||||||
|
glTexCoord2f(tt, tt);
|
||||||
|
glVertex3f(gs, 0, -gs);
|
||||||
|
glTexCoord2f(0, tt);
|
||||||
|
glVertex3f(-gs, 0, -gs);
|
||||||
|
glEnd();
|
||||||
|
glPopAttrib();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* used by ODE to perform collision detection */
|
||||||
|
void Towers_collide_callback(void * data, dGeomID o1, dGeomID o2)
|
||||||
|
{
|
||||||
|
const int maxNumContacts = 2;
|
||||||
|
Towers * t = (Towers *) data;
|
||||||
|
static dContact contact[maxNumContacts];
|
||||||
|
dBodyID b1 = dGeomGetBody(o1);
|
||||||
|
dBodyID b2 = dGeomGetBody(o2);
|
||||||
|
if (b1 && b2 && dAreConnected(b1, b2))
|
||||||
|
return;
|
||||||
|
int num = dCollide(o1, o2, maxNumContacts,
|
||||||
|
&contact[0].geom, sizeof(dContact));
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < num; i++)
|
||||||
|
{
|
||||||
|
contact[i].surface.mode =
|
||||||
|
dContactSlip1 | dContactSlip2 | dContactBounce |
|
||||||
|
dContactSoftERP | dContactSoftCFM | dContactApprox1;
|
||||||
|
contact[i].surface.mu = 0.5;
|
||||||
|
contact[i].surface.slip1 = 0.0;
|
||||||
|
contact[i].surface.slip2 = 0.0;
|
||||||
|
contact[i].surface.soft_erp = 0.8;
|
||||||
|
contact[i].surface.soft_cfm = 0.01;
|
||||||
|
contact[i].surface.bounce = 0.0;
|
||||||
|
dJointID joint = dJointCreateContact(t->m_world,
|
||||||
|
t->m_contactJointGroup, contact + i);
|
||||||
|
dJointAttach(joint, b1, b2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* invokes ODE to do physics on our world */
|
||||||
|
void Towers::worldStep()
|
||||||
|
{
|
||||||
|
dSpaceCollide(m_space, this, Towers_collide_callback);
|
||||||
|
dWorldQuickStep(m_world, WORLD_STEP);
|
||||||
|
dJointGroupEmpty(m_contactJointGroup);
|
||||||
|
}
|
||||||
|
|
42
ss/Towers.h
Normal file
42
ss/Towers.h
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
|
||||||
|
/* Author: Josh Holtrop
|
||||||
|
* DornerWorks screensaver
|
||||||
|
* A slightly more interesting screensaver mode involving
|
||||||
|
* towers of DW logos with randomly disappearing ones
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TOWERS_H
|
||||||
|
#define TOWERS_H
|
||||||
|
|
||||||
|
#include "SSMain.h"
|
||||||
|
#include "SSMode.h"
|
||||||
|
#include "LogoBox.h"
|
||||||
|
#include <ode/ode.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class Towers : public SSMode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Towers(SSMain * _SSMain);
|
||||||
|
~Towers();
|
||||||
|
void update();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void createWorld();
|
||||||
|
void worldStep();
|
||||||
|
void drawLogos();
|
||||||
|
void drawGround();
|
||||||
|
friend void Towers_collide_callback(void * data, dGeomID o1, dGeomID o2);
|
||||||
|
|
||||||
|
dWorldID m_world;
|
||||||
|
dSpaceID m_space;
|
||||||
|
dJointGroupID m_contactJointGroup;
|
||||||
|
std::vector<LogoBox *> m_logos;
|
||||||
|
Uint32 m_lastElapsed;
|
||||||
|
GLuint m_groundTexture;
|
||||||
|
int m_logoToRemove;
|
||||||
|
Uint32 m_lastRemoveTime;
|
||||||
|
GLuint m_logosList;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
244
ss/TumblingLogos.cc
Normal file
244
ss/TumblingLogos.cc
Normal file
@ -0,0 +1,244 @@
|
|||||||
|
|
||||||
|
/* Author: Josh Holtrop
|
||||||
|
* DornerWorks screensaver
|
||||||
|
* This module implements a slightly more interesting screensaver
|
||||||
|
* mode that contains many DornerWorks logos that "tumble" around
|
||||||
|
* inside a cube-shaped container as gravity randomly shifts every
|
||||||
|
* few seconds
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h> /* fmax() */
|
||||||
|
#include <stdlib.h> /* rand() */
|
||||||
|
#include <GL/gl.h>
|
||||||
|
#include <GL/glu.h>
|
||||||
|
#include "TumblingLogos.h"
|
||||||
|
#include <ode/ode.h>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#define WORLD_STEP 0.001
|
||||||
|
/* number of milliseconds after which to switch gravity */
|
||||||
|
#define GRAVITY_CHANGE_MSEC 4000
|
||||||
|
|
||||||
|
static double randDbl()
|
||||||
|
{
|
||||||
|
return ((double) rand() / (double) RAND_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
TumblingLogos::TumblingLogos(SSMain * _SSMain) : SSMode(_SSMain)
|
||||||
|
{
|
||||||
|
/* set up our specific openGL settings */
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glLoadIdentity();
|
||||||
|
gluPerspective(60.0,
|
||||||
|
(double)m_SSMain->getWidth()
|
||||||
|
/ (double)m_SSMain->getHeight()
|
||||||
|
/ (double)m_SSMain->getNumMonitors(),
|
||||||
|
0.01,
|
||||||
|
1000.01);
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
|
||||||
|
/* create the ODE world */
|
||||||
|
createWorld();
|
||||||
|
|
||||||
|
m_lastGravityChangeTime = m_lastElapsed = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
TumblingLogos::~TumblingLogos()
|
||||||
|
{
|
||||||
|
int sz = m_logos.size();
|
||||||
|
for (int i = 0; i < sz; i++)
|
||||||
|
{
|
||||||
|
delete m_logos[i];
|
||||||
|
}
|
||||||
|
dJointGroupDestroy(m_contactJointGroup);
|
||||||
|
dWorldDestroy(m_world);
|
||||||
|
dSpaceDestroy(m_space);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TumblingLogos::createWorld()
|
||||||
|
{
|
||||||
|
/* set up the ODE world and collision space */
|
||||||
|
m_world = dWorldCreate();
|
||||||
|
// dWorldSetCFM(m_world, 1e-5);
|
||||||
|
dWorldSetGravity(m_world, 0, -9.81, 0);
|
||||||
|
dWorldSetERP(m_world, 0.8);
|
||||||
|
m_space = dHashSpaceCreate(0);
|
||||||
|
m_contactJointGroup = dJointGroupCreate(0);
|
||||||
|
|
||||||
|
m_logoSize = 0.0;
|
||||||
|
m_boxSize = 0.0;
|
||||||
|
double logo_offset = 0.0;
|
||||||
|
double logoCellSize = 0.0;
|
||||||
|
|
||||||
|
/* create the logos to fill the tumble box */
|
||||||
|
for (int x = 0; x < TUMBLE_BOX_CELLS; x++)
|
||||||
|
{
|
||||||
|
for (int y = 0; y < TUMBLE_BOX_CELLS; y++)
|
||||||
|
{
|
||||||
|
for (int z = 0; z < TUMBLE_BOX_CELLS; z++)
|
||||||
|
{
|
||||||
|
LogoBox * lb = new LogoBox(m_world, m_space);
|
||||||
|
|
||||||
|
if (m_boxSize == 0.0)
|
||||||
|
{
|
||||||
|
m_logoSize = fmax(fmax(lb->getWidth(), lb->getDepth()),
|
||||||
|
lb->getHeight());
|
||||||
|
logoCellSize = m_logoSize * 1.3;
|
||||||
|
m_boxSize = logoCellSize * TUMBLE_BOX_CELLS;
|
||||||
|
logo_offset = logoCellSize/2.0 - m_boxSize/2.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
dMatrix3 rotation;
|
||||||
|
dRFromEulerAngles(rotation,
|
||||||
|
randDbl() * M_PI * 2.0,
|
||||||
|
randDbl() * M_PI * 2.0,
|
||||||
|
randDbl() * M_PI * 2.0);
|
||||||
|
dBodySetPosition(lb->getBody(),
|
||||||
|
x * logoCellSize + logo_offset +
|
||||||
|
(randDbl() - 0.5) * 0.1 * m_logoSize,
|
||||||
|
y * logoCellSize + logo_offset +
|
||||||
|
(randDbl() - 0.5) * 0.1 * m_logoSize,
|
||||||
|
z * logoCellSize + logo_offset +
|
||||||
|
(randDbl() - 0.5) * 0.1 * m_logoSize);
|
||||||
|
dBodySetRotation(lb->getBody(), rotation);
|
||||||
|
m_logos.push_back(lb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* tumble box will be size m_boxSize X m_boxSize X m_boxSize
|
||||||
|
* centered at the origin */
|
||||||
|
/* create planes surrounding the tumble box */
|
||||||
|
dCreatePlane(m_space, -1, 0, 0, -m_boxSize/2.0);
|
||||||
|
dCreatePlane(m_space, 1, 0, 0, -m_boxSize/2.0);
|
||||||
|
dCreatePlane(m_space, 0, -1, 0, -m_boxSize/2.0);
|
||||||
|
dCreatePlane(m_space, 0, 1, 0, -m_boxSize/2.0);
|
||||||
|
dCreatePlane(m_space, 0, 0, -1, -m_boxSize/2.0);
|
||||||
|
dCreatePlane(m_space, 0, 0, 1, -m_boxSize/2.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TumblingLogos::update()
|
||||||
|
{
|
||||||
|
SSMode::update();
|
||||||
|
|
||||||
|
if (m_lastElapsed == 0)
|
||||||
|
m_lastGravityChangeTime = m_lastElapsed = m_elapsed;
|
||||||
|
|
||||||
|
/* change gravity if it has been GRAVITY_CHANGE_MSEC milliseconds */
|
||||||
|
if (m_elapsed - m_lastGravityChangeTime > GRAVITY_CHANGE_MSEC)
|
||||||
|
{
|
||||||
|
changeGravity();
|
||||||
|
m_lastGravityChangeTime = m_elapsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
Uint32 delta = m_elapsed - m_lastElapsed;
|
||||||
|
for (unsigned int i = 0; i < delta / 2; i++)
|
||||||
|
worldStep();
|
||||||
|
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
int numMonitors = m_SSMain->getNumMonitors();
|
||||||
|
int width = m_SSMain->getWidth();
|
||||||
|
int height = m_SSMain->getHeight();
|
||||||
|
for (int i = 0; i < numMonitors; i++)
|
||||||
|
{
|
||||||
|
glViewport(i*width/numMonitors, 0, width/numMonitors, height);
|
||||||
|
glLoadIdentity();
|
||||||
|
gluLookAt(0, 0, m_boxSize * 1.25, 0, 0, 0, 0, 1, 0);
|
||||||
|
glRotatef(m_elapsed/60.0f, 0, 1, 0);
|
||||||
|
|
||||||
|
/* draw the logos */
|
||||||
|
int sz = m_logos.size();
|
||||||
|
for (int i = 0; i < sz; i++)
|
||||||
|
{
|
||||||
|
dBodyID body = m_logos[i]->getBody();
|
||||||
|
pushTransform(dBodyGetPosition(body),
|
||||||
|
dBodyGetRotation(body));
|
||||||
|
m_logos[i]->draw();
|
||||||
|
glPopMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* draw the wireframe bounding box */
|
||||||
|
glColor3f(1, 1, 1);
|
||||||
|
double halfBox = m_boxSize/2.0;
|
||||||
|
glPushAttrib(GL_LIGHTING_BIT);
|
||||||
|
glDisable(GL_LIGHTING);
|
||||||
|
for (int i = -1; i <= 1; i += 2)
|
||||||
|
{
|
||||||
|
glBegin(GL_LINE_LOOP);
|
||||||
|
glVertex3f(-halfBox, -halfBox, m_boxSize*i/2.0);
|
||||||
|
glVertex3f(-halfBox, halfBox, m_boxSize*i/2.0);
|
||||||
|
glVertex3f(halfBox, halfBox, m_boxSize*i/2.0);
|
||||||
|
glVertex3f(halfBox, -halfBox, m_boxSize*i/2.0);
|
||||||
|
glEnd();
|
||||||
|
glBegin(GL_LINES);
|
||||||
|
glVertex3f(m_boxSize*i/2.0, -halfBox, -halfBox);
|
||||||
|
glVertex3f(m_boxSize*i/2.0, -halfBox, halfBox);
|
||||||
|
glVertex3f(m_boxSize*i/2.0, halfBox, -halfBox);
|
||||||
|
glVertex3f(m_boxSize*i/2.0, halfBox, halfBox);
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
glPopAttrib();
|
||||||
|
}
|
||||||
|
SDL_GL_SwapBuffers();
|
||||||
|
|
||||||
|
m_lastElapsed = m_elapsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* used by ODE to perform collision detection */
|
||||||
|
void TumblingLogos_collide_callback(void * data, dGeomID o1, dGeomID o2)
|
||||||
|
{
|
||||||
|
TumblingLogos * tl = (TumblingLogos *) data;
|
||||||
|
static dContact contact[4];
|
||||||
|
dBodyID b1 = dGeomGetBody(o1);
|
||||||
|
dBodyID b2 = dGeomGetBody(o2);
|
||||||
|
if (b1 && b2 && dAreConnected(b1, b2))
|
||||||
|
return;
|
||||||
|
int num = dCollide(o1, o2, 4, &contact[0].geom, sizeof(dContact));
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < num; i++)
|
||||||
|
{
|
||||||
|
contact[i].surface.mode =
|
||||||
|
dContactSlip1 | dContactSlip2 | dContactBounce |
|
||||||
|
dContactSoftERP | dContactSoftCFM | dContactApprox1;
|
||||||
|
contact[i].surface.mu = 0.5;
|
||||||
|
contact[i].surface.slip1 = 0.0;
|
||||||
|
contact[i].surface.slip2 = 0.0;
|
||||||
|
contact[i].surface.soft_erp = 0.8;
|
||||||
|
contact[i].surface.soft_cfm = 0.01;
|
||||||
|
contact[i].surface.bounce = 0.4;
|
||||||
|
dJointID joint = dJointCreateContact(tl->m_world,
|
||||||
|
tl->m_contactJointGroup, contact + i);
|
||||||
|
dJointAttach(joint, b1, b2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* invokes ODE to do physics on our world */
|
||||||
|
void TumblingLogos::worldStep()
|
||||||
|
{
|
||||||
|
dSpaceCollide(m_space, this, TumblingLogos_collide_callback);
|
||||||
|
dWorldQuickStep(m_world, WORLD_STEP);
|
||||||
|
dJointGroupEmpty(m_contactJointGroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* randomly chooses a gravity direction */
|
||||||
|
void TumblingLogos::changeGravity()
|
||||||
|
{
|
||||||
|
double g[3] = {0.0, 0.0, 0.0};
|
||||||
|
double r = randDbl();
|
||||||
|
if (r < 0.7)
|
||||||
|
{
|
||||||
|
/* gravitate towards one of the six sides */
|
||||||
|
g[(int) (randDbl() * 3)] = ((randDbl() < 0.5) ? -1 : 1) * 9.81;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* gravitate towards one of the eight corners */
|
||||||
|
for (int i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
g[i] = ((randDbl() < 0.5) ? -1 : 1) * 9.81;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dWorldSetGravity(m_world, g[0], g[1], g[2]);
|
||||||
|
}
|
43
ss/TumblingLogos.h
Normal file
43
ss/TumblingLogos.h
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
|
||||||
|
/* Author: Josh Holtrop
|
||||||
|
* DornerWorks screensaver
|
||||||
|
* A slightly more interesting screensaver mode involving
|
||||||
|
* colliding DW logos contained in a cube that spins while
|
||||||
|
* gravity randomly changes direction
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TUMBLING_LOGOS_H
|
||||||
|
#define TUMBLING_LOGOS_H
|
||||||
|
|
||||||
|
#include "SSMain.h"
|
||||||
|
#include "SSMode.h"
|
||||||
|
#include "LogoBox.h"
|
||||||
|
#include <ode/ode.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#define TUMBLE_BOX_CELLS 4
|
||||||
|
|
||||||
|
class TumblingLogos : public SSMode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TumblingLogos(SSMain * _SSMain);
|
||||||
|
~TumblingLogos();
|
||||||
|
void update();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void createWorld();
|
||||||
|
void worldStep();
|
||||||
|
void changeGravity();
|
||||||
|
friend void TumblingLogos_collide_callback(void * data, dGeomID o1, dGeomID o2);
|
||||||
|
|
||||||
|
dWorldID m_world;
|
||||||
|
dSpaceID m_space;
|
||||||
|
double m_logoSize;
|
||||||
|
double m_boxSize;
|
||||||
|
dJointGroupID m_contactJointGroup;
|
||||||
|
std::vector<LogoBox *> m_logos;
|
||||||
|
Uint32 m_lastGravityChangeTime;
|
||||||
|
Uint32 m_lastElapsed;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
x
Reference in New Issue
Block a user