keyframe tools implemented

git-svn-id: https://svn.code.sf.net/p/extremetuxracer/code/trunk@229 0420edf4-82e4-42fc-9478-35b55e6d67a3
master
erin10 2010-11-18 15:23:16 +00:00
parent 641b2d8e72
commit c3a5ba35db
56 changed files with 2322 additions and 963 deletions

View File

@ -8,8 +8,8 @@ game_over.o paused.o reset.o game_type_select.o event_select.o \
race_select.o credits.o loading.o course.o keyframe.o env.o event.o \
spx.o common.o course_render.o game_ctrl.o physics.o \
track_marks.o hud.o view.o gui.o translation.o tools.o \
quadtree.o font.o ft_font.o textures.o help.o\
quadtree.o font.o ft_font.o textures.o help.o regist.o tool_frame.o \
tool_char.o
CFLAGS = -Wall -O2 -I/usr/include/freetype2
LDFLAGS = -lglut -lGL -lGLU -lSDL -lSDL_image -lSDL_mixer -lfreetype
@ -20,6 +20,15 @@ $(BIN) : $(OBJ)
# mmmm.o : mmmm.cpp mmmm.h
# $(CC) -c mmmm.cpp $(CFLAGS)
tool_char.o : tool_char.cpp tool_char.h
$(CC) -c tool_char.cpp $(CFLAGS)
tool_frame.o : tool_frame.cpp tool_frame.h
$(CC) -c tool_frame.cpp $(CFLAGS)
regist.o : regist.cpp regist.h
$(CC) -c regist.cpp $(CFLAGS)
tools.o : tools.cpp tools.h
$(CC) -c tools.cpp $(CFLAGS)

View File

