moved files to trunk directory

git-svn-id: svn://anubis/dwscr/trunk@83 5bef9df8-b654-44bb-925b-0ff18baa8f8c
This commit is contained in:
josh 2008-09-22 17:27:40 +00:00
parent 78092ee118
commit 68d41e9c63
26 changed files with 2184 additions and 0 deletions

42
LoadFile/LoadFile.cc Normal file
View 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
View File

@ -0,0 +1,2 @@
void * LoadFile(const char * filename, unsigned int * length);

17
LoadFile/Makefile Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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

Binary file not shown.

22
logo/dwlogo.mtl Normal file
View 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
View 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
View File

@ -0,0 +1 @@
mingw32-make WIN32=1 %*

112
ss/LogoBox.cpp Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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