@ -829,10 +829,6 @@ bool CCourse::LoadCourseList () {
CourseList[i].starty = SPFloatN (line, "starty", 5);
CourseList[i].env = Env.GetEnvIdx (SPStrN (line, "env", "etr"));
CourseList[i].music_theme = Music.GetThemeIdx (SPStrN (line, "theme", "normal"));
CourseList[i].start_frame = SPStrN (line, "start_keyframe", "tux_walk.lst");
CourseList[i].finish_frame = SPStrN (line, "finish_keyframe", "");
CourseList[i].wonrace_frame = SPStrN (line, "wonrace_keyframe", "");
CourseList[i].lostrace_frame = SPStrN (line, "lostrace_keyframe", "");
CourseList[i].use_keyframe = SPIntN (line, "use_keyframe", 0);
CourseList[i].finish_brake = SPFloatN (line, "finish_brake", 20);
paramlist.Clear (); // the list is used several times
@ -886,14 +882,8 @@ bool CCourse::LoadCourse (int idx) {
env = CourseList[idx].env;
music_theme = CourseList[idx].music_theme;
TuxStart.Load (CourseList[idx].start_frame);
g_game.use_keyframe = CourseList[idx].use_keyframe;
g_game.finish_brake = CourseList[idx].finish_brake;
if (g_game.use_keyframe) {
TuxLostrace.Load (CourseList[idx].lostrace_frame);
TuxWonrace.Load (CourseList[idx].wonrace_frame);
TuxFinish.Load (CourseList[idx].finish_frame);
}
if (!LoadElevMap ()) {
Message ("could not load course elev map");

View File

@ -56,10 +56,6 @@ typedef struct {
double starty;
int env;
int music_theme;
string start_frame;
string finish_frame;
string wonrace_frame;
string lostrace_frame;
bool use_keyframe;
double finish_brake;
} TCourse;

View File

@ -0,0 +1,11 @@
*[time] 0.2 [pos] 0.00 0.00 0.00 [yaw] 180 [pitch] 109 [neck] -50 [head] -8 [hip] -30 -30
*[time] 0.2 [pos] 0.00 0.10 0.00 [yaw] 180 [pitch] 90 [neck] -50 [hip] -20 -20 [knee] -20 -20
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -18 [hip] -30 -30 [knee] -40 -40
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [arm] -59 59 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 180 [pitch] 1
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 135 [pitch] 1 [roll] 9 [hip] 30 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 90 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 45 [pitch] 1 [roll] -10 [hip] 3 42
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0

View File

@ -0,0 +1,17 @@
*[time] 0.2 [pos] 0.00 0.00 0.00 [yaw] 180 [pitch] 109 [neck] -50 [head] -8 [hip] -30 -30
*[time] 0.2 [pos] 0.00 0.10 0.00 [yaw] 180 [pitch] 90 [neck] -50 [hip] -20 -20 [knee] -20 -20
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -18 [hip] -30 -30 [knee] -40 -40
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [arm] -59 59 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 180 [pitch] 1
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 135 [pitch] 1 [roll] 9 [hip] 30 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 90 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 45 [pitch] 1 [roll] -10 [hip] 3 42
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [head] 35 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [head] -35 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [head] 35 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [head] -35 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [hip] 3 0

View File

@ -0,0 +1,11 @@
*[time] 0.5 [pos] -1.25 0.25 1.00 [yaw] 100 [sh] -20 40 [hip] -25 20
*[time] 0.5 [pos] -1.00 0.25 1.00 [yaw] 80 [head] -45 [sh] 40 -20 [hip] 20 -25
*[time] 0.5 [pos] -0.75 0.25 1.00 [yaw] 100 [head] -60 [sh] -20 40 [hip] -25 20
*[time] 0.5 [pos] -0.50 0.25 1.00 [yaw] 80 [head] -60 [sh] 40 -20 [hip] 20 -25
*[time] 0.5 [pos] -0.25 0.25 1.00 [yaw] 100 [sh] -20 40 [hip] -25 20
*[time] 0.5 [pos] 0.00 0.25 1.00 [yaw] 80 [head] 60 [sh] 40 -20 [hip] 20 -25
*[time] 0.5 [pos] 0.00 0.25 1.00 [yaw] 180
*[time] 0.4 [pos] 0.00 0.25 1.00 [yaw] 180 [sh] -60 -60
*[time] 0.4 [pos] 0.00 0.25 1.00 [yaw] 180 [sh] 20 20
*[time] 0.2 [pos] 0.00 0.25 0.30 [yaw] 180 [pitch] 60 [neck] -25 [sh] 90 90 [hip] -20 -20
*[time] 9.0 [pos] 0.00 0.00 0.00 [yaw] 180 [pitch] 110 [neck] -50 [hip] -40 -40

View File

@ -0,0 +1,15 @@
*[time] 0.2 [pos] 0.00 0.00 0.00 [yaw] 180 [pitch] 109 [neck] -50 [head] -8 [hip] -30 -30
*[time] 0.2 [pos] 0.00 0.10 0.00 [yaw] 180 [pitch] 90 [neck] -50 [hip] -20 -20 [knee] -20 -20
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -18 [hip] -30 -30 [knee] -40 -40
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [arm] -59 59 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 180 [pitch] 1
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 135 [pitch] 1 [roll] 9 [hip] 30 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 90 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 45 [pitch] 1 [roll] -10 [hip] 3 42
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.60 0.00 [yaw] 5 [pitch] 1 [sh] 161 165 [arm] -86 88 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.60 0.00 [yaw] 5 [pitch] 1 [sh] 161 165 [arm] -86 88 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0

View File

@ -0,0 +1,11 @@
*[time] 0.2 [pos] 0.00 0.00 0.00 [yaw] 180 [pitch] 109 [neck] -50 [head] -8 [hip] -30 -30
*[time] 0.2 [pos] 0.00 0.10 0.00 [yaw] 180 [pitch] 90 [neck] -50 [hip] -20 -20 [knee] -20 -20
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -18 [hip] -30 -30 [knee] -40 -40
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [arm] -59 59 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 180 [pitch] 1
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 135 [pitch] 1 [roll] 9 [hip] 30 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 90 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 45 [pitch] 1 [roll] -10 [hip] 3 42
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0

View File

@ -0,0 +1,17 @@
*[time] 0.2 [pos] 0.00 0.00 0.00 [yaw] 180 [pitch] 109 [neck] -50 [head] -8 [hip] -30 -30
*[time] 0.2 [pos] 0.00 0.10 0.00 [yaw] 180 [pitch] 90 [neck] -50 [hip] -20 -20 [knee] -20 -20
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -18 [hip] -30 -30 [knee] -40 -40
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [arm] -59 59 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 180 [pitch] 1
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 135 [pitch] 1 [roll] 9 [hip] 30 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 90 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 45 [pitch] 1 [roll] -10 [hip] 3 42
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [head] 35 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [head] -35 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [head] 35 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [head] -35 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [hip] 3 0

11
data/char/boris/start.lst Normal file
View File

@ -0,0 +1,11 @@
*[time] 0.5 [pos] -1.25 0.25 1.00 [yaw] 100 [sh] -20 40 [hip] -25 20
*[time] 0.5 [pos] -1.00 0.25 1.00 [yaw] 80 [head] -45 [sh] 40 -20 [hip] 20 -25
*[time] 0.5 [pos] -0.75 0.25 1.00 [yaw] 100 [head] -60 [sh] -20 40 [hip] -25 20
*[time] 0.5 [pos] -0.50 0.25 1.00 [yaw] 80 [head] -60 [sh] 40 -20 [hip] 20 -25
*[time] 0.5 [pos] -0.25 0.25 1.00 [yaw] 100 [sh] -20 40 [hip] -25 20
*[time] 0.5 [pos] 0.00 0.25 1.00 [yaw] 80 [head] 60 [sh] 40 -20 [hip] 20 -25
*[time] 0.5 [pos] 0.00 0.25 1.00 [yaw] 180
*[time] 0.4 [pos] 0.00 0.25 1.00 [yaw] 180 [sh] -60 -60
*[time] 0.4 [pos] 0.00 0.25 1.00 [yaw] 180 [sh] 20 20
*[time] 0.2 [pos] 0.00 0.25 0.30 [yaw] 180 [pitch] 60 [neck] -25 [sh] 90 90 [hip] -20 -20
*[time] 9.0 [pos] 0.00 0.00 0.00 [yaw] 180 [pitch] 110 [neck] -50 [hip] -40 -40

View File

@ -0,0 +1,15 @@
*[time] 0.2 [pos] 0.00 0.00 0.00 [yaw] 180 [pitch] 109 [neck] -50 [head] -8 [hip] -30 -30
*[time] 0.2 [pos] 0.00 0.10 0.00 [yaw] 180 [pitch] 90 [neck] -50 [hip] -20 -20 [knee] -20 -20
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -18 [hip] -30 -30 [knee] -40 -40
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [arm] -59 59 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 180 [pitch] 1
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 135 [pitch] 1 [roll] 9 [hip] 30 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 90 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 45 [pitch] 1 [roll] -10 [hip] 3 42
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.60 0.00 [yaw] 5 [pitch] 1 [sh] 161 165 [arm] -86 88 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.60 0.00 [yaw] 5 [pitch] 1 [sh] 161 165 [arm] -86 88 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0

View File

@ -0,0 +1,11 @@
*[time] 0.2 [pos] 0.00 0.00 0.00 [yaw] 180 [pitch] 109 [neck] -50 [head] -8 [hip] -30 -30
*[time] 0.2 [pos] 0.00 0.10 0.00 [yaw] 180 [pitch] 90 [neck] -50 [hip] -20 -20 [knee] -20 -20
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -18 [hip] -30 -30 [knee] -40 -40
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [arm] -59 59 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 180 [pitch] 1
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 135 [pitch] 1 [roll] 9 [hip] 30 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 90 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 45 [pitch] 1 [roll] -10 [hip] 3 42
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0

View File

@ -0,0 +1,17 @@
*[time] 0.2 [pos] 0.00 0.00 0.00 [yaw] 180 [pitch] 109 [neck] -50 [head] -8 [hip] -30 -30
*[time] 0.2 [pos] 0.00 0.10 0.00 [yaw] 180 [pitch] 90 [neck] -50 [hip] -20 -20 [knee] -20 -20
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -18 [hip] -30 -30 [knee] -40 -40
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [arm] -59 59 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 180 [pitch] 1
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 135 [pitch] 1 [roll] 9 [hip] 30 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 90 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 45 [pitch] 1 [roll] -10 [hip] 3 42
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [head] 35 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [head] -35 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [head] 35 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [head] -35 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [hip] 3 0

View File

@ -0,0 +1,11 @@
*[time] 0.5 [pos] -1.25 0.25 1.00 [yaw] 100 [sh] -20 40 [hip] -25 20
*[time] 0.5 [pos] -1.00 0.25 1.00 [yaw] 80 [head] -45 [sh] 40 -20 [hip] 20 -25
*[time] 0.5 [pos] -0.75 0.25 1.00 [yaw] 100 [head] -60 [sh] -20 40 [hip] -25 20
*[time] 0.5 [pos] -0.50 0.25 1.00 [yaw] 80 [head] -60 [sh] 40 -20 [hip] 20 -25
*[time] 0.5 [pos] -0.25 0.25 1.00 [yaw] 100 [sh] -20 40 [hip] -25 20
*[time] 0.5 [pos] 0.00 0.25 1.00 [yaw] 80 [head] 60 [sh] 40 -20 [hip] 20 -25
*[time] 0.5 [pos] 0.00 0.25 1.00 [yaw] 180
*[time] 0.4 [pos] 0.00 0.25 1.00 [yaw] 180 [sh] -60 -60
*[time] 0.4 [pos] 0.00 0.25 1.00 [yaw] 180 [sh] 20 20
*[time] 0.2 [pos] 0.00 0.25 0.30 [yaw] 180 [pitch] 60 [neck] -25 [sh] 90 90 [hip] -20 -20
*[time] 9.0 [pos] 0.00 0.00 0.00 [yaw] 180 [pitch] 110 [neck] -50 [hip] -40 -40

View File

@ -0,0 +1,15 @@
*[time] 0.2 [pos] 0.00 0.00 0.00 [yaw] 180 [pitch] 109 [neck] -50 [head] -8 [hip] -30 -30
*[time] 0.2 [pos] 0.00 0.10 0.00 [yaw] 180 [pitch] 90 [neck] -50 [hip] -20 -20 [knee] -20 -20
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -18 [hip] -30 -30 [knee] -40 -40
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [arm] -59 59 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 180 [pitch] 1
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 135 [pitch] 1 [roll] 9 [hip] 30 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 90 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 45 [pitch] 1 [roll] -10 [hip] 3 42
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.60 0.00 [yaw] 5 [pitch] 1 [sh] 161 165 [arm] -86 88 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.60 0.00 [yaw] 5 [pitch] 1 [sh] 161 165 [arm] -86 88 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0

View File

@ -1,211 +0,0 @@
# Character definition
# [par] = parent node
# [order] = order of transform actions
# [name] only used for information on the tool screen
# [joint] a identifier that relaces the numeric identifier in case that
# the node contains a joint
# 0 translation
# 1 x-rotation
# 2 y-rotation
# 3 z-rotation
# 4 scale
# 5 visible
# 9 additionl y-rotation, use z component
# material
*[material] 1 [mat] whitecol [diff] 0.78 0.78 0.78 [spec] 0.2 0.2 0.2 [exp] 50.0
*[material] 1 [mat] blackcol [diff] 0.1 0.1 0.1 [spec] 0.5 0.5 0.5 [exp] 20.0
*[material] 1 [mat] beakcol [diff] 0.64 0.54 0.06 [spec] 0.4 0.4 0.4 [exp] 5.0
*[material] 1 [mat] iriscol [diff] 0.01 0.01 0.41 [spec] 0.4 0.4 0.4 [exp] 90.0
# -----------------------------------------------------------------------------------
# body
*[node] 01 [par] 00 [order] 4 [scale] 0.35 0.35 0.35
[name] complete figure
*[node] 02 [par] 01 [order] 4 [scale] 0.9 0.9 0.9
[name] body
*[node] 72 [par] 02 [order] 45 [vis] 10 [scale] 0.95 1.0 0.8 [mat] blackcol [shad] 1
[name] black part of the body
*[node] 73 [par] 02 [order] 045 [vis] 10 [trans] 0 0 0.17 [scale] 0.8 0.9 0.7 [mat] whitecol
[name] white part of the body
# breast
*[node] 03 [par] 01 [order] 0 [trans] 0 0.4 0.05
[name] breast
*[node] 04 [par] 03 [order] 4 [scale] 0.72 0.72 0.72
[name] breast
*[node] 74 [par] 04 [order] 45 [vis] 10 [scale] 0.95 1.0 0.8 [mat] blackcol
[name] black part of the breast
*[node] 75 [par] 04 [order] 045 [vis] 10 [trans] 0 0 0.17 [scale] 0.8 0.9 0.7
[mat] whitecol [name] white part of the breast
# neck
*[node] 05 [par] 01 [order] 02 [trans] 0 0.9 0.07 [rot] 0 90.0 0 [name] neck and head
*[node] 06 [par] 05 [joint] neck [name] joint for neck
*[node] 07 [par] 06 [order] 2 [rot] 0 -90 0 [name] neck and head
*[node] 08 [par] 07 [order] 4 [scale] 0.45 0.5 0.45 [name] neck
*[node] 09 [par] 08 [order] 5 [vis] 10 [mat] blackcol [shad] 1
[name] black part of the neck
*[node] 10 [par] 08 [order] 045 [vis] 10 [trans] 0 -0.08 0.35
[scale] 0.8 0.9 0.7 [mat] whitecol [name] white part of the neck
# head
*[node] 11 [par] 07 [order] 02 [trans] 0 0.3 0.07 [rot] 0 90.0 0 [name] head
*[node] 12 [par] 11 [joint] head [name] joint for head
#*[node] 13 [par] 12 [order] seems to do nothing, waste
*[node] 14 [par] 12 [order] 02 [trans] 0 0.2 0 [rot] 0 -90.0 0 [name] head
*[node] 15 [par] 14 [order] 45 [vis] 10 [scale] 0.42 0.5 0.42
[mat] blackcol [shad] 1 [name] head
# beak
*[node] 16 [par] 14 [order] 0145 [vis] 4 [trans] 0 -0.205 0.3 [rot] 10 0 0
[scale] 0.23 0.12 0.4 [mat] beakcol [name] beak
*[node] 17 [par] 14 [order] 0145 [vis] 4 [trans] 0 -0.23 0.3 [rot] 10 0 0
[scale] 0.21 0.17 0.38 [mat] beakcol [name] beak
# left eye
*[node] 18 [par] 14 [order] 023145 [vis] 4 [trans] 0.13 -0.03 0.38 [rot] 5.0 18.0 -5.0
[mat] whitecol [scale] 0.1 0.13 0.03 [name] left eye
# right eye
*[node] 19 [par] 14 [order] 023145 [vis] 4 [trans] -0.13 -0.03 0.38 [rot] 5.0 -18.0 -5.0
[mat] whitecol [scale] 0.1 0.13 0.03 [name] right eye
# left iris
*[node] 20 [par] 14 [order] 023145 [vis] 2 [trans] 0.12 -0.045 0.4 [rot] 5.0 18.0 5.0
[mat] iriscol [scale] 0.055 0.07 0.03 [name] left iris
# right iris
*[node] 21 [par] 14 [order] 023145 [vis] 2 [trans] -0.12 -0.045 0.4 [rot] 5.0 -18.0 -5.0
[mat] iriscol [scale] 0.055 0.07 0.03 [name] right iris
# left upper arm
*[node] 22 [par] 03 [order] 2031 [rot] 90 180 45 [trans] -0.56 0.3 0 [name] left arm
*[node] 23 [par] 22 [joint] left_shldr [name] joint for left shoulder
*[node] 24 [par] 23 [order] 01 [trans] -0.22 0 0 [rot] -90.0 0 0 [name] left arm
*[node] 25 [par] 24 [order] 45 [vis] 5 [scale] 0.34 0.1 0.2 [mat] blackcol [shad] 1
[name] left upper arm
# left forearm
*[node] 30 [par] 24 [order] 031 [trans] -0.23 0 0 [rot] 90 0 20.0
[name] left forearm and hand
*[node] 31 [par] 30 [joint] joint [name] joint for left_elbow
*[node] 32 [par] 31 [order] 01 [trans] -0.19 0 0 [rot] -90.0 0 0
[name] left forearm and hand
*[node] 33 [par] 32 [order] 45 [vis] 5 [scale] 0.3 0.07 0.15 [mat] blackcol [shad] 1
[name] left forearm
# left hand
*[node] 38 [par] 32 [order] 031 [trans] -0.24 0 0 [rot] 90 0 20.0 [name] left hand
*[node] 39 [par] 38 [joint] left_hand [name] joint for left hand
*[node] 40 [par] 39 [order] 01 [trans] -0.1 0 0 [rot] -90.0 0 0 [name] left hand
*[node] 41 [par] 40 [order] 45 [vis] 3 [scale] 0.12 0.05 0.12 [mat] blackcol [shad] 1
[name] left hand
# right upper arm
*[node] 26 [par] 03 [order] 031 [trans] -0.56 0.3 0 [rot] -90 0 45.0 [name] right arm
*[node] 27 [par] 26 [joint] right_shldr [name] joint for right shoulder
*[node] 28 [par] 27 [order] 01 [trans] -0.22 0 0 [rot] 90.0 0 0 [name] right arm
*[node] 29 [par] 28 [order] 45 [vis] 5 [scale] 0.34 0.1 0.2 [mat] blackcol [shad] 1
[name] right upper arm
# right forearm
*[node] 34 [par] 28 [order] 031 [trans] -0.23 0 0 [rot] -90 0 20.0
[name] rigth forearm and hand
*[node] 35 [par] 34 [joint] right_elbow [name] joint for right elbow
*[node] 36 [par] 35 [order] 01 [trans] -0.19 0 0 [rot] 90.0 0 0
[name] right forearm and hand
*[node] 37 [par] 36 [order] 45 [vis] 5 [scale] 0.3 0.07 0.15 [mat] blackcol [shad] 1
[name] right forearm
# right hand
*[node] 42 [par] 36 [order] 031 [trans] -0.24 0 0 [rot] -90 0 20.0 [name] right hand
*[node] 43 [par] 42 [joint] right_hand [name] joint for right hand
*[node] 44 [par] 43 [order] 01 [trans] -0.1 0 0 [rot] 90.0 0 0 [name] right hand
*[node] 45 [par] 44 [order] 45 [vis] 3 [scale] 0.12 0.05 0.12 [mat] blackcol [shad] 1
[name] right hand
# left leg
*[node] 46 [par] 01 [order] 209 [rot] 0 180.0 110 [trans] -0.28 -0.8 0 [name] left leg
*[node] 47 [par] 46 [joint] left_hip [name] joint for left leg
*[node] 48 [par] 47 [order] 02 [trans] 0 -0.1 0 [rot] 0 -110.0 0 [name] left leg
*[node] 49 [par] 48 [order] 45 [vis] 3 [scale] 0.07 0.3 0.07 [mat] beakcol [shad] 1
[name] left highbone
*[node] 50 [par] 48 [order] 045 [vis] 3 [trans] 0.0 0.05 0.0
[scale] 0.09 0.18 0.09 [mat] blackcol [name] left hip
*[node] 56 [par] 48 [order] 02 [trans] 0 -0.21 0 [rot] 0 90.0 0
[name] left lower leg and foot
*[node] 57 [par] 56 [joint] left_knee [name] joint for left knee
*[node] 58 [par] 57 [order] 02 [trans] 0 -0.13 0 [rot] 0 -90.0 0
[name] left lower leg and foot
*[node] 59 [par] 58 [order] 45 [vis] 3 [scale] 0.06 0.18 0.06
[mat] beakcol [name] left lower leg
*[node] 64 [par] 58 [order] 02 [trans] 0 -0.18 0 [rot] 0 -50.0 0
[name] left foot
*[node] 65 [par] 64 [joint] left_ankle [name] joint for left ankle
*[node] 76 [par] 65 [order] 04 [trans] -0.13 0 0 [scale] 1.1 1.0 1.3
[name] left foot
*[node] 77 [par] 76 [vis] 8 [order] 45 [scale] 0.25 0.08 0.18
[mat] beakcol [name] left foot
*[node] 78 [par] 76 [vis] 8 [order] 0245 [trans] -0.07 0 0.1 [rot] 0 30 0
[scale] 0.27 0.07 0.11 [mat] beakcol [shad] 1 [name] toe at left foot
*[node] 79 [par] 76 [vis] 8 [order] 0245 [trans] -0.07 0 -0.1 [rot] 0 -30 0
[scale] 0.27 0.07 0.11 [mat] beakcol [shad] 1 [name] toe at left foot
*[node] 80 [par] 76 [vis] 8 [order] 045 [trans] -0.08 0 0
[scale] 0.27 0.07 0.10 [mat] beakcol [shad] 1 [name] toe at left foot
# right leg
*[node] 51 [par] 01 [order] 02 [trans] -0.28 -0.8 0 [rot] 0 -110.0 0
[name] right leg
*[node] 52 [par] 51 [joint] right_hip [name] joint for right leg
*[node] 53 [par] 52 [order] 02 [trans] 0 -0.1 0 [rot] 0 110.0 0
[name] right leg
*[node] 54 [par] 53 [order] 45 [vis] 3 [scale] 0.07 0.3 0.07
[mat] beakcol [shad] 1 [name] right highbone
*[node] 55 [par] 53 [order] 045 [vis] 3 [trans] 0.0 0.05 0.0
[scale] 0.09 0.18 0.09 [mat] blackcol [name] right hip
*[node] 60 [par] 53 [order] 02 [trans] 0 -0.21 0 [rot] 0 -90.0 0
[name] right lower leg and foot
*[node] 61 [par] 60 [joint] right_knee [name] joint for right knee
*[node] 62 [par] 61 [order] 02 [trans] 0 -0.13 0 [rot] 0 90.0 0
[name] right lower leg and foot
*[node] 63 [par] 62 [order] 45 [vis] 3 [scale] 0.06 0.18 0.06
[mat] beakcol [name] right lower leg
*[node] 66 [par] 62 [order] 02 [trans] 0 -0.18 0 [rot] 0 50.0 0
[name] right foot
*[node] 67 [par] 66 [joint] right_ankle [name] joint for right ankle
*[node] 81 [par] 67 [order] 04 [trans] -0.13 0 0 [scale] 1.1 1.0 1.3
[name] right foot
*[node] 82 [par] 81 [vis] 8 [order] 45 [scale] 0.25 0.08 0.18
[mat] beakcol [name] right foot
*[node] 83 [par] 81 [vis] 8 [order] 0245 [trans] -0.07 0 0.1 [rot] 0 30 0
[scale] 0.27 0.07 0.11 [mat] beakcol [shad] 1 [name] toe at right foot
*[node] 84 [par] 81 [vis] 8 [order] 0245 [trans] -0.07 0 -0.1 [rot] 0 -30 0
[scale] 0.27 0.07 0.11 [mat] beakcol [shad] 1 [name] toe at right foot
*[node] 85 [par] 81 [vis] 8 [order] 045 [trans] -0.08 0 0
[scale] 0.27 0.07 0.10 [mat] beakcol [shad] 1 [name] toe at right foot
# tail
*[node] 68 [par] 01 [order] 01 [trans] 0 -0.4 -0.5 [rot] -60.0 0 0 [name] tail
*[node] 69 [par] 68 [joint] tail [name] joint for tail
*[node] 70 [par] 69 [order] 0 [trans] 0 0.15 0 [name] tail
*[node] 71 [par] 70 [order] 45 [vis] 2 [scale] 0.2 0.3 0.1
[mat] blackcol [shad] 1 [name] tail

View File

@ -0,0 +1,11 @@
*[time] 0.2 [pos] 0.00 0.00 0.00 [yaw] 180 [pitch] 109 [neck] -50 [head] -8 [hip] -30 -30
*[time] 0.2 [pos] 0.00 0.10 0.00 [yaw] 180 [pitch] 90 [neck] -50 [hip] -20 -20 [knee] -20 -20
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -18 [hip] -30 -30 [knee] -40 -40
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [arm] -59 59 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 180 [pitch] 1
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 135 [pitch] 1 [roll] 9 [hip] 30 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 90 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 45 [pitch] 1 [roll] -10 [hip] 3 42
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0

View File

@ -0,0 +1,17 @@
*[time] 0.2 [pos] 0.00 0.00 0.00 [yaw] 180 [pitch] 109 [neck] -50 [head] -8 [hip] -30 -30
*[time] 0.2 [pos] 0.00 0.10 0.00 [yaw] 180 [pitch] 90 [neck] -50 [hip] -20 -20 [knee] -20 -20
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -18 [hip] -30 -30 [knee] -40 -40
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [arm] -59 59 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 180 [pitch] 1
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 135 [pitch] 1 [roll] 9 [hip] 30 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 90 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 45 [pitch] 1 [roll] -10 [hip] 3 42
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [head] 35 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [head] -35 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [head] 35 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [head] -35 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [hip] 3 0

11
data/char/trixi/start.lst Normal file
View File

@ -0,0 +1,11 @@
*[time] 0.5 [pos] -1.25 0.25 1.00 [yaw] 100 [sh] -20 40 [hip] -25 20
*[time] 0.5 [pos] -1.00 0.25 1.00 [yaw] 80 [head] -45 [sh] 40 -20 [hip] 20 -25
*[time] 0.5 [pos] -0.75 0.25 1.00 [yaw] 100 [head] -60 [sh] -20 40 [hip] -25 20
*[time] 0.5 [pos] -0.50 0.25 1.00 [yaw] 80 [head] -60 [sh] 40 -20 [hip] 20 -25
*[time] 0.5 [pos] -0.25 0.25 1.00 [yaw] 100 [sh] -20 40 [hip] -25 20
*[time] 0.5 [pos] 0.00 0.25 1.00 [yaw] 80 [head] 60 [sh] 40 -20 [hip] 20 -25
*[time] 0.5 [pos] 0.00 0.25 1.00 [yaw] 180
*[time] 0.4 [pos] 0.00 0.25 1.00 [yaw] 180 [sh] -60 -60
*[time] 0.4 [pos] 0.00 0.25 1.00 [yaw] 180 [sh] 20 20
*[time] 0.2 [pos] 0.00 0.25 0.30 [yaw] 180 [pitch] 60 [neck] -25 [sh] 90 90 [hip] -20 -20
*[time] 9.0 [pos] 0.00 0.00 0.00 [yaw] 180 [pitch] 110 [neck] -50 [hip] -40 -40

View File

@ -0,0 +1,15 @@
*[time] 0.2 [pos] 0.00 0.00 0.00 [yaw] 180 [pitch] 109 [neck] -50 [head] -8 [hip] -30 -30
*[time] 0.2 [pos] 0.00 0.10 0.00 [yaw] 180 [pitch] 90 [neck] -50 [hip] -20 -20 [knee] -20 -20
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -18 [hip] -30 -30 [knee] -40 -40
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [arm] -59 59 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 180 [pitch] 1
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 135 [pitch] 1 [roll] 9 [hip] 30 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 90 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 45 [pitch] 1 [roll] -10 [hip] 3 42
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.60 0.00 [yaw] 5 [pitch] 1 [sh] 161 165 [arm] -86 88 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.60 0.00 [yaw] 5 [pitch] 1 [sh] 161 165 [arm] -86 88 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0

11
data/char/tux/finish.lst Normal file
View File

@ -0,0 +1,11 @@
*[time] 0.2 [pos] 0.00 0.00 0.00 [yaw] 180 [pitch] 109 [neck] -50 [head] -8 [hip] -30 -30
*[time] 0.2 [pos] 0.00 0.10 0.00 [yaw] 180 [pitch] 90 [neck] -50 [hip] -20 -20 [knee] -20 -20
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -18 [hip] -30 -30 [knee] -40 -40
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [arm] -59 59 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 180 [pitch] 1
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 135 [pitch] 1 [roll] 9 [hip] 30 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 90 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 45 [pitch] 1 [roll] -10 [hip] 3 42
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0

View File

@ -0,0 +1,17 @@
*[time] 0.2 [pos] 0.00 0.00 0.00 [yaw] 180 [pitch] 109 [neck] -50 [head] -8 [hip] -30 -30
*[time] 0.2 [pos] 0.00 0.10 0.00 [yaw] 180 [pitch] 90 [neck] -50 [hip] -20 -20 [knee] -20 -20
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -18 [hip] -30 -30 [knee] -40 -40
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [arm] -59 59 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 180 [pitch] 1
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 135 [pitch] 1 [roll] 9 [hip] 30 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 90 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 45 [pitch] 1 [roll] -10 [hip] 3 42
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [head] 35 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [head] -35 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [head] 35 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [head] -35 [hip] 3 0
*[time] 0.2 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [neck] 30 [hip] 3 0

View File

@ -91,7 +91,7 @@
# left forearm
*[node] 30 [par] 24 [order] 031 [trans] -0.23 0 0 [rot] 90 0 20.0
[name] left forearm and hand
*[node] 31 [par] 30 [joint] joint [name] joint for left_elbow
*[node] 31 [par] 30 [joint] left_elbow [name] joint for left_elbow
*[node] 32 [par] 31 [order] 01 [trans] -0.19 0 0 [rot] -90.0 0 0
[name] left forearm and hand
*[node] 33 [par] 32 [order] 45 [vis] 5 [scale] 0.3 0.07 0.15 [mat] blackcol [shad] 1

11
data/char/tux/start.lst Normal file
View File

@ -0,0 +1,11 @@
*[time] 0.5 [pos] -1.25 0.25 1.00 [yaw] 100 [sh] -20 40 [hip] -25 20
*[time] 0.5 [pos] -1.00 0.25 1.00 [yaw] 80 [head] -45 [sh] 40 -20 [hip] 20 -25
*[time] 0.5 [pos] -0.75 0.25 1.00 [yaw] 100 [head] -60 [sh] -20 40 [hip] -25 20
*[time] 0.5 [pos] -0.50 0.25 1.00 [yaw] 80 [head] -60 [sh] 40 -20 [hip] 20 -25
*[time] 0.5 [pos] -0.25 0.25 1.00 [yaw] 100 [sh] -20 40 [hip] -25 20
*[time] 0.5 [pos] 0.00 0.25 1.00 [yaw] 80 [head] 60 [sh] 40 -20 [hip] 20 -25
*[time] 0.5 [pos] 0.00 0.25 1.00 [yaw] 180
*[time] 0.4 [pos] 0.00 0.25 1.00 [yaw] 180 [sh] -60 -60
*[time] 0.4 [pos] 0.00 0.25 1.00 [yaw] 180 [sh] 20 20
*[time] 0.2 [pos] 0.00 0.25 0.30 [yaw] 180 [pitch] 60 [neck] -25 [sh] 90 90 [hip] -20 -20
*[time] 9.0 [pos] 0.00 0.00 0.00 [yaw] 180 [pitch] 110 [neck] -50 [hip] -40 -40

15
data/char/tux/wonrace.lst Normal file
View File

@ -0,0 +1,15 @@
*[time] 0.2 [pos] 0.00 0.00 0.00 [yaw] 180 [pitch] 109 [neck] -50 [head] -8 [hip] -30 -30
*[time] 0.2 [pos] 0.00 0.10 0.00 [yaw] 180 [pitch] 90 [neck] -50 [hip] -20 -20 [knee] -20 -20
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -18 [hip] -30 -30 [knee] -40 -40
*[time] 0.2 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [arm] -59 59 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.20 0.00 [yaw] 180 [pitch] 70 [neck] -26 [hip] -30 -30 [knee] -50 -50
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 180 [pitch] 1
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 135 [pitch] 1 [roll] 9 [hip] 30 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 90 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 45 [pitch] 1 [roll] -10 [hip] 3 42
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.60 0.00 [yaw] 5 [pitch] 1 [sh] 161 165 [arm] -86 88 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.60 0.00 [yaw] 5 [pitch] 1 [sh] 161 165 [arm] -86 88 [hip] 3 0
*[time] 0.3 [pos] 0.00 0.35 0.00 [yaw] 5 [pitch] 1 [hip] 3 0

View File

@ -3,7 +3,4 @@
[theme]calm
[env] tuxracer
[use_keyframe] 1
[wonrace_keyframe] tux_joice.lst
[lostrace_keyframe] tux_sad.lst
[finish_keyframe] tux_wait.lst
[finish_brake] 15.0

View File

@ -1,9 +1,5 @@
*[width]90.0[length]520.0[play_width]85.0[play_length] 470.0
*[width]90.0[length]520.0[play_width]85.0[play_length] 470.0
[startx]45.00[starty]3.50[angle]25.00[scale]7.00
[env] tuxracer
[use_keyframe] 1
[start_keyframe] tux_walk.lst
[wonrace_keyframe] tux_joice.lst
[lostrace_keyframe] tux_sad.lst
[finish_keyframe] tux_wait.lst
[finish_brake] 15.0

View File

@ -2,8 +2,4 @@
[startx]45.00[starty]3.50[angle]25.00[scale]7.00
[env] tuxracer
[use_keyframe] 1
[start_keyframe] tux_walk.lst
[wonrace_keyframe] tux_joice.lst
[lostrace_keyframe] tux_sad.lst
[finish_keyframe] tux_wait.lst
[finish_brake] 15.0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

View File

@ -32,7 +32,6 @@
* [id] 27 [name] ziff032 [file] ziff032.png [repeat] 0
* [id] 28 [name] mirror_butt [file] mirror_butt.png [repeat] 0
* [id] 29 [name] char_butt [file] char_butt.png [repeat] 0
* [id] 30 [name] random_butt [file] random_butt.png [repeat] 0
* [id] 33 [name] stars [file] stars.png [repeat] 0

253
doc/tools_keytab.rtf Normal file
View File

@ -0,0 +1,253 @@
{\rtf1\ansi\deff1\adeflang1025
{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\fswiss\fprq0\fcharset0 DejaVu Sans;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\fnil\fprq0\fcharset0 DejaVu Sans;}{\f4\fswiss\fprq0\fcharset0 DejaVu Sans;}{\f5\fswiss\fprq2\fcharset0 Arial;}{\f6\fnil\fprq0\fcharset128 OpenSymbol{\*\falt Arial Unicode MS};}{\f7\fswiss\fprq2\fcharset128 DejaVu Sans;}{\f8\fnil\fprq2\fcharset0 DejaVu Sans;}{\f9\fswiss\fprq2\fcharset0 DejaVu Sans;}}
{\colortbl;\red0\green0\blue0;\red128\green128\blue128;}
{\stylesheet{\s1\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\snext1 Normal;}
{\s2\sb240\sa120\keepn\rtlch\af8\afs28\lang255\ltrch\dbch\af8\langfe255\hich\f2\fs28\lang1031\loch\f2\fs28\lang1031\sbasedon1\snext3 Heading;}
{\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext3 Body Text;}
{\s4\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon3\snext4 List;}
{\s5\sb120\sa120\rtlch\afs24\lang255\ai\ltrch\dbch\af9\langfe255\hich\f3\fs24\lang1031\i\loch\f3\fs24\lang1031\i\sbasedon1\snext5 caption;}
{\s6\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f3\fs24\lang1031\loch\f3\fs24\lang1031\sbasedon1\snext6 Index;}
{\s7\sb240\sa120\keepn\rtlch\af5\afs28\lang255\ltrch\dbch\af9\langfe255\hich\f5\fs28\lang1031\loch\f5\fs28\lang1031\sbasedon1\snext3 Heading;}
{\s8\sb120\sa120\rtlch\afs24\lang255\ai\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\i\loch\fs24\lang1031\i\sbasedon1\snext8 caption;}
{\s9\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext9 Index;}
{\s10\sb240\sa120\keepn\rtlch\af5\afs28\lang255\ltrch\dbch\af9\langfe255\hich\f5\fs28\lang1031\loch\f5\fs28\lang1031\sbasedon1\snext3 WW-Heading;}
{\s11\sb120\sa120\rtlch\afs24\lang255\ai\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\i\loch\fs24\lang1031\i\sbasedon1\snext11 WW-caption;}
{\s12\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext12 WW-Index;}
{\s13\sb240\sa120\keepn\rtlch\af5\afs28\lang255\ltrch\dbch\af9\langfe255\hich\f5\fs28\lang1031\loch\f5\fs28\lang1031\sbasedon1\snext3 WW-Heading1;}
{\s14\sb120\sa120\rtlch\afs24\lang255\ai\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\i\loch\fs24\lang1031\i\sbasedon1\snext14 WW-caption1;}
{\s15\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext15 WW-Index1;}
{\s16\sb240\sa120\keepn\rtlch\af5\afs28\lang255\ltrch\dbch\af9\langfe255\hich\f5\fs28\lang1031\loch\f5\fs28\lang1031\sbasedon1\snext3 WW-Heading11;}
{\s17\sb120\sa120\rtlch\afs24\lang255\ai\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\i\loch\fs24\lang1031\i\sbasedon1\snext17 WW-caption11;}
{\s18\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext18 WW-Index11;}
{\s19\sb240\sa120\keepn\rtlch\af5\afs28\lang255\ltrch\dbch\af1\langfe255\hich\f5\fs28\lang1031\loch\f5\fs28\lang1031\sbasedon1\snext3 WW-Heading111;}
{\s20\sb120\sa120\rtlch\afs24\lang255\ai\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\i\loch\fs24\lang1031\i\sbasedon1\snext20 WW-caption111;}
{\s21\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext21 WW-Index111;}
{\s22\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext22 Table Contents;}
{\s23\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext23 WW-Table Contents;}
{\s24\qc\rtlch\afs24\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\b\loch\fs24\lang1031\b\sbasedon23\snext24 Table Heading;}
{\s25\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext25 WW-Table Contents1;}
{\s26\qc\rtlch\afs24\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\b\loch\fs24\lang1031\b\sbasedon25\snext26 WW-Table Heading;}
{\s27\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext27 WW-Table Contents12;}
{\s28\qc\rtlch\afs24\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\b\loch\fs24\lang1031\b\sbasedon27\snext28 WW-Table Heading1;}
{\s29\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext29 WW-Table Contents123;}
{\s30\qc\rtlch\afs24\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\b\loch\fs24\lang1031\b\sbasedon29\snext30 WW-Table Heading12;}
{\s31\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext31 Table Contents;}
{\s32\qc\rtlch\afs24\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\b\loch\fs24\lang1031\b\sbasedon31\snext32 Table Heading;}
{\*\cs34\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 2 1;}
{\*\cs35\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 2 2;}
{\*\cs36\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 2 3;}
{\*\cs37\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 2 4;}
{\*\cs38\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 2 5;}
{\*\cs39\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 2 6;}
{\*\cs40\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 2 7;}
{\*\cs41\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 2 8;}
{\*\cs42\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 2 9;}
{\*\cs43\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 2 10;}
{\*\cs44\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 3 1;}
{\*\cs45\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 3 2;}
{\*\cs46\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 3 3;}
{\*\cs47\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 3 4;}
{\*\cs48\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 3 5;}
{\*\cs49\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 3 6;}
{\*\cs50\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 3 7;}
{\*\cs51\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 3 8;}
{\*\cs52\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 3 9;}
{\*\cs53\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 3 10;}
{\*\cs54\cf0\rtlch\af1\afs24\lang255\ltrch\dbch\af1\langfe255\hich\f1\fs24\lang1031\loch\f1\fs24\lang1031 Numbering Symbols;}
{\*\cs55\cf0\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 Bullet Symbols;}
}
{\info{\creatim\yr2010\mo11\dy15\hr15\min35}{\revtim\yr0\mo0\dy0\hr0\min0}{\printim\yr0\mo0\dy0\hr0\min0}{\comment StarWriter}{\vern3000}}\deftab709
{\*\pgdsctbl
{\pgdsc0\pgdscuse195\pgwsxn11905\pghsxn16837\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Standard;}}
{\*\pgdscno0}\paperh16837\paperw11905\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\pgwsxn11905\pghsxn16837\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
\pard\plain \ltrpar\s3\sa120\ql\rtlch\afs28\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs28\lang1031\b\loch\fs28\lang1031\b {\rtlch \ltrch\loch\f1\fs28\lang1031\i0\b The character tools of Extreme Tux Racer}
\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031{\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0{\rtlch\ltrch\hich\b\loch\b Note}}{\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 : Now the keyframes are built and adjusted on per-character basis. The consequence is that each character gets its own set of keyframes. They are placed in the particular character folder. The folder can contain the following files:}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 - shape.lst - the file for building the character}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 - preview.png - an image for the entrance screen}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 - start.lst - the keyframe for the intro mode}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 - finish.lst - neutral keyframe for the final stage}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 - wonrace.lst - the same but used in case that the race was successful}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 - lostrace.lst - that should be clear}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 The animations rules should be part of the character, too, but that will be implemented later.}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031
\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\afs24\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\b\loch\fs24\lang1031\b {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b Starting the tools}
\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 For running the character tools you have to start the program by}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 \tab ./etr --char folder keyframe}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 where folder is the character folder (e.g. \'84samuel\'93) and keyframe one of the frame descriptions in this folder (e.g. \'84wonrace.lst\'93). Probably it's a good idea to create a special test folder.}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031
\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\afs24\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\b\loch\fs24\lang1031\b {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b The tool modes}
\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 There are 3 modes:}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 - char mode - for shaping the figure}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 - frame mode - for editing a singe frame of a keyframe sequence}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 - sequence mode - running the keyframe with real time}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 After starting the tools you are in char mode.}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031
\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\afs24\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\b\loch\fs24\lang1031\b {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b View}
\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 In char mode you can rotate and move the figure (see tables below). Also you can zoom in and out.}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 In frame mode it doesn't make sense to move or rotate the figure freely because the position as well as the rotations are adjusted by the frames. To get another view we have to move and rotate the camera whereas the figure keeps the specified adjustments.
It's not easy to orientate oneself by changing the camera position and direction, but it might be helpful to use <1> ... <8>. That sets the camera on fixed positions around the reference point (0, 0, 0).}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031{\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0{\rtlch\ltrch\hich\b\loch\b Keyboard function in the different modes:}}{\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 \tab }
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031
\par \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ab\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\b\loch\f7\fs20\lang1031\b
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ab\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\b\loch\f7\fs18\lang1031\b {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b char mode}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ab\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\b\loch\f7\fs20\lang1031\b {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b frame mode}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ab\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\b\loch\f7\fs18\lang1031\b {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b sequence mode}
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <PAGE_DOWN>}
\par \pard\plain \intbl\ltrpar\s22\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <PAGE_UP>}
\par \pard\plain \intbl\ltrpar\s22\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <HOME> <END>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 select node}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 select frame}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <CRSR_DOWN>}
\par \pard\plain \intbl\ltrpar\s22\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <CRSR_UP>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 select }
\par \pard\plain \intbl\ltrpar\s22\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 transformation}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 select }
\par \pard\plain \intbl\ltrpar\s22\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 joint}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <SPACE>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 select vector component }
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <CRSR_LEFT>}
\par \pard\plain \intbl\ltrpar\s22\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <CRSR_RIGHT>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 change value of}
\par \pard\plain \intbl\ltrpar\s22\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 selected component}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 rotate joint}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <1> ... <4>}
\par \pard\plain \intbl\ltrpar\s22\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <1> ... <8>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 set standard}
\par \pard\plain \intbl\ltrpar\s22\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 orientations}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 set standard}
\par \pard\plain \intbl\ltrpar\s22\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 views}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <TAB>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 go to frame mode}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 go to char mode}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 back to frame mode}
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <ESCAPE>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 quit program}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 quit program}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 back to frame mode}
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <ENTER>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 start sequence}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 repeat sequence}
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <M>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 show / hide material}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 show / hide material}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <H>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 toggle highlighting}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 toggle highlighting}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <R>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 reload character}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <U>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 reset current node}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <-> <+> <=>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 zoom}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <S>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 save character}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 save keyframe seq.}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <A><INST>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 add, insert frame}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trrh312\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <DEL>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 delete frame}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <CTRL> + <C>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 copy }
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <CTRL> + <V>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 paste}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <C>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 clear current frame}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <P>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 copy previous frame}
\par \pard\plain \intbl\ltrpar\s22\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 to current frame}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <0> (zero)}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 set current value to}
\par \pard\plain \intbl\ltrpar\s22\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 0.0}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <F1> <F2>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 change camera rotation}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <F3> <F4>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 change camera}
\par \pard\plain \intbl\ltrpar\s22\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 distance}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \pard\plain \ltrpar\s1\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031
\par \pard\plain \ltrpar\s1\ql\rtlch\afs24\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\b\loch\fs24\lang1031\b {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b Mouse functions:}
\par \pard\plain \ltrpar\s1\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031
\par \pard\plain \ltrpar\s1\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031
\par \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4818\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7227\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\b\loch\fs18\lang1031\b
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\b\loch\fs18\lang1031\b {\rtlch \ltrch\loch\f1\fs18\lang1031\i0\b char mode}
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\b\loch\fs18\lang1031\b {\rtlch \ltrch\loch\f1\fs18\lang1031\i0\b frame mode}
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\b\loch\fs18\lang1031\b {\rtlch \ltrch\loch\f1\fs18\lang1031\i0\b sequence mode}
\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4818\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7227\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031 {\rtlch \ltrch\loch\f1\fs18\lang1031\i0\b0 WHEEL}
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031 {\rtlch \ltrch\loch\f1\fs18\lang1031\i0\b0 zoom}
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031 {\rtlch \ltrch\loch\f1\fs18\lang1031\i0\b0 zoom}
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031
\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4818\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7227\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031 {\rtlch \ltrch\loch\f1\fs18\lang1031\i0\b0 LEFT BUTTON}
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031 {\rtlch \ltrch\loch\f1\fs18\lang1031\i0\b0 rotate figure}
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031
\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4818\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7227\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031 {\rtlch \ltrch\loch\f1\fs18\lang1031\i0\b0 RIGHT BUTTON}
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031 {\rtlch \ltrch\loch\f1\fs18\lang1031\i0\b0 move figure}
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031
\cell\row\pard \pard\plain \ltrpar\s1\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031
\par }

View File

@ -125,6 +125,7 @@ typedef struct {
typedef enum {
NO_MODE,
SPLASH,
REGIST,
GAME_TYPE_SELECT,
EVENT_SELECT,
EVENT,
@ -163,6 +164,14 @@ typedef enum {
NUM_VIEW_MODES
} TViewMode;
typedef enum {
START,
FINISH,
WONRACE,
LOSTRACE,
NUM_FRAME_TYPES
} TFrameType;
typedef struct {
TGameMode mode;
TGameMode prev_mode;
@ -176,7 +185,9 @@ typedef struct {
int treesize;
int treevar;
int argument;
string arg_str;
string group_arg;
string dir_arg;
string file_arg;
int loopdelay;
bool finish;
bool use_keyframe;

View File

@ -19,6 +19,7 @@ GNU General Public License for more details.
#include "course.h"
#include "env.h"
#include "audio.h"
#include "textures.h"
CEvents Events;
@ -237,7 +238,95 @@ CControl *CPlayers::GetControl (int player) {
return &plyr[player].ctrl;
}
// ********************************************************************
// Character Administration
// ********************************************************************
CCharacter Char;
CCharacter::CCharacter () {
for (int i=0; i<MAX_CHARACTERS; i++) {
CharList[i].name = "";
CharList[i].dir = "";
CharList[i].preview = 0;
CharList[i].shape = NULL;
}
numCharacters = 0;
curr_character = 0;
}
CCharacter::~CCharacter () {}
static string char_type_index = "[spheres]0[3d]1";
void CCharacter::LoadCharacterList () {
CSPList list (MAX_CHARACTERS+2);
string line, typestr, charpath, previewfile;
int i;
GLuint texid;
if (!list.Load (param.char_dir, "characters.lst")) {
Message ("could not load characters.lst");
return;
}
numCharacters = 0;
TCharacter *ch;
for (i=0; i<list.Count(); i++) {
line = list.Line (i);
CharList[i].name = SPStrN (line, "name", "");
CharList[i].dir = SPStrN (line, "dir", "");
typestr = SPStrN (line, "type", "unknown");
CharList[i].type = SPIntN (char_type_index, typestr, -1);
charpath = param.char_dir + SEP + CharList[i].dir;
if (DirExists (charpath.c_str())) {
previewfile = charpath + SEP + "preview.png";
texid = Tex.LoadMipmapTexture (previewfile.c_str(), 0);
if (texid < 1) {
Message ("could not load previewfile of character");
texid = Tex.TexID (NO_PREVIEW);
}
ch = &CharList[i];
ch->preview = texid;
ch->shape = new CCharShape;
if (ch->shape->Load (charpath, "shape.lst", false) == false) {
free (ch->shape);
ch->shape = NULL;
Message ("could not load character shape");
} else numCharacters++;
ch->frames[0].Load (charpath, "start.lst");
ch->finishframesok = true;
ch->frames[1].Load (charpath, "finish.lst");
if (ch->frames[1].loaded == false) ch->finishframesok = false;
ch->frames[2].Load (charpath, "wonrace.lst");
if (ch->frames[2].loaded == false) ch->finishframesok = false;
ch->frames[3].Load (charpath, "lostrace.lst");
if (ch->frames[3].loaded == false) ch->finishframesok = false;
}
}
}
void CCharacter::Draw (int idx) {
if (idx < 0 || idx >= numCharacters) return;
CharList[idx].shape->Draw ();
}
CCharShape *CCharacter::GetShape (int idx) {
if (idx < 0 || idx >= numCharacters) return NULL;
return CharList[idx].shape;
}
CKeyframe *CCharacter::GetKeyframe (int idx, TFrameType type) {
if (type < 0 || type >= NUM_FRAME_TYPES) return NULL;
if (idx < 0 || idx >= numCharacters) return NULL;
return &CharList[idx].frames[type];
}

View File

@ -18,6 +18,8 @@ GNU General Public License for more details.
#define GAME_CTRL_H
#include "bh.h"
#include "tux.h"
#include "keyframe.h"
#define MAX_RACES2 256
#define MAX_CUPS2 64
@ -109,4 +111,37 @@ public:
extern CPlayers Players;
// -------------------------------- characters ------------------------
#define MAX_CHARACTERS 16
typedef struct {
int type;
string name;
string dir;
GLuint preview;
CCharShape *shape;
CKeyframe frames[NUM_FRAME_TYPES];
bool finishframesok;
} TCharacter;
class CCharacter {
private:
int curr_character;
public:
CCharacter ();
~CCharacter ();
TCharacter CharList [MAX_CHARACTERS];
int numCharacters;
void Draw (int idx);
CCharShape *GetShape (int idx);
void LoadCharacterList ();
CKeyframe *GetKeyframe (int idx, TFrameType type);
};
extern CCharacter Char;
#endif

View File

@ -161,21 +161,22 @@ void GameOverInit (void) {
}
}
if (g_game.raceaborted || !g_game.use_keyframe) {
final_frame = NULL;
} else {
if (g_game.game_type == CUPRACING) {
if (g_game.race_result < 0) final_frame = &TuxLostrace;
else final_frame = &TuxWonrace;
} else final_frame = &TuxFinish;
if (g_game.race_result < 0) final_frame = Char.GetKeyframe (g_game.char_id, LOSTRACE);
else final_frame = Char.GetKeyframe (g_game.char_id, WONRACE);
} else final_frame = Char.GetKeyframe (g_game.char_id, FINISH);
if (!g_game.raceaborted) {
CControl *ctrl = Players.GetControl (0);
final_frame->Init (ctrl->cpos, -0.15);
final_frame->Init (ctrl->cpos, -0.18);
}
}
SetStationaryCamera (true);
}
void GameOverLoop (double time_step) {
CControl *ctrl = Players.GetControl (0);
int width, height;
@ -187,8 +188,10 @@ void GameOverLoop (double time_step) {
ClearRenderContext ();
Env.SetupFog ();
update_view (ctrl, 0);
if (final_frame != NULL) final_frame->Update (time_step, ctrl);
update_view (ctrl, 0);
if (final_frame != NULL) final_frame->Update (time_step, ctrl);
SetupViewFrustum (ctrl);
Env.DrawSkybox (ctrl->viewpos);

View File

@ -28,6 +28,8 @@ GNU General Public License for more details.
#include "particles.h"
#include "game_ctrl.h"
static CKeyframe *startframe;
void IntroKeys (unsigned int key, bool special, bool release, int x, int y);
void abort_intro (CControl *ctrl) {
@ -51,7 +53,12 @@ void intro_init(void) {
ctrl->cpos.x = start_pt.x;
ctrl->cpos.z = start_pt.y;
TuxStart.Init (ctrl->cpos, -0.05);
startframe = Char.GetKeyframe (g_game.char_id, START);
if (startframe->loaded) {
// startframe->Init (ctrl->cpos, -0.05);
CCharShape *sh = Char.GetShape (g_game.char_id);
startframe->Init (ctrl->cpos, -0.05, sh);
}
// reset of result values
g_game.herring = 0;
@ -65,7 +72,9 @@ void intro_init(void) {
ctrl->cvel = MakeVector (0, 0, 0);
clear_particles();
set_view_mode (ctrl, ABOVE);
update_view (ctrl, EPS);
SetCameraDistance (4.0);
SetStationaryCamera (false);
update_view (ctrl, EPS);
num_items = Course.numNocoll;
item_locs = Course.NocollArr;
@ -86,15 +95,15 @@ void intro_init(void) {
void intro_loop (double time_step) {
int width, height;
CControl *ctrl = Players.GetControl (0);
width = param.x_resolution;
height = param.y_resolution;
check_gl_error();
if (TuxStart.active) TuxStart.Update (time_step, ctrl);
else Winsys.SetMode (RACING);
ClearRenderContext ();
if (startframe->active) {
startframe->Update (time_step, ctrl);
} else Winsys.SetMode (RACING);
ClearRenderContext ();
Env.SetupFog ();
update_view (ctrl, time_step);

View File

@ -16,18 +16,36 @@ GNU General Public License for more details.
---------------------------------------------------------------------*/
#include "keyframe.h"
#include "tux.h"
#include "course.h"
#include "spx.h"
#include "game_ctrl.h"
CKeyframe TuxStart;
CKeyframe TuxLostrace;
CKeyframe TuxWonrace;
CKeyframe TuxFinish;
CKeyframe TuxTest;
// The jointnames are shown on the tools screen and define the
// possible rotations. A joint can be rotated around 3 axis, so
// a joint can contain up to 3 joinnames.
string jointnames[MAX_KEY_FRAMES] =
{"time","pos.x","pos.y","pos.z","yaw","pitch","roll","neck","head",
"l_shldr","r_shldr","l_arm","r_arm",
"l_hip","r_hip","l_knee","r_knee","l_ankle","r_ankle",
"","","","","","","","","","","","",""};
// The highlightnames must be official joint identifiers, defined in
// the character description. They are used to find the port nodes
// for highlighting
string highlightnames[MAX_KEY_FRAMES] =
{"","","","","","","","neck","head",
"left_shldr","right_shldr","left_shldr","right_shldr",
"left_hip","right_hip","left_knee","right_knee","left_ankle","right_ankle",
"","","","","","","","","","","","",""};
int numJoints = 19;
CKeyframe TestFrame;
CKeyframe::CKeyframe () {
for (int i=0; i<=MAX_KEY_FRAMES; i++) {
frames[i] = NULL;
}
keytime = 0;
numFrames = 0;
active = false;
@ -52,93 +70,203 @@ void CKeyframe::Init (TVector3 ref_position, double height_correction) {
keytime = 0;
}
void CKeyframe::Init (TVector3 ref_position, double height_correction, CCharShape *shape) {
if (!loaded) return;
shape->ResetNode ("head");
shape->ResetNode ("neck");
refpos = ref_position;
heightcorr = height_correction;
active = true;
keyidx = 0;
keytime = 0;
}
void CKeyframe::InitTest (TVector3 ref_position, CCharShape *shape) {
if (!loaded) return;
shape->ResetNode ("head");
shape->ResetNode ("neck");
refpos = ref_position;
heightcorr = 0.0;
active = true;
keyidx = 0;
keytime = 0;
}
void CKeyframe::Reset () {
loaded = false;
active = false;
loadedfile = "";
keytime = 0;
numFrames = 0;
for (int i=0; i<=MAX_KEY_FRAMES; i++) {
if (frames[i] != NULL) {
free (frames[i]);
frames[i] = NULL;
}
}
}
void CKeyframe::Load (string filename) {
if (loaded && loadedfile == filename) return;
bool CKeyframe::Load (string dir, string filename) {
if (loaded && loadedfile == filename) return true;
CSPList list (1000);
int i;
string line;
TVector2 pp;
numFrames = 0;
if (list.Load (param.keyframe_dir, filename)) {
TVector3 posit;
if (list.Load (dir, filename)) {
for (i=0; i<list.Count(); i++) {
line = list.Line (i);
frames[numFrames].time = SPFloatN (line, "time", 0);
frames[numFrames].pos = SPVector3N (line, "pos", MakeVector (0, 0, 0));
frames[numFrames].yaw = SPFloatN (line, "yaw", 0);
frames[numFrames].pitch = SPFloatN (line, "pitch", 0);
frames[numFrames].neck = SPFloatN (line, "neck", 0);
frames[numFrames].head = SPFloatN (line, "head", 0);
frames[numFrames] = new (TKeyframe2);
frames[numFrames]->val[0] = SPFloatN (line, "time", 0);
posit = SPVector3N (line, "pos", MakeVector (0, 0, 0));
frames[numFrames]->val[1] = posit.x;
frames[numFrames]->val[2] = posit.y;
frames[numFrames]->val[3] = posit.z;
frames[numFrames]->val[4] = SPFloatN (line, "yaw", 0);
frames[numFrames]->val[5] = SPFloatN (line, "pitch", 0);
frames[numFrames]->val[6] = SPFloatN (line, "roll", 0);
frames[numFrames]->val[7] = SPFloatN (line, "neck", 0);
frames[numFrames]->val[8] = SPFloatN (line, "head", 0);
pp = SPVector2N (line, "sh", MakeVector2 (0, 0));
frames[numFrames].l_shldr = pp.x;
frames[numFrames].r_shldr = pp.y;
frames[numFrames]->val[9] = pp.x;
frames[numFrames]->val[10] = pp.y;
pp = SPVector2N (line, "arm", MakeVector2 (0, 0));
frames[numFrames]->val[11] = pp.x;
frames[numFrames]->val[12] = pp.y;
pp = SPVector2N (line, "hip", MakeVector2 (0, 0));
frames[numFrames].l_hip = pp.x;
frames[numFrames].r_hip = pp.y;
frames[numFrames]->val[13] = pp.x;
frames[numFrames]->val[14] = pp.y;
pp = SPVector2N (line, "knee", MakeVector2 (0, 0));
frames[numFrames].l_knee = pp.x;
frames[numFrames].r_knee = pp.y;
frames[numFrames]->val[15] = pp.x;
frames[numFrames]->val[16] = pp.y;
pp = SPVector2N (line, "ankle", MakeVector2 (0, 0));
frames[numFrames].l_ankle = pp.x;
frames[numFrames].r_ankle = pp.y;
frames[numFrames]->val[17] = pp.x;
frames[numFrames]->val[18] = pp.y;
numFrames++;
}
loaded = true;
loadedfile = filename;
return true;
} else {
MessageN ("keyframe not found:", filename);
loaded = false;
return false;
}
}
// there are more possibilities for rotating the parts of the body,
// that will be implemented later
void CKeyframe::InterpolateKeyframe (int idx, double frac) {
CCharShape *shape = Char.GetShape (g_game.char_id);
double v;
v = interp (frac, frames[idx].yaw, frames[idx+1].yaw);
shape->RotateNode ("root", 2, v);
void CKeyframe::InterpolateKeyframe (int idx, double frac, CCharShape *shape) {
v = interp (frac, frames[idx].pitch, frames[idx+1].pitch);
shape->RotateNode ("root", 1, v);
double vv;
vv = interp (frac, frames[idx]->val[4], frames[idx+1]->val[4]);
shape->RotateNode ("root", 2, vv);
v = interp (frac, frames[idx].neck, frames[idx+1].neck);
shape->RotateNode ("neck", 3, v);
vv = interp (frac, frames[idx]->val[5], frames[idx+1]->val[5]);
shape->RotateNode ("root", 1, vv);
v = interp (frac, frames[idx].head, frames[idx+1].head);
shape->RotateNode ("head", 2, v);
vv = interp (frac, frames[idx]->val[6], frames[idx+1]->val[6]);
shape->RotateNode ("root", 3, vv);
v = interp (frac, frames[idx].l_shldr, frames[idx+1].l_shldr);
shape->RotateNode ("left_shldr", 3, v);
vv = interp (frac, frames[idx]->val[7], frames[idx+1]->val[7]);
shape->RotateNode ("neck", 3, vv);
v = interp (frac, frames[idx].r_shldr, frames[idx+1].r_shldr);
shape->RotateNode ("right_shldr", 3, v);
vv = interp (frac, frames[idx]->val[8], frames[idx+1]->val[8]);
shape->RotateNode ("head", 2, vv);
v = interp (frac, frames[idx].l_hip, frames[idx+1].l_hip);
shape->RotateNode ("left_hip", 3, v);
vv = interp (frac, frames[idx]->val[9], frames[idx+1]->val[9]);
shape->RotateNode ("left_shldr", 3, vv);
v = interp (frac, frames[idx].r_hip, frames[idx+1].r_hip);
shape->RotateNode ("right_hip", 3, v);
vv = interp (frac, frames[idx]->val[10], frames[idx+1]->val[10]);
shape->RotateNode ("right_shldr", 3, vv);
v = interp (frac, frames[idx].l_knee, frames[idx+1].l_knee);
shape->RotateNode ("left_knee", 3, v);
vv = interp (frac, frames[idx]->val[11], frames[idx+1]->val[11]);
shape->RotateNode ("left_shldr", 2, vv);
v = interp (frac, frames[idx].r_knee, frames[idx+1].r_knee);
shape->RotateNode ("right_knee", 3, v);
vv = interp (frac, frames[idx]->val[12], frames[idx+1]->val[12]);
shape->RotateNode ("right_shldr", 2, vv);
v = interp (frac, frames[idx].l_ankle, frames[idx+1].l_ankle);
shape->RotateNode ("left_ankle", 3, v);
vv = interp (frac, frames[idx]->val[13], frames[idx+1]->val[13]);
shape->RotateNode ("left_hip", 3, vv);
v = interp (frac, frames[idx].r_ankle, frames[idx+1].r_ankle);
shape->RotateNode ("right_ankle", 3, v);
vv = interp (frac, frames[idx]->val[14], frames[idx+1]->val[14]);
shape->RotateNode ("right_hip", 3, vv);
vv = interp (frac, frames[idx]->val[15], frames[idx+1]->val[15]);
shape->RotateNode ("left_knee", 3, vv);
vv = interp (frac, frames[idx]->val[16], frames[idx+1]->val[16]);
shape->RotateNode ("right_knee", 3, vv);
vv = interp (frac, frames[idx]->val[17], frames[idx+1]->val[17]);
shape->RotateNode ("left_ankle", 3, vv);
vv = interp (frac, frames[idx]->val[18], frames[idx+1]->val[18]);
shape->RotateNode ("right_ankle", 3, vv);
}
void CKeyframe::CalcKeyframe (int idx, CCharShape *shape, TVector3 refpos) {
double vv;
TVector3 pos;
pos.x = frames[idx]->val[1] + refpos.x;
pos.z = frames[idx]->val[3] + refpos.z;
pos.y = refpos.y;
shape->ResetRoot ();
shape->ResetJoints ();
shape->TranslateNode (0, MakeVector (pos.x, pos.y, pos.z));
vv = frames[idx]->val[4];
shape->RotateNode ("root", 2, vv);
vv = frames[idx]->val[5];
shape->RotateNode ("root", 1, vv);
vv = frames[idx]->val[6];
shape->RotateNode ("root", 3, vv);
vv = frames[idx]->val[7];
shape->RotateNode ("neck", 3, vv);
vv = frames[idx]->val[8];
shape->RotateNode ("head", 2, vv);
vv = frames[idx]->val[9];
shape->RotateNode ("left_shldr", 3, vv);
vv = frames[idx]->val[10];
shape->RotateNode ("right_shldr", 3, vv);
vv = frames[idx]->val[11];
shape->RotateNode ("left_shldr", 2, vv);
vv = frames[idx]->val[12];
shape->RotateNode ("right_shldr", 2, vv);
vv = frames[idx]->val[13];
shape->RotateNode ("left_hip", 3, vv);
vv = frames[idx]->val[14];
shape->RotateNode ("right_hip", 3, vv);
vv = frames[idx]->val[15];
shape->RotateNode ("left_knee", 3, vv);
vv = frames[idx]->val[16];
shape->RotateNode ("right_knee", 3, vv);
vv = frames[idx]->val[17];
shape->RotateNode ("left_ankle", 3, vv);
vv = frames[idx]->val[18];
shape->RotateNode ("right_ankle", 3, vv);
}
void CKeyframe::Update (double timestep, CControl *ctrl) {
@ -149,22 +277,22 @@ void CKeyframe::Update (double timestep, CControl *ctrl) {
if (!active) return;
keytime += timestep;
if (keytime >= frames[keyidx].time) {
if (keytime >= frames[keyidx]->val[0]) {
keyidx++;
keytime = 0;
}
if (keyidx >= numFrames-1 || numFrames < 2) {
active = false;
return;
}
if (fabs (frames[keyidx].time) < 0.0001) frac = 1.0;
else frac = (frames[keyidx].time - keytime) / frames[keyidx].time;
if (fabs (frames[keyidx]->val[0]) < 0.0001) frac = 1.0;
else frac = (frames[keyidx]->val[0] - keytime) / frames[keyidx]->val[0];
pos.x = interp (frac, frames[keyidx].pos.x, frames[keyidx+1].pos.x) + refpos.x;
pos.z = interp (frac, frames[keyidx].pos.z, frames[keyidx+1].pos.z) + refpos.z;
pos.y = interp (frac, frames[keyidx].pos.y, frames[keyidx+1].pos.y);
pos.x = interp (frac, frames[keyidx]->val[1], frames[keyidx+1]->val[1]) + refpos.x;
pos.z = interp (frac, frames[keyidx]->val[3], frames[keyidx+1]->val[3]) + refpos.z;
pos.y = interp (frac, frames[keyidx]->val[2], frames[keyidx+1]->val[2]);
pos.y += Course.FindYCoord (pos.x, pos.z);
shape->ResetRoot ();
@ -174,19 +302,16 @@ void CKeyframe::Update (double timestep, CControl *ctrl) {
double disp_y = pos.y + TUX_Y_CORR + heightcorr;
shape->ResetNode (0);
shape->TranslateNode (0, MakeVector (pos.x, disp_y, pos.z));
InterpolateKeyframe (keyidx, frac);
InterpolateKeyframe (keyidx, frac, shape);
}
void CKeyframe::TestUpdate (double timestep) {
void CKeyframe::UpdateTest (double timestep, CCharShape *shape) {
double frac;
TVector3 pos;
CCharShape *shape = Char.GetShape (g_game.char_id);
if (!active) return;
keytime += timestep;
if (keytime >= frames[keyidx].time) {
if (keytime >= frames[keyidx]->val[0]) {
keyidx++;
keytime = 0;
}
@ -196,15 +321,149 @@ void CKeyframe::TestUpdate (double timestep) {
return;
}
if (fabs (frames[keyidx].time) < 0.0001) frac = 1.0;
else frac = (frames[keyidx].time - keytime) / frames[keyidx].time;
if (fabs (frames[keyidx]->val[0]) < 0.0001) frac = 1.0;
else frac = (frames[keyidx]->val[0] - keytime) / frames[keyidx]->val[0];
pos.x = interp (frac, frames[keyidx].pos.x, frames[keyidx+1].pos.x);
pos.z = interp (frac, frames[keyidx].pos.z, frames[keyidx+1].pos.z);
pos.y = interp (frac, frames[keyidx].pos.y, frames[keyidx+1].pos.y);
pos.x = interp (frac, frames[keyidx]->val[1], frames[keyidx+1]->val[1]) + refpos.x;
pos.z = interp (frac, frames[keyidx]->val[3], frames[keyidx+1]->val[3]) + refpos.z;
pos.y = interp (frac, frames[keyidx]->val[2], frames[keyidx+1]->val[2]);
shape->ResetRoot ();
shape->ResetJoints ();
InterpolateKeyframe (keyidx, frac);
shape->TranslateNode (0, MakeVector (pos.x, pos.y, pos.z));
InterpolateKeyframe (keyidx, frac, shape);
}
void CKeyframe::ResetFrame2 (TKeyframe2 *frame) {
for (int i=1; i<32; i++) frame->val[i] = 0.0;
frame->val[0] = 0.5; // time
}
TKeyframe2 *CKeyframe::GetFrame (int idx) {
if (idx < 0 || idx >= numFrames) return NULL;
return frames[idx];
}
string CKeyframe::GetJointName (int idx) {
if (idx < 0 || idx >= numJoints) return "";
return jointnames[idx];
}
string CKeyframe::GetHighlightName (int idx) {
if (idx < 0 || idx >= numJoints) return "";
return highlightnames[idx];
}
int CKeyframe::GetNumJoints () {
return numJoints;
}
void CKeyframe::SaveTest (string dir, string filename) {
CSPList list (100);
string line;
TKeyframe2 *frame;
double ll, rr;
for (int i=0; i<numFrames; i++) {
frame = frames[i];
line = "*[time] " + Float_StrN (frame->val[0], 1);
line += " [pos] " + Float_StrN (frame->val[1], 2);
line += " " + Float_StrN (frame->val[2], 2);
line += " " + Float_StrN (frame->val[3], 2);
if (frame->val[4] != 0) line += " [yaw] " + Float_StrN (frame->val[4], 0);
if (frame->val[5] != 0) line += " [pitch] " + Float_StrN (frame->val[5], 0);
if (frame->val[6] != 0) line += " [roll] " + Float_StrN (frame->val[6], 0);
if (frame->val[7] != 0) line += " [neck] " + Float_StrN (frame->val[7], 0);
if (frame->val[8] != 0) line += " [head] " + Float_StrN (frame->val[8], 0);
ll = frame->val[9];
rr = frame->val[10];
if (ll != 0 || rr != 0)
line += " [sh] " + Float_StrN (ll, 0) + " " + Float_StrN (rr, 0);
ll = frame->val[11];
rr = frame->val[12];
if (ll != 0 || rr != 0)
line += " [arm] " + Float_StrN (ll, 0) + " " + Float_StrN (rr, 0);
ll = frame->val[13];
rr = frame->val[14];
if (ll != 0 || rr != 0)
line += " [hip] " + Float_StrN (ll, 0) + " " + Float_StrN (rr, 0);
ll = frame->val[15];
rr = frame->val[16];
if (ll != 0 || rr != 0)
line += " [knee] " + Float_StrN (ll, 0) + " " + Float_StrN (rr, 0);
ll = frame->val[17];
rr = frame->val[18];
if (ll != 0 || rr != 0)
line += " [ankle] " + Float_StrN (ll, 0) + " " + Float_StrN (rr, 0);
list.Add (line);
}
list.Save (dir, filename);
}
void CKeyframe::CopyFrame (int prim_idx, int sec_idx) {
TKeyframe2 *ppp = frames[prim_idx];
TKeyframe2 *sss = frames[sec_idx];
for (int i=0; i<MAX_FRAME_VALUES; i++) sss->val[i] = ppp->val[i];
}
void CKeyframe::AddFrame () {
if (numFrames >= MAX_KEY_FRAMES) return;
if (frames[numFrames] == NULL) frames[numFrames] = new (TKeyframe2);
ResetFrame2 (frames[numFrames]);
numFrames++;
}
int CKeyframe::DeleteFrame (int idx) {
if (numFrames < 2) return idx;
int lastframe = numFrames-1;
if (idx < 0 || idx > lastframe) return 0;
if (idx == lastframe) {
free (frames[lastframe]);
frames[lastframe] = NULL;
numFrames--;
return numFrames-1;
} else {
for (int i=idx; i<lastframe-1; i++) CopyFrame (i+1, i);
free (frames[lastframe]);
frames[lastframe] = NULL;
numFrames--;
return idx;
}
}
void CKeyframe::InsertFrame (int idx) {
if (numFrames >= MAX_KEY_FRAMES) return;
int lastframe = numFrames-1;
if (idx < 0 || idx > lastframe) return;
if (frames[numFrames] == NULL) frames[numFrames] = new (TKeyframe2);
for (int i=numFrames; i>idx; i--) CopyFrame (i-1, i);
ResetFrame2 (frames[idx]);
numFrames++;
}
void CKeyframe::CopyToClipboard (int idx) {
if (idx < 0 || idx >= numFrames) return;
for (int i=0; i<MAX_FRAME_VALUES; i++) clipboard.val[i] = frames[idx]->val[i];
}
void CKeyframe::PasteFromClipboard (int idx) {
if (idx < 0 || idx >= numFrames) return;
for (int i=0; i<MAX_FRAME_VALUES; i++) frames[idx]->val[i] = clipboard.val[i];
}
void CKeyframe::ClearFrame (int idx) {
if (idx < 0 || idx >= numFrames) return;
ResetFrame2 (frames[idx]);
}

View File

@ -19,55 +19,62 @@ GNU General Public License for more details.
#define KEYFRAME_H
#include "bh.h"
#include "tux.h"
#define MAX_KEY_FRAMES 128
#define MAX_FRAME_VALUES 32
typedef struct {
TVector3 pos;
double time;
double yaw;
double pitch;
double l_shldr;
double r_shldr;
double l_hip;
double r_hip;
double l_knee;
double r_knee;
double l_ankle;
double r_ankle;
double neck;
double head;
} TKeyframe;
double val[MAX_FRAME_VALUES];
} TKeyframe2;
class CKeyframe {
private:
double keytime;
int numFrames;
TKeyframe frames[MAX_KEY_FRAMES];
TKeyframe2 *frames[MAX_KEY_FRAMES];
TVector3 refpos;
double heightcorr;
int keyidx;
string loadedfile;
TKeyframe2 clipboard;
double interp (double frac, double v1, double v2);
void InterpolateKeyframe (int idx, double frac);
void InterpolateKeyframe (int idx, double frac, CCharShape *shape);
// test and editing
void ResetFrame2 (TKeyframe2 *frame);
public:
CKeyframe ();
~CKeyframe ();
int numFrames;
string jointname;
bool loaded;
bool active;
bool loaded;
string loadedfile;
void Init (TVector3 ref_position, double height_correction);
void Init (TVector3 ref_position, double height_correction, CCharShape *shape);
void InitTest (TVector3 ref_position, CCharShape *shape);
void Reset ();
void Update (double timestep, CControl *ctrl);
void TestUpdate (double timestep);
void Load (string filename);
void UpdateTest (double timestep, CCharShape *shape);
bool Load (string dir, string filename);
void CalcKeyframe (int idx, CCharShape *shape, TVector3 refpos);
// test and editing
TKeyframe2 *GetFrame (int idx);
string GetHighlightName (int idx);
string GetJointName (int idx);
int GetNumJoints ();
void SaveTest (string dir, string filename);
void CopyFrame (int prim_idx, int sec_idx);
void AddFrame ();
int DeleteFrame (int idx);
void InsertFrame (int idx);
void CopyToClipboard (int idx);
void PasteFromClipboard (int idx);
void ClearFrame (int idx);
};
extern CKeyframe TuxStart;
extern CKeyframe TuxLostrace;
extern CKeyframe TuxWonrace;
extern CKeyframe TuxFinish;
extern CKeyframe TuxTest;
extern CKeyframe TestFrame;
#endif

View File

@ -37,19 +37,22 @@ GNU General Public License for more details.
#include "help.h"
#include "tools.h"
#include "tux.h"
#include "regist.h"
#include "keyframe.h"
TGameData g_game;
void InitGame (int argc, char **argv) {
g_game.toolmode = NONE;
g_game.argument = 0;
string group;
if (argc == 3) {
group = argv[1];
if (group == "--char") g_game.argument = 1;
g_game.arg_str = argv[2];
}
if (argc == 4) {
g_game.group_arg = argv[1];
if (g_game.group_arg == "--char") g_game.argument = 1;
g_game.dir_arg = argv[2];
g_game.file_arg = argv[3];
}
g_game.secs_since_start = 0;
g_game.course_id = 0;
@ -89,6 +92,7 @@ int main( int argc, char **argv ) {
// register loop functions
splash_screen_register();
regist_register ();
intro_register();
racing_register();
game_over_register();
@ -119,7 +123,6 @@ int main( int argc, char **argv ) {
switch (g_game.argument) {
case 0: Winsys.SetMode (SPLASH); break;
case 1:
if (TestChar.Load (param.char_dir, g_game.arg_str, true) == false) Winsys.Quit();
g_game.toolmode = TUXSHAPE;
Winsys.SetMode (TOOLS);
break;

View File

@ -20,6 +20,8 @@ GNU General Public License for more details.
#include "tux.h"
#include "audio.h"
#include "particles.h"
#include "game_ctrl.h"
#include "view.h"
CControl::CControl () {}
@ -224,7 +226,6 @@ void CControl::AdjustPosition (TPlane surf_plane, double dist_from_surface) {
}
}
void CControl::SetTuxPosition (double speed) {
CCharShape *shape = Char.GetShape (g_game.char_id);
double playWidth, playLength;
@ -244,6 +245,7 @@ void CControl::SetTuxPosition (double speed) {
if (g_game.use_keyframe) {
g_game.finish = true;
finish_speed = speed;
// SetStationaryCamera (true);
} else Winsys.SetMode (GAME_OVER);
}
/// -----------------------------------------------------------

View File

@ -891,7 +891,8 @@ void quadsquare::Render (const quadcornerdata& cd, GLubyte *vnc_array) {
DrawTris();
}
}
/*
if (param.perf_level > 1) {
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
for (i=0; i<VertexArrayCounter; i++) {
@ -901,6 +902,7 @@ void quadsquare::Render (const quadcornerdata& cd, GLubyte *vnc_array) {
}
DrawEnvmapTris();
}
*/
}
}
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

View File

@ -112,8 +112,8 @@ static void RaceSelectMouseFunc (int button, int state, int x, int y ){
case 3: if (curr_wind < lastWind) curr_wind++; else curr_wind = 0; break;
case 4: if (curr_mirror < lastMirror) curr_mirror++; else curr_mirror = 0; break;
case 5: if (curr_random < lastRandom) curr_random++; else curr_random = 0; break;
case 7: SetRaceConditions (); break;
case 8: Winsys.SetMode (GAME_TYPE_SELECT); break;
case 6: SetRaceConditions (); break;
case 7: Winsys.SetMode (GAME_TYPE_SELECT); break;
}
}
}

View File

@ -315,7 +315,8 @@ void racing_loop (double time_step){
ctrl->UpdatePlayerPos (time_step);
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
update_view (ctrl, time_step);
if (g_game.finish) IncCameraDistance (time_step);
update_view (ctrl, time_step);
UpdateTrackmarks (ctrl);
SetupViewFrustum (ctrl);

171
regist.cpp Normal file
View File

@ -0,0 +1,171 @@
/* --------------------------------------------------------------------
EXTREME TUXRACER
Copyright (C) 1999-2001 Jasmin F. Patry (Tuxracer)
Copyright (C) 2010 Extreme Tuxracer Team
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
---------------------------------------------------------------------*/
#include "regist.h"
#include "ogl.h"
#include "textures.h"
#include "audio.h"
#include "gui.h"
#include "course.h"
#include "tux.h"
#include "env.h"
#include "particles.h"
#include "credits.h"
#include "font.h"
#include "game_ctrl.h"
#include "translation.h"
static TVector2 cursor_pos = {0, 0};
static int curr_focus = 0;
static TCharacter *CharList;
static int curr_character = 0;
static int last_character;
static int xleft, ytop;
void ChangeCharSelectionN (int focus, int dir) {
if (dir == 0) {
switch (focus) {
case 0: if (curr_character > 0) curr_character--; break;
}
} else {
switch (focus) {
case 0: if (curr_character < last_character) curr_character++; break;
}
}
}
void RegistKeys (unsigned int key, bool special, bool release, int x, int y) {
if (release) return;
switch (key) {
case 27: Winsys.Quit (); break;
case 13:
g_game.char_id = curr_character;
Winsys.SetMode (GAME_TYPE_SELECT);
break;
case SDLK_TAB: if (curr_focus < 1) curr_focus++; else curr_focus = 0; break;
case SDLK_DOWN: ChangeCharSelectionN (curr_focus, 1); break;
case SDLK_UP: ChangeCharSelectionN (curr_focus, 0); break;
}
}
void RegistMouseFunc (int button, int state, int x, int y) {
int foc, dir;
if (state == 1) {
GetFocus (x, y, &foc, &dir);
switch (foc) {
case 0: ChangeCharSelectionN (foc, dir); break;
case 1:
g_game.char_id = curr_character;
Winsys.SetMode (GAME_TYPE_SELECT);
break;
case 8: Winsys.SetMode (GAME_TYPE_SELECT); break;
}
}
}
void RegistMotionFunc (int x, int y ){
TVector2 old_pos;
int sc, dir;
if (Winsys.ModePending ()) return;
GetFocus (x, y, &sc, &dir);
if (sc >= 0) curr_focus = sc;
y = param.y_resolution - y;
old_pos = cursor_pos;
cursor_pos = MakeVector2 (x, y);
if (old_pos.x != x || old_pos.y != y) {
if (param.ui_snow) push_ui_snow (cursor_pos);
}
}
void RegistInit (void) {
Winsys.ShowCursor (!param.ice_cursor);
init_ui_snow ();
Music.Play (param.menu_music, -1);
xleft = (param.x_resolution - 500) / 2;
ytop = AutoYPos (230);
ResetWidgets ();
AddArrow (xleft + 470, ytop, 0, 0);
AddArrow (xleft + 470, ytop+18, 1, 0);
AddTextButton ("Enter", -1, ytop + 280, 1, -1);
curr_focus = 0;
g_game.loopdelay = 10;
CharList = Char.CharList;
last_character = Char.numCharacters - 1;
}
void RegistLoop (double timestep ){
int ww = param.x_resolution;
int hh = param.y_resolution;
Music.Update ();
check_gl_error();
ClearRenderContext ();
set_gl_options (GUI);
SetupGuiDisplay ();
TColor col;
update_ui_snow (timestep);
draw_ui_snow();
Tex.Draw (BOTTOM_LEFT, 0, hh - 256, 1);
Tex.Draw (BOTTOM_RIGHT, ww-256, hh-256, 1);
Tex.Draw (TOP_LEFT, 0, 0, 1);
Tex.Draw (TOP_RIGHT, ww-256, 0, 1);
Tex.Draw (T_TITLE_SMALL, -1, 20, 1.0);
if (param.use_papercut_font > 0) FT.SetSize (20); else FT.SetSize (15);
FT.SetColor (colWhite);
FT.DrawString (xleft, ytop-40, "Select your player name:");
FT.DrawString (xleft+260, ytop-40, "Select a character:");
// char selection
if (curr_focus == 0) col = colDYell; else col = colWhite;
DrawFrameX (xleft+260, ytop-4, 200, 44, 3, colMBackgr, col, 1.0);
if (param.use_papercut_font > 0) FT.SetSize (28); else FT.SetSize (22);
FT.SetColor (colDYell);
FT.DrawString (xleft+280, ytop, CharList[curr_character].name);
Tex.DrawDirectFrame (CharList[curr_character].preview, xleft + 300, ytop + 65,
128, 128, 3, colWhite);
// player selection
if (curr_focus == 2) col = colDYell; else col = colWhite;
DrawFrameX (xleft, ytop-4, 200, 44, 3, colMBackgr, col, 1.0);
FT.DrawString (xleft+20, ytop, "Little Bear");
Tex.DrawDirectFrame (Tex.TexID (44), xleft + 30, ytop + 65,
128, 128, 3, colWhite);
FT.SetColor (colWhite);
FT.DrawString (-1, ytop+240, "Register a new player");
PrintArrow (0, (curr_character > 0));
PrintArrow (1, (curr_character < last_character));
PrintTextButton (0, curr_focus);
if (param.ice_cursor) DrawCursor ();
Winsys.SwapBuffers();
}
void RegistTerm () {
}
void regist_register() {
Winsys.SetModeFuncs (REGIST, RegistInit, RegistLoop, RegistTerm,
RegistKeys, RegistMouseFunc, RegistMotionFunc, NULL, NULL);
}

25
regist.h Normal file
View File

@ -0,0 +1,25 @@
/* --------------------------------------------------------------------
EXTREME TUXRACER
Copyright (C) 1999-2001 Jasmin F. Patry (Tuxracer)
Copyright (C) 2010 Extreme Tuxracer Team
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
---------------------------------------------------------------------*/
#ifndef REGIST_H
#define REGIST_H
#include "bh.h"
void regist_register();
#endif

View File

@ -29,175 +29,50 @@ GNU General Public License for more details.
#include "game_ctrl.h"
#include "translation.h"
static TVector2 cursor_pos = {0, 0};
static int pass = 0;
static int curr_focus = 0;
static TCharacter *CharList;
static int curr_character = 0;
static int last_character;
static int xleft, ytop;
void ChangeCharSelection (int focus, int dir) {
if (dir == 0) {
switch (focus) {
case 0: if (curr_character > 0) curr_character--; break;
}
} else {
switch (focus) {
case 0: if (curr_character < last_character) curr_character++; break;
}
}
}
void SplashKeys (unsigned int key, bool special, bool release, int x, int y) {
if (release) return;
switch (key) {
case 27: Winsys.Quit (); break;
case 13:
g_game.char_id = curr_character;
Winsys.SetMode (GAME_TYPE_SELECT);
break;
case SDLK_TAB: if (curr_focus < 1) curr_focus++; else curr_focus = 0; break;
case SDLK_DOWN: ChangeCharSelection (curr_focus, 1); break;
case SDLK_UP: ChangeCharSelection (curr_focus, 0); break;
}
}
void SplashMouseFunc (int button, int state, int x, int y) {
int foc, dir;
if (state == 1) {
GetFocus (x, y, &foc, &dir);
switch (foc) {
case 0: ChangeCharSelection (foc, dir); break;
case 1:
g_game.char_id = curr_character;
Winsys.SetMode (GAME_TYPE_SELECT);
break;
case 8: Winsys.SetMode (GAME_TYPE_SELECT); break;
}
}
}
void SplashMotionFunc (int x, int y ){
TVector2 old_pos;
int sc, dir;
if (Winsys.ModePending ()) return;
GetFocus (x, y, &sc, &dir);
if (sc >= 0) curr_focus = sc;
y = param.y_resolution - y;
old_pos = cursor_pos;
cursor_pos = MakeVector2 (x, y);
if (old_pos.x != x || old_pos.y != y) {
if (param.ui_snow) push_ui_snow (cursor_pos);
}
}
void SplashInit (void) {
Winsys.ShowCursor (!param.ice_cursor);
init_ui_snow ();
Music.Play (param.menu_music, -1);
pass = 0;
xleft = (param.x_resolution - 500) / 2;
ytop = AutoYPos (230);
ResetWidgets ();
AddArrow (xleft + 470, ytop, 0, 0);
AddArrow (xleft + 470, ytop+18, 1, 0);
AddTextButton ("Enter", -1, ytop + 280, 1, -1);
curr_focus = 0;
g_game.loopdelay = 20;
g_game.loopdelay = 10;
}
void SplashLoop (double timestep ){
int ww = param.x_resolution;
int hh = param.y_resolution;
int top;
Music.Update ();
check_gl_error();
ClearRenderContext ();
set_gl_options (GUI);
SetupGuiDisplay ();
TColor col;
if (param.ui_snow && pass > 0) {
update_ui_snow (timestep);
draw_ui_snow();
}
if (pass == 0) {
Tex.Draw (TEXLOGO, -1, 60, 1);
FT.SetColor (colDYell);
FT.SetSize (AutoFtSize ());
top = AutoYPos (350);
FT.DrawText (CENTER, top, "loading resources");
FT.DrawText (CENTER, top + AutoDistance(), "please wait ...");
} else {
Tex.Draw (BOTTOM_LEFT, 0, hh - 256, 1);
Tex.Draw (BOTTOM_RIGHT, ww-256, hh-256, 1);
Tex.Draw (TOP_LEFT, 0, 0, 1);
Tex.Draw (TOP_RIGHT, ww-256, 0, 1);
Tex.Draw (T_TITLE_SMALL, -1, 20, 1.0);
Tex.Draw (TEXLOGO, -1, 60, 1);
FT.SetColor (colDYell);
FT.SetSize (AutoFtSize ());
top = AutoYPos (350);
FT.DrawText (CENTER, top, "Loading resources,");
FT.DrawText (CENTER, top + AutoDistance(), "please wait ...");
if (param.use_papercut_font > 0) FT.SetSize (20); else FT.SetSize (15);
FT.SetColor (colWhite);
FT.DrawString (xleft, ytop-40, "Select your player name:");
FT.DrawString (xleft+260, ytop-40, "Select a character:");
// char selection
if (curr_focus == 0) col = colDYell; else col = colWhite;
DrawFrameX (xleft+260, ytop-4, 200, 44, 3, colMBackgr, col, 1.0);
if (param.use_papercut_font > 0) FT.SetSize (28); else FT.SetSize (22);
FT.SetColor (colDYell);
FT.DrawString (xleft+280, ytop, CharList[curr_character].name);
Tex.DrawDirectFrame (CharList[curr_character].preview, xleft + 300, ytop + 65,
128, 128, 3, colWhite);
// player selection
if (curr_focus == 2) col = colDYell; else col = colWhite;
DrawFrameX (xleft, ytop-4, 200, 44, 3, colMBackgr, col, 1.0);
FT.DrawString (xleft+20, ytop, "Little Bear");
Tex.DrawDirectFrame (Tex.TexID (44), xleft + 30, ytop + 65,
128, 128, 3, colWhite);
FT.SetColor (colWhite);
FT.DrawString (-1, ytop+240, "Register a new player");
PrintArrow (0, (curr_character > 0));
PrintArrow (1, (curr_character < last_character));
PrintTextButton (0, curr_focus);
}
if (param.ice_cursor) DrawCursor ();
Winsys.SwapBuffers();
// =========================== pass 0 =============================
if (pass == 0) {
Trans.LoadLanguages ();
Trans.LoadTranslations (param.language);
LoadCreditList ();
Char.LoadCharacterList ();
Course.LoadObjectTypes ();
Course.LoadTerrainTypes ();
Env.LoadEnvironmentList ();
Course.LoadCourseList ();
Events.LoadEventList ();
Players.LoadParams ();
pass = 1;
Trans.LoadLanguages ();
Trans.LoadTranslations (param.language);
LoadCreditList ();
Char.LoadCharacterList ();
Course.LoadObjectTypes ();
Course.LoadTerrainTypes ();
Env.LoadEnvironmentList ();
Course.LoadCourseList ();
Events.LoadEventList ();
Players.LoadParams ();
CharList = Char.CharList;
last_character = Char.numCharacters - 1;
SDL_Delay (100);
}
SDL_Delay (100);
Winsys.SetMode (REGIST);
}
void SplashTerm () {
@ -205,5 +80,5 @@ void SplashTerm () {
void splash_screen_register() {
Winsys.SetModeFuncs (SPLASH, SplashInit, SplashLoop, SplashTerm,
SplashKeys, SplashMouseFunc, SplashMotionFunc, NULL, NULL);
NULL, NULL, NULL, NULL, NULL);
}

366
tool_char.cpp Normal file
View File

@ -0,0 +1,366 @@
/* --------------------------------------------------------------------
EXTREME TUXRACER
Copyright (C) 1999-2001 Jasmin F. Patry (Tuxracer)
Copyright (C) 2010 Extreme Tuxracer Team
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
---------------------------------------------------------------------*/
#include "tool_char.h"
#include "tools.h"
#include "ogl.h"
#include "keyframe.h"
#include "font.h"
#include "textures.h"
static int firstnode = 0;
static int lastnode;
static int curr_node = 0;
static int firstact = 0;
static int lastact;
static int curr_act = 0;
static float xposition = 0;
static float yposition = 0;
static float zposition = -3;
static float xrotation = 0;
static float yrotation = 0;
static float zrotation = 0;
static int drawcount = 0;
static int charbase = 24;
static bool must_render = true;
static TCharAction *action;
static bool shift = false;
static bool control = false;
static bool alt = false;
static TCharAction Undo;
static int startx, starty;
static double startrotx, startroty, startposx, startposy;
static bool rotactive = false;
static bool moveactive = false;
static int comp = 0;
void InitCharTools () {
charbase = (int)((param.y_resolution - 200) / 18);
firstnode = 1;
lastnode = TestChar.GetNumNodes () -1;
curr_node = firstnode;
curr_act = firstact;
lastact = TestChar.GetNumActs (curr_node) -1;
action = TestChar.GetAction (curr_node);
StoreAction (action);
}
void StoreAction (TCharAction *act) {
int i;
for (i=0; i<=act->num; i++) {
Undo.vec[i] = act->vec[i];
Undo.dval[i] = act->dval[i];
}
}
void RecallAction (TCharAction *act) {
int i;
for (i=0; i<=act->num; i++) {
act->vec[i] = Undo.vec[i];
act->dval[i] = Undo.dval[i];
}
}
void ChangeValue (int type, double fact) {
if (type == 0 || type == 4) {
if (comp == 0) {
action->vec[curr_act].x += 0.02 * fact;
action->vec[curr_act].y += 0.02 * fact;
action->vec[curr_act].z += 0.02 * fact;
} else if (comp == 1) action->vec[curr_act].x += 0.02 * fact;
else if (comp == 2) action->vec[curr_act].y += 0.02 * fact;
else if (comp == 3) action->vec[curr_act].z += 0.02 * fact;
} else if (type > 0 && type < 4) {
action->dval[curr_act] += 1 * fact;
} else if (type == 5) {
action->dval[curr_act] += 1 * fact;
}
TestChar.RefreshNode (curr_node);
SetCharChanged (true);
}
void ChangeNode (int steps) {
bool ch;
if (steps > 0) ch = (curr_node + steps <= lastnode);
else ch = (curr_node + steps >= firstnode);
if (ch) {
curr_node += steps;
curr_act = firstact;
lastact = TestChar.GetNumActs (curr_node) -1;
action = TestChar.GetAction (curr_node);
if (action->num > 0 && action->type[0] == 4) comp = 0; else comp = 1;
StoreAction (action);
}
}
void SetRotation (double x, double y, double z) {
xrotation = x;
yrotation = y;
zrotation = z;
}
void CharKeys (unsigned int key, bool special, bool release, int x, int y) {
int keyfact;
must_render = true;
if (ToolsFinalStage ()) {
if (key == SDLK_y || key == SDLK_j) {
SaveToolCharacter ();
SaveToolFrame ();
Winsys.Quit();
} else if (key == SDLK_n) Winsys.Quit ();
return;
}
if (key == 304) shift = !release;
if (key == 306) control = !release;
if (key == 308) alt = !release;
if (shift) keyfact = -1; else keyfact = 1;
if (release) return;
int type = action->type[curr_act];
switch (key) {
case SDLK_TAB: SetToolMode (1); break;
case SDLK_ESCAPE: case SDLK_q: QuitTool (); break;
case SDLK_s: SaveToolCharacter (); break;
case SDLK_c: ScreenshotN (); break;
case SDLK_m: TestChar.useMaterials = !TestChar.useMaterials; break;
case SDLK_h: TestChar.useHighlighting = !TestChar.useHighlighting; break;
case SDLK_r:
TestChar.Reset ();
ReloadToolCharacter ();
ToolsInit ();
break;
case SDLK_u: if (action != NULL) {
RecallAction (action);
TestChar.RefreshNode (curr_node);
} break;
case SDLK_PLUS: case SDLK_EQUALS: // zoom in
zposition += 0.1;
xposition -= 0.03;
break;
case SDLK_MINUS: // zoom out
zposition -= 0.1;
xposition += 0.03;
break;
// set rotations for view
case SDLK_1: SetRotation (0, 0, 0); break;
case SDLK_2: SetRotation (-50, 180, 15); break;
case SDLK_3: SetRotation (0, 180, 0); break;
case SDLK_4: SetRotation (0, -80, 0); break;
// select node
case SDLK_PAGEUP: ChangeNode (-1); break;
case SDLK_PAGEDOWN: ChangeNode (1); break;
case SDLK_END: ChangeNode (charbase); break;
case SDLK_HOME: ChangeNode (-charbase); break;
// select action
case SDLK_DOWN:
if (curr_act < lastact) curr_act++;
if (action->type[curr_act] == 4) comp = 0; else comp = 1;
break;
case SDLK_UP:
if (curr_act > 0) curr_act--;
if (action->type[curr_act] == 4) comp = 0; else comp = 1;
break;
case SDLK_LEFT: ChangeValue (type, -1); break;
case SDLK_RIGHT: ChangeValue (type, 1); break;
// select value
case SDLK_SPACE:
if (type == 0 || type == 4) {
comp++;
if (comp > 3) comp = 0;
if (type == 0 && comp == 0) comp = 1;
} break;
default: break;
}
}
void CharMouse (int button, int state, int x, int y) {
must_render = true;
if (ToolsFinalStage ()) return;
if (state<1) {
rotactive = false;
moveactive = false;
return;
}
if (button == 1) {
startx = x;
starty = y;
startrotx = xrotation;
startroty = yrotation;
rotactive = true;
} else if (button == 3) {
startx = x;
starty = y;
startposx = xposition;
startposy = yposition;
moveactive = true;
} else if (button == 4) {
zposition -= 0.1;
xposition += 0.03;
} else if (button == 5) {
zposition += 0.1;
xposition -= 0.03;
}
}
void CharMotion (int x, int y) {
int diffx, diffy;
float diffposx, diffposy;
must_render = true;
if (rotactive) {
diffx = x - startx;
diffy = y - starty;
yrotation = startroty + diffx;
xrotation = startrotx + diffy;
}
if (moveactive) {
diffposx = (double)(x - startx) / 200;
diffposy = (double)(y - starty) / 200;
yposition = startposy - diffposy;
xposition = startposx + diffposx;
}
}
void DrawActionVec (int nr, string s, int y, TVector3 v) {
FT.SetColor (colLGrey);
FT.DrawString (20, y, s);
if (nr == curr_act) {
if (comp == 0) {
FT.SetColor (colYellow);
FT.DrawString (100, y, Float_StrN (v.x, 2));
FT.DrawString (150, y, Float_StrN (v.y, 2));
FT.DrawString (200, y, Float_StrN (v.z, 2));
} else {
if (comp == 1) FT.SetColor (colYellow); else FT.SetColor (colLGrey);
FT.DrawString (100, y, Float_StrN (v.x, 2));
if (comp == 2) FT.SetColor (colYellow); else FT.SetColor (colLGrey);
FT.DrawString (150, y, Float_StrN (v.y, 2));
if (comp == 3) FT.SetColor (colYellow); else FT.SetColor (colLGrey);
FT.DrawString (200, y, Float_StrN (v.z, 2));
}
} else {
FT.DrawString (100, y, Float_StrN (v.x, 2));
FT.DrawString (150, y, Float_StrN (v.y, 2));
FT.DrawString (200, y, Float_StrN (v.z, 2));
}
}
void DrawActionFloat (int nr, string s, int y, float f) {
FT.SetColor (colLGrey);
FT.DrawString (20, y, s);
if (nr == curr_act) FT.SetColor (colYellow); else FT.SetColor (colLGrey);
FT.DrawString (100, y, Float_StrN (f, 2));
}
void RenderChar (double timestep) {
if (!must_render) return;
bool is_visible = false;
check_gl_error();
// ------------- 3d scenery ---------------------------------------
set_gl_options (TUX);
ClearRenderContext (colDDBackgr);
TestChar.highlight_node = TestChar.GetNodeName (curr_node);
glLoadIdentity ();
glPushMatrix ();
SetToolLight ();
TestChar.ResetRoot ();
TestChar.ResetJoints ();
glTranslatef (xposition, yposition, zposition);
glRotatef (xrotation, 1, 0, 0);
glRotatef (yrotation, 0, 1, 0);
glRotatef (zrotation, 0, 0, 1);
if (drawcount > 0) TestChar.Draw ();
glPopMatrix ();
drawcount++;
// --------------- 2d screen --------------------------------------
SetupGuiDisplay ();
set_gl_options (TEXFONT);
FT.SetFont ("bold");
FT.SetSize (20);
FT.SetColor (colYellow);
FT.DrawString (-1, 10, "Edit mode");
if (CharHasChanged ()) DrawChanged ();
FT.SetFont ("normal");
FT.SetSize (16);
int xl, yt;
for (int i=0; i<=lastnode; i++) {
if (i != curr_node) {
FT.SetColor (colLGrey);
FT.SetFont ("normal");
} else {
FT.SetColor (colYellow);
FT.SetFont ("bold");
}
xl = ITrunc (i, charbase) * 100 + 20;
yt = IFrac (i, charbase) * 18 + 60;
FT.DrawString (xl, yt, TestChar.GetNodeJoint (i));
}
int num = action->num;
int type;
if (num > 0) {
for (int i=0; i<num; i++) {
is_visible = false;
type = action->type[i];
yt = param.y_resolution - 120 + i * 18;
switch (type) {
case 0: DrawActionVec (i, "trans", yt, action->vec[i]); break;
case 1: DrawActionFloat (i, "x-rot", yt, action->dval[i]); break;
case 2: DrawActionFloat (i, "y-rot", yt, action->dval[i]); break;
case 3: DrawActionFloat (i, "z-rot", yt, action->dval[i]); break;
case 4: DrawActionVec (i, "scale", yt, action->vec[i]); break;
case 5: DrawActionFloat (i, "vis", yt, action->dval[i]);
is_visible = true; break;
default: break;
}
}
}
if (is_visible) FT.SetColor (colYellow); else FT.SetColor (colLGrey);
FT.DrawString (20, 20, action->name);
if (ToolsFinalStage ()) {
FT.SetSize (20);
FT.SetColor (colYellow);
FT.DrawString (-1, param.y_resolution - 50, "Quit program. Save character list (y/n)");
}
Reshape (param.x_resolution, param.y_resolution);
Winsys.SwapBuffers ();
if (drawcount > 3) must_render = false;
}

33
tool_char.h Normal file
View File

@ -0,0 +1,33 @@
/* --------------------------------------------------------------------
EXTREME TUXRACER
Copyright (C) 1999-2001 Jasmin F. Patry (Tuxracer)
Copyright (C) 2010 Extreme Tuxracer Team
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
---------------------------------------------------------------------*/
#ifndef TOOL_CHAR_H
#define TOOL_CHAR_H
#include "bh.h"
#include "tux.h"
void InitCharTools ();
void CharKeys (unsigned int key, bool special, bool release, int x, int y);
void CharMouse (int button, int state, int x, int y);
void CharMotion (int x, int y);
void RenderChar (double timestep);
void StoreAction (TCharAction *act);
#endif

277
tool_frame.cpp Normal file
View File

@ -0,0 +1,277 @@
/* --------------------------------------------------------------------
EXTREME TUXRACER
Copyright (C) 1999-2001 Jasmin F. Patry (Tuxracer)
Copyright (C) 2010 Extreme Tuxracer Team
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
---------------------------------------------------------------------*/
#include "tool_frame.h"
#include "tools.h"
#include "ogl.h"
#include "keyframe.h"
#include "font.h"
static int curr_frame = 0;
static int curr_joint = 0;
static int last_joint = 0;
static TVector3 ref_position = MakeVector (0, 0, 0);
static bool must_render = true;
static int framebase = 24;
static int jointbase = 16;
static bool shift = false;
static bool control = false;
static bool alt = false;
static bool lastframe = 0;
static bool keyrun = false;
void InitFrameTools () {
framebase = (int)((param.y_resolution - 350) / 18);
if (TestFrame.numFrames < 1) TestFrame.AddFrame ();
curr_joint = 0;
last_joint = TestFrame.GetNumJoints () -1;
}
void SingleFrameKeys (unsigned int key, bool special, bool release, int x, int y) {
//PrintInt (key);
must_render = true;
int keyfact;
lastframe = TestFrame.numFrames - 1;
TKeyframe2 *frame = TestFrame.GetFrame (curr_frame);
// setting the camera change state
if (key == SDLK_F1) {GluCamera.turnright = !release; return;}
else if (key == SDLK_F2) {GluCamera.turnleft = !release; return;}
if (key == SDLK_F3) {GluCamera.nearer = !release; return;}
else if (key == SDLK_F4) {GluCamera.farther = !release; return;}
// additional keys if needed
if (key == 304) shift = !release;
if (key == 306) control = !release;
if (key == 308) alt = !release;
if (shift) keyfact = -1; else keyfact = 1;
if (release) return;
switch (key) {
case SDLK_y: case SDLK_j:
if (ToolsFinalStage ()) {
SaveToolCharacter ();
SaveToolFrame ();
Winsys.Quit();
} break;
case SDLK_n: if (ToolsFinalStage ()) Winsys.Quit (); break;
case 27: case SDLK_q: QuitTool (); break;
case SDLK_s: SaveToolFrame (); break;
case SDLK_TAB: SetToolMode (0); break;
case SDLK_a:
TestFrame.AddFrame ();
SetFrameChanged (true);
break;
case 277:
TestFrame.InsertFrame (curr_frame);
SetFrameChanged (true);
break;
case 127:
curr_frame = TestFrame.DeleteFrame (curr_frame);
SetFrameChanged (true);
break;
case SDLK_PAGEDOWN: if (curr_frame < TestFrame.numFrames-1) curr_frame++; break;
case SDLK_PAGEUP: if (curr_frame > 0) curr_frame--; break;
case SDLK_UP: if (curr_joint > 0) curr_joint--; break;
case SDLK_DOWN: if (curr_joint < last_joint) curr_joint++; break;
case SDLK_RIGHT:
if (curr_joint < 4) frame->val[curr_joint] += 0.05;
else frame->val[curr_joint] += 1;
SetFrameChanged (true);
break;
case SDLK_LEFT:
if (curr_joint < 4) frame->val[curr_joint] -= 0.05;
else frame->val[curr_joint] -= 1;
SetFrameChanged (true);
break;
case SDLK_0:
frame->val[curr_joint] = 0.0;
SetFrameChanged (true);
break;
case 32:
if (curr_joint < 4) frame->val[curr_joint] += 0.05 * keyfact;
else frame->val[curr_joint] += 1 * keyfact;
SetFrameChanged (true);
break;
case 13:
TestFrame.InitTest (ref_position, &TestChar);
SetToolMode (2);
must_render = true;
break;
case SDLK_m: TestChar.useMaterials = !TestChar.useMaterials; break;
case SDLK_h: TestChar.useHighlighting = !TestChar.useHighlighting; break;
case SDLK_c:
if (control) TestFrame.CopyToClipboard (curr_frame);
else TestFrame.ClearFrame (curr_frame);
SetFrameChanged (true);
break;
case SDLK_v:
if (control) TestFrame.PasteFromClipboard (curr_frame);
SetFrameChanged (true);
break;
case SDLK_p: if (curr_frame>0)
TestFrame.CopyFrame (curr_frame-1, curr_frame); break;
case SDLK_1: GluCamera.angle = 0; break;
case SDLK_2: GluCamera.angle = 45; break;
case SDLK_3: GluCamera.angle = 90; break;
case SDLK_4: GluCamera.angle = 135; break;
case SDLK_5: GluCamera.angle = 180; break;
case SDLK_6: GluCamera.angle = 225; break;
case SDLK_7: GluCamera.angle = 270; break;
case SDLK_8: GluCamera.angle = 315; break;
}
}
void SingleFrameMouse (int button, int state, int x, int y) {
must_render = true;
if (ToolsFinalStage ()) return;
if (button == 4) {
GluCamera.distance += 0.1;
} else if (button == 5) {
GluCamera.distance -= 0.1;
}
}
void SingleFrameMotion (int x, int y) {
}
void PrintFrameParams (int ytop, TKeyframe2 *frame) {
int y, x;
int offs = 18;
for (int i=0; i<=last_joint; i++) {
if (i == curr_joint) FT.SetColor (colYellow);
else FT.SetColor (colLGrey);
x = ITrunc (i, jointbase) * 140 + 20;
y = IFrac (i, jointbase) * offs + ytop;
FT.DrawString (x, y, TestFrame.GetJointName(i));
if (i < 4) FT.DrawString (x+80, y, Float_StrN (frame->val[i], 2));
else FT.DrawString (x+80, y, Float_StrN (frame->val[i], 0));
}
}
void RenderSingleFrame (double timestep) {
if (!must_render) return;
check_gl_error ();
// ------------------ 3d scenery ----------------------------------
set_gl_options (TUX);
ClearRenderContext (colDDBackgr);
string hlname = TestFrame.GetHighlightName (curr_joint);
TestChar.highlight_node = TestChar.GetNodeName (hlname);
glPushMatrix ();
SetToolLight ();
GluCamera.Update (timestep);
TestFrame.CalcKeyframe (curr_frame, &TestChar, ref_position);
TestChar.Draw ();
glPopMatrix ();
// ----------------- 2d screen ------------------------------------
SetupGuiDisplay ();
set_gl_options (TEXFONT);
if (FrameHasChanged ()) DrawChanged ();
FT.SetFont ("bold");
FT.SetSize (20);
FT.SetColor (colYellow);
FT.DrawString (-1, 10, "Keyframe mode");
FT.SetFont ("normal");
FT.SetSize (16);
int xl, yt;
for (int i=0; i<TestFrame.numFrames; i++) {
if (i != curr_frame) {
FT.SetColor (colLGrey);
FT.SetFont ("normal");
} else {
FT.SetColor (colYellow);
FT.SetFont ("bold");
}
xl = ITrunc (i, framebase) * 100 + 20;
yt = IFrac (i, framebase) * 18 + 20;
FT.DrawString (xl, yt, Int_StrN (i));
}
FT.SetFont ("normal");
FT.SetColor (colLGrey);
PrintFrameParams (param.y_resolution - 330, TestFrame.GetFrame (curr_frame));
if (ToolsFinalStage ()) {
FT.SetSize (20);
FT.SetColor (colYellow);
FT.DrawString (-1, param.y_resolution - 50, "Quit program. Save character list (y/n)");
}
Reshape (param.x_resolution, param.y_resolution);
Winsys.SwapBuffers();
must_render = false;
}
// --------------------------------------------------------------------
// frame sequence
// --------------------------------------------------------------------
void SequenceKeys (unsigned int key, bool special, bool release, int x, int y) {
if (release) return;
switch (key) {
case 13: keyrun = true; break;
case 27: case SDLK_TAB: SetToolMode (1); break;
case SDLK_q: QuitTool (); break;
}
}
void SequenceMouse (int button, int state, int x, int y) {}
void SequenceMotion (int x, int y) {}
void RenderSequence (double timestep) {
check_gl_error();
set_gl_options (TUX);
ClearRenderContext (colDDBackgr);
GluCamera.Update (timestep);
if (TestFrame.active) TestFrame.UpdateTest (timestep, &TestChar);
else if (keyrun) {
TestFrame.InitTest (NullVec, &TestChar);
keyrun = false;
}
glPushMatrix ();
TestChar.Draw ();
glPopMatrix ();
Reshape (param.x_resolution, param.y_resolution);
Winsys.SwapBuffers();
}

40
tool_frame.h Normal file
View File

@ -0,0 +1,40 @@
/* --------------------------------------------------------------------
EXTREME TUXRACER
Copyright (C) 1999-2001 Jasmin F. Patry (Tuxracer)
Copyright (C) 2010 Extreme Tuxracer Team
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
---------------------------------------------------------------------*/
#ifndef TOOL_FRAME_H
#define TOOL_FRAME_H
#include "bh.h"
void InitFrameTools ();
void SingleFrameKeys (unsigned int key, bool special, bool release, int x, int y);
void SingleFrameMouse (int button, int state, int x, int y);
void SingleFrameMotion (int x, int y);
void RenderSingleFrame (double timestep);
// --------------------------------------------------------------------
// frame sequence
// --------------------------------------------------------------------
void SequenceKeys (unsigned int key, bool special, bool release, int x, int y);
void SequenceMouse (int button, int state, int x, int y);
void SequenceMotion (int x, int y);
void RenderSequence (double timestep);
#endif

507
tools.cpp
View File

@ -18,39 +18,107 @@ GNU General Public License for more details.
#include "tools.h"
#include "tux.h"
#include "ogl.h"
#include "env.h"
#include "font.h"
#include "textures.h"
#include "keyframe.h"
#include "tool_frame.h"
#include "tool_char.h"
static float xposition = 1;
static float yposition = 0;
static float zposition = -2.0;
static float xrotation = 0;
static float yrotation = 0;
static float zrotation = 0;
CGluCamera GluCamera;
CCamera::CCamera () {
xview = 0;
yview = 0;
zview = 4;
vhead = 0;
vpitch = 0;
fore = false;
back = false;
left = false;
right = false;
up = false;
down = false;
headleft = false;
headright = false;
pitchup = false;
pitchdown = false;
}
void CCamera::XMove (GLfloat step) {
zview += (float)sin(-vhead * 3.14 / 180 ) * step;
xview += (float)cos(-vhead * 3.14 / 180 ) * step;
}
void CCamera::YMove (GLfloat step) {
yview += step;
}
void CCamera::ZMove (GLfloat step) {
xview += (float)sin (vhead * 3.14 / 180 ) * step;
zview += (float)cos (vhead * 3.14 / 180 ) * step;
}
void CCamera::RotateHead (GLfloat step) {
vhead += step;
}
void CCamera::RotatePitch (GLfloat step) {
vpitch += step;
}
void CCamera::Update (float timestep) {
if (fore) ZMove (-2 * timestep);
if (back) ZMove (2 * timestep);
if (left) XMove (-1 * timestep);
if (right) XMove (1 * timestep);
if (up) YMove (1 * timestep);
if (down) YMove (-1 * timestep);
if (headleft) RotateHead (5 * timestep);
if (headright) RotateHead (-5 * timestep);
if (pitchup) RotatePitch (-2 * timestep);
if (pitchdown) RotatePitch (2 * timestep);
glLoadIdentity ();
glRotatef (-vpitch, 1.0, 0.0 , 0.0);
glRotatef (-vhead, 0.0, 1.0 , 0.0);
glTranslatef (-xview, -yview, -zview);
}
CGluCamera::CGluCamera () {
angle = 0.0;
distance = 3.0;
}
void CGluCamera::Update (double timestep) {
if (turnright) angle += timestep * 2000;
if (turnleft) angle -= timestep * 2000;
if (nearer) distance -= timestep * 100;
if (farther) distance += timestep * 100;
double xx = distance * sin (angle * M_PI / 180);
double zz = distance * sin ((90 - angle) * M_PI / 180);
glLoadIdentity ();
gluLookAt (xx, 0, zz, 0, 0, 0, 0, 1, 0);
}
// --------------------------------------------------------------------
// tools
// --------------------------------------------------------------------
static bool shift;
static int base = 24;
static bool finalstage = false;
static bool charchanged = false;
static bool must_render = true;
static bool framechanged = false;
static string char_dir;
static string char_file;
static string frame_file;
static float tdef_amb[] = {0.45, 0.53, 0.75, 1.0};
static float tdef_diff[] = {1.0, 0.9, 1.0, 1.0};
static float tdef_spec[] = {0.6, 0.6, 0.6, 1.0};
static float tdef_pos[] = {1, 2, 2, 0.0};
static TLight toollight;
static int firstnode = 0;
static int lastnode;
static int curr_node = 0;
static int firstact = 0;
static int lastact;
static int curr_act = 0;
static TCharAction *action;
void ToolsInit (void);
static int tool_mode = 0;
void DrawQuad (float x, float y, float w, float h,
float scrheight, TColor col, int frame) {
@ -65,6 +133,14 @@ void DrawQuad (float x, float y, float w, float h,
glEnable (GL_TEXTURE_2D);
}
void DrawChanged () {
DrawQuad (param.x_resolution - 120, 10, 100, 22, param.y_resolution, colRed, 0);
FT.SetFont ("normal");
FT.SetSize (18);
FT.SetColor (colBlack);
FT.DrawString (param.x_resolution - 110, 8, "changed");
}
void InitToolLight () {
toollight.is_on = true;
for (int i=0; i<4; i++) {
@ -84,350 +160,107 @@ void SetToolLight () {
glEnable (GL_LIGHTING);
}
static int drawcount = 0;
void TuxshapeMonitor () {
glPushMatrix ();
SetToolLight ();
glTranslatef (xposition, yposition, zposition);
glRotatef (xrotation, 1, 0, 0);
glRotatef (yrotation, 0, 1, 0);
glRotatef (zrotation, 0, 0, 1);
// ResetTuxRoot2 ();
// ResetTuxJoints2 ();
if (drawcount > 0) TestChar.Draw ();
glPopMatrix ();
drawcount++;
if (drawcount > 3) must_render = false;
g_game.loopdelay = 10;
}
static TCharAction Undo;
void StoreAction (TCharAction *act) {
int i;
for (i=0; i<=act->num; i++) {
Undo.vec[i] = act->vec[i];
Undo.dval[i] = act->dval[i];
}
}
void RecallAction (TCharAction *act) {
int i;
for (i=0; i<=act->num; i++) {
act->vec[i] = Undo.vec[i];
act->dval[i] = Undo.dval[i];
}
}
void QuitTool () {
if (!charchanged) Winsys.Quit ();
if (!charchanged && !framechanged) Winsys.Quit ();
else finalstage = true;
}
void ToolsKeys (unsigned int key, bool special, bool release, int x, int y) {
int keyfact;
must_render = true;
if (finalstage) {
if (key == SDLK_y || key == SDLK_j) {
TestChar.SaveCharNodes (g_game.arg_str);
Winsys.Quit();
} else if (key == SDLK_n) Winsys.Quit ();
} else {
if (key == 304) shift = !release;
if (shift) keyfact = -1; else keyfact = 1;
if (release) return;
int type = action->type[curr_act];
switch (key) {
case 27: case SDLK_q: QuitTool (); break;
case SDLK_n: TestChar.PrintNode(curr_node); break;
case SDLK_9: TestChar.PrintAction(curr_node); break;
case SDLK_s: TestChar.SaveCharNodes (g_game.arg_str); charchanged = false; break;
case SDLK_c: ScreenshotN (); break;
case SDLK_m: TestChar.useMaterials = !TestChar.useMaterials; break;
case SDLK_h: TestChar.useHighlighting = !TestChar.useHighlighting; break;
case SDLK_8: TestChar.PrintNode (6); break;
case SDLK_r:
TestChar.Reset ();
TestChar.Load (param.char_dir, g_game.arg_str, true);
ToolsInit ();
break;
case SDLK_1:
xrotation = 0;
yrotation = 0;
zrotation = 0;
break;
case SDLK_2:
xrotation = -50;
yrotation = 180;
zrotation = 15;
break;
case SDLK_3:
xrotation = 0;
yrotation = 180;
zrotation = 0;
break;
case SDLK_4:
xrotation = 0;
yrotation = -80;
zrotation = 0;
break;
case SDLK_u: if (action != NULL) {
RecallAction (action);
TestChar.RefreshNode (curr_node);
} break;
case SDLK_UP:
if (curr_node > firstnode) {
curr_node--;
curr_act = firstact;
lastact = TestChar.GetNumActs (curr_node) -1;
action = TestChar.GetAction (curr_node);
StoreAction (action);
}
break;
case SDLK_DOWN:
if (curr_node < lastnode) {
curr_node++;
curr_act = firstact;
lastact = TestChar.GetNumActs (curr_node) -1;
action = TestChar.GetAction (curr_node);
StoreAction (action);
}
break;
case SDLK_RIGHT:
if (curr_node + base <= lastnode) {
curr_node += base;
curr_act = firstact;
lastact = TestChar.GetNumActs (curr_node) -1;
action = TestChar.GetAction (curr_node);
StoreAction (action);
}
break;
case SDLK_LEFT:
if (curr_node - base >= 0) {
curr_node -= base;
curr_act = firstact;
lastact = TestChar.GetNumActs (curr_node) -1;
action = TestChar.GetAction (curr_node);
StoreAction (action);
}
break;
case SDLK_PAGEDOWN: if (curr_act < lastact) curr_act++; break;
case SDLK_PAGEUP: if (curr_act > 0) curr_act--; break;
case 257: case SDLK_x:
if (type == 0 || type == 4) {
action->vec[curr_act].x += (0.02 * keyfact);
TestChar.RefreshNode (curr_node);
charchanged = true;
} else if (type > 0 && type < 4) {
action->dval[curr_act] += (1 * keyfact);
TestChar.RefreshNode (curr_node);
charchanged = true;
} else if (type == 5) {
action->dval[curr_act] += (1 * keyfact);
TestChar.RefreshNode (curr_node);
charchanged = true;
}
break;
case 258: case SDLK_y:
if (type == 0 || type == 4) {
action->vec[curr_act].y += (0.02 * keyfact);
TestChar.RefreshNode (curr_node);
charchanged = true;
}
break;
case 259: case SDLK_z:
if (type == 0 || type == 4) {
action->vec[curr_act].z += (0.02 * keyfact);
TestChar.RefreshNode (curr_node);
charchanged = true;
}
break;
case SDLK_a:
if (type == 4) {
action->vec[curr_act].x += (0.02 * keyfact);
action->vec[curr_act].y += (0.02 * keyfact);
action->vec[curr_act].z += (0.02 * keyfact);
TestChar.RefreshNode (curr_node);
charchanged = true;
}
break;
case SDLK_PLUS: // zoom in
zposition += 0.1;
xposition -= 0.03;
break;
case SDLK_EQUALS: // zoom in (for qwerty)
zposition += 0.1;
xposition -= 0.03;
break;
case SDLK_MINUS: // zoom out
zposition -= 0.1;
xposition += 0.03;
break;
}
void SetToolMode (int newmode) {
if (newmode == tool_mode) return;
if (newmode > 2) tool_mode = 0; else tool_mode = newmode;
switch (tool_mode) {
case 0: break;
case 1: break;
case 2: break;
}
}
static int startx, starty;
static double startrotx, startroty, startposx, startposy;
static bool rotactive = false;
static bool moveactive = false;
bool CharHasChanged () {return charchanged;}
bool FrameHasChanged () {return framechanged;}
static void ToolsMouse (int button, int state, int x, int y) {
must_render = true;
if (!finalstage) {
if (button == 1) {
if (state < 1) {
rotactive = false;
return;
}
startx = x;
starty = y;
startrotx = xrotation;
startroty = yrotation;
rotactive = true;
} else if (button == 3) {
if (state < 1) {
moveactive = false;
return;
}
startx = x;
starty = y;
startposx = xposition;
startposy = yposition;
moveactive = true;
} else if (button == 4) {
if (state==1) {
zposition -= 0.1;
xposition += 0.03;
}
} else if (button == 5) {
if (state==1) {
zposition += 0.1;
xposition -= 0.03;
}
}
}
bool ToolsFinalStage () {
return finalstage;
}
static void ToolsMotion (int x, int y) {
int diffx, diffy;
float diffposx, diffposy;
must_render = true;
if (rotactive) {
diffx = x - startx;
diffy = y - starty;
yrotation = startroty + diffx;
xrotation = startrotx + diffy;
}
if (moveactive) {
diffposx = (double)(x - startx) / 200;
diffposy = (double)(y - starty) / 200;
yposition = startposy - diffposy;
xposition = startposx + diffposx;
}
void SetCharChanged (bool val) {
charchanged = val;
}
void DrawActionVec (string s, int y, TVector3 v) {
FT.DrawString (20, y, s);
FT.DrawString (100, y, Float_StrN (v.x, 2));
FT.DrawString (150, y, Float_StrN (v.y, 2));
FT.DrawString (200, y, Float_StrN (v.z, 2));
void SetFrameChanged (bool val) {
framechanged = val;
}
void DrawActionFloat (string s, int y, float f) {
FT.DrawString (20, y, s);
FT.DrawString (100, y, Float_StrN (f, 2));
void SaveToolCharacter () {
if (!charchanged) return;
TestChar.SaveCharNodes (char_dir, char_file);
charchanged = false;
}
// --------------------------------------------------------------------
void ReloadToolCharacter () {
TestChar.Load (char_dir, char_file, true);
charchanged = false;
}
void SaveToolFrame () {
if (!framechanged) return;
TestFrame.SaveTest (char_dir, frame_file);
framechanged = false;
}
void ToolsInit (void) {
base = (int)((param.y_resolution - 200) / 18);
Winsys.KeyRepeat (true);
char_dir = param.char_dir + SEP + g_game.dir_arg;
char_file = "shape.lst";
frame_file = g_game.file_arg;
if (TestChar.Load (char_dir, char_file, true) == false) {
Message ("could not load 'shape.lst'");
Winsys.Quit();
}
if (TestFrame.Load (char_dir, frame_file) == false) {
Message ("could not load 'frame.lst'");
Winsys.Quit();
}
charchanged = false;
framechanged = false;
InitToolLight ();
firstnode = 1;
lastnode = TestChar.GetNumNodes () -1;
curr_node = firstnode;
curr_act = firstact;
lastact = TestChar.GetNumActs (curr_node) -1;
action = TestChar.GetAction (curr_node);
StoreAction (action);
InitCharTools ();
InitFrameTools ();
Winsys.KeyRepeat (true);
g_game.loopdelay = 1;
}
void RenderTools () {
bool is_visible = false;
check_gl_error();
set_gl_options (TUX);
ClearRenderContext (colDDBackgr);
TestChar.highlight_node = TestChar.GetNodeName (curr_node);
TuxshapeMonitor ();
SetupGuiDisplay ();
set_gl_options (TEXFONT);
FT.SetFont ("normal");
FT.SetSize (16);
int xl, yt;
for (int i=0; i<=lastnode; i++) {
if (i != curr_node) {
FT.SetColor (colLGrey);
FT.SetFont ("normal");
} else {
FT.SetColor (colYellow);
FT.SetFont ("bold");
void ToolsKeys (unsigned int key, bool special, bool release, int x, int y) {
switch (tool_mode) {
case 0: CharKeys (key, special, release, x, y); break;
case 1: SingleFrameKeys (key, special, release, x, y); break;
case 2: SequenceKeys (key, special, release, x, y); break;
}
xl = ITrunc (i, base) * 100 + 20;
yt = IFrac (i, base) * 18 + 60;
FT.DrawString (xl, yt, TestChar.GetNodeJoint (i));
}
void ToolsMouse (int button, int state, int x, int y) {
switch (tool_mode) {
case 0: CharMouse (button, state, x, y); break;
case 1: SingleFrameMouse (button, state, x, y); break;
case 2: SequenceMouse (button, state, x, y); break;
}
}
int num = action->num;
int type;
if (num > 0) {
for (int i=0; i<num; i++) {
is_visible = false;
if (i == curr_act) FT.SetColor (colYellow);
else FT.SetColor (colLGrey);
type = action->type[i];
yt = param.y_resolution - 120 + i * 18;
switch (type) {
case 0: DrawActionVec ("trans", yt, action->vec[i]); break;
case 1: DrawActionFloat ("x-rot", yt, action->dval[i]); break;
case 2: DrawActionFloat ("y-rot", yt, action->dval[i]); break;
case 3: DrawActionFloat ("z-rot", yt, action->dval[i]); break;
case 4: DrawActionVec ("scale", yt, action->vec[i]); break;
case 5: DrawActionFloat ("vis", yt, action->dval[i]);
is_visible = true;
break;
default: break;
}
}
void ToolsMotion (int x, int y) {
switch (tool_mode) {
case 0: CharMotion (x, y); break;
case 1: SingleFrameMotion (x, y); break;
case 2: SequenceMotion (x, y); break;
}
if (is_visible) FT.SetColor (colYellow); else FT.SetColor (colLGrey);
FT.DrawString (20, 20, action->name);
if (finalstage) {
FT.SetSize (20);
FT.SetColor (colYellow);
FT.DrawString (-1, param.y_resolution - 50, "Quit program. Save character list (y/n)");
}
Reshape (param.x_resolution, param.y_resolution);
Winsys.SwapBuffers();
}
void ToolsLoop (double timestep) {
if (must_render) RenderTools ();
switch (tool_mode) {
case 0: RenderChar (timestep); break;
case 1: RenderSingleFrame (timestep); break;
case 2: RenderSequence (timestep); break;
}
}
void ToolsTerm () {}

68
tools.h
View File

@ -19,6 +19,74 @@ GNU General Public License for more details.
#define TOOLS_H_
#include "bh.h"
#include "env.h"
class CCamera {
private:
GLfloat xview; // x-Position der Kamera
GLfloat yview; // Y-Position der Kamera
GLfloat zview; // z-Position der Kamera
GLfloat vhead; // heading - Rundumsicht
GLfloat vpitch; // pitch - Drehung nach oben/unten
void XMove (GLfloat step);
void YMove (GLfloat step);
void ZMove (GLfloat step);
void RotateHead (GLfloat step);
void RotatePitch (GLfloat step);
public:
CCamera ();
bool fore;
bool back;
bool left;
bool right;
bool up;
bool down;
bool headleft;
bool headright;
bool pitchup;
bool pitchdown;
void Update (float timestep);
};
// ---------------------------------------------------------------
// CGluCamera works with gluLookAt but is reduced to a simple
// go-around-camera that ist strictly focused on an object in
// identity position (0,0,0).
class CGluCamera {
private:
public:
CGluCamera ();
double distance;
double angle;
void Update (double timestep);
bool turnright;
bool turnleft;
bool nearer;
bool farther;
};
extern CGluCamera GluCamera;
// --------------------------------------------------------------------
void ToolsInit (void);
void SetToolLight ();
void QuitTool ();
void SetToolMode (int newmode);
bool ToolsFinalStage ();
void SetCharChanged (bool val);
void SetFrameChanged (bool val);
bool CharHasChanged ();
bool FrameHasChanged ();
void SaveToolCharacter ();
void SaveToolFrame ();
void ReloadToolCharacter ();
void DrawChanged ();
void RegisterToolFuncs ();

82
tux.cpp
View File

@ -146,7 +146,7 @@ bool CCharShape::CreateCharNode
MakeIdentityMatrix (node->trans);
MakeIdentityMatrix (node->invtrans);
SPAddIntN (NodeIndex, joint, node_name);
if (joint.size() > 0) SPAddIntN (NodeIndex, joint, node_name);
Nodes[numNodes] = node;
Index[node_name] = numNodes;
@ -867,6 +867,13 @@ int CCharShape::GetNodeName (int idx) {
return Nodes[idx]->node_name;
}
int CCharShape::GetNodeName (string node_trivialname) {
int node_name = SPIntN (NodeIndex, node_trivialname, -1);
// if (node_name < 0) return false;
return node_name;
}
void CCharShape::RefreshNode (int idx) {
if (idx < 0 || idx >= numNodes) return;
TMatrix TempMatrix;
@ -981,7 +988,7 @@ void CCharShape::PrintNode (int idx) {
PrintInt ("next: ", node->next_name);
}
void CCharShape::SaveCharNodes (string filename) {
void CCharShape::SaveCharNodes (string dir, string filename) {
CSPList list (MAX_CHAR_NODES + 10);
string line, order, joint;
TCharNode *node;
@ -1037,76 +1044,7 @@ void CCharShape::SaveCharNodes (string filename) {
if (joint.size() > 0) list.Add ("# " + joint);
}
}
list.Save (param.char_dir, filename);
list.Save (dir, filename);
}
// ********************************************************************
// Character Administration
// ********************************************************************
CCharacter Char;
CCharacter::CCharacter () {
for (int i=0; i<MAX_CHARACTERS; i++) {
CharList[i].name = "";
CharList[i].dir = "";
CharList[i].preview = 0;
CharList[i].shape = NULL;
}
numCharacters = 0;
curr_character = 0;
}
CCharacter::~CCharacter () {}
static string char_type_index = "[spheres]0[3d]1";
void CCharacter::LoadCharacterList () {
CSPList list (MAX_CHARACTERS+2);
string line, typestr, charpath, previewfile;
int i;
GLuint texid;
if (!list.Load (param.char_dir, "characters.lst")) {
Message ("could not load characters.lst");
return;
}
numCharacters = 0;
for (i=0; i<list.Count(); i++) {
line = list.Line (i);
CharList[i].name = SPStrN (line, "name", "");
CharList[i].dir = SPStrN (line, "dir", "");
typestr = SPStrN (line, "type", "unknown");
CharList[i].type = SPIntN (char_type_index, typestr, -1);
charpath = param.char_dir + SEP + CharList[i].dir;
if (DirExists (charpath.c_str())) {
previewfile = charpath + SEP + "preview.png";
texid = Tex.LoadMipmapTexture (previewfile.c_str(), 0);
if (texid < 1) {
Message ("could not load previewfile of character");
texid = Tex.TexID (NO_PREVIEW);
}
CharList[i].preview = texid;
CharList[i].shape = new CCharShape;
if (CharList[i].shape->Load (charpath, "shape.lst", false) == false) {
free (CharList[i].shape);
CharList[i].shape = NULL;
Message ("could not load character shape");
} else numCharacters++;
}
}
}
void CCharacter::Draw (int idx) {
if (idx < 0 || idx >= numCharacters) return;
CharList[idx].shape->Draw ();
}
CCharShape *CCharacter::GetShape (int idx) {
if (idx < 0 || idx >= numCharacters) return NULL;
return CharList[idx].shape;
}

38
tux.h
View File

@ -28,7 +28,6 @@ GNU General Public License for more details.
#define MIN_SPHERE_DIV 3
#define MAX_SPHERE_DIV 16
typedef struct {
TColor diffuse;
TColor specular;
@ -71,14 +70,12 @@ private:
TCharNode *Nodes[MAX_CHAR_NODES];
TCharAction *Actions[MAX_CHAR_NODES];
int Index[MAX_CHAR_NODES];
string NodeIndex;
int numNodes;
bool useActions;
bool newActions;
TCharMaterial *Materials [MAX_CHAR_MAT];
int numMaterials;
string MaterialIndex;
string file_name;
string Matlines[MAX_CHAR_MAT];
int numMatlines;
@ -121,6 +118,8 @@ public:
~CCharShape ();
bool useMaterials;
bool useHighlighting;
string NodeIndex;
string file_name;
// nodes
bool ResetNode (int node_name);
@ -150,6 +149,7 @@ public:
int highlight_node;
int GetNodeName (int idx);
int GetNodeName (string node_trivialname);
string GetNodeJoint (int idx);
int GetNumNodes ();
string GetNodeFullname (int idx);
@ -158,35 +158,11 @@ public:
void PrintAction (int idx);
void PrintNode (int idx);
void RefreshNode (int idx);
void SaveCharNodes (string filename);
void SaveCharNodes (string dir, string filename);
};
#define MAX_CHARACTERS 16
typedef struct {
int type;
string name;
string dir;
GLuint preview;
CCharShape *shape;
} TCharacter;
class CCharacter {
private:
int curr_character;
public:
CCharacter ();
~CCharacter ();
TCharacter CharList [MAX_CHARACTERS];
int numCharacters;
void Draw (int idx);
CCharShape *GetShape (int idx);
void LoadCharacterList ();
};
extern CCharShape TestChar;
extern CCharacter Char;
// only for char tools, the characters for playing are in
// CCharacter (game_ctrl)
extern CCharShape TestChar;
#endif

View File

@ -21,7 +21,6 @@ GNU General Public License for more details.
#define MIN_CAMERA_HEIGHT 1.5
#define ABSOLUTE_MIN_CAMERA_HEIGHT 0.3
#define CAMERA_DISTANCE 4.0
#define CAMERA_ANGLE_ABOVE_SLOPE 10
#define PLAYER_ANGLE_IN_CAMERA 20
#define MAX_CAMERA_PITCH 40
@ -32,6 +31,28 @@ GNU General Public License for more details.
#define MAX_INTERPOLATION_VALUE 0.3
#define BASELINE_INTERPOLATION_SPEED 4.5
#define NO_INTERPOLATION_SPEED 2.0
#define CAMERA_DISTANCE_INCREMENT 2
static TMatrix stationary_matrix;
static bool is_stationary = false;
static bool shall_stationary = false;
void SetStationaryCamera (bool stat) {
if (stat == false) {
is_stationary = false;
shall_stationary = false;
} else {
shall_stationary = true;
}
}
static double camera_distance = 4.0;
void IncCameraDistance (double timestep) {
camera_distance += timestep * CAMERA_DISTANCE_INCREMENT;
}
void SetCameraDistance (double val) {camera_distance = val;}
void set_view_mode (CControl *ctrl, TViewMode mode) {ctrl->viewmode = mode;}
TViewMode get_view_mode (CControl *ctrl) {return ctrl->viewmode; }
@ -113,8 +134,7 @@ void interpolate_view_frame (TVector3 up1, TVector3 dir1,
p_dir2->z = -cob_mat2[2][2];
}
void setup_view_matrix (CControl *ctrl) {
void setup_view_matrix (CControl *ctrl, bool save_mat) {
TVector3 view_x, view_y, view_z;
TMatrix view_mat;
TVector3 viewpt_in_view_frame;
@ -157,7 +177,13 @@ void setup_view_matrix (CControl *ctrl) {
view_mat[3][1] = -viewpt_in_view_frame.y;
view_mat[3][2] = -viewpt_in_view_frame.z;
glLoadIdentity();
if (save_mat) {
int xx, yy;
for (xx=0; xx<4; xx++) {
for (yy=0; yy<4; yy++) stationary_matrix[xx][yy] = view_mat[xx][yy];
}
}
glLoadIdentity();
glMultMatrixd ((double*) view_mat);
}
@ -173,7 +199,7 @@ TVector3 MakeViewVector () {
course_angle -
CAMERA_ANGLE_ABOVE_SLOPE +
PLAYER_ANGLE_IN_CAMERA)));
res = ScaleVector (CAMERA_DISTANCE, res);
res = ScaleVector (camera_distance, res);
return res;
}
@ -192,6 +218,12 @@ void update_view (CControl *ctrl, double dt) {
TVector3 vel_cpy;
double time_constant_mult;
if (is_stationary) {
glLoadIdentity();
glMultMatrixd ((double*) stationary_matrix);
return;
}
vel_cpy = ctrl->cvel;
speed = NormVector (&vel_cpy);
time_constant_mult = 1.0 /
@ -227,7 +259,7 @@ void update_view (CControl *ctrl, double dt) {
for (i=0; i<2; i++) {
view_pt = interpolate_view_pos (ctrl->cpos, ctrl->cpos,
MAX_CAMERA_PITCH, ctrl->viewpos,
view_pt, CAMERA_DISTANCE, dt,
view_pt, camera_distance, dt,
BEHIND_ORBIT_TIME_CONSTANT *
time_constant_mult);
}
@ -277,7 +309,7 @@ void update_view (CControl *ctrl, double dt) {
for (i=0; i<2; i++) {
view_pt = interpolate_view_pos (ctrl->plyr_pos, ctrl->cpos,
MAX_CAMERA_PITCH, ctrl->viewpos,
view_pt, CAMERA_DISTANCE, dt,
view_pt, camera_distance, dt,
FOLLOW_ORBIT_TIME_CONSTANT *
time_constant_mult);
}
@ -332,10 +364,16 @@ void update_view (CControl *ctrl, double dt) {
ctrl->viewup = up_dir;
ctrl->plyr_pos = ctrl->cpos;
ctrl->view_init = true;
// Am Schluss eird die Viewmatrix an gl bergeben
setup_view_matrix (ctrl);
if (shall_stationary) {
setup_view_matrix (ctrl, true);
is_stationary = true;
} else {
setup_view_matrix (ctrl, false);
}
}
// --------------------------------------------------------------------
// viewfrustum
// --------------------------------------------------------------------

11
view.h
View File

@ -21,10 +21,13 @@ GNU General Public License for more details.
#include "bh.h"
#include "tux.h"
void set_view_mode (CControl *ctrl, TViewMode mode );
TViewMode get_view_mode (CControl *ctrl );
void update_view (CControl *ctrl, double dt );
void setup_view_matrix (CControl *ctrl );
void set_view_mode (CControl *ctrl, TViewMode mode);
TViewMode get_view_mode (CControl *ctrl);
void update_view (CControl *ctrl, double dt);
void SetStationaryCamera (bool stat); // 0 follow, 1 stationary
void IncCameraDistance (double timestep);
void SetCameraDistance (double val);
// ------------- viewfrustum ------------------------------------------