Initial import of source distribution.
70
Makefile
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
# $Id: Makefile,v 1.8 2002/07/22 06:11:25 msell Exp $
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# $Log: Makefile,v $
|
||||||
|
# Revision 1.8 2002/07/22 06:11:25 msell
|
||||||
|
# end.cpp
|
||||||
|
#
|
||||||
|
# Revision 1.7 2002/07/21 20:35:25 msell
|
||||||
|
# -D_GNU_SOURCE pois
|
||||||
|
#
|
||||||
|
# Revision 1.6 2002/07/21 20:33:27 msell
|
||||||
|
# -g pois
|
||||||
|
#
|
||||||
|
# Revision 1.5 2002/07/21 15:16:13 msell
|
||||||
|
# -Wall pois
|
||||||
|
#
|
||||||
|
# Revision 1.4 2002/07/21 15:12:59 msell
|
||||||
|
# test
|
||||||
|
#
|
||||||
|
# Revision 1.3 2002/07/21 15:12:16 msell
|
||||||
|
# Äänet enabloitu :)
|
||||||
|
#
|
||||||
|
# Revision 1.2 2002/07/19 19:48:06 msell
|
||||||
|
# Makefile
|
||||||
|
#
|
||||||
|
# Revision 1.1 2002/07/19 19:46:07 msell
|
||||||
|
# Makefile
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# $Date: 2002/07/22 06:11:25 $
|
||||||
|
|
||||||
|
FMOD = yes
|
||||||
|
|
||||||
|
GFXFLAGS = `sdl-config --cflags`
|
||||||
|
GFXLIBS = `sdl-config --libs` -lGL -lGLU -lSDL_image
|
||||||
|
|
||||||
|
ifeq ($(FMOD), yes)
|
||||||
|
SNDFLAGS = -DUSEFMOD=1
|
||||||
|
SNDLIBS = -lfmod-3.5
|
||||||
|
endif
|
||||||
|
|
||||||
|
CC = c++
|
||||||
|
CFLAGS = -I. -O3 $(GFXFLAGS) $(SNDFLAGS) -pg -s
|
||||||
|
LIBS = $(GFXLIBS) $(SNDLIBS)
|
||||||
|
|
||||||
|
|
||||||
|
SRC = 3dutils.cpp appearance.cpp audio.cpp camera.cpp collision.cpp \
|
||||||
|
fight.cpp font.cpp glapi.cpp graphics.cpp legoblocks.cpp \
|
||||||
|
legoman.cpp light.cpp main.cpp material.cpp menu.cpp mesh.cpp \
|
||||||
|
object.cpp objectfactory.cpp particle.cpp run.cpp shape.cpp \
|
||||||
|
sphere.cpp texture.cpp utils.cpp vector.cpp world.cpp end.cpp
|
||||||
|
|
||||||
|
|
||||||
|
OBJ = $(SRC:%.cpp=src/%.o)
|
||||||
|
|
||||||
|
all: blockofighter
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(OBJ) gmon.out
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
rm -f blockofighter
|
||||||
|
|
||||||
|
blockofighter: $(OBJ)
|
||||||
|
$(CC) $(CFLAGS) -o $@ $(OBJ) $(LIBS)
|
||||||
|
|
||||||
|
%.o: %.cpp
|
||||||
|
$(CC) $(CFLAGS) -c -o $@ $<
|
||||||
|
|
160
data/blockolegscaled.asc
Normal file
|
@ -0,0 +1,160 @@
|
||||||
|
Ambient light color: Red=0.0000 Green=0.0000 Blue=0.0000
|
||||||
|
|
||||||
|
Named object: "jalka1"
|
||||||
|
Tri-mesh, Vertices: 32 Faces: 60
|
||||||
|
Mapped
|
||||||
|
Vertex list:
|
||||||
|
Vertex 0: X:-3.2904 Y:-6.3682 Z:-2.4075 U:0.6909 V:0.1580
|
||||||
|
Vertex 1: X:-3.2904 Y:1.0225 Z:-2.8320 U:0.7380 V:0.6200
|
||||||
|
Vertex 2: X:-3.2904 Y:1.5878 Z:-3.2093 U:0.7798 V:0.6553
|
||||||
|
Vertex 3: X:-3.2904 Y:2.2435 Z:-3.4923 U:0.8112 V:0.6963
|
||||||
|
Vertex 4: X:-3.2904 Y:3.2339 Z:-3.6792 U:0.8319 V:0.7583
|
||||||
|
Vertex 5: X:-3.2904 Y:5.0261 Z:-3.2750 U:0.7871 V:0.8703
|
||||||
|
Vertex 6: X:-3.2904 Y:5.8825 Z:-2.7160 U:0.7251 V:0.9238
|
||||||
|
Vertex 7: X:-3.2904 Y:6.3874 Z:-2.1454 U:0.6618 V:0.9554
|
||||||
|
Vertex 8: X:-3.2904 Y:6.8429 Z:-1.2758 U:0.5654 V:0.9839
|
||||||
|
Vertex 9: X:-3.2904 Y:7.0927 Z:-0.1927 U:0.4453 V:0.9995
|
||||||
|
Vertex 10: X:-3.2904 Y:6.7671 Z:1.7856 U:0.2259 V:0.9791
|
||||||
|
Vertex 11: X:-3.2904 Y:6.1074 Z:2.6333 U:0.1319 V:0.9379
|
||||||
|
Vertex 12: X:-3.2904 Y:5.0313 Z:3.4472 U:0.0416 V:0.8706
|
||||||
|
Vertex 13: X:-3.2904 Y:-8.8867 Z:3.8179 U:0.0005 V:0.0005
|
||||||
|
Vertex 14: X:-3.2904 Y:-8.8867 Z:-5.1901 U:0.9995 V:0.0005
|
||||||
|
Vertex 15: X:-3.2904 Y:-6.3871 Z:-5.1901 U:0.9995 V:0.1568
|
||||||
|
Vertex 16: X:3.4077 Y:-6.3682 Z:-2.4075 U:0.6909 V:0.1580
|
||||||
|
Vertex 17: X:3.4077 Y:1.0225 Z:-2.8320 U:0.7380 V:0.6200
|
||||||
|
Vertex 18: X:3.4077 Y:1.5878 Z:-3.2093 U:0.7798 V:0.6553
|
||||||
|
Vertex 19: X:3.4077 Y:2.2435 Z:-3.4923 U:0.8112 V:0.6963
|
||||||
|
Vertex 20: X:3.4077 Y:3.2339 Z:-3.6792 U:0.8319 V:0.7583
|
||||||
|
Vertex 21: X:3.4077 Y:5.0261 Z:-3.2750 U:0.7871 V:0.8703
|
||||||
|
Vertex 22: X:3.4077 Y:5.8825 Z:-2.7160 U:0.7251 V:0.9238
|
||||||
|
Vertex 23: X:3.4077 Y:6.3874 Z:-2.1454 U:0.6618 V:0.9554
|
||||||
|
Vertex 24: X:3.4077 Y:6.8429 Z:-1.2758 U:0.5654 V:0.9839
|
||||||
|
Vertex 25: X:3.4077 Y:7.0927 Z:-0.1927 U:0.4453 V:0.9995
|
||||||
|
Vertex 26: X:3.4077 Y:6.7671 Z:1.7856 U:0.2259 V:0.9791
|
||||||
|
Vertex 27: X:3.4077 Y:6.1074 Z:2.6333 U:0.1319 V:0.9379
|
||||||
|
Vertex 28: X:3.4077 Y:5.0313 Z:3.4472 U:0.0416 V:0.8706
|
||||||
|
Vertex 29: X:3.4077 Y:-8.8867 Z:3.8179 U:0.0005 V:0.0005
|
||||||
|
Vertex 30: X:3.4077 Y:-8.8867 Z:-5.1901 U:0.9995 V:0.0005
|
||||||
|
Vertex 31: X:3.4077 Y:-6.3871 Z:-5.1901 U:0.9995 V:0.1568
|
||||||
|
Face list:
|
||||||
|
Face 0: A:0 B:1 C:17 AB:1 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 1
|
||||||
|
Face 1: A:0 B:17 C:16 AB:0 BC:1 CA:1 Nosmooth
|
||||||
|
Smoothing: 1
|
||||||
|
Face 2: A:1 B:2 C:18 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 3: A:1 B:18 C:17 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 4: A:2 B:3 C:19 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 3
|
||||||
|
Face 5: A:2 B:19 C:18 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 3
|
||||||
|
Face 6: A:3 B:4 C:20 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 3
|
||||||
|
Face 7: A:3 B:20 C:19 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 3
|
||||||
|
Face 8: A:4 B:5 C:21 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 3
|
||||||
|
Face 9: A:4 B:21 C:20 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 3
|
||||||
|
Face 10: A:5 B:6 C:22 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 3
|
||||||
|
Face 11: A:5 B:22 C:21 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 3
|
||||||
|
Face 12: A:6 B:7 C:23 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 13: A:6 B:23 C:22 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 14: A:7 B:8 C:24 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 3
|
||||||
|
Face 15: A:7 B:24 C:23 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 3
|
||||||
|
Face 16: A:8 B:9 C:25 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 17: A:8 B:25 C:24 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 18: A:9 B:10 C:26 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 19: A:9 B:26 C:25 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 20: A:10 B:11 C:27 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 3
|
||||||
|
Face 21: A:10 B:27 C:26 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 3
|
||||||
|
Face 22: A:11 B:12 C:28 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 23: A:11 B:28 C:27 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 24: A:12 B:13 C:29 AB:1 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 2
|
||||||
|
Face 25: A:12 B:29 C:28 AB:0 BC:1 CA:1 Nosmooth
|
||||||
|
Smoothing: 2
|
||||||
|
Face 26: A:13 B:14 C:30 AB:1 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 3
|
||||||
|
Face 27: A:13 B:30 C:29 AB:0 BC:1 CA:1 Nosmooth
|
||||||
|
Smoothing: 3
|
||||||
|
Face 28: A:14 B:15 C:31 AB:1 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 2
|
||||||
|
Face 29: A:14 B:31 C:30 AB:0 BC:1 CA:1 Nosmooth
|
||||||
|
Smoothing: 2
|
||||||
|
Face 30: A:15 B:0 C:16 AB:1 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 3
|
||||||
|
Face 31: A:15 B:16 C:31 AB:0 BC:1 CA:1 Nosmooth
|
||||||
|
Smoothing: 3
|
||||||
|
Face 32: A:13 B:15 C:14 AB:0 BC:1 CA:1 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 33: A:13 B:0 C:15 AB:0 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 34: A:12 B:0 C:13 AB:0 BC:0 CA:1 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 35: A:12 B:1 C:0 AB:0 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 36: A:11 B:1 C:12 AB:0 BC:0 CA:1 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 37: A:11 B:2 C:1 AB:0 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 38: A:11 B:3 C:2 AB:0 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 39: A:10 B:3 C:11 AB:0 BC:0 CA:1 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 40: A:9 B:3 C:10 AB:0 BC:0 CA:1 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 41: A:8 B:3 C:9 AB:0 BC:0 CA:1 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 42: A:7 B:3 C:8 AB:0 BC:0 CA:1 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 43: A:6 B:3 C:7 AB:0 BC:0 CA:1 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 44: A:5 B:3 C:6 AB:0 BC:0 CA:1 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 45: A:4 B:3 C:5 AB:0 BC:0 CA:1 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 46: A:29 B:30 C:31 AB:1 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 47: A:29 B:31 C:16 AB:0 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 48: A:28 B:29 C:16 AB:1 BC:0 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 49: A:28 B:16 C:17 AB:0 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 50: A:27 B:28 C:17 AB:1 BC:0 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 51: A:27 B:17 C:18 AB:0 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 52: A:27 B:18 C:19 AB:0 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 53: A:26 B:27 C:19 AB:1 BC:0 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 54: A:25 B:26 C:19 AB:1 BC:0 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 55: A:24 B:25 C:19 AB:1 BC:0 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 56: A:23 B:24 C:19 AB:1 BC:0 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 57: A:22 B:23 C:19 AB:1 BC:0 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 58: A:21 B:22 C:19 AB:1 BC:0 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 59: A:20 B:21 C:19 AB:1 BC:0 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
|
40
data/blockotorsoscaled.asc
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
Ambient light color: Red=0.0000 Green=0.0000 Blue=0.0000
|
||||||
|
|
||||||
|
Named object: "BlockoTorso"
|
||||||
|
Tri-mesh, Vertices: 8 Faces: 12
|
||||||
|
Mapped
|
||||||
|
Vertex list:
|
||||||
|
Vertex 0: X:7.9304 Y:-5.7145 Z:-3.9370 U:0.0000 V:0.0000
|
||||||
|
Vertex 1: X:5.9145 Y:8.4213 Z:-4.0770 U:0.2629 V:0.0000
|
||||||
|
Vertex 2: X:-6.6049 Y:8.4214 Z:-4.0770 U:0.4666 V:0.0000
|
||||||
|
Vertex 3: X:-8.5263 Y:-5.8986 Z:-3.9354 U:0.7323 V:0.0000
|
||||||
|
Vertex 4: X:7.9304 Y:-5.6399 Z:4.6084 U:1.0000 V:0.0000
|
||||||
|
Vertex 5: X:5.9145 Y:8.4959 Z:4.4684 U:0.0000 V:1.0000
|
||||||
|
Vertex 6: X:-6.6049 Y:8.4960 Z:4.4684 U:0.2629 V:1.0000
|
||||||
|
Vertex 7: X:-8.5263 Y:-5.8240 Z:4.6100 U:0.4666 V:1.0000
|
||||||
|
Face list:
|
||||||
|
Face 0: A:0 B:1 C:5 AB:1 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 1
|
||||||
|
Face 1: A:0 B:5 C:4 AB:0 BC:1 CA:1 Nosmooth
|
||||||
|
Smoothing: 1
|
||||||
|
Face 2: A:1 B:2 C:6 AB:1 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 3
|
||||||
|
Face 3: A:1 B:6 C:5 AB:0 BC:1 CA:1 Nosmooth
|
||||||
|
Smoothing: 3
|
||||||
|
Face 4: A:2 B:3 C:7 AB:1 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 2
|
||||||
|
Face 5: A:2 B:7 C:6 AB:0 BC:1 CA:1 Nosmooth
|
||||||
|
Smoothing: 2
|
||||||
|
Face 6: A:3 B:0 C:4 AB:1 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 3
|
||||||
|
Face 7: A:3 B:4 C:7 AB:0 BC:1 CA:1 Nosmooth
|
||||||
|
Smoothing: 3
|
||||||
|
Face 8: A:2 B:0 C:3 AB:0 BC:1 CA:1 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 9: A:2 B:1 C:0 AB:1 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 10: A:6 B:7 C:4 AB:1 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 11: A:6 B:4 C:5 AB:0 BC:1 CA:1 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
|
402
data/blockowaistscaled.asc
Normal file
|
@ -0,0 +1,402 @@
|
||||||
|
Ambient light color: Red=0.0000 Green=0.0000 Blue=0.0000
|
||||||
|
|
||||||
|
Named object: "BlockoWaist"
|
||||||
|
Tri-mesh, Vertices: 82 Faces: 156
|
||||||
|
Mapped
|
||||||
|
Vertex list:
|
||||||
|
Vertex 0: X:-7.8379 Y:-0.6276 Z:3.4615 U:0.0000 V:0.0000
|
||||||
|
Vertex 1: X:-7.8379 Y:-0.0029 Z:2.8671 U:0.0000 V:0.0000
|
||||||
|
Vertex 2: X:-7.8379 Y:0.4064 Z:2.3468 U:0.0000 V:0.0000
|
||||||
|
Vertex 3: X:-7.8379 Y:0.6286 Z:1.6786 U:0.0000 V:0.0000
|
||||||
|
Vertex 4: X:-7.8379 Y:0.7771 Z:0.9489 U:0.0000 V:0.0000
|
||||||
|
Vertex 5: X:-7.8379 Y:0.7658 Z:-0.3442 U:0.0000 V:0.0000
|
||||||
|
Vertex 6: X:-7.8379 Y:0.4505 Z:-1.4278 U:0.0000 V:0.0000
|
||||||
|
Vertex 7: X:-7.8379 Y:0.0895 Z:-2.0971 U:0.0000 V:0.0000
|
||||||
|
Vertex 8: X:-7.8379 Y:-0.6214 Z:-2.8582 U:0.0000 V:0.0000
|
||||||
|
Vertex 9: X:-7.8853 Y:-0.6418 Z:-4.1596 U:0.0000 V:0.0000
|
||||||
|
Vertex 10: X:-7.8853 Y:1.1771 Z:-4.1758 U:0.0000 V:0.0000
|
||||||
|
Vertex 11: X:-7.8379 Y:1.3024 Z:4.2549 U:0.0000 V:0.0000
|
||||||
|
Vertex 12: X:-7.8379 Y:-0.6223 Z:4.2717 U:0.0000 V:0.0000
|
||||||
|
Vertex 13: X:7.8521 Y:-0.6276 Z:3.4615 U:0.0000 V:0.0000
|
||||||
|
Vertex 14: X:7.8521 Y:-0.0029 Z:2.8671 U:0.0000 V:0.0000
|
||||||
|
Vertex 15: X:7.8521 Y:0.4064 Z:2.3468 U:0.0000 V:0.0000
|
||||||
|
Vertex 16: X:7.8521 Y:0.6286 Z:1.6786 U:0.0000 V:0.0000
|
||||||
|
Vertex 17: X:7.8521 Y:0.7771 Z:0.9489 U:0.0000 V:0.0000
|
||||||
|
Vertex 18: X:7.8521 Y:0.7658 Z:-0.3443 U:0.0000 V:0.0000
|
||||||
|
Vertex 19: X:7.8521 Y:0.4505 Z:-1.4278 U:0.0000 V:0.0000
|
||||||
|
Vertex 20: X:7.8521 Y:0.0895 Z:-2.0971 U:0.0000 V:0.0000
|
||||||
|
Vertex 21: X:7.8521 Y:-0.6214 Z:-2.8582 U:0.0000 V:0.0000
|
||||||
|
Vertex 22: X:7.8047 Y:-0.6418 Z:-4.1596 U:0.0000 V:0.0000
|
||||||
|
Vertex 23: X:7.8047 Y:1.1771 Z:-4.1758 U:0.0000 V:0.0000
|
||||||
|
Vertex 24: X:7.8521 Y:1.3024 Z:4.2549 U:0.0000 V:0.0000
|
||||||
|
Vertex 25: X:7.8521 Y:-0.6223 Z:4.2717 U:0.0000 V:0.0000
|
||||||
|
Vertex 26: X:-0.6238 Y:-3.2036 Z:-3.7235 U:0.9995 V:0.5000
|
||||||
|
Vertex 27: X:-0.6238 Y:-2.2939 Z:-3.6266 U:0.9863 V:0.6145
|
||||||
|
Vertex 28: X:-0.6238 Y:-1.4568 Z:-3.3352 U:0.9487 V:0.7196
|
||||||
|
Vertex 29: X:-0.6238 Y:-0.7162 Z:-2.8732 U:0.8897 V:0.8123
|
||||||
|
Vertex 30: X:-0.6238 Y:-0.0965 Z:-2.2642 U:0.8123 V:0.8897
|
||||||
|
Vertex 31: X:-0.6238 Y:0.3784 Z:-1.5318 U:0.7196 V:0.9487
|
||||||
|
Vertex 32: X:-0.6237 Y:0.6843 Z:-0.6999 U:0.6145 V:0.9863
|
||||||
|
Vertex 33: X:-0.6237 Y:0.7971 Z:0.2079 U:0.5000 V:0.9995
|
||||||
|
Vertex 34: X:-0.6237 Y:0.7001 Z:1.1176 U:0.3855 V:0.9863
|
||||||
|
Vertex 35: X:-0.6237 Y:0.4088 Z:1.9547 U:0.2804 V:0.9487
|
||||||
|
Vertex 36: X:-0.6237 Y:-0.0532 Z:2.6952 U:0.1877 V:0.8897
|
||||||
|
Vertex 37: X:-0.6237 Y:-0.6622 Z:3.3150 U:0.1103 V:0.8123
|
||||||
|
Vertex 38: X:-0.6237 Y:-1.3946 Z:3.7899 U:0.0513 V:0.7196
|
||||||
|
Vertex 39: X:-0.6237 Y:-2.2265 Z:4.0957 U:0.0137 V:0.6145
|
||||||
|
Vertex 40: X:-0.6237 Y:-3.1343 Z:4.2085 U:0.0005 V:0.5000
|
||||||
|
Vertex 41: X:-0.6237 Y:-4.0440 Z:4.1116 U:0.0137 V:0.3855
|
||||||
|
Vertex 42: X:-0.6237 Y:-4.8811 Z:3.8203 U:0.0513 V:0.2804
|
||||||
|
Vertex 43: X:-0.6237 Y:-5.6216 Z:3.3583 U:0.1103 V:0.1877
|
||||||
|
Vertex 44: X:-0.6237 Y:-6.2414 Z:2.7492 U:0.1877 V:0.1103
|
||||||
|
Vertex 45: X:-0.6237 Y:-6.7163 Z:2.0169 U:0.2804 V:0.0513
|
||||||
|
Vertex 46: X:-0.6238 Y:-7.0222 Z:1.1850 U:0.3855 V:0.0137
|
||||||
|
Vertex 47: X:-0.6238 Y:-7.1349 Z:0.2771 U:0.5000 V:0.0005
|
||||||
|
Vertex 48: X:-0.6238 Y:-7.0380 Z:-0.6325 U:0.6145 V:0.0137
|
||||||
|
Vertex 49: X:-0.6238 Y:-6.7467 Z:-1.4697 U:0.7196 V:0.0513
|
||||||
|
Vertex 50: X:-0.6238 Y:-6.2847 Z:-2.2102 U:0.8123 V:0.1103
|
||||||
|
Vertex 51: X:-0.6238 Y:-5.6756 Z:-2.8299 U:0.8897 V:0.1877
|
||||||
|
Vertex 52: X:-0.6238 Y:-4.9433 Z:-3.3048 U:0.9487 V:0.2804
|
||||||
|
Vertex 53: X:-0.6238 Y:-4.1114 Z:-3.6107 U:0.9863 V:0.3855
|
||||||
|
Vertex 54: X:0.4257 Y:-3.2036 Z:-3.7235 U:0.9995 V:0.5000
|
||||||
|
Vertex 55: X:0.4257 Y:-2.2939 Z:-3.6266 U:0.9863 V:0.6145
|
||||||
|
Vertex 56: X:0.4257 Y:-1.4568 Z:-3.3352 U:0.9487 V:0.7196
|
||||||
|
Vertex 57: X:0.4257 Y:-0.7162 Z:-2.8732 U:0.8897 V:0.8123
|
||||||
|
Vertex 58: X:0.4257 Y:-0.0965 Z:-2.2642 U:0.8123 V:0.8897
|
||||||
|
Vertex 59: X:0.4257 Y:0.3784 Z:-1.5318 U:0.7196 V:0.9487
|
||||||
|
Vertex 60: X:0.4257 Y:0.6843 Z:-0.6999 U:0.6145 V:0.9863
|
||||||
|
Vertex 61: X:0.4257 Y:0.7971 Z:0.2079 U:0.5000 V:0.9995
|
||||||
|
Vertex 62: X:0.4257 Y:0.7001 Z:1.1176 U:0.3855 V:0.9863
|
||||||
|
Vertex 63: X:0.4257 Y:0.4088 Z:1.9547 U:0.2804 V:0.9487
|
||||||
|
Vertex 64: X:0.4257 Y:-0.0532 Z:2.6952 U:0.1877 V:0.8897
|
||||||
|
Vertex 65: X:0.4257 Y:-0.6622 Z:3.3150 U:0.1103 V:0.8123
|
||||||
|
Vertex 66: X:0.4257 Y:-1.3946 Z:3.7899 U:0.0513 V:0.7196
|
||||||
|
Vertex 67: X:0.4257 Y:-2.2265 Z:4.0957 U:0.0137 V:0.6145
|
||||||
|
Vertex 68: X:0.4257 Y:-3.1343 Z:4.2085 U:0.0005 V:0.5000
|
||||||
|
Vertex 69: X:0.4257 Y:-4.0440 Z:4.1116 U:0.0137 V:0.3855
|
||||||
|
Vertex 70: X:0.4257 Y:-4.8811 Z:3.8203 U:0.0513 V:0.2804
|
||||||
|
Vertex 71: X:0.4257 Y:-5.6216 Z:3.3583 U:0.1103 V:0.1877
|
||||||
|
Vertex 72: X:0.4257 Y:-6.2414 Z:2.7492 U:0.1877 V:0.1103
|
||||||
|
Vertex 73: X:0.4257 Y:-6.7163 Z:2.0169 U:0.2804 V:0.0513
|
||||||
|
Vertex 74: X:0.4257 Y:-7.0222 Z:1.1850 U:0.3855 V:0.0137
|
||||||
|
Vertex 75: X:0.4257 Y:-7.1349 Z:0.2771 U:0.5000 V:0.0005
|
||||||
|
Vertex 76: X:0.4257 Y:-7.0380 Z:-0.6325 U:0.6145 V:0.0137
|
||||||
|
Vertex 77: X:0.4257 Y:-6.7467 Z:-1.4697 U:0.7196 V:0.0513
|
||||||
|
Vertex 78: X:0.4257 Y:-6.2847 Z:-2.2102 U:0.8123 V:0.1103
|
||||||
|
Vertex 79: X:0.4257 Y:-5.6756 Z:-2.8299 U:0.8897 V:0.1877
|
||||||
|
Vertex 80: X:0.4257 Y:-4.9433 Z:-3.3048 U:0.9487 V:0.2804
|
||||||
|
Vertex 81: X:0.4257 Y:-4.1114 Z:-3.6107 U:0.9863 V:0.3855
|
||||||
|
Face list:
|
||||||
|
Face 0: A:0 B:1 C:14 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 1: A:0 B:14 C:13 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 2: A:1 B:2 C:15 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 3
|
||||||
|
Face 3: A:1 B:15 C:14 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 3
|
||||||
|
Face 4: A:2 B:3 C:16 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 5: A:2 B:16 C:15 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 6: A:3 B:4 C:17 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 3
|
||||||
|
Face 7: A:3 B:17 C:16 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 3
|
||||||
|
Face 8: A:4 B:5 C:18 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 9: A:4 B:18 C:17 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 10: A:5 B:6 C:19 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 3
|
||||||
|
Face 11: A:5 B:19 C:18 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 3
|
||||||
|
Face 12: A:6 B:7 C:20 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 13: A:6 B:20 C:19 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 14: A:7 B:8 C:21 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 3
|
||||||
|
Face 15: A:7 B:21 C:20 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 3
|
||||||
|
Face 16: A:8 B:9 C:22 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 17: A:8 B:22 C:21 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 18: A:9 B:10 C:23 AB:1 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 3
|
||||||
|
Face 19: A:9 B:23 C:22 AB:0 BC:1 CA:1 Nosmooth
|
||||||
|
Smoothing: 3
|
||||||
|
Face 20: A:10 B:11 C:24 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 21: A:10 B:24 C:23 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 22: A:11 B:12 C:25 AB:1 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 3
|
||||||
|
Face 23: A:11 B:25 C:24 AB:0 BC:1 CA:1 Nosmooth
|
||||||
|
Smoothing: 3
|
||||||
|
Face 24: A:12 B:0 C:13 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 25: A:12 B:13 C:25 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 26: A:8 B:10 C:9 AB:0 BC:1 CA:1 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 27: A:7 B:10 C:8 AB:0 BC:0 CA:1 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 28: A:11 B:0 C:12 AB:0 BC:1 CA:1 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 29: A:11 B:1 C:0 AB:0 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 30: A:11 B:2 C:1 AB:0 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 31: A:6 B:10 C:7 AB:0 BC:0 CA:1 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 32: A:11 B:3 C:2 AB:0 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 33: A:5 B:10 C:6 AB:0 BC:0 CA:1 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 34: A:5 B:11 C:10 AB:0 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 35: A:4 B:11 C:5 AB:0 BC:0 CA:1 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 36: A:4 B:3 C:11 AB:1 BC:0 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 37: A:21 B:22 C:23 AB:1 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 38: A:20 B:21 C:23 AB:1 BC:0 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 39: A:24 B:25 C:13 AB:1 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 40: A:24 B:13 C:14 AB:0 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 41: A:24 B:14 C:15 AB:0 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 42: A:19 B:20 C:23 AB:1 BC:0 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 43: A:24 B:15 C:16 AB:0 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 44: A:18 B:19 C:23 AB:1 BC:0 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 45: A:18 B:23 C:24 AB:0 BC:1 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 46: A:17 B:18 C:24 AB:1 BC:0 CA:0 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 47: A:17 B:24 C:16 AB:0 BC:0 CA:1 Nosmooth
|
||||||
|
Smoothing: 5
|
||||||
|
Face 48: A:26 B:27 C:55 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 49: A:26 B:55 C:54 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 50: A:27 B:28 C:56 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1, 2
|
||||||
|
Face 51: A:27 B:56 C:55 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 1, 2
|
||||||
|
Face 52: A:28 B:29 C:57 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 53: A:28 B:57 C:56 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 54: A:29 B:30 C:58 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 55: A:29 B:58 C:57 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 56: A:30 B:31 C:59 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 57: A:30 B:59 C:58 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 58: A:31 B:32 C:60 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 59: A:31 B:60 C:59 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 60: A:32 B:33 C:61 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 61: A:32 B:61 C:60 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 62: A:33 B:34 C:62 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 63: A:33 B:62 C:61 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 64: A:34 B:35 C:63 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 65: A:34 B:63 C:62 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 66: A:35 B:36 C:64 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 67: A:35 B:64 C:63 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 68: A:36 B:37 C:65 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 69: A:36 B:65 C:64 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 70: A:37 B:38 C:66 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 71: A:37 B:66 C:65 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 72: A:38 B:39 C:67 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 73: A:38 B:67 C:66 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 74: A:39 B:40 C:68 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 75: A:39 B:68 C:67 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 76: A:40 B:41 C:69 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 77: A:40 B:69 C:68 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 78: A:41 B:42 C:70 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 79: A:41 B:70 C:69 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 80: A:42 B:43 C:71 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 81: A:42 B:71 C:70 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 82: A:43 B:44 C:72 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 83: A:43 B:72 C:71 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 84: A:44 B:45 C:73 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 85: A:44 B:73 C:72 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 86: A:45 B:46 C:74 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 87: A:45 B:74 C:73 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 88: A:46 B:47 C:75 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 89: A:46 B:75 C:74 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 90: A:47 B:48 C:76 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 91: A:47 B:76 C:75 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 92: A:48 B:49 C:77 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 93: A:48 B:77 C:76 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 94: A:49 B:50 C:78 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 95: A:49 B:78 C:77 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 96: A:50 B:51 C:79 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 97: A:50 B:79 C:78 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 98: A:51 B:52 C:80 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 99: A:51 B:80 C:79 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 100: A:52 B:53 C:81 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 2
|
||||||
|
Face 101: A:52 B:81 C:80 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 2
|
||||||
|
Face 102: A:53 B:26 C:54 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1, 2
|
||||||
|
Face 103: A:53 B:54 C:81 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 1, 2
|
||||||
|
Face 104: A:39 B:41 C:40 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 5
|
||||||
|
Face 105: A:39 B:42 C:41 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 106: A:38 B:42 C:39 AB:0 BC:0 CA:1
|
||||||
|
Smoothing: 5
|
||||||
|
Face 107: A:38 B:43 C:42 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 108: A:37 B:43 C:38 AB:0 BC:0 CA:1
|
||||||
|
Smoothing: 5
|
||||||
|
Face 109: A:36 B:43 C:37 AB:0 BC:0 CA:1
|
||||||
|
Smoothing: 5
|
||||||
|
Face 110: A:36 B:44 C:43 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 111: A:36 B:45 C:44 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 112: A:36 B:46 C:45 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 113: A:36 B:47 C:46 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 114: A:36 B:48 C:47 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 115: A:36 B:49 C:48 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 116: A:36 B:50 C:49 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 117: A:36 B:51 C:50 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 118: A:36 B:52 C:51 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 119: A:36 B:53 C:52 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 120: A:36 B:26 C:53 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 121: A:36 B:27 C:26 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 122: A:36 B:28 C:27 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 123: A:36 B:29 C:28 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 124: A:36 B:30 C:29 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 125: A:36 B:31 C:30 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 126: A:36 B:32 C:31 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 127: A:36 B:33 C:32 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 128: A:36 B:34 C:33 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 129: A:36 B:35 C:34 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 130: A:67 B:68 C:69 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 131: A:67 B:69 C:70 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 132: A:66 B:67 C:70 AB:1 BC:0 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 133: A:66 B:70 C:71 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 134: A:65 B:66 C:71 AB:1 BC:0 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 135: A:64 B:65 C:71 AB:1 BC:0 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 136: A:64 B:71 C:72 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 137: A:64 B:72 C:73 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 138: A:64 B:73 C:74 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 139: A:64 B:74 C:75 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 140: A:64 B:75 C:76 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 141: A:64 B:76 C:77 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 142: A:64 B:77 C:78 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 143: A:64 B:78 C:79 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 144: A:64 B:79 C:80 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 145: A:64 B:80 C:81 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 146: A:64 B:81 C:54 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 147: A:64 B:54 C:55 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 148: A:64 B:55 C:56 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 149: A:64 B:56 C:57 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 150: A:64 B:57 C:58 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 151: A:64 B:58 C:59 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 152: A:64 B:59 C:60 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 153: A:64 B:60 C:61 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 154: A:64 B:61 C:62 AB:0 BC:1 CA:0
|
||||||
|
Smoothing: 5
|
||||||
|
Face 155: A:64 B:62 C:63 AB:0 BC:1 CA:1
|
||||||
|
Smoothing: 5
|
||||||
|
|
BIN
data/damagehand.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
data/damagehead.png
Normal file
After Width: | Height: | Size: 3.5 KiB |
BIN
data/damageleg.png
Normal file
After Width: | Height: | Size: 9 KiB |
BIN
data/damagetorso.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
data/fall1.wav
Normal file
BIN
data/fall2.wav
Normal file
BIN
data/fight.mp3
Normal file
BIN
data/fight.wav
Normal file
BIN
data/flare.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
data/font.png
Normal file
After Width: | Height: | Size: 57 KiB |
BIN
data/hit1.wav
Normal file
BIN
data/hitsoft1.wav
Normal file
BIN
data/hitsoft2.wav
Normal file
BIN
data/jump.wav
Normal file
810
data/leftarm.asc
Normal file
|
@ -0,0 +1,810 @@
|
||||||
|
Ambient light color: Red=0.0000 Green=0.0000 Blue=0.0000
|
||||||
|
|
||||||
|
Named object: "BlockoHandRight02"
|
||||||
|
Tri-mesh, Vertices: 162 Faces: 320
|
||||||
|
Mapped
|
||||||
|
Vertex list:
|
||||||
|
Vertex 0: X:0.2585 Y:6.3832 Z:-0.3438 U:0.4367 V:0.6319
|
||||||
|
Vertex 1: X:0.3128 Y:6.3802 Z:-0.2495 U:0.4227 V:0.6404
|
||||||
|
Vertex 2: X:1.6655 Y:5.5338 Z:-1.9743 U:0.6480 V:0.9382
|
||||||
|
Vertex 3: X:-0.2510 Y:4.5548 Z:-3.1671 U:0.8426 V:0.6169
|
||||||
|
Vertex 4: X:1.8177 Y:4.3915 Z:-2.4432 U:0.7134 V:0.9940
|
||||||
|
Vertex 5: X:0.3165 Y:4.6165 Z:2.7651 U:0.0020 V:0.6169
|
||||||
|
Vertex 6: X:1.4639 Y:0.7845 Z:-2.3719 U:0.7134 V:0.9865
|
||||||
|
Vertex 7: X:1.1262 Y:-0.3284 Z:-2.5700 U:0.7474 V:0.9453
|
||||||
|
Vertex 8: X:1.5822 Y:-0.7933 Z:-0.3795 U:0.4344 V:0.9995
|
||||||
|
Vertex 9: X:0.9876 Y:-1.3241 Z:2.5612 U:0.0303 V:0.8449
|
||||||
|
Vertex 10: X:-0.4685 Y:-1.2753 Z:2.7491 U:0.0234 V:0.5682
|
||||||
|
Vertex 11: X:-1.6705 Y:-2.0509 Z:-3.0829 U:0.8595 V:0.4596
|
||||||
|
Vertex 12: X:-0.0539 Y:-2.7838 Z:-2.4606 U:0.7515 V:0.7633
|
||||||
|
Vertex 13: X:-2.4832 Y:-4.1856 Z:-3.9799 U:0.9995 V:0.3588
|
||||||
|
Vertex 14: X:-0.4936 Y:-5.3122 Z:-2.1315 U:0.7149 V:0.7172
|
||||||
|
Vertex 15: X:-2.2695 Y:-6.1044 Z:0.0737 U:0.4303 V:0.3588
|
||||||
|
Vertex 16: X:-4.2591 Y:-4.9778 Z:-1.7747 U:0.7149 V:0.0005
|
||||||
|
Vertex 17: X:0.0050 Y:5.9558 Z:-1.9655 U:0.6684 V:0.6203
|
||||||
|
Vertex 18: X:1.2246 Y:5.5653 Z:-2.2760 U:0.6962 V:0.8605
|
||||||
|
Vertex 19: X:1.3421 Y:5.8427 Z:-1.5546 U:0.5930 V:0.8651
|
||||||
|
Vertex 20: X:0.6572 Y:6.1631 Z:-0.3071 U:0.4265 V:0.7095
|
||||||
|
Vertex 21: X:0.9318 Y:5.9054 Z:-0.3526 U:0.4296 V:0.7660
|
||||||
|
Vertex 22: X:0.7058 Y:6.1715 Z:0.3133 U:0.3387 V:0.7074
|
||||||
|
Vertex 23: X:-1.2196 Y:-2.9438 Z:1.9860 U:0.1430 V:0.4689
|
||||||
|
Vertex 24: X:0.1904 Y:-2.1434 Z:2.3390 U:0.0734 V:0.7132
|
||||||
|
Vertex 25: X:-0.3064 Y:-4.7882 Z:-1.7143 U:0.6530 V:0.7361
|
||||||
|
Vertex 26: X:-0.0558 Y:-4.1725 Z:-1.3472 U:0.5972 V:0.7663
|
||||||
|
Vertex 27: X:-0.2827 Y:-3.6185 Z:-2.3753 U:0.7438 V:0.7328
|
||||||
|
Vertex 28: X:-0.4293 Y:-4.4613 Z:-2.2656 U:0.7316 V:0.7174
|
||||||
|
Vertex 29: X:0.2897 Y:6.3734 Z:-0.3170 U:0.4325 V:0.6374
|
||||||
|
Vertex 30: X:0.3150 Y:6.3813 Z:-0.1844 U:0.4136 V:0.6396
|
||||||
|
Vertex 31: X:0.2399 Y:6.3884 Z:-0.1510 U:0.4099 V:0.6249
|
||||||
|
Vertex 32: X:1.3569 Y:5.5632 Z:-1.7734 U:0.6239 V:0.8764
|
||||||
|
Vertex 33: X:-1.0749 Y:6.0845 Z:-0.1106 U:0.4223 V:0.3831
|
||||||
|
Vertex 34: X:-1.4056 Y:5.8122 Z:-1.2469 U:0.5867 V:0.3459
|
||||||
|
Vertex 35: X:-0.8926 Y:5.7510 Z:-2.1281 U:0.7036 V:0.4586
|
||||||
|
Vertex 36: X:1.2217 Y:5.6366 Z:1.5211 U:0.1630 V:0.7915
|
||||||
|
Vertex 37: X:0.9888 Y:5.6627 Z:1.8816 U:0.1155 V:0.7410
|
||||||
|
Vertex 38: X:0.3373 Y:5.9919 Z:1.5082 U:0.1762 V:0.6203
|
||||||
|
Vertex 39: X:0.3134 Y:6.2131 Z:0.7688 U:0.2800 V:0.6252
|
||||||
|
Vertex 40: X:-0.5127 Y:5.7923 Z:1.8421 U:0.1410 V:0.4586
|
||||||
|
Vertex 41: X:-1.1836 Y:5.8363 Z:1.0731 U:0.2579 V:0.3459
|
||||||
|
Vertex 42: X:0.7078 Y:4.4727 Z:-3.1217 U:0.8235 V:0.7969
|
||||||
|
Vertex 43: X:1.3435 Y:4.4238 Z:-2.8412 U:0.7757 V:0.9118
|
||||||
|
Vertex 44: X:1.8497 Y:4.9671 Z:-2.3710 U:0.7020 V:0.9891
|
||||||
|
Vertex 45: X:1.8254 Y:5.2687 Z:-2.2388 U:0.6834 V:0.9772
|
||||||
|
Vertex 46: X:-0.1522 Y:5.4235 Z:-2.8763 U:0.7992 V:0.6158
|
||||||
|
Vertex 47: X:-0.1931 Y:5.1276 Z:-3.0614 U:0.8262 V:0.6164
|
||||||
|
Vertex 48: X:-1.8058 Y:5.6206 Z:-0.0359 U:0.4223 V:0.2527
|
||||||
|
Vertex 49: X:-1.9650 Y:5.3387 Z:-0.0177 U:0.4223 V:0.2273
|
||||||
|
Vertex 50: X:-1.2857 Y:4.6544 Z:-2.6601 U:0.7852 V:0.4126
|
||||||
|
Vertex 51: X:1.5142 Y:4.4211 Z:-2.1929 U:0.6823 V:0.9323
|
||||||
|
Vertex 52: X:1.3278 Y:5.0448 Z:-0.4148 U:0.4343 V:0.8555
|
||||||
|
Vertex 53: X:1.2671 Y:5.3462 Z:-0.4064 U:0.4335 V:0.8390
|
||||||
|
Vertex 54: X:1.4416 Y:4.5068 Z:2.0474 U:0.0878 V:0.8421
|
||||||
|
Vertex 55: X:1.1412 Y:4.5404 Z:2.5124 U:0.0265 V:0.7770
|
||||||
|
Vertex 56: X:0.3522 Y:5.1868 Z:2.6385 U:0.0184 V:0.6164
|
||||||
|
Vertex 57: X:0.3567 Y:5.4787 Z:2.4430 U:0.0454 V:0.6158
|
||||||
|
Vertex 58: X:-0.7958 Y:4.7076 Z:2.4615 U:0.0594 V:0.4126
|
||||||
|
Vertex 59: X:1.1795 Y:0.8124 Z:-2.1234 U:0.6823 V:0.9284
|
||||||
|
Vertex 60: X:0.9968 Y:0.8378 Z:-1.5546 U:0.6049 V:0.8837
|
||||||
|
Vertex 61: X:1.1640 Y:0.8790 Z:1.3618 U:0.1931 V:0.8626
|
||||||
|
Vertex 62: X:1.1274 Y:0.8962 Z:2.1150 U:0.0878 V:0.8421
|
||||||
|
Vertex 63: X:0.8269 Y:0.9299 Z:2.5799 U:0.0265 V:0.7770
|
||||||
|
Vertex 64: X:1.3006 Y:0.0496 Z:-2.5167 U:0.7371 V:0.9707
|
||||||
|
Vertex 65: X:1.3814 Y:0.2785 Z:-2.4293 U:0.7234 V:0.9805
|
||||||
|
Vertex 66: X:-0.7605 Y:0.3367 Z:-3.1118 U:0.8479 V:0.5907
|
||||||
|
Vertex 67: X:-2.5204 Y:0.4998 Z:0.0986 U:0.4205 V:0.2017
|
||||||
|
Vertex 68: X:1.2929 Y:-0.3897 Z:-2.2258 U:0.6969 V:0.9714
|
||||||
|
Vertex 69: X:1.4485 Y:-0.5212 Z:-1.5921 U:0.6061 V:0.9915
|
||||||
|
Vertex 70: X:1.5602 Y:-1.0751 Z:0.9443 U:0.2492 V:0.9766
|
||||||
|
Vertex 71: X:1.3267 Y:-1.2311 Z:1.8558 U:0.1246 V:0.9193
|
||||||
|
Vertex 72: X:1.2298 Y:-0.6186 Z:2.3488 U:0.0558 V:0.8823
|
||||||
|
Vertex 73: X:1.1902 Y:0.0546 Z:1.8936 U:0.1193 V:0.8717
|
||||||
|
Vertex 74: X:-0.2475 Y:-0.5444 Z:2.8769 U:0.0014 V:0.5952
|
||||||
|
Vertex 75: X:-0.1139 Y:0.1569 Z:2.8631 U:0.0005 V:0.6088
|
||||||
|
Vertex 76: X:-1.5713 Y:-1.0893 Z:2.4575 U:0.0789 V:0.3639
|
||||||
|
Vertex 77: X:-0.8311 Y:-2.3215 Z:-3.0474 U:0.8437 V:0.6205
|
||||||
|
Vertex 78: X:-0.3523 Y:-2.5606 Z:-2.8056 U:0.8036 V:0.7098
|
||||||
|
Vertex 79: X:0.7678 Y:-1.0448 Z:-2.5644 U:0.7525 V:0.8900
|
||||||
|
Vertex 80: X:-3.3753 Y:-1.6884 Z:-0.3637 U:0.5001 V:0.0862
|
||||||
|
Vertex 81: X:-1.5187 Y:-4.4011 Z:-3.7930 U:0.9606 V:0.5396
|
||||||
|
Vertex 82: X:-0.8047 Y:-4.8053 Z:-3.1296 U:0.8585 V:0.6682
|
||||||
|
Vertex 83: X:-1.9359 Y:-2.7587 Z:-3.2785 U:0.8916 V:0.4251
|
||||||
|
Vertex 84: X:-4.0845 Y:-4.0562 Z:-1.3600 U:0.6530 V:0.0105
|
||||||
|
Vertex 85: X:-4.0557 Y:-4.5166 Z:-2.8216 U:0.8585 V:0.0495
|
||||||
|
Vertex 86: X:-3.4184 Y:-4.2324 Z:-3.6130 U:0.9606 V:0.1781
|
||||||
|
Vertex 87: X:-0.6969 Y:-5.7733 Z:-1.0846 U:0.5713 V:0.6682
|
||||||
|
Vertex 88: X:-1.3343 Y:-6.0576 Z:-0.2933 U:0.4691 V:0.5396
|
||||||
|
Vertex 89: X:-2.1486 Y:-4.6071 Z:0.9693 U:0.3007 V:0.3407
|
||||||
|
Vertex 90: X:-3.2340 Y:-5.8889 Z:-0.1133 U:0.4691 V:0.1781
|
||||||
|
Vertex 91: X:-3.9480 Y:-5.4847 Z:-0.7766 U:0.5713 V:0.0495
|
||||||
|
Vertex 92: X:0.8034 Y:5.8989 Z:-1.8978 U:0.6483 V:0.7695
|
||||||
|
Vertex 93: X:1.0279 Y:5.9289 Z:0.4783 U:0.3116 V:0.7688
|
||||||
|
Vertex 94: X:-0.1537 Y:-3.8222 Z:-2.1096 U:0.7051 V:0.7556
|
||||||
|
Vertex 95: X:1.1132 Y:5.8643 Z:-1.3986 U:0.5741 V:0.8191
|
||||||
|
Vertex 96: X:0.9465 Y:5.8885 Z:-1.0601 U:0.5288 V:0.7815
|
||||||
|
Vertex 97: X:0.7872 Y:6.1296 Z:-0.8799 U:0.5053 V:0.7445
|
||||||
|
Vertex 98: X:0.6861 Y:6.1495 Z:-0.6390 U:0.4728 V:0.7210
|
||||||
|
Vertex 99: X:-0.9877 Y:6.0603 Z:-1.0013 U:0.5462 V:0.4156
|
||||||
|
Vertex 100: X:-0.5996 Y:6.0140 Z:-1.6679 U:0.6347 V:0.5009
|
||||||
|
Vertex 101: X:0.9959 Y:5.9278 Z:1.0930 U:0.2257 V:0.7520
|
||||||
|
Vertex 102: X:0.8191 Y:5.9476 Z:1.3631 U:0.1901 V:0.7137
|
||||||
|
Vertex 103: X:-0.3128 Y:6.0452 Z:1.3294 U:0.2099 V:0.5009
|
||||||
|
Vertex 104: X:-0.8203 Y:6.0784 Z:0.7476 U:0.2984 V:0.4156
|
||||||
|
Vertex 105: X:-0.0085 Y:6.2384 Z:0.6196 U:0.3052 V:0.5672
|
||||||
|
Vertex 106: X:0.7300 Y:5.0489 Z:-3.0159 U:0.8075 V:0.7896
|
||||||
|
Vertex 107: X:1.3698 Y:5.0000 Z:-2.7472 U:0.7613 V:0.9055
|
||||||
|
Vertex 108: X:0.7001 Y:5.3513 Z:-2.8284 U:0.7812 V:0.7757
|
||||||
|
Vertex 109: X:1.3394 Y:5.3027 Z:-2.5770 U:0.7373 V:0.8917
|
||||||
|
Vertex 110: X:-1.6526 Y:5.5825 Z:-1.3580 U:0.6059 V:0.3054
|
||||||
|
Vertex 111: X:-1.8168 Y:5.2987 Z:-1.4686 U:0.6241 V:0.2814
|
||||||
|
Vertex 112: X:-1.0449 Y:5.5101 Z:-2.4019 U:0.7445 V:0.4389
|
||||||
|
Vertex 113: X:-1.1767 Y:5.2224 Z:-2.5682 U:0.7700 V:0.4220
|
||||||
|
Vertex 114: X:1.5384 Y:4.9970 Z:-2.1231 U:0.6714 V:0.9260
|
||||||
|
Vertex 115: X:1.5076 Y:5.2990 Z:-1.9915 U:0.6529 V:0.9129
|
||||||
|
Vertex 116: X:1.2818 Y:5.3265 Z:-1.4501 U:0.5798 V:0.8606
|
||||||
|
Vertex 117: X:1.4677 Y:5.0648 Z:1.2194 U:0.2029 V:0.8524
|
||||||
|
Vertex 118: X:1.3960 Y:5.3648 Z:1.1047 U:0.2195 V:0.8360
|
||||||
|
Vertex 119: X:1.4282 Y:5.0818 Z:1.9444 U:0.1016 V:0.8318
|
||||||
|
Vertex 120: X:1.1346 Y:5.1146 Z:2.3941 U:0.0424 V:0.7684
|
||||||
|
Vertex 121: X:1.3489 Y:5.3816 Z:1.7845 U:0.1247 V:0.8148
|
||||||
|
Vertex 122: X:1.0631 Y:5.4134 Z:2.2113 U:0.0686 V:0.7532
|
||||||
|
Vertex 123: X:-0.7072 Y:5.2734 Z:2.3389 U:0.0746 V:0.4220
|
||||||
|
Vertex 124: X:-1.5444 Y:5.3283 Z:1.3792 U:0.2205 V:0.2814
|
||||||
|
Vertex 125: X:-0.6099 Y:5.5573 Z:2.1447 U:0.1002 V:0.4389
|
||||||
|
Vertex 126: X:-1.4047 Y:5.6094 Z:1.2337 U:0.2387 V:0.3054
|
||||||
|
Vertex 127: X:0.8365 Y:0.1492 Z:-2.8524 U:0.7903 V:0.8881
|
||||||
|
Vertex 128: X:0.2950 Y:0.4010 Z:-3.0643 U:0.8269 V:0.7863
|
||||||
|
Vertex 129: X:-2.4717 Y:0.2736 Z:-1.4073 U:0.6316 V:0.2412
|
||||||
|
Vertex 130: X:-1.7985 Y:0.3707 Z:-2.5817 U:0.7873 V:0.3865
|
||||||
|
Vertex 131: X:1.3448 Y:0.0208 Z:-2.1844 U:0.6898 V:0.9735
|
||||||
|
Vertex 132: X:1.4024 Y:-0.0528 Z:-1.5434 U:0.5992 V:0.9742
|
||||||
|
Vertex 133: X:1.2247 Y:0.2801 Z:-2.1473 U:0.6859 V:0.9461
|
||||||
|
Vertex 134: X:1.1497 Y:0.2590 Z:-1.5453 U:0.6024 V:0.9218
|
||||||
|
Vertex 135: X:1.5471 Y:-0.4431 Z:0.9701 U:0.2449 V:0.9632
|
||||||
|
Vertex 136: X:1.4467 Y:-0.5530 Z:1.7793 U:0.1328 V:0.9319
|
||||||
|
Vertex 137: X:1.2919 Y:0.1301 Z:0.9129 U:0.2555 V:0.9069
|
||||||
|
Vertex 138: X:1.0619 Y:-0.6306 Z:2.5415 U:0.0310 V:0.8476
|
||||||
|
Vertex 139: X:0.6344 Y:-0.6140 Z:2.7307 U:0.0102 V:0.7640
|
||||||
|
Vertex 140: X:1.0985 Y:0.0577 Z:2.3185 U:0.0608 V:0.8470
|
||||||
|
Vertex 141: X:0.7388 Y:0.0839 Z:2.6615 U:0.0175 V:0.7731
|
||||||
|
Vertex 142: X:-2.0922 Y:0.3975 Z:1.5630 U:0.2093 V:0.2576
|
||||||
|
Vertex 143: X:-0.0206 Y:-1.7185 Z:-2.8353 U:0.8021 V:0.7584
|
||||||
|
Vertex 144: X:-2.4047 Y:-1.1937 Z:-2.5856 U:0.7983 V:0.2991
|
||||||
|
Vertex 145: X:0.4916 Y:-2.0244 Z:-2.2954 U:0.7199 V:0.8498
|
||||||
|
Vertex 146: X:0.9510 Y:-1.1378 Z:-2.2636 U:0.7079 V:0.9205
|
||||||
|
Vertex 147: X:1.1319 Y:-1.3218 Z:-1.6746 U:0.6231 V:0.9470
|
||||||
|
Vertex 148: X:0.5153 Y:-2.9471 Z:0.4603 U:0.3340 V:0.8207
|
||||||
|
Vertex 149: X:-0.0687 Y:-3.0800 Z:1.3763 U:0.2134 V:0.6974
|
||||||
|
Vertex 150: X:-1.8807 Y:-1.8401 Z:2.1602 U:0.1258 V:0.3237
|
||||||
|
Vertex 151: X:-2.6986 Y:-1.4516 Z:1.2433 U:0.2650 V:0.1804
|
||||||
|
Vertex 152: X:-0.7072 Y:-4.0367 Z:-3.0377 U:0.8431 V:0.6720
|
||||||
|
Vertex 153: X:-1.0797 Y:-3.0214 Z:-3.2133 U:0.8713 V:0.5886
|
||||||
|
Vertex 154: X:-0.5689 Y:-3.3153 Z:-2.8800 U:0.8181 V:0.6832
|
||||||
|
Vertex 155: X:-2.9168 Y:-2.6554 Z:-2.9076 U:0.8525 V:0.2332
|
||||||
|
Vertex 156: X:-1.3298 Y:-5.3967 Z:0.1591 U:0.4046 V:0.5214
|
||||||
|
Vertex 157: X:-0.3590 Y:-4.5604 Z:-0.2337 U:0.4455 V:0.6962
|
||||||
|
Vertex 158: X:-3.2422 Y:-5.0790 Z:0.3393 U:0.4045 V:0.1550
|
||||||
|
Vertex 159: X:-3.8451 Y:-4.5948 Z:-0.3375 U:0.5070 V:0.0461
|
||||||
|
Vertex 160: X:-3.0726 Y:-4.2465 Z:0.7743 U:0.3400 V:0.1652
|
||||||
|
Vertex 161: X:-3.6694 Y:-3.7331 Z:0.0768 U:0.4452 V:0.0574
|
||||||
|
Face list:
|
||||||
|
Face 0: A:108 B:46 C:17 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 1: A:19 B:2 C:18 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 2: A:92 B:0 C:97 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 3: A:92 B:108 C:17 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 4: A:92 B:19 C:18 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 5: A:17 B:0 C:92 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 6: A:18 B:108 C:92 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 7: A:97 B:19 C:92 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 8: A:20 B:1 C:22 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 9: A:93 B:20 C:22 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 10: A:21 B:20 C:93 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 11: A:10 B:23 C:24 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 12: A:9 B:10 C:24 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 13: A:25 B:14 C:28 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 14: A:27 B:12 C:145 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 15: A:94 B:25 C:28 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 16: A:94 B:147 C:26 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 17: A:94 B:27 C:145 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 18: A:26 B:25 C:94 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 19: A:145 B:147 C:94 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 20: A:28 B:27 C:94 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 21: A:29 B:0 C:31 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 22: A:31 B:30 C:1 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 23: A:1 B:29 C:31 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 24: A:96 B:95 C:98 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 25: A:97 B:98 C:95 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 26: A:32 B:2 C:95 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 27: A:19 B:95 C:2 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 28: A:53 B:96 C:21 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 29: A:20 B:98 C:1 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 30: A:0 B:29 C:97 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 31: A:95 B:96 C:32 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 32: A:98 B:20 C:96 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 33: A:21 B:96 C:20 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 34: A:29 B:1 C:97 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 35: A:98 B:97 C:1 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 36: A:95 B:19 C:97 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 37: A:0 B:99 C:31 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 38: A:99 B:34 C:33 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 39: A:48 B:33 C:34 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 40: A:17 B:46 C:100 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 41: A:35 B:100 C:46 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 42: A:33 B:31 C:99 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 43: A:100 B:35 C:99 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 44: A:34 B:99 C:35 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 45: A:0 B:17 C:100 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 46: A:99 B:0 C:100 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 47: A:102 B:101 C:39 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 48: A:22 B:39 C:101 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 49: A:36 B:93 C:101 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 50: A:102 B:38 C:37 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 51: A:57 B:37 C:38 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 52: A:30 B:31 C:39 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 53: A:1 B:30 C:22 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 54: A:37 B:36 C:102 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 55: A:101 B:102 C:36 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 56: A:38 B:102 C:39 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 57: A:39 B:22 C:30 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 58: A:101 B:93 C:22 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 59: A:105 B:104 C:103 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 60: A:40 B:57 C:103 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 61: A:38 B:103 C:57 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 62: A:104 B:33 C:41 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 63: A:48 B:41 C:33 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 64: A:105 B:39 C:31 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 65: A:41 B:40 C:104 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 66: A:103 B:104 C:40 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 67: A:33 B:104 C:31 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 68: A:104 B:105 C:31 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 69: A:103 B:38 C:105 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 70: A:39 B:105 C:38 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 71: A:107 B:106 C:109 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 72: A:108 B:109 C:106 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 73: A:42 B:3 C:106 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 74: A:47 B:106 C:3 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 75: A:107 B:44 C:43 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 76: A:4 B:43 C:44 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 77: A:18 B:2 C:109 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 78: A:45 B:109 C:2 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 79: A:43 B:42 C:107 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 80: A:106 B:107 C:42 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 81: A:109 B:45 C:107 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 82: A:44 B:107 C:45 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 83: A:109 B:108 C:18 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 84: A:106 B:47 C:108 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 85: A:46 B:108 C:47 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 86: A:111 B:110 C:113 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 87: A:112 B:113 C:110 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 88: A:34 B:110 C:48 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 89: A:47 B:3 C:113 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 90: A:50 B:113 C:3 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 91: A:112 B:35 C:46 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 92: A:49 B:48 C:111 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 93: A:110 B:111 C:48 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 94: A:113 B:50 C:111 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 95: A:46 B:47 C:112 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 96: A:113 B:112 C:47 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 97: A:110 B:34 C:112 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 98: A:35 B:112 C:34 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 99: A:115 B:116 C:114 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 100: A:51 B:4 C:114 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 101: A:44 B:114 C:4 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 102: A:96 B:53 C:116 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 103: A:115 B:45 C:32 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 104: A:2 B:32 C:45 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 105: A:114 B:116 C:51 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 106: A:52 B:116 C:53 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 107: A:32 B:96 C:115 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 108: A:116 B:115 C:96 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 109: A:114 B:44 C:115 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 110: A:45 B:115 C:44 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 111: A:117 B:52 C:118 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 112: A:118 B:53 C:21 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 113: A:21 B:93 C:118 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 114: A:53 B:118 C:52 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 115: A:120 B:119 C:122 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 116: A:121 B:122 C:119 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 117: A:54 B:117 C:119 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 118: A:120 B:56 C:55 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 119: A:5 B:55 C:56 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 120: A:37 B:57 C:122 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 121: A:121 B:118 C:36 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 122: A:93 B:36 C:118 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 123: A:55 B:54 C:120 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 124: A:119 B:120 C:54 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 125: A:122 B:57 C:120 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 126: A:56 B:120 C:57 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 127: A:36 B:37 C:121 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 128: A:122 B:121 C:37 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 129: A:119 B:117 C:121 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 130: A:118 B:121 C:117 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 131: A:124 B:123 C:126 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 132: A:125 B:126 C:123 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 133: A:58 B:5 C:123 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 134: A:56 B:123 C:5 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 135: A:41 B:48 C:126 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 136: A:125 B:57 C:40 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 137: A:123 B:124 C:58 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 138: A:126 B:48 C:124 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 139: A:49 B:124 C:48 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 140: A:40 B:41 C:125 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 141: A:126 B:125 C:41 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 142: A:123 B:56 C:125 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 143: A:57 B:125 C:56 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 144: A:6 B:43 C:4 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 145: A:50 B:130 C:129 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 146: A:67 B:49 C:129 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 147: A:111 B:129 C:49 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 148: A:130 B:50 C:3 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 149: A:129 B:111 C:50 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 150: A:59 B:6 C:51 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 151: A:60 B:59 C:116 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 152: A:51 B:116 C:59 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 153: A:60 B:116 C:52 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 154: A:4 B:51 C:6 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 155: A:61 B:60 C:117 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 156: A:52 B:117 C:60 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 157: A:62 B:61 C:54 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 158: A:117 B:54 C:61 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 159: A:55 B:75 C:63 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 160: A:63 B:62 C:55 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 161: A:54 B:55 C:62 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 162: A:75 B:55 C:5 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 163: A:124 B:49 C:142 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 164: A:67 B:142 C:49 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 165: A:142 B:58 C:124 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 166: A:5 B:58 C:75 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 167: A:7 B:127 C:64 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 168: A:43 B:6 C:127 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 169: A:65 B:127 C:6 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 170: A:128 B:66 C:42 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 171: A:3 B:42 C:66 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 172: A:64 B:127 C:65 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 173: A:42 B:43 C:128 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 174: A:127 B:128 C:43 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 175: A:3 B:66 C:130 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 176: A:132 B:131 C:134 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 177: A:133 B:134 C:131 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 178: A:68 B:7 C:131 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 179: A:64 B:131 C:7 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 180: A:8 B:69 C:132 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 181: A:137 B:134 C:60 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 182: A:133 B:65 C:59 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 183: A:6 B:59 C:65 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 184: A:69 B:68 C:132 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 185: A:131 B:132 C:68 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 186: A:134 B:137 C:132 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 187: A:59 B:60 C:133 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 188: A:134 B:133 C:60 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 189: A:131 B:64 C:133 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 190: A:65 B:133 C:64 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 191: A:136 B:135 C:73 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 192: A:137 B:73 C:135 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 193: A:70 B:8 C:135 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 194: A:132 B:135 C:8 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 195: A:136 B:72 C:71 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 196: A:9 B:71 C:72 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 197: A:71 B:70 C:136 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 198: A:135 B:136 C:70 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 199: A:72 B:136 C:73 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 200: A:60 B:61 C:137 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 201: A:73 B:137 C:61 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 202: A:135 B:132 C:137 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 203: A:139 B:138 C:141 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 204: A:140 B:141 C:138 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 205: A:72 B:138 C:9 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 206: A:139 B:74 C:10 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 207: A:63 B:75 C:141 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 208: A:140 B:73 C:62 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 209: A:61 B:62 C:73 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 210: A:10 B:9 C:139 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 211: A:138 B:139 C:9 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 212: A:141 B:75 C:139 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 213: A:74 B:139 C:75 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 214: A:62 B:63 C:140 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 215: A:141 B:140 C:63 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 216: A:138 B:72 C:140 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 217: A:73 B:140 C:72 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 218: A:151 B:76 C:142 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 219: A:74 B:76 C:10 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 220: A:76 B:75 C:58 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 221: A:142 B:67 C:151 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 222: A:58 B:142 C:76 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 223: A:75 B:76 C:74 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 224: A:128 B:143 C:77 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 225: A:143 B:145 C:78 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 226: A:12 B:78 C:145 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 227: A:127 B:7 C:143 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 228: A:79 B:143 C:7 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 229: A:78 B:77 C:143 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 230: A:145 B:143 C:79 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 231: A:143 B:128 C:127 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 232: A:77 B:11 C:128 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 233: A:66 B:128 C:11 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 234: A:155 B:144 C:11 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 235: A:144 B:130 C:66 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 236: A:80 B:67 C:129 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 237: A:144 B:155 C:129 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 238: A:66 B:11 C:144 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 239: A:130 B:144 C:129 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 240: A:146 B:147 C:145 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 241: A:26 B:147 C:8 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 242: A:69 B:8 C:147 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 243: A:146 B:79 C:68 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 244: A:7 B:68 C:79 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 245: A:68 B:69 C:146 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 246: A:147 B:146 C:69 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 247: A:79 B:146 C:145 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 248: A:149 B:148 C:9 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 249: A:157 B:26 C:148 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 250: A:8 B:148 C:26 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 251: A:149 B:23 C:156 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 252: A:89 B:156 C:23 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 253: A:148 B:8 C:70 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 254: A:156 B:157 C:149 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 255: A:148 B:149 C:157 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 256: A:9 B:24 C:149 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 257: A:23 B:149 C:24 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 258: A:70 B:71 C:148 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 259: A:9 B:148 C:71 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 260: A:23 B:150 C:89 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 261: A:150 B:10 C:76 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 262: A:80 B:151 C:67 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 263: A:76 B:151 C:150 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 264: A:10 B:150 C:23 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 265: A:152 B:153 C:154 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 266: A:81 B:13 C:153 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 267: A:83 B:153 C:13 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 268: A:152 B:28 C:82 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 269: A:14 B:82 C:28 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 270: A:78 B:12 C:154 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 271: A:27 B:154 C:12 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 272: A:153 B:83 C:77 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 273: A:11 B:77 C:83 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 274: A:82 B:81 C:152 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 275: A:153 B:152 C:81 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 276: A:154 B:27 C:152 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 277: A:28 B:152 C:27 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 278: A:77 B:78 C:153 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 279: A:154 B:153 C:78 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 280: A:84 B:80 C:85 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 281: A:129 B:85 C:80 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 282: A:16 B:84 C:85 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 283: A:83 B:13 C:155 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 284: A:86 B:155 C:13 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 285: A:11 B:83 C:155 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 286: A:155 B:86 C:85 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 287: A:85 B:129 C:155 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 288: A:87 B:14 C:157 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 289: A:25 B:157 C:14 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 290: A:156 B:89 C:88 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 291: A:15 B:88 C:89 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 292: A:88 B:87 C:156 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 293: A:157 B:156 C:87 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 294: A:26 B:157 C:25 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 295: A:159 B:158 C:161 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 296: A:160 B:161 C:158 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 297: A:90 B:15 C:158 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 298: A:89 B:158 C:15 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 299: A:159 B:84 C:91 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 300: A:16 B:91 C:84 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 301: A:151 B:80 C:161 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 302: A:84 B:161 C:80 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 303: A:160 B:89 C:150 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 304: A:91 B:90 C:159 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 305: A:158 B:159 C:90 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 306: A:161 B:84 C:159 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 307: A:150 B:151 C:160 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 308: A:161 B:160 C:151 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 309: A:158 B:89 C:160 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 310: A:91 B:16 C:82 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 311: A:85 B:82 C:16 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 312: A:82 B:88 C:90 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 313: A:15 B:90 C:88 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 314: A:87 B:82 C:14 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 315: A:82 B:86 C:81 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 316: A:13 B:81 C:86 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 317: A:90 B:91 C:82 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 318: A:88 B:82 C:87 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 319: A:86 B:82 C:85 AB:1 BC:0 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
|
1221
data/leftpalm.asc
Normal file
BIN
data/menu.mp3
Normal file
BIN
data/menuchange.wav
Normal file
BIN
data/menuselect.wav
Normal file
BIN
data/perusnaama3.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
810
data/rightarm.asc
Normal file
|
@ -0,0 +1,810 @@
|
||||||
|
Ambient light color: Red=0.0000 Green=0.0000 Blue=0.0000
|
||||||
|
|
||||||
|
Named object: "BlockoHandRight"
|
||||||
|
Tri-mesh, Vertices: 162 Faces: 320
|
||||||
|
Mapped
|
||||||
|
Vertex list:
|
||||||
|
Vertex 0: X:-0.3396 Y:6.4827 Z:-0.3438 U:0.4367 V:0.6319
|
||||||
|
Vertex 1: X:-0.3939 Y:6.4821 Z:-0.2495 U:0.4227 V:0.6404
|
||||||
|
Vertex 2: X:-1.7823 Y:5.6955 Z:-1.9743 U:0.6480 V:0.9382
|
||||||
|
Vertex 3: X:0.0897 Y:4.6339 Z:-3.1671 U:0.8426 V:0.6169
|
||||||
|
Vertex 4: X:-1.9842 Y:4.5610 Z:-2.4432 U:0.7134 V:0.9940
|
||||||
|
Vertex 5: X:-0.4746 Y:4.7202 Z:2.7651 U:0.0020 V:0.6169
|
||||||
|
Vertex 6: X:-1.7881 Y:0.9420 Z:-2.3719 U:0.7134 V:0.9865
|
||||||
|
Vertex 7: X:-1.4993 Y:-0.1847 Z:-2.5700 U:0.7474 V:0.9453
|
||||||
|
Vertex 8: X:-1.9750 Y:-0.6292 Z:-0.3795 U:0.4344 V:0.9995
|
||||||
|
Vertex 9: X:-1.4042 Y:-1.1855 Z:2.5612 U:0.0303 V:0.8449
|
||||||
|
Vertex 10: X:0.0527 Y:-1.2002 Z:2.7491 U:0.0234 V:0.5682
|
||||||
|
Vertex 11: X:1.2196 Y:-2.0275 Z:-3.0829 U:0.8595 V:0.4596
|
||||||
|
Vertex 12: X:-0.4274 Y:-2.6892 Z:-2.4606 U:0.7515 V:0.7633
|
||||||
|
Vertex 13: X:1.9385 Y:-4.1956 Z:-3.9799 U:0.9995 V:0.3588
|
||||||
|
Vertex 14: X:-0.0984 Y:-5.2343 Z:-2.1315 U:0.7149 V:0.7172
|
||||||
|
Vertex 15: X:1.6413 Y:-6.1032 Z:0.0737 U:0.4303 V:0.3588
|
||||||
|
Vertex 16: X:3.6782 Y:-5.0645 Z:-1.7747 U:0.7149 V:0.0005
|
||||||
|
Vertex 17: X:-0.1049 Y:6.0447 Z:-1.9655 U:0.6684 V:0.6203
|
||||||
|
Vertex 18: X:-1.3404 Y:5.7078 Z:-2.2760 U:0.6962 V:0.8605
|
||||||
|
Vertex 19: X:-1.4457 Y:5.9900 Z:-1.5546 U:0.5930 V:0.8651
|
||||||
|
Vertex 20: X:-0.7475 Y:6.2802 Z:-0.3071 U:0.4265 V:0.7095
|
||||||
|
Vertex 21: X:-1.0331 Y:6.0347 Z:-0.3526 U:0.4296 V:0.7660
|
||||||
|
Vertex 22: X:-0.7957 Y:6.2908 Z:0.3133 U:0.3387 V:0.7074
|
||||||
|
Vertex 23: X:0.7303 Y:-2.8999 Z:1.9860 U:0.1430 V:0.4689
|
||||||
|
Vertex 24: X:-0.6435 Y:-2.0387 Z:2.3390 U:0.0734 V:0.7132
|
||||||
|
Vertex 25: X:-0.2625 Y:-4.7027 Z:-1.7143 U:0.6530 V:0.7361
|
||||||
|
Vertex 26: X:-0.4861 Y:-4.0767 Z:-1.3472 U:0.5972 V:0.7663
|
||||||
|
Vertex 27: X:-0.2352 Y:-3.5331 Z:-2.3753 U:0.7438 V:0.7328
|
||||||
|
Vertex 28: X:-0.1255 Y:-4.3815 Z:-2.2656 U:0.7316 V:0.7174
|
||||||
|
Vertex 29: X:-0.3712 Y:6.4743 Z:-0.3170 U:0.4325 V:0.6374
|
||||||
|
Vertex 30: X:-0.3961 Y:6.4833 Z:-0.1844 U:0.4136 V:0.6396
|
||||||
|
Vertex 31: X:-0.3207 Y:6.4871 Z:-0.1510 U:0.4099 V:0.6249
|
||||||
|
Vertex 32: X:-1.4727 Y:5.7114 Z:-1.7734 U:0.6239 V:0.8764
|
||||||
|
Vertex 33: X:0.9795 Y:6.1262 Z:-0.1106 U:0.4223 V:0.3831
|
||||||
|
Vertex 34: X:1.2980 Y:5.8397 Z:-1.2469 U:0.5867 V:0.3459
|
||||||
|
Vertex 35: X:0.7828 Y:5.8010 Z:-2.1281 U:0.7036 V:0.4586
|
||||||
|
Vertex 36: X:-1.3344 Y:5.7789 Z:1.5211 U:0.1630 V:0.7915
|
||||||
|
Vertex 37: X:-1.1006 Y:5.7948 Z:1.8816 U:0.1155 V:0.7410
|
||||||
|
Vertex 38: X:-0.4353 Y:6.0953 Z:1.5082 U:0.1762 V:0.6203
|
||||||
|
Vertex 39: X:-0.4019 Y:6.3152 Z:0.7688 U:0.2800 V:0.6252
|
||||||
|
Vertex 40: X:0.4051 Y:5.8587 Z:1.8421 U:0.1410 V:0.4586
|
||||||
|
Vertex 41: X:1.0773 Y:5.8734 Z:1.0731 U:0.2579 V:0.3459
|
||||||
|
Vertex 42: X:-0.8718 Y:4.5937 Z:-3.1217 U:0.8235 V:0.7969
|
||||||
|
Vertex 43: X:-1.5090 Y:4.5725 Z:-2.8412 U:0.7757 V:0.9118
|
||||||
|
Vertex 44: X:-1.9910 Y:5.1373 Z:-2.3710 U:0.7020 V:0.9891
|
||||||
|
Vertex 45: X:-1.9536 Y:5.4376 Z:-2.2388 U:0.6834 V:0.9772
|
||||||
|
Vertex 46: X:0.0289 Y:5.5060 Z:-2.8763 U:0.7992 V:0.6158
|
||||||
|
Vertex 47: X:0.0568 Y:5.2086 Z:-3.0614 U:0.8262 V:0.6164
|
||||||
|
Vertex 48: X:1.6895 Y:5.6308 Z:-0.0359 U:0.4223 V:0.2527
|
||||||
|
Vertex 49: X:1.8362 Y:5.3423 Z:-0.0177 U:0.4223 V:0.2273
|
||||||
|
Vertex 50: X:1.1278 Y:4.6882 Z:-2.6601 U:0.7852 V:0.4126
|
||||||
|
Vertex 51: X:-1.6797 Y:4.5773 Z:-2.1929 U:0.6823 V:0.9323
|
||||||
|
Vertex 52: X:-1.4662 Y:5.1922 Z:-0.4148 U:0.4343 V:0.8555
|
||||||
|
Vertex 53: X:-1.3925 Y:5.4907 Z:-0.4064 U:0.4335 V:0.8390
|
||||||
|
Vertex 54: X:-1.6034 Y:4.6597 Z:2.0474 U:0.0878 V:0.8421
|
||||||
|
Vertex 55: X:-1.3018 Y:4.6802 Z:2.5124 U:0.0265 V:0.7770
|
||||||
|
Vertex 56: X:-0.4854 Y:5.2915 Z:2.6385 U:0.0184 V:0.6164
|
||||||
|
Vertex 57: X:-0.4771 Y:5.5834 Z:2.4430 U:0.0454 V:0.6158
|
||||||
|
Vertex 58: X:0.6406 Y:4.7627 Z:2.4615 U:0.0594 V:0.4126
|
||||||
|
Vertex 59: X:-1.5027 Y:0.9574 Z:-2.1234 U:0.6823 V:0.9284
|
||||||
|
Vertex 60: X:-1.3190 Y:0.9748 Z:-1.5546 U:0.6049 V:0.8837
|
||||||
|
Vertex 61: X:-1.4843 Y:1.0232 Z:1.3618 U:0.1931 V:0.8626
|
||||||
|
Vertex 62: X:-1.4470 Y:1.0389 Z:2.1150 U:0.0878 V:0.8421
|
||||||
|
Vertex 63: X:-1.1454 Y:1.0594 Z:2.5799 U:0.0265 V:0.7770
|
||||||
|
Vertex 64: X:-1.6570 Y:0.2006 Z:-2.5167 U:0.7371 V:0.9707
|
||||||
|
Vertex 65: X:-1.7277 Y:0.4328 Z:-2.4293 U:0.7234 V:0.9805
|
||||||
|
Vertex 66: X:0.4147 Y:0.3976 Z:-3.1118 U:0.8479 V:0.5907
|
||||||
|
Vertex 67: X:2.1800 Y:0.4837 Z:0.0986 U:0.4205 V:0.2017
|
||||||
|
Vertex 68: X:-1.6684 Y:-0.2386 Z:-2.2258 U:0.6969 V:0.9714
|
||||||
|
Vertex 69: X:-1.8296 Y:-0.3632 Z:-1.5921 U:0.6061 V:0.9915
|
||||||
|
Vertex 70: X:-1.9653 Y:-0.9117 Z:0.9443 U:0.2492 V:0.9766
|
||||||
|
Vertex 71: X:-1.7389 Y:-1.0777 Z:1.8558 U:0.1246 V:0.9193
|
||||||
|
Vertex 72: X:-1.6153 Y:-0.4701 Z:2.3488 U:0.0558 V:0.8823
|
||||||
|
Vertex 73: X:-1.5464 Y:0.2008 Z:1.8936 U:0.1193 V:0.8717
|
||||||
|
Vertex 74: X:-0.1362 Y:-0.4604 Z:2.8769 U:0.0014 V:0.5952
|
||||||
|
Vertex 75: X:-0.2391 Y:0.2461 Z:2.8631 U:0.0005 V:0.6088
|
||||||
|
Vertex 76: X:1.1625 Y:-1.0625 Z:2.4575 U:0.0789 V:0.3639
|
||||||
|
Vertex 77: X:0.3693 Y:-2.2612 Z:-3.0474 U:0.8437 V:0.6205
|
||||||
|
Vertex 78: X:-0.1195 Y:-2.4792 Z:-2.8056 U:0.8036 V:0.7098
|
||||||
|
Vertex 79: X:-1.1724 Y:-0.9159 Z:-2.5644 U:0.7525 V:0.8900
|
||||||
|
Vertex 80: X:2.9386 Y:-1.7397 Z:-0.3637 U:0.5001 V:0.0862
|
||||||
|
Vertex 81: X:0.9655 Y:-4.3688 Z:-3.7930 U:0.9606 V:0.5396
|
||||||
|
Vertex 82: X:0.2346 Y:-4.7415 Z:-3.1296 U:0.8585 V:0.6682
|
||||||
|
Vertex 83: X:1.4540 Y:-2.7462 Z:-3.2785 U:0.8916 V:0.4251
|
||||||
|
Vertex 84: X:3.5439 Y:-4.1362 Z:-1.3600 U:0.6530 V:0.0105
|
||||||
|
Vertex 85: X:3.4951 Y:-4.5949 Z:-2.8216 U:0.8585 V:0.0495
|
||||||
|
Vertex 86: X:2.8708 Y:-4.2831 Z:-3.6130 U:0.9606 V:0.1781
|
||||||
|
Vertex 87: X:0.0847 Y:-5.7039 Z:-1.0846 U:0.5713 V:0.6682
|
||||||
|
Vertex 88: X:0.7090 Y:-6.0157 Z:-0.2933 U:0.4691 V:0.5396
|
||||||
|
Vertex 89: X:1.5858 Y:-4.6021 Z:0.9693 U:0.3007 V:0.3407
|
||||||
|
Vertex 90: X:2.6142 Y:-5.9301 Z:-0.1133 U:0.4691 V:0.1781
|
||||||
|
Vertex 91: X:3.3452 Y:-5.5573 Z:-0.7766 U:0.5713 V:0.0495
|
||||||
|
Vertex 92: X:-0.9051 Y:6.0227 Z:-1.8978 U:0.6483 V:0.7695
|
||||||
|
Vertex 93: X:-1.1280 Y:6.0624 Z:0.4783 U:0.3116 V:0.7688
|
||||||
|
Vertex 94: X:-0.3729 Y:-3.7310 Z:-2.1096 U:0.7051 V:0.7556
|
||||||
|
Vertex 95: X:-1.2161 Y:6.0016 Z:-1.3986 U:0.5741 V:0.8191
|
||||||
|
Vertex 96: X:-1.0485 Y:6.0185 Z:-1.0601 U:0.5288 V:0.7815
|
||||||
|
Vertex 97: X:-0.8789 Y:6.2524 Z:-0.8799 U:0.5053 V:0.7445
|
||||||
|
Vertex 98: X:-0.7770 Y:6.2679 Z:-0.6390 U:0.4728 V:0.7210
|
||||||
|
Vertex 99: X:0.8913 Y:6.1057 Z:-1.0013 U:0.5462 V:0.4156
|
||||||
|
Vertex 100: X:0.5016 Y:6.0765 Z:-1.6679 U:0.6347 V:0.5009
|
||||||
|
Vertex 101: X:-1.0961 Y:6.0599 Z:1.0930 U:0.2257 V:0.7520
|
||||||
|
Vertex 102: X:-0.9187 Y:6.0720 Z:1.3631 U:0.1901 V:0.7137
|
||||||
|
Vertex 103: X:0.2165 Y:6.1201 Z:1.3294 U:0.2099 V:0.5009
|
||||||
|
Vertex 104: X:0.7249 Y:6.1312 Z:0.7476 U:0.2984 V:0.4156
|
||||||
|
Vertex 105: X:-0.0791 Y:6.3264 Z:0.6196 U:0.3052 V:0.5672
|
||||||
|
Vertex 106: X:-0.8688 Y:5.1703 Z:-3.0159 U:0.8075 V:0.7896
|
||||||
|
Vertex 107: X:-1.5102 Y:5.1493 Z:-2.7472 U:0.7613 V:0.9055
|
||||||
|
Vertex 108: X:-0.8257 Y:5.4711 Z:-2.8284 U:0.7812 V:0.7757
|
||||||
|
Vertex 109: X:-1.4666 Y:5.4504 Z:-2.5770 U:0.7373 V:0.8917
|
||||||
|
Vertex 110: X:1.5348 Y:5.5994 Z:-1.3580 U:0.6059 V:0.3054
|
||||||
|
Vertex 111: X:1.6865 Y:5.3087 Z:-1.4686 U:0.6241 V:0.2814
|
||||||
|
Vertex 112: X:0.9245 Y:5.5536 Z:-2.4019 U:0.7445 V:0.4389
|
||||||
|
Vertex 113: X:1.0436 Y:5.2604 Z:-2.5682 U:0.7700 V:0.4220
|
||||||
|
Vertex 114: X:-1.6787 Y:5.1537 Z:-2.1231 U:0.6714 V:0.9260
|
||||||
|
Vertex 115: X:-1.6348 Y:5.4540 Z:-1.9915 U:0.6529 V:0.9129
|
||||||
|
Vertex 116: X:-1.4080 Y:5.4717 Z:-1.4501 U:0.5798 V:0.8606
|
||||||
|
Vertex 117: X:-1.6052 Y:5.2183 Z:1.2194 U:0.2029 V:0.8524
|
||||||
|
Vertex 118: X:-1.5205 Y:5.5149 Z:1.1047 U:0.2195 V:0.8360
|
||||||
|
Vertex 119: X:-1.5649 Y:5.2336 Z:1.9444 U:0.1016 V:0.8318
|
||||||
|
Vertex 120: X:-1.2702 Y:5.2535 Z:2.3941 U:0.0424 V:0.7684
|
||||||
|
Vertex 121: X:-1.4726 Y:5.5296 Z:1.7845 U:0.1247 V:0.8148
|
||||||
|
Vertex 122: X:-1.1857 Y:5.5489 Z:2.2113 U:0.0686 V:0.7532
|
||||||
|
Vertex 123: X:0.5768 Y:5.3318 Z:2.3389 U:0.0746 V:0.4220
|
||||||
|
Vertex 124: X:1.4156 Y:5.3502 Z:1.3792 U:0.2205 V:0.2814
|
||||||
|
Vertex 125: X:0.4920 Y:5.6197 Z:2.1447 U:0.1002 V:0.4389
|
||||||
|
Vertex 126: X:1.2882 Y:5.6371 Z:1.2337 U:0.2387 V:0.3054
|
||||||
|
Vertex 127: X:-1.1890 Y:0.2799 Z:-2.8524 U:0.7903 V:0.8881
|
||||||
|
Vertex 128: X:-0.6370 Y:0.5078 Z:-3.0643 U:0.8269 V:0.7863
|
||||||
|
Vertex 129: X:2.1215 Y:0.2599 Z:-1.4073 U:0.6316 V:0.2412
|
||||||
|
Vertex 130: X:1.4532 Y:0.3862 Z:-2.5817 U:0.7873 V:0.3865
|
||||||
|
Vertex 131: X:-1.7023 Y:0.1738 Z:-2.1844 U:0.6898 V:0.9735
|
||||||
|
Vertex 132: X:-1.7632 Y:0.1028 Z:-1.5434 U:0.5992 V:0.9742
|
||||||
|
Vertex 133: X:-1.5710 Y:0.4276 Z:-2.1473 U:0.6859 V:0.9461
|
||||||
|
Vertex 134: X:-1.4971 Y:0.4032 Z:-1.5453 U:0.6024 V:0.9218
|
||||||
|
Vertex 135: X:-1.9247 Y:-0.2809 Z:0.9701 U:0.2449 V:0.9632
|
||||||
|
Vertex 136: X:-1.8292 Y:-0.3950 Z:1.7793 U:0.1328 V:0.9319
|
||||||
|
Vertex 137: X:-1.6447 Y:0.2806 Z:0.9129 U:0.2555 V:0.9069
|
||||||
|
Vertex 138: X:-1.4481 Y:-0.4894 Z:2.5415 U:0.0310 V:0.8476
|
||||||
|
Vertex 139: X:-1.0204 Y:-0.4915 Z:2.7307 U:0.0102 V:0.7640
|
||||||
|
Vertex 140: X:-1.4547 Y:0.1999 Z:2.3185 U:0.0608 V:0.8470
|
||||||
|
Vertex 141: X:-1.0942 Y:0.2104 Z:2.6615 U:0.0175 V:0.7731
|
||||||
|
Vertex 142: X:1.7477 Y:0.4002 Z:1.5630 U:0.2093 V:0.2576
|
||||||
|
Vertex 143: X:-0.4142 Y:-1.6235 Z:-2.8353 U:0.8021 V:0.7584
|
||||||
|
Vertex 144: X:1.9905 Y:-1.2031 Z:-2.5856 U:0.7983 V:0.2991
|
||||||
|
Vertex 145: X:-0.9392 Y:-1.9067 Z:-2.2955 U:0.7199 V:0.8498
|
||||||
|
Vertex 146: X:-1.3595 Y:-1.0009 Z:-2.2636 U:0.7079 V:0.9205
|
||||||
|
Vertex 147: X:-1.5482 Y:-1.1768 Z:-1.6746 U:0.6231 V:0.9470
|
||||||
|
Vertex 148: X:-1.0031 Y:-2.8275 Z:0.4603 U:0.3340 V:0.8207
|
||||||
|
Vertex 149: X:-0.4254 Y:-2.9857 Z:1.3763 U:0.2134 V:0.6974
|
||||||
|
Vertex 150: X:1.4389 Y:-1.8261 Z:2.1602 U:0.1258 V:0.3237
|
||||||
|
Vertex 151: X:2.2730 Y:-1.4736 Z:1.2433 U:0.2650 V:0.1804
|
||||||
|
Vertex 152: X:0.1707 Y:-3.9693 Z:-3.0377 U:0.8431 V:0.6720
|
||||||
|
Vertex 153: X:0.5871 Y:-2.9713 Z:-3.2133 U:0.8713 V:0.5886
|
||||||
|
Vertex 154: X:0.0640 Y:-3.2426 Z:-2.8800 U:0.8181 V:0.6832
|
||||||
|
Vertex 155: X:2.4385 Y:-2.6858 Z:-2.9076 U:0.8525 V:0.2332
|
||||||
|
Vertex 156: X:0.7334 Y:-5.3553 Z:0.1591 U:0.4046 V:0.5214
|
||||||
|
Vertex 157: X:-0.2000 Y:-4.4774 Z:-0.2337 U:0.4455 V:0.6962
|
||||||
|
Vertex 158: X:2.6578 Y:-5.1213 Z:0.3393 U:0.4045 V:0.1550
|
||||||
|
Vertex 159: X:3.2813 Y:-4.6639 Z:-0.3375 U:0.5070 V:0.0461
|
||||||
|
Vertex 160: X:2.5247 Y:-4.2821 Z:0.7743 U:0.3400 V:0.1652
|
||||||
|
Vertex 161: X:3.1433 Y:-3.7953 Z:0.0768 U:0.4452 V:0.0574
|
||||||
|
Face list:
|
||||||
|
Face 0: A:46 B:108 C:17 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 1: A:2 B:19 C:18 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 2: A:0 B:92 C:97 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 3: A:108 B:92 C:17 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 4: A:19 B:92 C:18 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 5: A:0 B:17 C:92 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 6: A:108 B:18 C:92 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 7: A:19 B:97 C:92 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 8: A:1 B:20 C:22 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 9: A:20 B:93 C:22 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 10: A:20 B:21 C:93 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 11: A:23 B:10 C:24 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 12: A:10 B:9 C:24 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 13: A:14 B:25 C:28 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 14: A:12 B:27 C:145 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 15: A:25 B:94 C:28 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 16: A:147 B:94 C:26 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 17: A:27 B:94 C:145 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 18: A:25 B:26 C:94 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 19: A:147 B:145 C:94 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 20: A:27 B:28 C:94 AB:1 BC:1 CA:1
|
||||||
|
Smoothing: 1
|
||||||
|
Face 21: A:0 B:29 C:31 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 22: A:30 B:31 C:1 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 23: A:29 B:1 C:31 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 24: A:95 B:96 C:98 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 25: A:98 B:97 C:95 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 26: A:2 B:32 C:95 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 27: A:95 B:19 C:2 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 28: A:96 B:53 C:21 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 29: A:98 B:20 C:1 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 30: A:29 B:0 C:97 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 31: A:96 B:95 C:32 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 32: A:20 B:98 C:96 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 33: A:96 B:21 C:20 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 34: A:1 B:29 C:97 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 35: A:97 B:98 C:1 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 36: A:19 B:95 C:97 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 37: A:99 B:0 C:31 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 38: A:34 B:99 C:33 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 39: A:33 B:48 C:34 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 40: A:46 B:17 C:100 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 41: A:100 B:35 C:46 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 42: A:31 B:33 C:99 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 43: A:35 B:100 C:99 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 44: A:99 B:34 C:35 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 45: A:17 B:0 C:100 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 46: A:0 B:99 C:100 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 47: A:101 B:102 C:39 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 48: A:39 B:22 C:101 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 49: A:93 B:36 C:101 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 50: A:38 B:102 C:37 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 51: A:37 B:57 C:38 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 52: A:31 B:30 C:39 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 53: A:30 B:1 C:22 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 54: A:36 B:37 C:102 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 55: A:102 B:101 C:36 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 56: A:102 B:38 C:39 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 57: A:22 B:39 C:30 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 58: A:93 B:101 C:22 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 59: A:104 B:105 C:103 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 60: A:57 B:40 C:103 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 61: A:103 B:38 C:57 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 62: A:33 B:104 C:41 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 63: A:41 B:48 C:33 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 64: A:39 B:105 C:31 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 65: A:40 B:41 C:104 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 66: A:104 B:103 C:40 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 67: A:104 B:33 C:31 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 68: A:105 B:104 C:31 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 69: A:38 B:103 C:105 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 70: A:105 B:39 C:38 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 71: A:106 B:107 C:109 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 72: A:109 B:108 C:106 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 73: A:3 B:42 C:106 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 74: A:106 B:47 C:3 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 75: A:44 B:107 C:43 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 76: A:43 B:4 C:44 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 77: A:2 B:18 C:109 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 78: A:109 B:45 C:2 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 79: A:42 B:43 C:107 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 80: A:107 B:106 C:42 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 81: A:45 B:109 C:107 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 82: A:107 B:44 C:45 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 83: A:108 B:109 C:18 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 84: A:47 B:106 C:108 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 85: A:108 B:46 C:47 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 86: A:110 B:111 C:113 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 87: A:113 B:112 C:110 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 88: A:110 B:34 C:48 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 89: A:3 B:47 C:113 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 90: A:113 B:50 C:3 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 91: A:35 B:112 C:46 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 92: A:48 B:49 C:111 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 93: A:111 B:110 C:48 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 94: A:50 B:113 C:111 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 95: A:47 B:46 C:112 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 96: A:112 B:113 C:47 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 97: A:34 B:110 C:112 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 98: A:112 B:35 C:34 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 99: A:116 B:115 C:114 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 100: A:4 B:51 C:114 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 101: A:114 B:44 C:4 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 102: A:53 B:96 C:116 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 103: A:45 B:115 C:32 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 104: A:32 B:2 C:45 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 105: A:116 B:114 C:51 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 106: A:116 B:52 C:53 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 107: A:96 B:32 C:115 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 108: A:115 B:116 C:96 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 109: A:44 B:114 C:115 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 110: A:115 B:45 C:44 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 111: A:52 B:117 C:118 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 112: A:53 B:118 C:21 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 113: A:93 B:21 C:118 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 114: A:118 B:53 C:52 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 115: A:119 B:120 C:122 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 116: A:122 B:121 C:119 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 117: A:117 B:54 C:119 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 118: A:56 B:120 C:55 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 119: A:55 B:5 C:56 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 120: A:57 B:37 C:122 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 121: A:118 B:121 C:36 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 122: A:36 B:93 C:118 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 123: A:54 B:55 C:120 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 124: A:120 B:119 C:54 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 125: A:57 B:122 C:120 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 126: A:120 B:56 C:57 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 127: A:37 B:36 C:121 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 128: A:121 B:122 C:37 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 129: A:117 B:119 C:121 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 130: A:121 B:118 C:117 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 131: A:123 B:124 C:126 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 132: A:126 B:125 C:123 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 133: A:5 B:58 C:123 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 134: A:123 B:56 C:5 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 135: A:48 B:41 C:126 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 136: A:57 B:125 C:40 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 137: A:124 B:123 C:58 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 138: A:48 B:126 C:124 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 139: A:124 B:49 C:48 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 140: A:41 B:40 C:125 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 141: A:125 B:126 C:41 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 142: A:56 B:123 C:125 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 143: A:125 B:57 C:56 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 144: A:43 B:6 C:4 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 145: A:130 B:50 C:129 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 146: A:49 B:67 C:129 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 147: A:129 B:111 C:49 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 148: A:50 B:130 C:3 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 149: A:111 B:129 C:50 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 150: A:6 B:59 C:51 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 151: A:59 B:60 C:116 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 152: A:116 B:51 C:59 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 153: A:116 B:60 C:52 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 154: A:51 B:4 C:6 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 155: A:60 B:61 C:117 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 156: A:117 B:52 C:60 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 157: A:61 B:62 C:54 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 158: A:54 B:117 C:61 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 159: A:75 B:55 C:63 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 160: A:62 B:63 C:55 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 161: A:55 B:54 C:62 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 162: A:55 B:75 C:5 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 163: A:49 B:124 C:142 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 164: A:142 B:67 C:49 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 165: A:58 B:142 C:124 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 166: A:58 B:5 C:75 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 167: A:127 B:7 C:64 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 168: A:6 B:43 C:127 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 169: A:127 B:65 C:6 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 170: A:66 B:128 C:42 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 171: A:42 B:3 C:66 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 172: A:127 B:64 C:65 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 173: A:43 B:42 C:128 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 174: A:128 B:127 C:43 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 175: A:66 B:3 C:130 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 176: A:131 B:132 C:134 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 177: A:134 B:133 C:131 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 178: A:7 B:68 C:131 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 179: A:131 B:64 C:7 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 180: A:69 B:8 C:132 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 181: A:134 B:137 C:60 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 182: A:65 B:133 C:59 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 183: A:59 B:6 C:65 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 184: A:68 B:69 C:132 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 185: A:132 B:131 C:68 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 186: A:137 B:134 C:132 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 187: A:60 B:59 C:133 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 188: A:133 B:134 C:60 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 189: A:64 B:131 C:133 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 190: A:133 B:65 C:64 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 191: A:135 B:136 C:73 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 192: A:73 B:137 C:135 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 193: A:8 B:70 C:135 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 194: A:135 B:132 C:8 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 195: A:72 B:136 C:71 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 196: A:71 B:9 C:72 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 197: A:70 B:71 C:136 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 198: A:136 B:135 C:70 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 199: A:136 B:72 C:73 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 200: A:61 B:60 C:137 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 201: A:137 B:73 C:61 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 202: A:132 B:135 C:137 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 203: A:138 B:139 C:141 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 204: A:141 B:140 C:138 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 205: A:138 B:72 C:9 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 206: A:74 B:139 C:10 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 207: A:75 B:63 C:141 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 208: A:73 B:140 C:62 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 209: A:62 B:61 C:73 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 210: A:9 B:10 C:139 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 211: A:139 B:138 C:9 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 212: A:75 B:141 C:139 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 213: A:139 B:74 C:75 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 214: A:63 B:62 C:140 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 215: A:140 B:141 C:63 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 216: A:72 B:138 C:140 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 217: A:140 B:73 C:72 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 218: A:76 B:151 C:142 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 219: A:76 B:74 C:10 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 220: A:75 B:76 C:58 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 221: A:67 B:142 C:151 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 222: A:142 B:58 C:76 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 223: A:76 B:75 C:74 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 224: A:143 B:128 C:77 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 225: A:145 B:143 C:78 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 226: A:78 B:12 C:145 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 227: A:7 B:127 C:143 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 228: A:143 B:79 C:7 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 229: A:77 B:78 C:143 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 230: A:143 B:145 C:79 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 231: A:128 B:143 C:127 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 232: A:11 B:77 C:128 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 233: A:128 B:66 C:11 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 234: A:144 B:155 C:11 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 235: A:130 B:144 C:66 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 236: A:67 B:80 C:129 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 237: A:155 B:144 C:129 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 238: A:11 B:66 C:144 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 239: A:144 B:130 C:129 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 240: A:147 B:146 C:145 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 241: A:147 B:26 C:8 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 242: A:8 B:69 C:147 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 243: A:79 B:146 C:68 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 244: A:68 B:7 C:79 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 245: A:69 B:68 C:146 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 246: A:146 B:147 C:69 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 247: A:146 B:79 C:145 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 248: A:148 B:149 C:9 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 249: A:26 B:157 C:148 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 250: A:148 B:8 C:26 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 251: A:23 B:149 C:156 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 252: A:156 B:89 C:23 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 253: A:8 B:148 C:70 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 254: A:157 B:156 C:149 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 255: A:149 B:148 C:157 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 256: A:24 B:9 C:149 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 257: A:149 B:23 C:24 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 258: A:71 B:70 C:148 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 259: A:148 B:9 C:71 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 260: A:150 B:23 C:89 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 261: A:10 B:150 C:76 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 262: A:151 B:80 C:67 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 263: A:151 B:76 C:150 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 264: A:150 B:10 C:23 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 265: A:153 B:152 C:154 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 266: A:13 B:81 C:153 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 267: A:153 B:83 C:13 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 268: A:28 B:152 C:82 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 269: A:82 B:14 C:28 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 270: A:12 B:78 C:154 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 271: A:154 B:27 C:12 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 272: A:83 B:153 C:77 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 273: A:77 B:11 C:83 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 274: A:81 B:82 C:152 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 275: A:152 B:153 C:81 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 276: A:27 B:154 C:152 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 277: A:152 B:28 C:27 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 278: A:78 B:77 C:153 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 279: A:153 B:154 C:78 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 280: A:80 B:84 C:85 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 281: A:85 B:129 C:80 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 282: A:84 B:16 C:85 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 283: A:13 B:83 C:155 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 284: A:155 B:86 C:13 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 285: A:83 B:11 C:155 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 286: A:86 B:155 C:85 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 287: A:129 B:85 C:155 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 288: A:14 B:87 C:157 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 289: A:157 B:25 C:14 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 290: A:89 B:156 C:88 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 291: A:88 B:15 C:89 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 292: A:87 B:88 C:156 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 293: A:156 B:157 C:87 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 294: A:157 B:26 C:25 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 295: A:158 B:159 C:161 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 296: A:161 B:160 C:158 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 297: A:15 B:90 C:158 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 298: A:158 B:89 C:15 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 299: A:84 B:159 C:91 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 300: A:91 B:16 C:84 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 301: A:80 B:151 C:161 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 302: A:161 B:84 C:80 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 303: A:89 B:160 C:150 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 304: A:90 B:91 C:159 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 305: A:159 B:158 C:90 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 306: A:84 B:161 C:159 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 307: A:151 B:150 C:160 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 308: A:160 B:161 C:151 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 309: A:89 B:158 C:160 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 310: A:16 B:91 C:82 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 311: A:82 B:85 C:16 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 312: A:88 B:82 C:90 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 313: A:90 B:15 C:88 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 314: A:82 B:87 C:14 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 315: A:86 B:82 C:81 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 316: A:81 B:13 C:86 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 317: A:91 B:90 C:82 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 318: A:82 B:88 C:87 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
Face 319: A:82 B:86 C:85 AB:1 BC:1 CA:0
|
||||||
|
Smoothing: 1
|
||||||
|
|
1221
data/rightpalm.asc
Normal file
BIN
data/tback.png
Normal file
After Width: | Height: | Size: 593 KiB |
BIN
data/tbottom.png
Normal file
After Width: | Height: | Size: 764 KiB |
BIN
data/tfront.png
Normal file
After Width: | Height: | Size: 583 KiB |
BIN
data/tleft.png
Normal file
After Width: | Height: | Size: 586 KiB |
BIN
data/tright.png
Normal file
After Width: | Height: | Size: 635 KiB |
BIN
data/ttop.png
Normal file
After Width: | Height: | Size: 321 KiB |
BIN
data/tux.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
data/victory.wav
Normal file
BIN
dist/win32/SDL.dll
vendored
Normal file
BIN
dist/win32/SDL_image.dll
vendored
Normal file
BIN
dist/win32/blockofighter.exe
vendored
Normal file
BIN
dist/win32/fmod.dll
vendored
Normal file
BIN
dist/win32/jpeg.dll
vendored
Normal file
BIN
dist/win32/libpng1.dll
vendored
Normal file
BIN
dist/win32/zlib.dll
vendored
Normal file
113
readme.txt
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
|
||||||
|
BlockoFighter v. 2.01
|
||||||
|
|
||||||
|
|
||||||
|
http://blockofighter.kicks-ass.net/
|
||||||
|
|
||||||
|
|
||||||
|
Standard disclaimer and legal mumbo jumbo
|
||||||
|
=========================================
|
||||||
|
|
||||||
|
This program is FREEWARE, which means you can use the program without
|
||||||
|
a charge for non-profit purposes, namely personal gaming.
|
||||||
|
|
||||||
|
LEGO® is a trademark of the LEGO Group of companies which does not
|
||||||
|
sponsor, authorize or endorse this program. The models may look like
|
||||||
|
LEGO® bricks but that is just your mind doing tricks.
|
||||||
|
|
||||||
|
We take no responsibility of what might or might not happen to you,
|
||||||
|
your computer, pets, car or whatever as a result of using this program.
|
||||||
|
|
||||||
|
We'd like you to have fun playing this simple game. Although it isn't
|
||||||
|
mandatory we would very much like to receive feedback.
|
||||||
|
|
||||||
|
Feedback can be sent to Miika Sell (msell@cc.hut.fi , Itchi on IrcNet) or
|
||||||
|
Juha Kaarlas (profeetta@psicorps.com , Druidi on IrcNet).
|
||||||
|
|
||||||
|
You may distribute this game ONLY in it's complete form in original
|
||||||
|
package. Source codes are for educational purposes and for building
|
||||||
|
executable in Linux, and may not be used for own purposes without
|
||||||
|
our permission.
|
||||||
|
|
||||||
|
|
||||||
|
History
|
||||||
|
=======
|
||||||
|
|
||||||
|
2.01:
|
||||||
|
* Blockomen make more damage -> faster games
|
||||||
|
* Blockomen can now jump from any stable surface
|
||||||
|
* Keyboard configuration is changed, see below for new controls
|
||||||
|
|
||||||
|
2.0:
|
||||||
|
Whole game remade from scratch.
|
||||||
|
|
||||||
|
Recommended system specs
|
||||||
|
========================
|
||||||
|
|
||||||
|
OpenGL is required! The game uses SDL for window and image handling,
|
||||||
|
and FMOD by Firelight Technologies for audio.
|
||||||
|
|
||||||
|
Fast CPU (at least 1GHz) is highly recommended, mostly because of very
|
||||||
|
slow and unoptimized physics engine. Also a fast graphics-card is
|
||||||
|
recommended, but this game is mostly CPU-expensive.
|
||||||
|
|
||||||
|
|
||||||
|
Windows
|
||||||
|
=======
|
||||||
|
|
||||||
|
All necessary libraries are included in the package. Just launch
|
||||||
|
BlockoFighter.exe
|
||||||
|
|
||||||
|
|
||||||
|
Linux
|
||||||
|
=====
|
||||||
|
|
||||||
|
SDL and FMOD must be installed in order for this game to compile
|
||||||
|
and work.
|
||||||
|
SDL and SDL_Image are located at http://www.libsdl.org/, but are also
|
||||||
|
available for example via apt-get in Linux Debian:
|
||||||
|
apt-get install libsdl1.2-dev
|
||||||
|
apt-get install libsdl-image1.2-dev
|
||||||
|
FMOD is located at http://www.fmod.org/
|
||||||
|
|
||||||
|
After installing libraries, just use "make" -command to build the game,
|
||||||
|
and enjoy the game by launching blockofighter -executable.
|
||||||
|
|
||||||
|
This game was created in Windows-environment, and we were not able
|
||||||
|
to test it in Linux enough, but at least it worked with me :)
|
||||||
|
|
||||||
|
|
||||||
|
Controls
|
||||||
|
========
|
||||||
|
|
||||||
|
Action Player 1 Player 2
|
||||||
|
----------------------------------------------
|
||||||
|
Move forward: Up arrow E
|
||||||
|
Move backward: Down arrow D
|
||||||
|
Turn left: Left arrow S
|
||||||
|
Turn right: Right arrow F
|
||||||
|
Jump: ¨ or ] (near enter) Q
|
||||||
|
Hit: ' or \ (near enter) A
|
||||||
|
|
||||||
|
Use arrows, enter and esc to navigate in menus
|
||||||
|
|
||||||
|
|
||||||
|
Known issues
|
||||||
|
============
|
||||||
|
|
||||||
|
- Blockomen might sometimes get stuck in each others
|
||||||
|
- In some Linux-environment screen was left blank while game
|
||||||
|
was still running fine. We are working on this.
|
||||||
|
- There has been reports about blockomen not getting damage at all
|
||||||
|
when launching Blockofighter for the first time, though this has not
|
||||||
|
been verified. If this happens, try launching the game again.
|
||||||
|
|
||||||
|
|
||||||
|
Greetings
|
||||||
|
=========
|
||||||
|
|
||||||
|
Special thanks to Osmand, who made two songs for us.
|
||||||
|
Thanks goes also to Forge for creating some of our sound effects.
|
||||||
|
|
||||||
|
Since this is made for Assembly demoparty, some greets are necessary:
|
||||||
|
Lonely Coders, Unreal Voodoo, THP and all friends who supported us.
|
360
src/3dutils.cpp
Normal file
|
@ -0,0 +1,360 @@
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#include "3dutils.h"
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "utils.h"
|
||||||
|
#include "mesh.h"
|
||||||
|
#include "vector.h"
|
||||||
|
#include "texture.h"
|
||||||
|
|
||||||
|
#include "glapi.h"
|
||||||
|
|
||||||
|
int SKYBOX = -1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Luo pyörähdyskappaleen y-akselin ympäri annetuista pisteistä
|
||||||
|
* Parametrina taulukollinen pisteitä,
|
||||||
|
* pisteidein määrä,
|
||||||
|
* jakojen määrä pyörähdyssuunnassa,
|
||||||
|
* jakojen määrä "pysty"suunnassa
|
||||||
|
* Jos viimeinen parametri on sama kuin pisteiden määrä,
|
||||||
|
* niin pyörähdyskappale vastaa suoraan annettujen pisteiden
|
||||||
|
* pyörähdyskappaletta. Muulloin pisteet lasketaan kuutiollisella
|
||||||
|
* interpoloinnilla annettujen pisteiden välillä.
|
||||||
|
*/
|
||||||
|
void createLathedSurface(point2d *points, point2d *pointderivates, int count, int slices, int stacks){
|
||||||
|
int i, j;
|
||||||
|
point2d *h1, *h2;
|
||||||
|
point2d *derivates;
|
||||||
|
if (pointderivates == NULL) derivates = new point2d[count];
|
||||||
|
else derivates = pointderivates;
|
||||||
|
//Derivaatta pisteessä i on (points[i+1]-points[i-1])/2 alkua ja loppua lukuunottamatta
|
||||||
|
for (i = 0; i < count; i++){
|
||||||
|
if (pointderivates == NULL || (derivates[i].x == 0 && derivates[i].y == 0)){
|
||||||
|
if (i == 0) h1 = &points[0];
|
||||||
|
else h1 = &points[i-1];
|
||||||
|
if (i == count-1) h2 = &points[count-1];
|
||||||
|
else h2 = &points[i+1];
|
||||||
|
float dx,dy;
|
||||||
|
dx = (h2->x - h1->x);
|
||||||
|
dy = (h2->y - h1->y);
|
||||||
|
if (i > 0 && i < count){
|
||||||
|
dx /= 2;
|
||||||
|
dy /= 2;
|
||||||
|
}
|
||||||
|
derivates[i].x = dx;
|
||||||
|
derivates[i].y = dy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
float sif;
|
||||||
|
int si;
|
||||||
|
point2d newpoint, oldpoint;
|
||||||
|
point2d derivate;
|
||||||
|
point2d newnormal, oldnormal;
|
||||||
|
point2d A, B, C, D;
|
||||||
|
oldpoint.x = points[0].x;
|
||||||
|
oldpoint.y = points[0].y;
|
||||||
|
oldnormal.x = derivates[0].y;
|
||||||
|
oldnormal.y = -derivates[0].x;
|
||||||
|
point2d *p1, *p2, *d1, *d2;
|
||||||
|
int i1, i2;
|
||||||
|
float t;
|
||||||
|
float x1, y1, z1, x2, y2, z2, nx1, ny1, nz1, nx2, ny2, nz2;
|
||||||
|
for (i = 1; i <= stacks-(stacks/count); i++){
|
||||||
|
sif = (float)i*count/stacks;
|
||||||
|
si = (int)sif;
|
||||||
|
t = sif-si;
|
||||||
|
i1 = si;
|
||||||
|
i2 = si+1;
|
||||||
|
if (i2 >= count) i2 = count-1;
|
||||||
|
p1 = &points[i1];
|
||||||
|
p2 = &points[i2];
|
||||||
|
d1 = &derivates[i1];
|
||||||
|
d2 = &derivates[i2];
|
||||||
|
//Hermite-käyrä A*t^3 + B*t^2 + C*t + D
|
||||||
|
//Hermite-käyrän derivaatta 3*A*t^2 + 2*B*t + C
|
||||||
|
//Vakiot A,B,C ja D ovat laskettu siten, että:
|
||||||
|
//1. H(0)=p1;
|
||||||
|
//2. H(1)=p2;
|
||||||
|
//3. H'(0)=d1;
|
||||||
|
//4. H'(1)=d2;
|
||||||
|
//
|
||||||
|
//A = d2 - 2*p2 + d1 + 2*p1
|
||||||
|
//B = -d2 + 3*p2 - 2*d1 - 3*p1
|
||||||
|
//C = d1
|
||||||
|
//D = p1
|
||||||
|
A.x = d2->x - 2*p2->x + d1->x + 2*p1->x;
|
||||||
|
A.y = d2->y - 2*p2->y + d1->y + 2*p1->y;
|
||||||
|
B.x = - d2->x + 3*p2->x - 2*d1->x - 3*p1->x;
|
||||||
|
B.y = - d2->y + 3*p2->y - 2*d1->y - 3*p1->y;
|
||||||
|
C.x = d1->x;
|
||||||
|
C.y = d1->y;
|
||||||
|
D.x = p1->x;
|
||||||
|
D.y = p1->y;
|
||||||
|
|
||||||
|
newpoint.x = A.x*t*t*t + B.x*t*t + C.x*t + D.x;
|
||||||
|
newpoint.y = A.y*t*t*t + B.y*t*t + C.y*t + D.y;
|
||||||
|
|
||||||
|
derivate.x = 3*A.x*t*t + 2*B.x*t + C.x;
|
||||||
|
derivate.y = 3*A.y*t*t + 2*B.y*t + C.y;
|
||||||
|
|
||||||
|
newnormal.x = derivate.y;
|
||||||
|
newnormal.y = -derivate.x;
|
||||||
|
|
||||||
|
glBegin(GL_QUAD_STRIP);
|
||||||
|
for (j = 0; j <= slices; j++){
|
||||||
|
float angle = j*2*PI/slices;
|
||||||
|
|
||||||
|
nx2 = sin(angle)*newnormal.x;
|
||||||
|
ny2 = newnormal.y;
|
||||||
|
nz2 = cos(angle)*newnormal.x;
|
||||||
|
glNormal3f(nx2, ny2, nz2);
|
||||||
|
x2 = sin(angle)*newpoint.x;
|
||||||
|
y2 = newpoint.y;
|
||||||
|
z2 = cos(angle)*newpoint.x;
|
||||||
|
glTexCoord2f(j*1.0/slices,1.0-(i*1.0/(stacks-1)));
|
||||||
|
glVertex3f(x2, y2, z2);
|
||||||
|
|
||||||
|
nx1 = sin(angle)*oldnormal.x;
|
||||||
|
ny1 = oldnormal.y;
|
||||||
|
nz1 = cos(angle)*oldnormal.x;
|
||||||
|
glNormal3f(nx1, ny1, nz1);
|
||||||
|
x1 = sin(angle)*oldpoint.x;
|
||||||
|
y1 = oldpoint.y;
|
||||||
|
z1 = cos(angle)*oldpoint.x;
|
||||||
|
glTexCoord2f(j*1.0/slices,1.0-((i-1)*1.0/(stacks-1)));
|
||||||
|
glVertex3f(x1, y1, z1);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
oldpoint.x = newpoint.x;
|
||||||
|
oldpoint.y = newpoint.y;
|
||||||
|
oldnormal.x = newnormal.x;
|
||||||
|
oldnormal.y = newnormal.y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GLUquadricObj *spherequadric = gluNewQuadric();
|
||||||
|
|
||||||
|
void createSphere(float r, int slices, int stacks){
|
||||||
|
/*float phi, theta;
|
||||||
|
int x, y;
|
||||||
|
for (y = 0; y < stacks; y++){
|
||||||
|
for (x = 0; x < slices; x++){
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
gluSphere(spherequadric, r, slices, stacks);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define DEFAULTSLICES 20
|
||||||
|
#define DEFAULTSTACKS 10
|
||||||
|
|
||||||
|
void createSphere(float r){
|
||||||
|
createSphere(r, DEFAULTSLICES, DEFAULTSTACKS);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool solvePointInTriangle(float *position, float *normal,
|
||||||
|
Vertex *v1, Vertex *v2, Vertex *v3,
|
||||||
|
float *t, float *u, float *v){
|
||||||
|
float edge1[3], edge2[3], tvec[3], pvec[3], qvec[3];
|
||||||
|
float det,inv_det;
|
||||||
|
|
||||||
|
// find vectors for two edges sharing vert0
|
||||||
|
vectorSub(edge1, v2->position, v1->position);
|
||||||
|
vectorSub(edge2, v3->position, v1->position);
|
||||||
|
|
||||||
|
// begin calculating determinant - also used to calculate U parameter
|
||||||
|
vectorCross(pvec, normal, edge2);
|
||||||
|
|
||||||
|
//if determinant is near zero, ray lies in plane of triangle
|
||||||
|
det = vectorDot(edge1, pvec);
|
||||||
|
|
||||||
|
if (det > -EPSILON && det < EPSILON) return false;
|
||||||
|
inv_det = 1.0 / det;
|
||||||
|
|
||||||
|
// calculate distance from vert0 to ray origin
|
||||||
|
vectorSub(tvec, position, v1->position);
|
||||||
|
|
||||||
|
// calculate U parameter and test bounds
|
||||||
|
*u = vectorDot(tvec, pvec) * inv_det;
|
||||||
|
if (*u < 0.0 || *u > 1.0) return false;
|
||||||
|
|
||||||
|
// prepare to test V parameter
|
||||||
|
vectorCross(qvec, tvec, edge1);
|
||||||
|
|
||||||
|
// calculate V parameter and test bounds
|
||||||
|
*v = vectorDot(normal, qvec) * inv_det;
|
||||||
|
if (*v < 0.0 || *u + *v > 1.0) return false;
|
||||||
|
|
||||||
|
// calculate t, ray intersects triangle
|
||||||
|
*t = vectorDot(edge2, qvec) * inv_det;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float distanceFromPlane(float point[3], float normal[3], float distance){
|
||||||
|
return vectorDot(point, normal) + distance;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void createSkyBox(float x, float y, float z, float w, float h, float l)
|
||||||
|
{
|
||||||
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
glClear(GL_DEPTH_BUFFER_BIT);
|
||||||
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
glDisable(GL_ALPHA_TEST);
|
||||||
|
glDisable(GL_LIGHTING);
|
||||||
|
glShadeModel(GL_FLAT);
|
||||||
|
|
||||||
|
float modelview[16];
|
||||||
|
|
||||||
|
glGetFloatv(GL_MODELVIEW_MATRIX, modelview);
|
||||||
|
modelview[12] = modelview[13] = modelview[14] = 0.0f;
|
||||||
|
glPushMatrix();
|
||||||
|
glLoadMatrixf(modelview);
|
||||||
|
|
||||||
|
if (SKYBOX > 0){
|
||||||
|
glCallList(SKYBOX);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
|
||||||
|
SKYBOX = glGenLists(1);
|
||||||
|
|
||||||
|
float d = 1.0/512;
|
||||||
|
|
||||||
|
//glPushAttrib(GL_COLOR);
|
||||||
|
|
||||||
|
glNewList(SKYBOX, GL_COMPILE_AND_EXECUTE);
|
||||||
|
|
||||||
|
|
||||||
|
//glBindTexture(GL_TEXTURE_2D, SKY_BACK_ID);
|
||||||
|
skybacktexture->enable();
|
||||||
|
|
||||||
|
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
glColor4f(1, 1, 1, 1.0);
|
||||||
|
|
||||||
|
glTexCoord2f(1-d, 1-d); glVertex3f(x + w, y, z);
|
||||||
|
glTexCoord2f(1-d, 0+d); glVertex3f(x + w, y + h, z);
|
||||||
|
glTexCoord2f(0+d, 0+d); glVertex3f(x, y + h, z);
|
||||||
|
glTexCoord2f(0+d, 1-d); glVertex3f(x, y, z);
|
||||||
|
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
|
||||||
|
//glBindTexture(GL_TEXTURE_2D, SKY_FRONT_ID);
|
||||||
|
skyfronttexture->enable();
|
||||||
|
|
||||||
|
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
|
||||||
|
glColor4f(1, 1, 1, 1.0);
|
||||||
|
|
||||||
|
glTexCoord2f(1-d, 1-d); glVertex3f(x, y, z + l);
|
||||||
|
glTexCoord2f(1-d, 0+d); glVertex3f(x, y + h, z + l);
|
||||||
|
glTexCoord2f(0+d, 0+d); glVertex3f(x + w, y + h, z + l);
|
||||||
|
glTexCoord2f(0+d, 1-d); glVertex3f(x + w, y, z + l);
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//glBindTexture(GL_TEXTURE_2D, SKY_TOP_ID);
|
||||||
|
skytoptexture->enable();
|
||||||
|
|
||||||
|
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
glColor4f(1, 1, 1, 1.0);
|
||||||
|
|
||||||
|
glTexCoord2f(0+d, 0+d); glVertex3f(x + w, y + h, z + l);
|
||||||
|
glTexCoord2f(1-d, 0+d); glVertex3f(x + w, y + h, z);
|
||||||
|
glTexCoord2f(1-d, 1-d); glVertex3f(x, y + h, z);
|
||||||
|
glTexCoord2f(0+d, 1-d); glVertex3f(x, y + h, z + l);
|
||||||
|
/*glTexCoord2f(1.0f, 0+d); glVertex3f(x + w, y + h, z);
|
||||||
|
glTexCoord2f(1.0f, 1.0f); glVertex3f(x + w, y + h, z + l);
|
||||||
|
glTexCoord2f(0+d, 1.0f); glVertex3f(x, y + h, z + l);
|
||||||
|
glTexCoord2f(0+d, 0+d); glVertex3f(x, y + h, z);*/
|
||||||
|
|
||||||
|
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//glBindTexture(GL_TEXTURE_2D, SKY_BOTTOM_ID);
|
||||||
|
skybottomtexture->enable();
|
||||||
|
|
||||||
|
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
glColor4f(1, 1, 1, 1.0);
|
||||||
|
|
||||||
|
glTexCoord2f(1-d, 0+d); glVertex3f(x, y, z);
|
||||||
|
glTexCoord2f(1-d, 1-d); glVertex3f(x + w, y, z);
|
||||||
|
glTexCoord2f(0+d, 1-d); glVertex3f(x + w, y, z + l);
|
||||||
|
glTexCoord2f(0+d, 0+d); glVertex3f(x, y, z + l);
|
||||||
|
|
||||||
|
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
//glBindTexture(GL_TEXTURE_2D, SKY_LEFT_ID);
|
||||||
|
skylefttexture->enable();
|
||||||
|
|
||||||
|
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
glColor4f(1, 1, 1, 1.0);
|
||||||
|
glTexCoord2f(1-d, 0+d); glVertex3f(x, y + h, z);
|
||||||
|
glTexCoord2f(0+d, 0+d); glVertex3f(x, y + h, z + l);
|
||||||
|
glTexCoord2f(0+d, 1-d); glVertex3f(x, y, z + l);
|
||||||
|
glTexCoord2f(1-d, 1-d); glVertex3f(x, y, z);
|
||||||
|
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
//glBindTexture(GL_TEXTURE_2D, SKY_RIGHT_ID);
|
||||||
|
skyrighttexture->enable();
|
||||||
|
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
glColor4f(1, 1, 1, 1.0);
|
||||||
|
glTexCoord2f(0+d, 1-d); glVertex3f(x + w, y, z);
|
||||||
|
glTexCoord2f(1-d, 1-d); glVertex3f(x + w, y, z + l);
|
||||||
|
glTexCoord2f(1-d, 0+d); glVertex3f(x + w, y + h, z + l);
|
||||||
|
glTexCoord2f(0+d, 0+d); glVertex3f(x + w, y + h, z);
|
||||||
|
|
||||||
|
|
||||||
|
glEnd();
|
||||||
|
glEndList();
|
||||||
|
}
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
glEnable(GL_CULL_FACE);
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
glEnable(GL_LIGHTING);
|
||||||
|
glShadeModel(GL_SMOOTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void enable2D(void){
|
||||||
|
glDisable(GL_LIGHTING);
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glPushMatrix();
|
||||||
|
glLoadIdentity();
|
||||||
|
gluOrtho2D(0, 1, 1, 0);
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
glPushMatrix();
|
||||||
|
glLoadIdentity();
|
||||||
|
}
|
||||||
|
|
||||||
|
void disable2D(void){
|
||||||
|
glPopMatrix();
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glPopMatrix();
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
glEnable(GL_CULL_FACE);
|
||||||
|
glEnable(GL_LIGHTING);
|
||||||
|
}
|
134
src/3dutils.h
Normal file
|
@ -0,0 +1,134 @@
|
||||||
|
/*
|
||||||
|
* $Id: 3dutils.h,v 1.22 2002/07/22 11:50:26 jkaarlas Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: 3dutils.h,v $
|
||||||
|
* Revision 1.22 2002/07/22 11:50:26 jkaarlas
|
||||||
|
* naama
|
||||||
|
*
|
||||||
|
* Revision 1.21 2002/07/22 11:44:16 jkaarlas
|
||||||
|
* naama
|
||||||
|
*
|
||||||
|
* Revision 1.20 2002/07/19 20:33:28 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.19 2002/07/19 18:59:46 msell
|
||||||
|
* Alkuhommaa ja säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.18 2002/07/19 14:05:51 msell
|
||||||
|
* Damagetextuurit näkyy
|
||||||
|
*
|
||||||
|
* Revision 1.17 2002/07/19 12:28:29 msell
|
||||||
|
* 2D-mode
|
||||||
|
*
|
||||||
|
* Revision 1.16 2002/07/17 20:32:47 msell
|
||||||
|
* Detail-optio toimii
|
||||||
|
*
|
||||||
|
* Revision 1.15 2002/07/17 19:06:39 jkaarlas
|
||||||
|
* skyboxin keskitys
|
||||||
|
*
|
||||||
|
* Revision 1.14 2002/07/17 16:40:33 msell
|
||||||
|
* Resoluution vaihto
|
||||||
|
*
|
||||||
|
* Revision 1.13 2002/07/16 17:16:34 msell
|
||||||
|
* Fontit ja valikot
|
||||||
|
*
|
||||||
|
* Revision 1.12 2002/07/16 00:42:43 msell
|
||||||
|
* Uusia skyboxeja ja areenan säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.11 2002/07/15 22:03:22 msell
|
||||||
|
* MultiAppearance
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/07/15 21:42:58 msell
|
||||||
|
* Skybox-testi
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/07/15 15:22:07 msell
|
||||||
|
* Parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/07/14 21:27:48 jkaarlas
|
||||||
|
* uudet tekstuurit
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/07/14 21:22:40 jkaarlas
|
||||||
|
* skybox ja ukkojen säätö
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/20 22:50:12 msell
|
||||||
|
* Meshit
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/17 19:58:08 msell
|
||||||
|
* #includeiden parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/16 01:04:58 jkaarlas
|
||||||
|
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/05 23:55:46 msell
|
||||||
|
* Pallo
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/04 16:28:32 msell
|
||||||
|
* #pragma once
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/06/03 23:06:38 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/22 11:50:26 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __3DUTILS_H_INCLUDED__
|
||||||
|
#define __3DUTILS_H_INCLUDED__
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
#include "texture.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define SKYFRONT DATAPATH"tback.png"
|
||||||
|
#define SKYBACK DATAPATH"tfront.png"
|
||||||
|
#define SKYLEFT DATAPATH"tleft.png"
|
||||||
|
#define SKYRIGHT DATAPATH"tright.png"
|
||||||
|
#define SKYTOP DATAPATH"ttop.png"
|
||||||
|
#define SKYBOTTOM DATAPATH"tbottom.png"
|
||||||
|
|
||||||
|
|
||||||
|
#define DAMAGEHEAD DATAPATH"damagehead.png"
|
||||||
|
#define DAMAGETORSO DATAPATH"damagetorso.png"
|
||||||
|
#define DAMAGEHAND DATAPATH"damagehand.png"
|
||||||
|
#define DAMAGELEG DATAPATH"damageleg.png"
|
||||||
|
#define FACE DATAPATH"perusnaama3.png"
|
||||||
|
|
||||||
|
extern int SKYBOX;
|
||||||
|
|
||||||
|
typedef struct{
|
||||||
|
float x,y;
|
||||||
|
} point2d;
|
||||||
|
|
||||||
|
typedef struct{
|
||||||
|
float x,y,z;
|
||||||
|
} point3d;
|
||||||
|
|
||||||
|
extern Texture *flaretexture;
|
||||||
|
extern Texture *skyfronttexture;
|
||||||
|
extern Texture *skybacktexture;
|
||||||
|
extern Texture *skylefttexture;
|
||||||
|
extern Texture *skyrighttexture;
|
||||||
|
extern Texture *skytoptexture;
|
||||||
|
extern Texture *skybottomtexture;
|
||||||
|
extern Texture *damageHead;
|
||||||
|
extern Texture *faceTexture;
|
||||||
|
|
||||||
|
void createLathedSurface(point2d *points, point2d *pointderivates, int count, int slices, int stacks);
|
||||||
|
void createSphere(float r, int slices, int stacks);
|
||||||
|
void createSphere(float r);
|
||||||
|
|
||||||
|
float distanceFromPlane(float point[3], float normal[3], float distance);
|
||||||
|
|
||||||
|
void createSkyBox(float x, float y, float z, float w, float h, float l);
|
||||||
|
|
||||||
|
|
||||||
|
//MUST be called in pairs, enable pushes and disable pops
|
||||||
|
void enable2D(void);
|
||||||
|
void disable2D(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
155
src/appearance.cpp
Normal file
|
@ -0,0 +1,155 @@
|
||||||
|
/*
|
||||||
|
* $Id: appearance.cpp,v 1.9 2002/07/15 22:03:23 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: appearance.cpp,v $
|
||||||
|
* Revision 1.9 2002/07/15 22:03:23 msell
|
||||||
|
* MultiAppearance
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/06/24 14:12:15 msell
|
||||||
|
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/06/20 00:21:01 jkaarlas
|
||||||
|
* materiaali- ja tekstuurihommia edistetty
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/17 20:49:04 msell
|
||||||
|
* free -> SDL_FreeSurface
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/16 01:04:58 jkaarlas
|
||||||
|
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/05 23:55:46 msell
|
||||||
|
* Pallo
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/03 23:20:43 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/03 23:06:38 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/06/02 16:57:37 msell
|
||||||
|
* Objektirakenteen pohja
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/15 22:03:23 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include "appearance.h"
|
||||||
|
#include "utils.h"
|
||||||
|
#include "3dutils.h"
|
||||||
|
#include "glapi.h"
|
||||||
|
|
||||||
|
Appearance::Appearance(void){
|
||||||
|
}
|
||||||
|
|
||||||
|
void Appearance::prepare(void){
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*BoxAppearance::BoxAppearance(void){
|
||||||
|
setDimension(-1, 1, -1, 1, -1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
BoxAppearance::setDimension(float x1, float x2, float y1, float y2, float z1, float z2){
|
||||||
|
if (x1 > x2) swapFloat(&x1, &x2);
|
||||||
|
if (y1 > y2) swapFloat(&y1, &y2);
|
||||||
|
if (z1 > z2) swapFloat(&z1, &z2);
|
||||||
|
this->x1 = x1;
|
||||||
|
this->x2 = x2;
|
||||||
|
this->y1 = y1;
|
||||||
|
this->y2 = y2;
|
||||||
|
this->z1 = z1;
|
||||||
|
this->z2 = z2;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BoxAppearance::draw(void){
|
||||||
|
|
||||||
|
this->material.enable();
|
||||||
|
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
|
||||||
|
//Front Face
|
||||||
|
glNormal3f(0, 0, 1);
|
||||||
|
glVertex3f(x1, y1, z2);
|
||||||
|
glVertex3f(x2, y1, z2);
|
||||||
|
glVertex3f(x2, y2, z2);
|
||||||
|
glVertex3f(x1, y2, z2);
|
||||||
|
// Back Face
|
||||||
|
glNormal3f(0, 0, -1);
|
||||||
|
glVertex3f(x1, y1, z1);
|
||||||
|
glVertex3f(x1, y2, z1);
|
||||||
|
glVertex3f(x2, y2, z1);
|
||||||
|
glVertex3f(x2, y1, z1);
|
||||||
|
// Top Face
|
||||||
|
glNormal3f(0, 1, 0);
|
||||||
|
glVertex3f(x1, y2, z1);
|
||||||
|
glVertex3f(x1, y2, z2);
|
||||||
|
glVertex3f(x2, y2, z2);
|
||||||
|
glVertex3f(x2, y2, z1);
|
||||||
|
// Bottom Face
|
||||||
|
glNormal3f(0, -1, 0);
|
||||||
|
glVertex3f(x1, y1, z1);
|
||||||
|
glVertex3f(x2, y1, z1);
|
||||||
|
glVertex3f(x2, y1, z2);
|
||||||
|
glVertex3f(x1, y1, z2);
|
||||||
|
// Right face
|
||||||
|
glNormal3f(x2, 0, 0);
|
||||||
|
glVertex3f(x2, y1, z1);
|
||||||
|
glVertex3f(x2, y2, z1);
|
||||||
|
glVertex3f(x2, y2, z2);
|
||||||
|
glVertex3f(x2, y1, z2);
|
||||||
|
// Left Face
|
||||||
|
glNormal3f(x1, 0, 0);
|
||||||
|
glVertex3f(x1, y1, z1);
|
||||||
|
glVertex3f(x1, y1, z2);
|
||||||
|
glVertex3f(x1, y2, z2);
|
||||||
|
glVertex3f(x1, y2, z1);
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
this->material.disable();
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
Material* Appearance::getMaterial(void){
|
||||||
|
return &this->material;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Appearance::setMaterial(Material matsku){
|
||||||
|
material = matsku;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MultiAppearance::MultiAppearance(void){
|
||||||
|
appearances = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MultiAppearance::addAppearance(Appearance *appearance){
|
||||||
|
appearancelist *node = new appearancelist;
|
||||||
|
node->data = appearance;
|
||||||
|
node->next = appearances;
|
||||||
|
appearances = node;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MultiAppearance::prepare(void){
|
||||||
|
appearancelist *node = appearances;
|
||||||
|
while (node != NULL){
|
||||||
|
node->data->prepare();
|
||||||
|
node = node->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MultiAppearance::draw(void){
|
||||||
|
appearancelist *node = appearances;
|
||||||
|
while (node != NULL){
|
||||||
|
node->data->draw();
|
||||||
|
node = node->next;
|
||||||
|
}
|
||||||
|
}
|
88
src/appearance.h
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
/*
|
||||||
|
* $Id: appearance.h,v 1.11 2002/07/19 20:33:28 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: appearance.h,v $
|
||||||
|
* Revision 1.11 2002/07/19 20:33:28 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/07/15 22:03:23 msell
|
||||||
|
* MultiAppearance
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/07/07 17:53:21 msell
|
||||||
|
* Legoukon alku
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/06/24 14:12:15 msell
|
||||||
|
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/06/20 00:21:01 jkaarlas
|
||||||
|
* materiaali- ja tekstuurihommia edistetty
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/17 20:49:04 msell
|
||||||
|
* free -> SDL_FreeSurface
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/17 19:58:08 msell
|
||||||
|
* #includeiden parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/04 16:28:32 msell
|
||||||
|
* #pragma once
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/03 23:20:43 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/03 23:06:38 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/06/02 16:57:37 msell
|
||||||
|
* Objektirakenteen pohja
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 20:33:28 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __APPEARANCE_H_INCLUDED__
|
||||||
|
#define __APPEARANCE_H_INCLUDED__
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#include "material.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Abstract class for drawing objects
|
||||||
|
*/
|
||||||
|
class Appearance{
|
||||||
|
private:
|
||||||
|
public:
|
||||||
|
Material material;
|
||||||
|
|
||||||
|
Appearance(void);
|
||||||
|
|
||||||
|
Material* getMaterial(void);
|
||||||
|
void setMaterial(Material mat);
|
||||||
|
|
||||||
|
virtual void prepare(void);
|
||||||
|
virtual void draw(void) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct appearancelist{
|
||||||
|
Appearance *data;
|
||||||
|
appearancelist *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
class MultiAppearance : public Appearance{
|
||||||
|
private:
|
||||||
|
appearancelist *appearances;
|
||||||
|
|
||||||
|
public:
|
||||||
|
MultiAppearance(void);
|
||||||
|
void addAppearance(Appearance *appearance);
|
||||||
|
|
||||||
|
void prepare(void);
|
||||||
|
void draw(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
309
src/audio.cpp
Normal file
|
@ -0,0 +1,309 @@
|
||||||
|
/*
|
||||||
|
* $Id: audio.cpp,v 1.9 2002/07/21 15:03:11 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: audio.cpp,v $
|
||||||
|
* Revision 1.9 2002/07/21 15:03:11 msell
|
||||||
|
* Äänet disabloitu
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/07/19 18:59:46 msell
|
||||||
|
* Alkuhommaa ja säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/07/18 23:05:31 msell
|
||||||
|
* Partikkelit ja kakkospelaajan liike
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/02 16:57:37 msell
|
||||||
|
* Objektirakenteen pohja
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/05/19 13:40:19 msell
|
||||||
|
* Säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/05/18 12:29:35 msell
|
||||||
|
* Valot ja äänijärjestelmän parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/05/15 21:07:23 msell
|
||||||
|
* Äänisäätöä
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/05/15 15:21:00 msell
|
||||||
|
* Äänisäätöä
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/05/15 14:36:38 msell
|
||||||
|
* Yksinkertainen SDL-runko (Kääntyy toistaiseksi vain windowsissa).
|
||||||
|
* Mukana myös musiikinsoitto fmodilla.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/21 15:03:11 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "audio.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define SOUND_FADENONE 0
|
||||||
|
#define SOUND_FADEIN 1
|
||||||
|
#define SOUND_FADEOUT 2
|
||||||
|
|
||||||
|
|
||||||
|
struct soundlist{
|
||||||
|
Sound *sound;
|
||||||
|
soundlist *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
soundlist *allsounds = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
Sound::Sound(Sound *source){
|
||||||
|
memcpy(this, source, sizeof(Sound));
|
||||||
|
soundlist *node = new soundlist;
|
||||||
|
node->sound = this;
|
||||||
|
node->next = allsounds;
|
||||||
|
allsounds = node;
|
||||||
|
}
|
||||||
|
|
||||||
|
Sound::Sound(char *filename){
|
||||||
|
load(filename, SOUNDTYPE_AUTODETECT, false);
|
||||||
|
//printf("%s: %p, %p, %p, %p\n", filename, this, stream, sample, module);
|
||||||
|
}
|
||||||
|
|
||||||
|
Sound::Sound(char *filename, int type){
|
||||||
|
load(filename, type, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
Sound::Sound(char *filename, bool loops){
|
||||||
|
load(filename, SOUNDTYPE_AUTODETECT, loops);
|
||||||
|
//printf("%s: %p, %p, %p, %p\n", filename, this, stream, sample, module);
|
||||||
|
}
|
||||||
|
|
||||||
|
Sound::Sound(char *filename, int type, bool loops){
|
||||||
|
load(filename, type, loops);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool endsWith(char *str1, char *str2){
|
||||||
|
char *str3 = str1 + strlen(str1) - strlen(str2);
|
||||||
|
#ifdef WIN32
|
||||||
|
if (stricmp(str3, str2)) return false;
|
||||||
|
#else
|
||||||
|
if (strcasecmp(str3, str2)) return false;
|
||||||
|
#endif
|
||||||
|
else return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Sound::load(char *filename, int type, bool loops){
|
||||||
|
this->filename = filename;
|
||||||
|
if (type == SOUNDTYPE_AUTODETECT){
|
||||||
|
if (endsWith(filename, "mp3") ||
|
||||||
|
endsWith(filename, "mp2") ||
|
||||||
|
endsWith(filename, "ogg")) type = SOUNDTYPE_STREAM;
|
||||||
|
|
||||||
|
if (endsWith(filename, "wav") ||
|
||||||
|
endsWith(filename, "raw")) type = SOUNDTYPE_SAMPLE;
|
||||||
|
|
||||||
|
if (endsWith(filename, "s3m") ||
|
||||||
|
endsWith(filename, "xm") ||
|
||||||
|
endsWith(filename, "it") ||
|
||||||
|
endsWith(filename, "mid") ||
|
||||||
|
endsWith(filename, "rmi") ||
|
||||||
|
endsWith(filename, "sgr") ||
|
||||||
|
endsWith(filename, "mod")) type = SOUNDTYPE_MODULE;
|
||||||
|
}
|
||||||
|
#ifdef AUDIO_FMOD
|
||||||
|
sample = NULL;
|
||||||
|
module = NULL;
|
||||||
|
stream = NULL;
|
||||||
|
this->type = type;
|
||||||
|
if (type == SOUNDTYPE_MODULE){
|
||||||
|
module = FMUSIC_LoadSong(filename);
|
||||||
|
this->loops = false;
|
||||||
|
} else if (type == SOUNDTYPE_SAMPLE){
|
||||||
|
if (loops){
|
||||||
|
sample = FSOUND_Sample_Load(FSOUND_FREE, filename, FSOUND_LOOP_NORMAL, 0);
|
||||||
|
FSOUND_Sample_SetLoopMode(sample, FSOUND_LOOP_NORMAL);
|
||||||
|
} else{
|
||||||
|
sample = FSOUND_Sample_Load(FSOUND_FREE, filename, FSOUND_LOOP_OFF, 0);
|
||||||
|
FSOUND_Sample_SetLoopMode(sample, FSOUND_LOOP_OFF);
|
||||||
|
}
|
||||||
|
this->loops = loops;
|
||||||
|
} else if (type == SOUNDTYPE_STREAM){
|
||||||
|
if (loops){
|
||||||
|
stream = FSOUND_Stream_OpenFile(filename, FSOUND_LOOP_NORMAL, 0);
|
||||||
|
} else{
|
||||||
|
stream = FSOUND_Stream_OpenFile(filename, FSOUND_LOOP_OFF, 0);
|
||||||
|
}
|
||||||
|
this->loops = loops;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
stopcallback = NULL;
|
||||||
|
soundlist *node = new soundlist;
|
||||||
|
node->sound = this;
|
||||||
|
node->next = allsounds;
|
||||||
|
allsounds = node;
|
||||||
|
minduration = 0;
|
||||||
|
setVolume(1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Sound::play(){
|
||||||
|
//printf("Playing %s: %p, %p, %p, %p\n", filename, this, stream, sample, module);
|
||||||
|
if (minduration > 0) return false;
|
||||||
|
running = true;
|
||||||
|
finished = false;
|
||||||
|
fademode = SOUND_FADENONE;
|
||||||
|
minduration = 0;
|
||||||
|
#ifdef AUDIO_FMOD
|
||||||
|
if (type == SOUNDTYPE_MODULE){
|
||||||
|
FMUSIC_PlaySong(module);
|
||||||
|
FMUSIC_SetMasterVolume(module, volume*256);
|
||||||
|
} else if (type == SOUNDTYPE_SAMPLE){
|
||||||
|
channel = FSOUND_PlaySound(FSOUND_FREE, sample);
|
||||||
|
FSOUND_SetVolume(channel, volume*256);
|
||||||
|
if (!loops){
|
||||||
|
running = false;
|
||||||
|
finished = false;
|
||||||
|
}
|
||||||
|
} else if (type == SOUNDTYPE_STREAM){
|
||||||
|
channel = FSOUND_Stream_Play(FSOUND_FREE, stream);
|
||||||
|
FSOUND_SetVolume(channel, volume*256);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
//printf("Done: %f\n", volume);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Sound::play(int minduration){
|
||||||
|
if (play()) this->minduration = minduration;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Sound::stop(){
|
||||||
|
#ifdef AUDIO_FMOD
|
||||||
|
if (type == SOUNDTYPE_MODULE){
|
||||||
|
FMUSIC_StopSong(module);
|
||||||
|
} else if (type == SOUNDTYPE_SAMPLE){
|
||||||
|
FSOUND_StopSound(channel);
|
||||||
|
} else if (type == SOUNDTYPE_STREAM){
|
||||||
|
FSOUND_Stream_Stop(stream);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void Sound::setVolume(float volume){
|
||||||
|
//printf("Volume %s: %f\n", filename, volume);
|
||||||
|
#ifdef AUDIO_FMOD
|
||||||
|
if (type == SOUNDTYPE_MODULE){
|
||||||
|
FMUSIC_SetMasterVolume(module, volume*256);
|
||||||
|
} else if (type == SOUNDTYPE_SAMPLE){
|
||||||
|
FSOUND_SetVolume(channel, volume*256);
|
||||||
|
} else if (type == SOUNDTYPE_STREAM){
|
||||||
|
FSOUND_SetVolume(channel, volume*256);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
this->volume = volume;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef AUDIO_FMOD
|
||||||
|
signed char streamendcallback(FSOUND_STREAM *stream, void *buff, int len, int param){
|
||||||
|
Sound *sound = (Sound *)param;
|
||||||
|
sound->setFinished();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void Sound::setStopCallback(STOPCALLBACK callback){
|
||||||
|
stopcallback = callback;
|
||||||
|
#ifdef AUDIO_FMOD
|
||||||
|
if (type == SOUNDTYPE_MODULE){
|
||||||
|
} else if (type == SOUNDTYPE_SAMPLE){
|
||||||
|
//NOT SUPPORTED
|
||||||
|
} else if (type == SOUNDTYPE_STREAM){
|
||||||
|
FSOUND_Stream_SetEndCallback(stream, streamendcallback, (int)this);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Sound::setFinished(void){
|
||||||
|
finished = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Sound::isFinished(void){
|
||||||
|
#ifdef AUDIO_FMOD
|
||||||
|
if (type == SOUNDTYPE_MODULE){
|
||||||
|
if (FMUSIC_IsFinished(module)) return true;
|
||||||
|
} else if (type == SOUNDTYPE_SAMPLE){
|
||||||
|
//NOT SUPPORTED
|
||||||
|
} else if (type == SOUNDTYPE_STREAM){
|
||||||
|
if (finished) return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Sound::update(void){
|
||||||
|
if (running){
|
||||||
|
if (isFinished()){
|
||||||
|
running = false;
|
||||||
|
if (stopcallback != NULL) stopcallback(this);
|
||||||
|
} else{
|
||||||
|
if (fademode == SOUND_FADEIN){
|
||||||
|
if (fadepos < fadetarget){
|
||||||
|
fadepos++;
|
||||||
|
setVolume((float)fadepos/fadetarget);
|
||||||
|
} else fademode = SOUND_FADENONE;
|
||||||
|
}
|
||||||
|
if (fademode == SOUND_FADEOUT){
|
||||||
|
if (fadepos < fadetarget){
|
||||||
|
fadepos++;
|
||||||
|
setVolume(1.0 - (float)fadepos/fadetarget);
|
||||||
|
} else{
|
||||||
|
fademode = SOUND_FADENONE;
|
||||||
|
stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (minduration > 0) minduration--;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Sound::fadeIn(int length){
|
||||||
|
fademode = SOUND_FADEIN;
|
||||||
|
fadepos = 0;
|
||||||
|
fadetarget = length;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Sound::fadeOut(int length){
|
||||||
|
if (fademode == SOUND_FADEIN){
|
||||||
|
float percent = 1.0 - (float)fadepos/fadetarget;
|
||||||
|
fadepos = fadetarget * percent;
|
||||||
|
}
|
||||||
|
fadepos = 0;
|
||||||
|
fadetarget = length;
|
||||||
|
fademode = SOUND_FADEOUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void initAudio(void){
|
||||||
|
#ifdef AUDIO_FMOD
|
||||||
|
FSOUND_Init(44100, 32, 0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void uninitAudio(void){
|
||||||
|
#ifdef AUDIO_FMOD
|
||||||
|
FSOUND_Close();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateAudio(void){
|
||||||
|
soundlist *node = allsounds;
|
||||||
|
while (node != NULL){
|
||||||
|
Sound *sound = node->sound;
|
||||||
|
sound->update();
|
||||||
|
node = node->next;
|
||||||
|
}
|
||||||
|
}
|
130
src/audio.h
Normal file
|
@ -0,0 +1,130 @@
|
||||||
|
/*
|
||||||
|
* $Id: audio.h,v 1.13 2002/07/21 15:12:16 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: audio.h,v $
|
||||||
|
* Revision 1.13 2002/07/21 15:12:16 msell
|
||||||
|
* Äänet enabloitu :)
|
||||||
|
*
|
||||||
|
* Revision 1.12 2002/07/21 15:03:12 msell
|
||||||
|
* Äänet disabloitu
|
||||||
|
*
|
||||||
|
* Revision 1.11 2002/07/19 20:33:28 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/07/19 18:59:46 msell
|
||||||
|
* Alkuhommaa ja säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/07/18 23:05:31 msell
|
||||||
|
* Partikkelit ja kakkospelaajan liike
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/07/14 21:22:40 jkaarlas
|
||||||
|
* skybox ja ukkojen säätö
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/06/04 16:28:32 msell
|
||||||
|
* #pragma once
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/05/19 13:40:19 msell
|
||||||
|
* Säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/05/18 12:29:35 msell
|
||||||
|
* Valot ja äänijärjestelmän parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/05/16 18:41:16 msell
|
||||||
|
* Vektorifunctioita ja kamera
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/05/15 21:07:23 msell
|
||||||
|
* Äänisäätöä
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/05/15 15:21:00 msell
|
||||||
|
* Äänisäätöä
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/05/15 14:36:39 msell
|
||||||
|
* Yksinkertainen SDL-runko (Kääntyy toistaiseksi vain windowsissa).
|
||||||
|
* Mukana myös musiikinsoitto fmodilla.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/21 15:12:16 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __AUDIO_H_INCLUDED__
|
||||||
|
#define __AUDIO_H_INCLUDED__
|
||||||
|
|
||||||
|
|
||||||
|
//#define AUDIO_NONE
|
||||||
|
#define AUDIO_FMOD
|
||||||
|
//Only FMOD and NONE is supported, choose one
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef AUDIO_FMOD
|
||||||
|
#include <fmod.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
class Sound;
|
||||||
|
|
||||||
|
typedef void(* STOPCALLBACK)(Sound *sound);
|
||||||
|
|
||||||
|
#define SOUNDTYPE_AUTODETECT 0
|
||||||
|
#define SOUNDTYPE_MODULE 1
|
||||||
|
#define SOUNDTYPE_STREAM 2
|
||||||
|
#define SOUNDTYPE_SAMPLE 3
|
||||||
|
|
||||||
|
#define BGSONG DATAPATH"boom.mp3"
|
||||||
|
|
||||||
|
class Sound{
|
||||||
|
private:
|
||||||
|
#ifdef AUDIO_FMOD
|
||||||
|
int type;
|
||||||
|
FMUSIC_MODULE *module;
|
||||||
|
FSOUND_STREAM *stream;
|
||||||
|
FSOUND_SAMPLE *sample;
|
||||||
|
int channel;
|
||||||
|
#endif
|
||||||
|
bool loops;
|
||||||
|
bool finished;
|
||||||
|
bool running;
|
||||||
|
float volume;
|
||||||
|
STOPCALLBACK stopcallback;
|
||||||
|
bool isFinished(void);
|
||||||
|
|
||||||
|
int fadepos, fadetarget;
|
||||||
|
int fademode;
|
||||||
|
|
||||||
|
int minduration;
|
||||||
|
|
||||||
|
char *filename;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Sound(Sound *source);
|
||||||
|
Sound(char *filename);
|
||||||
|
Sound(char *filename, int type);
|
||||||
|
Sound(char *filename, bool loops);
|
||||||
|
Sound(char *filename, int type, bool loops);
|
||||||
|
void load(char *filename, int type, bool loops);
|
||||||
|
bool play(void);
|
||||||
|
|
||||||
|
//Plays sound for at least minduration frames until sound
|
||||||
|
//can be played again. Doesn't prevent stopping of the sound
|
||||||
|
void play(int minduration);
|
||||||
|
void stop();
|
||||||
|
void setStopCallback(STOPCALLBACK callback);
|
||||||
|
void setVolume(float volume);
|
||||||
|
void fadeIn(int length);
|
||||||
|
void fadeOut(int length);
|
||||||
|
|
||||||
|
//Do not use methods below
|
||||||
|
void setFinished(void);
|
||||||
|
void update(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
void initAudio(void);
|
||||||
|
void uninitAudio(void);
|
||||||
|
void updateAudio(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
113
src/camera.cpp
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
/*
|
||||||
|
* $Id: camera.cpp,v 1.5 2002/07/22 01:14:14 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: camera.cpp,v $
|
||||||
|
* Revision 1.5 2002/07/22 01:14:14 msell
|
||||||
|
* Lopetussysteemi
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/17 20:49:04 msell
|
||||||
|
* free -> SDL_FreeSurface
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/16 01:04:58 jkaarlas
|
||||||
|
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/03 23:06:38 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/05/16 18:42:07 msell
|
||||||
|
* Vektorifunctioita ja kamera
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/22 01:14:14 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#include "camera.h"
|
||||||
|
#include "vector.h"
|
||||||
|
#include "glapi.h"
|
||||||
|
|
||||||
|
Camera::Camera(void){
|
||||||
|
right = &matrix[0];
|
||||||
|
up = &matrix[3];
|
||||||
|
forward = &matrix[6];
|
||||||
|
|
||||||
|
vectorSet(position, 0, 2, 2);
|
||||||
|
vectorSet(target, 0, 0, 0);
|
||||||
|
vectorSet(up, 0, 1, 0);
|
||||||
|
|
||||||
|
calculateMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::setPosition(float position[3]){
|
||||||
|
vectorCopy(this->position, position);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::setPosition(float x, float y, float z){
|
||||||
|
this->position[0] = x;
|
||||||
|
this->position[1] = y;
|
||||||
|
this->position[2] = z;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::getPosition(float *position){
|
||||||
|
vectorCopy(position, this->position);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::setTarget(float target[3]){
|
||||||
|
vectorCopy(this->target, target);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::getTarget(float *target){
|
||||||
|
vectorCopy(target, this->target);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::setUp(float up[3]){
|
||||||
|
vectorCopy(this->up, up);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::getMatrix(float *matrix){
|
||||||
|
vectorCopy(&matrix[0], &this->matrix[0]);
|
||||||
|
vectorCopy(&matrix[3], &this->matrix[3]);
|
||||||
|
vectorCopy(&matrix[6], &this->matrix[6]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::moveRight(float amount){
|
||||||
|
float movevector[3];
|
||||||
|
vectorScale(movevector, right, amount);
|
||||||
|
vectorAdd(position, movevector);
|
||||||
|
//vectorAdd(target, movevector);
|
||||||
|
calculateMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::moveUp(float amount){
|
||||||
|
float movevector[3];
|
||||||
|
vectorScale(movevector, up, amount);
|
||||||
|
vectorAdd(position, movevector);
|
||||||
|
//vectorAdd(target, movevector);
|
||||||
|
calculateMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::moveForward(float amount){
|
||||||
|
float movevector[3];
|
||||||
|
vectorScale(movevector, forward, amount);
|
||||||
|
vectorAdd(position, movevector);
|
||||||
|
//vectorAdd(target, movevector);
|
||||||
|
calculateMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::glUpdate(void){
|
||||||
|
//glLoadIdentity();
|
||||||
|
|
||||||
|
gluLookAt(position[0], position[1], position[2],
|
||||||
|
target[0], target[1], target[2],
|
||||||
|
up[0], up[1], up[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::calculateMatrix(void){
|
||||||
|
vectorSub(forward, target, position);
|
||||||
|
vectorNormalize(forward);
|
||||||
|
vectorCross(right, forward, up);
|
||||||
|
}
|
55
src/camera.h
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* $Id: camera.h,v 1.4 2002/07/19 20:33:28 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: camera.h,v $
|
||||||
|
* Revision 1.4 2002/07/19 20:33:28 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/04 16:28:32 msell
|
||||||
|
* #pragma once
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/03 23:06:38 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/05/16 18:42:07 msell
|
||||||
|
* Vektorifunctioita ja kamera
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 20:33:28 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CAMERA_H_INCLUDED__
|
||||||
|
#define __CAMERA_H_INCLUDED__
|
||||||
|
|
||||||
|
class Camera{
|
||||||
|
private:
|
||||||
|
float position[3];
|
||||||
|
float target[3];
|
||||||
|
float matrix[9];
|
||||||
|
float *right, *up, *forward;
|
||||||
|
|
||||||
|
void calculateMatrix(void);
|
||||||
|
|
||||||
|
public:
|
||||||
|
Camera(void);
|
||||||
|
|
||||||
|
void setPosition(float position[3]);
|
||||||
|
void setPosition(float x, float y, float z);
|
||||||
|
void getPosition(float *position);
|
||||||
|
void setTarget(float target[3]);
|
||||||
|
void getTarget(float *target);
|
||||||
|
void setUp(float up[3]);
|
||||||
|
void getMatrix(float *matrix);
|
||||||
|
|
||||||
|
void moveRight(float amount);
|
||||||
|
void moveUp(float amount);
|
||||||
|
void moveForward(float amount);
|
||||||
|
|
||||||
|
void glUpdate(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
842
src/collision.cpp
Normal file
|
@ -0,0 +1,842 @@
|
||||||
|
/*
|
||||||
|
* $Id: collision.cpp,v 1.24 2002/07/21 15:03:12 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: collision.cpp,v $
|
||||||
|
* Revision 1.24 2002/07/21 15:03:12 msell
|
||||||
|
* Äänet disabloitu
|
||||||
|
*
|
||||||
|
* Revision 1.23 2002/07/19 18:59:46 msell
|
||||||
|
* Alkuhommaa ja säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.22 2002/07/18 23:05:31 msell
|
||||||
|
* Partikkelit ja kakkospelaajan liike
|
||||||
|
*
|
||||||
|
* Revision 1.21 2002/07/17 22:45:53 msell
|
||||||
|
* Ääniä vähän
|
||||||
|
*
|
||||||
|
* Revision 1.20 2002/07/15 15:22:07 msell
|
||||||
|
* Parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.19 2002/07/14 21:40:43 msell
|
||||||
|
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
|
||||||
|
*
|
||||||
|
* Revision 1.18 2002/07/10 17:13:44 msell
|
||||||
|
* Törmäystarkastelun parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.17 2002/07/08 22:53:38 msell
|
||||||
|
* Säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.16 2002/07/08 18:28:47 msell
|
||||||
|
* Törmäystä ja ukkoja
|
||||||
|
*
|
||||||
|
* Revision 1.15 2002/07/07 23:21:11 msell
|
||||||
|
* Pientä parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.14 2002/07/07 23:05:22 msell
|
||||||
|
* Osien liimaaminen toisiinsa (kesken)
|
||||||
|
*
|
||||||
|
* Revision 1.13 2002/07/07 15:29:07 msell
|
||||||
|
* Törmäyksien parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.12 2002/07/04 21:05:41 msell
|
||||||
|
* Se toimii!! =)
|
||||||
|
* Törmäystarkistukset siis
|
||||||
|
*
|
||||||
|
* Revision 1.11 2002/06/30 16:05:04 msell
|
||||||
|
* Törmäyksien parantelua, transformaatioita mukana
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/06/27 14:39:48 msell
|
||||||
|
* Toimiva maila :)
|
||||||
|
* Pyörivät kappaleet siis antaa liike-energiaa liikkuville kappaleille (ei toisin päin vielä)
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/06/27 00:08:04 msell
|
||||||
|
* Kimmotukset palloille myös pyöritettyihin mesheihin
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/06/23 20:12:19 msell
|
||||||
|
* Parempi törmäystarkistus palloista mesheihin
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/06/20 22:50:12 msell
|
||||||
|
* Meshit
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/17 12:42:46 msell
|
||||||
|
* Hieman parempi törmäysmallinnus taas
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/15 22:56:37 msell
|
||||||
|
* Säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/15 17:18:37 msell
|
||||||
|
* Toimiva törmäystarkastus kiinteille laatikoille
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/14 00:26:17 msell
|
||||||
|
* 100 kimpoilevaa palloa ja vähän vaimennusta
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/14 00:05:05 msell
|
||||||
|
* Törmäyssimulaatio kunnossa toivon mukaan
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/06/11 23:11:45 msell
|
||||||
|
* Törmäystarkistusta
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/21 15:03:12 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "object.h"
|
||||||
|
#include "vector.h"
|
||||||
|
#include "collision.h"
|
||||||
|
#include "mesh.h"
|
||||||
|
#include "3dutils.h"
|
||||||
|
#include "world.h"
|
||||||
|
#include "audio.h"
|
||||||
|
|
||||||
|
|
||||||
|
//objectlist *collisionlists[32];
|
||||||
|
unsigned int collisionlinks[32];
|
||||||
|
|
||||||
|
Contact *contacts;
|
||||||
|
int contactcount;
|
||||||
|
|
||||||
|
void initCollisions(void){
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 32; i++){
|
||||||
|
//collisionlists[i] = NULL;
|
||||||
|
collisionlinks[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*void addCollisionObject(Object *object, int group){
|
||||||
|
objectlist *node = new objectlist;
|
||||||
|
node->object = object;
|
||||||
|
node->next = collisionlists[group];
|
||||||
|
collisionlists[group] = node;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
void addCollisionLink(int source, int target){
|
||||||
|
collisionlinks[source] |= (1<<target);
|
||||||
|
if (source != target) collisionlinks[target] |= (1<<source);
|
||||||
|
}
|
||||||
|
|
||||||
|
void removeCollisionLink(int source, int target){
|
||||||
|
collisionlinks[source] &= ~(1<<target);
|
||||||
|
if (source != target) collisionlinks[target] &= ~(1<<source);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isCollisionLink(int source, int target){
|
||||||
|
if (collisionlinks[source] & (1<<target)) return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void addCollision(Object *source, Object *target,
|
||||||
|
float *normal, float *contactpoint){
|
||||||
|
if (contactcount == MAXCONTACTS){
|
||||||
|
printf("Too many contacts!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Contact *contact = &contacts[contactcount++];
|
||||||
|
contact->object1 = source;
|
||||||
|
contact->object2 = target;
|
||||||
|
vectorCopy(contact->normal, normal);
|
||||||
|
vectorCopy(contact->position, contactpoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define KINETICFRICTION 0.4
|
||||||
|
|
||||||
|
bool handleCollision(Contact *contact){
|
||||||
|
Object *source = contact->object1;
|
||||||
|
Object *target = contact->object2;
|
||||||
|
float *normal = contact->normal;
|
||||||
|
float *contactpoint = contact->position;
|
||||||
|
|
||||||
|
float sourcevelocity[3], targetvelocity[3];
|
||||||
|
float sourcecontactpoint[3], targetcontactpoint[3];
|
||||||
|
|
||||||
|
vectorSub(sourcecontactpoint, contactpoint, source->position);
|
||||||
|
source->getVelocity(sourcevelocity, sourcecontactpoint);
|
||||||
|
|
||||||
|
if (target == NULL){
|
||||||
|
vectorSet(targetcontactpoint, 0, 0, 0);
|
||||||
|
vectorSet(targetvelocity, 0, 0, 0);
|
||||||
|
} else{
|
||||||
|
vectorSub(targetcontactpoint, contactpoint, target->position);
|
||||||
|
target->getVelocity(targetvelocity, targetcontactpoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
float deltavelocity[3];
|
||||||
|
vectorSub(deltavelocity, sourcevelocity, targetvelocity);
|
||||||
|
float dot = vectorDot(deltavelocity, normal);
|
||||||
|
|
||||||
|
//if (fabs(dot) < EPSILON) return false;
|
||||||
|
//if (dot > -1.0e-5 && dot < 1.0e-5) return false;
|
||||||
|
//if (dot >= 0) return false;
|
||||||
|
if (dot > -1.0e-5) return false;
|
||||||
|
|
||||||
|
|
||||||
|
float invmass1;
|
||||||
|
invmass1 = source->invmass;
|
||||||
|
|
||||||
|
float invmass2;
|
||||||
|
if (target == NULL) invmass2 = 0;
|
||||||
|
else invmass2 = target->invmass;
|
||||||
|
|
||||||
|
float t1;
|
||||||
|
if (source->invmomentofinertia == 0){
|
||||||
|
t1 = 0;
|
||||||
|
} else{
|
||||||
|
float v1[3];
|
||||||
|
vectorCross(v1, sourcecontactpoint, normal);
|
||||||
|
vectorScale(v1, source->invmomentofinertia);
|
||||||
|
float w1[3];
|
||||||
|
vectorCross(w1, v1, sourcecontactpoint);
|
||||||
|
t1 = vectorDot(normal, w1);
|
||||||
|
}
|
||||||
|
|
||||||
|
float t2;
|
||||||
|
if (target == NULL || target->invmomentofinertia == 0){
|
||||||
|
t2 = 0;
|
||||||
|
} else{
|
||||||
|
float v1[3];
|
||||||
|
vectorCross(v1, targetcontactpoint, normal);
|
||||||
|
vectorScale(v1, target->invmomentofinertia);
|
||||||
|
float w1[3];
|
||||||
|
vectorCross(w1, v1, targetcontactpoint);
|
||||||
|
t2 = vectorDot(normal, w1);
|
||||||
|
}
|
||||||
|
|
||||||
|
float denominator = invmass1 + invmass2 + t1 + t2;
|
||||||
|
|
||||||
|
float e = 1.0 - COLLISIONFRICTION;
|
||||||
|
|
||||||
|
float impulsesize = (1 + e) * dot / denominator;
|
||||||
|
|
||||||
|
//printf("%f\n", impulsesize);
|
||||||
|
|
||||||
|
float impulse[3];
|
||||||
|
vectorScale(impulse, normal, impulsesize);
|
||||||
|
|
||||||
|
|
||||||
|
float friction[3];
|
||||||
|
vectorScale(friction, normal, vectorDot(deltavelocity, normal));
|
||||||
|
vectorAdd(friction, deltavelocity);
|
||||||
|
vectorNormalize(friction);
|
||||||
|
float frictionsize = 10*KINETICFRICTION*dot/denominator;
|
||||||
|
float maxfrictionsize = 0.1*vectorLength(deltavelocity);
|
||||||
|
if (frictionsize < -maxfrictionsize) frictionsize = -maxfrictionsize;
|
||||||
|
vectorScale(friction, -frictionsize);
|
||||||
|
vectorAdd(impulse, friction);
|
||||||
|
|
||||||
|
|
||||||
|
if (target != NULL){
|
||||||
|
target->addImpulse(impulse, targetcontactpoint);
|
||||||
|
target->calculateStateVariables();
|
||||||
|
}
|
||||||
|
|
||||||
|
float speed;
|
||||||
|
float speed2[3];
|
||||||
|
|
||||||
|
if (target != NULL && source != NULL){
|
||||||
|
//float kvel[3];
|
||||||
|
//source->getVelocity(kvel);
|
||||||
|
float k = vectorLength(sourcevelocity)*0.1;
|
||||||
|
//if (k > 1) k = 1;
|
||||||
|
speed = -impulsesize*target->invmass*k;
|
||||||
|
vectorScale(speed2, impulse, target->invmass*k);
|
||||||
|
/*float kvel[3];
|
||||||
|
source->getVelocity(kvel);
|
||||||
|
float k = 0;//vectorDot(speed2, kvel);
|
||||||
|
if (k < EPSILON) k = 0;
|
||||||
|
speed *= k;
|
||||||
|
vectorScale(speed2, k);
|
||||||
|
if (k > 0) */target->hitForce(speed, speed2, source);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vectorScale(impulse, -1);
|
||||||
|
source->addImpulse(impulse, sourcecontactpoint);
|
||||||
|
source->calculateStateVariables();
|
||||||
|
|
||||||
|
//vectorScale(speed, source->invmass);
|
||||||
|
if (target != NULL && source != NULL){
|
||||||
|
//float kvel[3];
|
||||||
|
//target->getVelocity(kvel);
|
||||||
|
float k = vectorLength(targetvelocity)*0.1;
|
||||||
|
//if (k > 1) k = 1;
|
||||||
|
speed = -impulsesize*source->invmass*k;
|
||||||
|
vectorScale(speed2, impulse, source->invmass*k);
|
||||||
|
/*float kvel[3];
|
||||||
|
target->getVelocity(kvel);
|
||||||
|
float k = 0;//vectorDot(speed2, kvel);
|
||||||
|
if (k < EPSILON) k = 0;
|
||||||
|
speed *= k;
|
||||||
|
vectorScale(speed2, k);
|
||||||
|
if (k > 0) */source->hitForce(speed, speed2, target);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool handleLink(ObjectLink *link){
|
||||||
|
if (!link->enabled) return false;
|
||||||
|
|
||||||
|
Object *source = link->object1;
|
||||||
|
Object *target = link->object2;
|
||||||
|
|
||||||
|
float normal[3];
|
||||||
|
float contactpoint1[3], contactpoint2[3];
|
||||||
|
source->transformPoint(contactpoint1, link->point1);
|
||||||
|
target->transformPoint(contactpoint2, link->point2);
|
||||||
|
|
||||||
|
float diff[3];
|
||||||
|
vectorSub(diff, contactpoint1, contactpoint2);
|
||||||
|
vectorNormalize(normal, diff);
|
||||||
|
|
||||||
|
float strength = vectorDot(diff, diff);
|
||||||
|
|
||||||
|
if (strength < 1.0e-5) return false;
|
||||||
|
|
||||||
|
float sourcevelocity[3], targetvelocity[3];
|
||||||
|
float sourcecontactpoint[3], targetcontactpoint[3];
|
||||||
|
|
||||||
|
vectorSub(sourcecontactpoint, contactpoint1, source->position);
|
||||||
|
source->getVelocity(sourcevelocity, sourcecontactpoint);
|
||||||
|
|
||||||
|
vectorSub(targetcontactpoint, contactpoint2, target->position);
|
||||||
|
target->getVelocity(targetvelocity, targetcontactpoint);
|
||||||
|
|
||||||
|
float deltavelocity[3];
|
||||||
|
vectorSub(deltavelocity, sourcevelocity, targetvelocity);
|
||||||
|
float dot = vectorDot(deltavelocity, normal);
|
||||||
|
|
||||||
|
//if (fabs(dot) < EPSILON) return false;
|
||||||
|
//if (dot > -1.0e-5 && dot < 1.0e-5) return false;
|
||||||
|
//if (dot >= 0) return false;
|
||||||
|
//if (dot > -1.0e-5) return false;
|
||||||
|
|
||||||
|
|
||||||
|
float invmass1 = source->invmass;
|
||||||
|
float invmass2 = target->invmass;
|
||||||
|
|
||||||
|
float t1;
|
||||||
|
if (source->invmomentofinertia == 0){
|
||||||
|
t1 = 0;
|
||||||
|
} else{
|
||||||
|
float v1[3];
|
||||||
|
vectorCross(v1, sourcecontactpoint, normal);
|
||||||
|
vectorScale(v1, source->invmomentofinertia);
|
||||||
|
float w1[3];
|
||||||
|
vectorCross(w1, v1, sourcecontactpoint);
|
||||||
|
t1 = vectorDot(normal, w1);
|
||||||
|
}
|
||||||
|
|
||||||
|
float t2;
|
||||||
|
if (target->invmomentofinertia == 0){
|
||||||
|
t2 = 0;
|
||||||
|
} else{
|
||||||
|
float v1[3];
|
||||||
|
vectorCross(v1, targetcontactpoint, normal);
|
||||||
|
vectorScale(v1, target->invmomentofinertia);
|
||||||
|
float w1[3];
|
||||||
|
vectorCross(w1, v1, targetcontactpoint);
|
||||||
|
t2 = vectorDot(normal, w1);
|
||||||
|
}
|
||||||
|
|
||||||
|
float denominator = invmass1 + invmass2 + t1 + t2;
|
||||||
|
|
||||||
|
float impulsesize = (dot + strength*100) / denominator;
|
||||||
|
|
||||||
|
//printf("%f\n", impulsesize);
|
||||||
|
|
||||||
|
float impulse[3];
|
||||||
|
vectorScale(impulse, normal, impulsesize);
|
||||||
|
|
||||||
|
|
||||||
|
target->addImpulse(impulse, targetcontactpoint);
|
||||||
|
target->calculateStateVariables();
|
||||||
|
|
||||||
|
vectorScale(impulse, -1);
|
||||||
|
source->addImpulse(impulse, sourcecontactpoint);
|
||||||
|
source->calculateStateVariables();
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool checkCollisions(Object *object, float *contactnormal){
|
||||||
|
//bool collision = false;
|
||||||
|
int group = object->getCollisionGroup();
|
||||||
|
int groups = collisionlinks[group];
|
||||||
|
group = 0;
|
||||||
|
int collisions = 0;
|
||||||
|
/*float oldmomentum[3];
|
||||||
|
vectorCopy(oldmomentum, object->momentum);
|
||||||
|
|
||||||
|
while (groups){
|
||||||
|
if (groups & 1){
|
||||||
|
objectlist *node = collisionlists[group];
|
||||||
|
while (node != NULL){
|
||||||
|
Object *object2 = node->object;
|
||||||
|
node = node->next;
|
||||||
|
if (object != object2){
|
||||||
|
if (object2->geometry->checkCollision(object, contactnormal)){
|
||||||
|
collisions++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
group++;
|
||||||
|
groups >>= 1;
|
||||||
|
}
|
||||||
|
/*float temp[3];
|
||||||
|
vectorSub(temp, object->momentum, oldmomentum);
|
||||||
|
vectorScale(temp, 1.0/DT);
|
||||||
|
object->addForce(temp);*/
|
||||||
|
//vectorSub(object->
|
||||||
|
//vectorCopy(object->momentum, oldmomentum);
|
||||||
|
//printf("%i\n", collisions);
|
||||||
|
//vectorScale(object->force, 1.0/collisions);
|
||||||
|
/*if (collisions > 0){
|
||||||
|
vectorScale(object->force, 2.0/vectorLength(object->momentum));
|
||||||
|
}*/
|
||||||
|
return collisions > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* mass = 0 means infinite mass
|
||||||
|
*/
|
||||||
|
/*void collide(float *velocity1, float *velocity2,
|
||||||
|
float mass1, float mass2,
|
||||||
|
float *normal, float *newimpulse){
|
||||||
|
float deltavelocity[3];
|
||||||
|
vectorSub(deltavelocity, velocity1, velocity2);
|
||||||
|
float dot = vectorDot(deltavelocity, normal);
|
||||||
|
float massinverse1 = 0;
|
||||||
|
float massinverse2 = 0;
|
||||||
|
if (mass1 != 0) massinverse1 = 1.0 / mass1;
|
||||||
|
if (mass2 != 0) massinverse2 = 1.0 / mass2;
|
||||||
|
float impulsesize = -1 * dot / (massinverse1 + massinverse2);
|
||||||
|
vectorScale(newimpulse, normal, impulsesize);
|
||||||
|
if (dot > 0){
|
||||||
|
vectorSet(newimpulse, 0, 0, 0);
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
void collide(Object *source, Object *target, float *normal, float *contactpoint){
|
||||||
|
/* float momentum[3];
|
||||||
|
source->getMomentum(momentum);
|
||||||
|
|
||||||
|
float sourcevelocity[3], targetvelocity[3];
|
||||||
|
float sourcecontactpoint[3], targetcontactpoint[3];
|
||||||
|
|
||||||
|
//source->unTransformPoint(sourcecontactpoint, contactpoint);
|
||||||
|
//target->unTransformPoint(targetcontactpoint, contactpoint);
|
||||||
|
vectorSub(sourcecontactpoint, contactpoint, source->position);
|
||||||
|
vectorSub(targetcontactpoint, contactpoint, target->position);
|
||||||
|
|
||||||
|
source->getVelocity(sourcevelocity);//, sourcecontactpoint);
|
||||||
|
float sourcemass = source->getMass();
|
||||||
|
|
||||||
|
target->getVelocity(targetvelocity);//, targetcontactpoint);
|
||||||
|
float targetmass = target->getMass();
|
||||||
|
|
||||||
|
float deltavelocity[3];
|
||||||
|
vectorSub(deltavelocity, sourcevelocity, targetvelocity);
|
||||||
|
float dot = vectorDot(deltavelocity, normal);
|
||||||
|
float massinverse1 = 0;
|
||||||
|
float massinverse2 = 0;
|
||||||
|
if (sourcemass != 0) massinverse1 = 1.0 / sourcemass;
|
||||||
|
if (targetmass != 0) massinverse2 = 1.0 / targetmass;
|
||||||
|
|
||||||
|
float t1;
|
||||||
|
if (source->invmomentofinertia == 0){
|
||||||
|
t1 = 0;
|
||||||
|
} else{
|
||||||
|
float v1[3];
|
||||||
|
vectorCross(v1, sourcecontactpoint, normal);
|
||||||
|
vectorScale(v1, 1.0/source->momentofinertia);
|
||||||
|
float w1[3];
|
||||||
|
vectorCross(w1, v1, sourcecontactpoint);
|
||||||
|
t1 = vectorDot(normal, w1);
|
||||||
|
}
|
||||||
|
//printf("S: %f, %f, %f\n", sourcecontactpoint[0], source->momentofinertia, v1);
|
||||||
|
|
||||||
|
float t2;
|
||||||
|
if (target->momentofinertia == 0){
|
||||||
|
t2 = 0;
|
||||||
|
} else{
|
||||||
|
float v2[3];
|
||||||
|
vectorCross(v2, targetcontactpoint, normal);
|
||||||
|
vectorScale(v2, 1.0/target->momentofinertia);
|
||||||
|
float w2[3];
|
||||||
|
vectorCross(w2, v2, targetcontactpoint);
|
||||||
|
t2 = vectorDot(normal, w2);
|
||||||
|
}
|
||||||
|
//printf("T: %f, %f, %f\n", targetcontactpoint[0], target->momentofinertia, v2);
|
||||||
|
|
||||||
|
|
||||||
|
float divisor;
|
||||||
|
divisor = massinverse1 + massinverse2;// + t1 + t2;
|
||||||
|
|
||||||
|
printf("%f, %f, %f, %f : %f\n", massinverse1, massinverse2, t1, t2, divisor);
|
||||||
|
|
||||||
|
float impulsesize = -dot / divisor;
|
||||||
|
|
||||||
|
float impulse[3];
|
||||||
|
vectorScale(impulse, normal, impulsesize);
|
||||||
|
//collide(sourcevelocity, targetvelocity, sourcemass, targetmass, normal, impulse);
|
||||||
|
|
||||||
|
//vectorAdd(source->momentum, impulse);
|
||||||
|
|
||||||
|
float *force = impulse;
|
||||||
|
|
||||||
|
//vectorScale(force, 2.0/DT);
|
||||||
|
printf("F: %f, %f, %f\n", impulse[0], impulse[1], impulse[2]);
|
||||||
|
|
||||||
|
//float cp[3];
|
||||||
|
//vectorSub(cp, contactpoint, source->position);
|
||||||
|
//source->addForce(force, sourcecontactpoint);*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool checkSphereMeshCollision(float *sphereposition, float r, Mesh *mesh, float *normal, float *contactpoint){
|
||||||
|
float linenormal[3];
|
||||||
|
float pointnormal[3];
|
||||||
|
float maxdist = 0;
|
||||||
|
bool planecollision = false;
|
||||||
|
bool linecollision = false;
|
||||||
|
bool pointcollision = false;
|
||||||
|
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < mesh->polygoncount; i++){
|
||||||
|
class Polygon *polygon = &mesh->polygons[i];
|
||||||
|
|
||||||
|
float dist = distanceFromPlane(sphereposition, polygon->planenormal, polygon->planedistance);
|
||||||
|
if (dist < r && dist > -r){
|
||||||
|
bool directcollision = true;
|
||||||
|
for (j = 0; j < polygon->vertexcount; j++){
|
||||||
|
float *p1 = polygon->vertices[j]->position;
|
||||||
|
float *p2 = polygon->vertices[(j+1)%polygon->vertexcount]->position;
|
||||||
|
float *p3 = polygon->vertices[(j+2)%polygon->vertexcount]->position;
|
||||||
|
float v1[3], v2[3];
|
||||||
|
vectorSub(v1, p2, p1);
|
||||||
|
|
||||||
|
//Collision for polygon surface
|
||||||
|
vectorSub(v2, p3, p2);
|
||||||
|
float t1[3];
|
||||||
|
vectorProject(t1, v2, v1);
|
||||||
|
float norm[3];
|
||||||
|
vectorSub(norm, v2, t1);
|
||||||
|
vectorNormalize(norm);
|
||||||
|
|
||||||
|
//Collision for polygon edges
|
||||||
|
float newpoint[3];
|
||||||
|
vectorSub(newpoint, sphereposition, p1);
|
||||||
|
float dist2 = vectorDot(newpoint, norm);
|
||||||
|
if (dist2 < 0){
|
||||||
|
directcollision = false;
|
||||||
|
float projloc = vectorDot(newpoint, v1) / vectorDot(v1, v1);
|
||||||
|
if (projloc >= 0 && projloc <= 1){
|
||||||
|
float proj[3];
|
||||||
|
vectorScale(proj, v1, projloc);
|
||||||
|
float projorth[3];
|
||||||
|
vectorSub(projorth, newpoint, proj);
|
||||||
|
float l2 = vectorDot(projorth, projorth);
|
||||||
|
if (l2 < r*r){
|
||||||
|
vectorNormalize(linenormal, projorth);
|
||||||
|
if (dist < 0) vectorScale(linenormal, -1);
|
||||||
|
linecollision = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Collision for polygon vertices
|
||||||
|
float pointdiff[3];
|
||||||
|
vectorSub(pointdiff, sphereposition, p1);
|
||||||
|
float l3 = vectorDot(pointdiff, pointdiff);
|
||||||
|
if (l3 < r*r){
|
||||||
|
vectorScale(pointnormal, pointdiff, 1.0 / sqrt(l3));
|
||||||
|
if (dist < 0) vectorScale(pointnormal, -1);
|
||||||
|
pointcollision = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (directcollision){
|
||||||
|
if (dist > maxdist || !planecollision){
|
||||||
|
vectorCopy(normal, polygon->planenormal);
|
||||||
|
maxdist = dist;
|
||||||
|
planecollision = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (planecollision){
|
||||||
|
vectorScale(contactpoint, normal, -r);
|
||||||
|
vectorAdd(contactpoint, sphereposition);
|
||||||
|
} else if (linecollision){
|
||||||
|
vectorScale(contactpoint, linenormal, -r);
|
||||||
|
vectorAdd(contactpoint, sphereposition);
|
||||||
|
vectorCopy(normal, linenormal);
|
||||||
|
} else if (pointcollision){
|
||||||
|
vectorScale(contactpoint, pointnormal, -r);
|
||||||
|
vectorAdd(contactpoint, sphereposition);
|
||||||
|
vectorCopy(normal, pointnormal);
|
||||||
|
} else{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool checkPointMeshCollision(float *position, Mesh *mesh, float *normal, float *contactpoint){
|
||||||
|
float maxdist = 0;
|
||||||
|
bool planecollision = false;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < mesh->polygoncount; i++){
|
||||||
|
class Polygon *polygon = &mesh->polygons[i];
|
||||||
|
|
||||||
|
float dist = distanceFromPlane(position, polygon->planenormal, polygon->planedistance);
|
||||||
|
if (dist < 0){
|
||||||
|
bool directcollision = true;
|
||||||
|
/*for (j = 0; j < polygon->vertexcount; j++){
|
||||||
|
float *p1 = polygon->vertices[j]->position;
|
||||||
|
float *p2 = polygon->vertices[(j+1)%polygon->vertexcount]->position;
|
||||||
|
float *p3 = polygon->vertices[(j+2)%polygon->vertexcount]->position;
|
||||||
|
float v1[3], v2[3];
|
||||||
|
vectorSub(v1, p2, p1);
|
||||||
|
|
||||||
|
//Collision for polygon surface
|
||||||
|
vectorSub(v2, p3, p2);
|
||||||
|
float t1[3];
|
||||||
|
vectorProject(t1, v2, v1);
|
||||||
|
float norm[3];
|
||||||
|
vectorSub(norm, v2, t1);
|
||||||
|
vectorNormalize(norm);
|
||||||
|
|
||||||
|
//Collision for polygon edges
|
||||||
|
float newpoint[3];
|
||||||
|
vectorSub(newpoint, position, p1);
|
||||||
|
float dist2 = vectorDot(newpoint, norm);
|
||||||
|
if (dist2 < 0) directcollision = false;
|
||||||
|
}*/
|
||||||
|
if (directcollision){
|
||||||
|
if (dist > maxdist || !planecollision){
|
||||||
|
vectorCopy(normal, polygon->planenormal);
|
||||||
|
maxdist = dist;
|
||||||
|
planecollision = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (planecollision){
|
||||||
|
vectorCopy(contactpoint, position);
|
||||||
|
} else{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MAXPOLYGONS 1000
|
||||||
|
|
||||||
|
struct tracehit{
|
||||||
|
float t;
|
||||||
|
Polygon *polygon;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool tracePlane(tracehit *result, float *origin, float *ray, class Polygon *polygon){
|
||||||
|
float *normal = polygon->planenormal;
|
||||||
|
float D = polygon->planedistance;
|
||||||
|
float denominator = vectorDot(normal, ray);
|
||||||
|
if (denominator == 0){
|
||||||
|
if (vectorDot(normal, origin) > 0) result->t = 1000000;
|
||||||
|
else result->t = -1000000;
|
||||||
|
result->polygon = polygon;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
float t = - (vectorDot(normal, origin) + D) / denominator;
|
||||||
|
|
||||||
|
result->t = t;
|
||||||
|
result->polygon = polygon;
|
||||||
|
|
||||||
|
//if (t < 0 || t > 1) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Edge *findSharingEdge(class Polygon *p1, class Polygon *p2){
|
||||||
|
//printf("Edges:\n");
|
||||||
|
int i, j;
|
||||||
|
for (i = 0; i < p1->vertexcount; i++){
|
||||||
|
//printf("%p\n", p1->edges[i]);
|
||||||
|
for (j = 0; j < p2->vertexcount; j++){
|
||||||
|
if (p1->edges[i] == p2->edges[j]) return p1->edges[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Polygon *findSharingPolygon(Mesh *mesh, class Polygon *p1, class Polygon *p2){
|
||||||
|
//printf("Edges:\n");
|
||||||
|
int i, j;
|
||||||
|
for (i = 0; i < p1->vertexcount; i++){
|
||||||
|
//printf("%p\n", p1->edges[i]);
|
||||||
|
for (j = 0; j < p2->vertexcount; j++){
|
||||||
|
if (p1->edges[i] == p2->edges[j]) return p1->edges[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}*/
|
||||||
|
Polygon *findNearestPolygon(class Polygon *polygon, float *point){
|
||||||
|
int i;
|
||||||
|
float mindist = 0;
|
||||||
|
Polygon *nearestpolygon = NULL;
|
||||||
|
for (i = 0; i < polygon->edgecount; i++){
|
||||||
|
Edge *edge = polygon->edges[i];
|
||||||
|
Polygon *polygon2 = edge->p1;
|
||||||
|
if (polygon2 == polygon) polygon2 = edge->p2;
|
||||||
|
float newdist = distanceFromPlane(point, polygon2->planenormal, polygon2->planedistance);
|
||||||
|
if (newdist > 0) return NULL;
|
||||||
|
if (mindist == 0 || newdist > mindist){
|
||||||
|
mindist = newdist;
|
||||||
|
nearestpolygon = polygon2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nearestpolygon;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool checkEdgeMeshCollision(float *p1, float *p2, Mesh *mesh, float *normal, float *contactpoint){
|
||||||
|
float ray[3];
|
||||||
|
vectorSub(ray, p2, p1);
|
||||||
|
|
||||||
|
float maxdist = 0;
|
||||||
|
bool collision = false;
|
||||||
|
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
tracehit hits[MAXPOLYGONS];
|
||||||
|
int hitcount = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < mesh->polygoncount; i++){
|
||||||
|
class Polygon *polygon = &mesh->polygons[i];
|
||||||
|
|
||||||
|
if (tracePlane(&hits[hitcount], p1, ray, polygon)){
|
||||||
|
hitcount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hitcount < 2) return false;
|
||||||
|
|
||||||
|
for (i = 1; i < hitcount; i++){
|
||||||
|
for (j = i; j > 0; j--){
|
||||||
|
if (hits[j].t < hits[j-1].t){
|
||||||
|
float tempt = hits[j].t;
|
||||||
|
hits[j].t = hits[j-1].t;
|
||||||
|
hits[j-1].t = tempt;
|
||||||
|
class Polygon *tempp = hits[j].polygon;
|
||||||
|
hits[j].polygon = hits[j-1].polygon;
|
||||||
|
hits[j-1].polygon = tempp;
|
||||||
|
} else break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int negative = -1, positive = -1;
|
||||||
|
|
||||||
|
|
||||||
|
for (i = 0; i < hitcount; i++){
|
||||||
|
float t = hits[i].t;
|
||||||
|
class Polygon *polygon = hits[i].polygon;
|
||||||
|
|
||||||
|
float dot = vectorDot(ray, polygon->planenormal);
|
||||||
|
|
||||||
|
if (dot > 0 && positive == -1) positive = i;
|
||||||
|
if (dot < 0) negative = i;
|
||||||
|
|
||||||
|
if (dot < 0 && positive != -1) return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (negative == -1 || positive == -1) return false;
|
||||||
|
|
||||||
|
/*for (i = 0; i < hitcount; i++){
|
||||||
|
float t = hits[i].t;
|
||||||
|
class Polygon *polygon = hits[i].polygon;
|
||||||
|
|
||||||
|
float dot = vectorDot(ray, polygon->planenormal);
|
||||||
|
|
||||||
|
printf("%f ", dot);
|
||||||
|
}
|
||||||
|
printf("\n");*/
|
||||||
|
|
||||||
|
if (hits[negative].t < 0 || hits[positive].t > 1) return false;
|
||||||
|
|
||||||
|
Edge *edge2 = findSharingEdge(hits[negative].polygon, hits[positive].polygon);
|
||||||
|
|
||||||
|
//fflush(stdout);
|
||||||
|
float cp1[3], cp2[3];
|
||||||
|
vectorScale(cp1, ray, hits[negative].t);
|
||||||
|
vectorAdd(cp1, p1);
|
||||||
|
vectorScale(cp2, ray, hits[positive].t);
|
||||||
|
vectorAdd(cp2, p1);
|
||||||
|
|
||||||
|
if (edge2 != NULL){
|
||||||
|
|
||||||
|
/*float ev1[3];
|
||||||
|
vectorSub(ev1, edge2->v2->position, edge2->v1->position);
|
||||||
|
vectorCross(normal, ev1, ray);
|
||||||
|
vectorScale(normal, vectorDot(normal, hits[positive].polygon->planenormal));
|
||||||
|
vectorNormalize(normal);
|
||||||
|
|
||||||
|
float at = (hits[negative].t + hits[positive].t) / 2;
|
||||||
|
vectorScale(contactpoint, ray, at);
|
||||||
|
vectorAdd(contactpoint, p1);*/
|
||||||
|
|
||||||
|
float dot1 = fabs(vectorDot(ray, hits[negative].polygon->planenormal));
|
||||||
|
float dot2 = fabs(vectorDot(ray, hits[positive].polygon->planenormal));
|
||||||
|
|
||||||
|
if (dot1 > dot2){
|
||||||
|
//vectorScale(contactpoint, ray, hits[negative].t);
|
||||||
|
//vectorAdd(contactpoint, p1);
|
||||||
|
vectorCopy(contactpoint, cp1);
|
||||||
|
vectorCopy(normal, hits[positive].polygon->planenormal);
|
||||||
|
} else{
|
||||||
|
//vectorScale(contactpoint, ray, hits[positive].t);
|
||||||
|
//vectorAdd(contactpoint, p1);
|
||||||
|
vectorCopy(contactpoint, cp2);
|
||||||
|
vectorCopy(normal, hits[negative].polygon->planenormal);
|
||||||
|
}
|
||||||
|
} else{
|
||||||
|
Polygon *polygon = findNearestPolygon(hits[negative].polygon, cp1);
|
||||||
|
if (polygon != NULL){
|
||||||
|
/*vectorCopy(contactpoint, cp1);
|
||||||
|
vectorAdd(contactpoint, cp2);
|
||||||
|
vectorScale(contactpoint, 0.5);*/
|
||||||
|
float at = (hits[negative].t + hits[positive].t) / 2;
|
||||||
|
vectorScale(contactpoint, ray, at);
|
||||||
|
vectorAdd(contactpoint, p1);
|
||||||
|
|
||||||
|
vectorCopy(normal, polygon->planenormal);
|
||||||
|
} else{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//shotsound->play();
|
||||||
|
return true;
|
||||||
|
}
|
103
src/collision.h
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
/*
|
||||||
|
* $Id: collision.h,v 1.15 2002/07/19 20:33:28 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: collision.h,v $
|
||||||
|
* Revision 1.15 2002/07/19 20:33:28 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.14 2002/07/15 20:32:35 msell
|
||||||
|
* Uudet valot ja ulkoasun parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.13 2002/07/14 21:40:43 msell
|
||||||
|
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
|
||||||
|
*
|
||||||
|
* Revision 1.12 2002/07/10 17:13:44 msell
|
||||||
|
* Törmäystarkastelun parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.11 2002/07/08 22:53:38 msell
|
||||||
|
* Säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/07/08 18:28:47 msell
|
||||||
|
* Törmäystä ja ukkoja
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/07/07 23:05:22 msell
|
||||||
|
* Osien liimaaminen toisiinsa (kesken)
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/07/07 15:29:07 msell
|
||||||
|
* Törmäyksien parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/07/04 21:05:41 msell
|
||||||
|
* Se toimii!! =)
|
||||||
|
* Törmäystarkistukset siis
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/30 16:05:04 msell
|
||||||
|
* Törmäyksien parantelua, transformaatioita mukana
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/27 14:39:48 msell
|
||||||
|
* Toimiva maila :)
|
||||||
|
* Pyörivät kappaleet siis antaa liike-energiaa liikkuville kappaleille (ei toisin päin vielä)
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/27 00:08:04 msell
|
||||||
|
* Kimmotukset palloille myös pyöritettyihin mesheihin
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/23 20:12:19 msell
|
||||||
|
* Parempi törmäystarkistus palloista mesheihin
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/14 00:05:05 msell
|
||||||
|
* Törmäyssimulaatio kunnossa toivon mukaan
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/06/11 23:11:45 msell
|
||||||
|
* Törmäystarkistusta
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 20:33:28 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __COLLISION_H_INCLUDED__
|
||||||
|
#define __COLLISION_H_INCLUDED__
|
||||||
|
|
||||||
|
#include "mesh.h"
|
||||||
|
|
||||||
|
#define COLLISIONGROUP_NONE 0
|
||||||
|
#define COLLISIONGROUP_ARENA 1
|
||||||
|
#define COLLISIONGROUP_MAN1 2
|
||||||
|
#define COLLISIONGROUP_MAN1HAND 3
|
||||||
|
#define COLLISIONGROUP_MAN2 4
|
||||||
|
#define COLLISIONGROUP_MAN2HAND 5
|
||||||
|
#define COLLISIONGROUP_PARTICLE 6
|
||||||
|
|
||||||
|
#define COLLISIONFRICTION 0.9
|
||||||
|
|
||||||
|
void initCollisions(void);
|
||||||
|
//void addCollisionObject(Object *object, int group);
|
||||||
|
void addCollisionLink(int source, int target);
|
||||||
|
void removeCollisionLink(int source, int target);
|
||||||
|
bool isCollisionLink(int source, int target);
|
||||||
|
|
||||||
|
class Contact{
|
||||||
|
public:
|
||||||
|
Object *object1, *object2;
|
||||||
|
float normal[3];
|
||||||
|
float position[3];
|
||||||
|
};
|
||||||
|
|
||||||
|
extern Contact *contacts;
|
||||||
|
extern int contactcount;
|
||||||
|
|
||||||
|
|
||||||
|
//Contact point is world-relative and must be transformed
|
||||||
|
//into coordinate system of both objects
|
||||||
|
void addCollision(Object *source, Object *target,
|
||||||
|
float *normal, float *contactpoint);
|
||||||
|
bool handleCollision(Contact *contact);
|
||||||
|
bool handleLink(ObjectLink *link);
|
||||||
|
|
||||||
|
bool checkSphereMeshCollision(float *sphereposition, float r, Mesh *mesh, float *normal, float *contactpoint);
|
||||||
|
bool checkPointMeshCollision(float *position, Mesh *mesh, float *normal, float *contactpoint);
|
||||||
|
bool checkEdgeMeshCollision(float *p1, float *p2, Mesh *mesh, float *normal, float *contactpoint);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
161
src/end.cpp
Normal file
|
@ -0,0 +1,161 @@
|
||||||
|
/*
|
||||||
|
* $Id: end.cpp,v 1.2 2002/07/22 11:40:26 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: end.cpp,v $
|
||||||
|
* Revision 1.2 2002/07/22 11:40:26 msell
|
||||||
|
* Loppukuvaan lattia
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/07/22 01:14:14 msell
|
||||||
|
* Lopetussysteemi
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/22 11:40:26 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "legoblocks.h"
|
||||||
|
#include "camera.h"
|
||||||
|
#include "light.h"
|
||||||
|
#include "audio.h"
|
||||||
|
#include "object.h"
|
||||||
|
#include "appearance.h"
|
||||||
|
#include "sphere.h"
|
||||||
|
#include "vector.h"
|
||||||
|
#include "collision.h"
|
||||||
|
#include "utils.h"
|
||||||
|
#include "graphics.h"
|
||||||
|
#include "objectfactory.h"
|
||||||
|
#include "world.h"
|
||||||
|
#include "3dutils.h"
|
||||||
|
#include "legoman.h"
|
||||||
|
#include "font.h"
|
||||||
|
#include "run.h"
|
||||||
|
#include "menu.h"
|
||||||
|
#include "fight.h"
|
||||||
|
|
||||||
|
#include "glapi.h"
|
||||||
|
|
||||||
|
Camera endcamera;
|
||||||
|
Light endlight, endlight2;
|
||||||
|
|
||||||
|
//BasicBlockAppearance *endfloor = new BasicBlockAppearance(100, 1, 100);
|
||||||
|
BasicBlock *endfloor;// = new BasicBlock(20, 1, 15);
|
||||||
|
|
||||||
|
void initEnd(void){
|
||||||
|
endlight.setColor(1, 1, 1);
|
||||||
|
endlight.setSpecular(1, 1, 1);
|
||||||
|
endlight.setPosition(-0.5, BLOCKHEIGHT*16, 0.5);
|
||||||
|
endlight.setAttenuation(0, 0.0, 0.005);
|
||||||
|
|
||||||
|
endlight2.setColor(1, 1, 1);
|
||||||
|
endlight2.setSpecular(1, 1, 1);
|
||||||
|
endlight2.setAttenuation(1.0, 0.0, 0.0);
|
||||||
|
|
||||||
|
endfloor = new BasicBlock(30, 1, 20);
|
||||||
|
//endfloor->material.setColor(0, 1, 0, 1);
|
||||||
|
endfloor->setColor(0, 1, 0);
|
||||||
|
endfloor->setPosition(-10, -BLOCKHEIGHT*0.5, 0);
|
||||||
|
endfloor->prepare();
|
||||||
|
}
|
||||||
|
|
||||||
|
int endingcounter;
|
||||||
|
|
||||||
|
void endRestart(void){
|
||||||
|
endingcounter = 0;
|
||||||
|
//initEnd();
|
||||||
|
//endfloor->prepare();
|
||||||
|
}
|
||||||
|
|
||||||
|
void stopEnding(void){
|
||||||
|
endlight.setEnabled(false);
|
||||||
|
changeGameMode(MENUMODE);
|
||||||
|
fightmusic->fadeOut(300);
|
||||||
|
menuRestart();
|
||||||
|
}
|
||||||
|
|
||||||
|
float endfade;
|
||||||
|
|
||||||
|
void calculateEnd(int framecount){
|
||||||
|
endfade = -1;
|
||||||
|
|
||||||
|
if (endingcounter < 200){
|
||||||
|
endfade = 1-(float)endingcounter/200;
|
||||||
|
}
|
||||||
|
endingcounter++;
|
||||||
|
|
||||||
|
endlight.setEnabled(true);
|
||||||
|
//endlight2.setEnabled(true);
|
||||||
|
|
||||||
|
float target[3] = {0, 13, 0};
|
||||||
|
endcamera.setTarget(target);
|
||||||
|
endcamera.setPosition(10+sin(framecount*0.002)*2, 20+sin(framecount*0.0017)*2, 25+cos(framecount*0.002)*2);
|
||||||
|
//endcamera.setPosition(sin(framecount*0.01)*25, sin(framecount*0.007)*6+20, cos(framecount*0.01)*25);
|
||||||
|
|
||||||
|
//endlight.setPosition(40, 20, 0);
|
||||||
|
endlight.setPosition(-sin(framecount*0.007)*10, 15, cos(framecount*0.007)*2+22);
|
||||||
|
|
||||||
|
if (keys[SDLK_ESCAPE]){
|
||||||
|
stopEnding();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawEnd(int framecount){
|
||||||
|
glLoadIdentity();
|
||||||
|
glTranslatef(10, 0, 0);
|
||||||
|
|
||||||
|
endcamera.glUpdate();
|
||||||
|
|
||||||
|
updateLights();
|
||||||
|
|
||||||
|
glEnable(GL_LIGHTING);
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
glEnable(GL_CULL_FACE);
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
|
||||||
|
endfloor->draw();
|
||||||
|
|
||||||
|
glColor3f(1, 1, 0);
|
||||||
|
|
||||||
|
drawTrophy();
|
||||||
|
|
||||||
|
glRotatef(270, 0, 1, 0);
|
||||||
|
glTranslatef(2-BLOCKHEIGHT*0.5, 0, 15-BLOCKHEIGHT*0.5);
|
||||||
|
glScalef(3, 3, 3);
|
||||||
|
|
||||||
|
winner->head->draw();
|
||||||
|
winner->torso->draw();
|
||||||
|
winner->lefthand->draw();
|
||||||
|
winner->righthand->draw();
|
||||||
|
winner->waist->draw();
|
||||||
|
winner->leftleg->draw();
|
||||||
|
winner->rightleg->draw();
|
||||||
|
|
||||||
|
|
||||||
|
enable2D();
|
||||||
|
|
||||||
|
glColor3f(1, 1, 1);
|
||||||
|
|
||||||
|
if (winner->side == PLAYER1) print(0.05, 0.05, "Player 1 is\nthe winner", 0.09);
|
||||||
|
if (winner->side == PLAYER2) print(0.05, 0.05, "Player 2 is\nthe winner", 0.09);
|
||||||
|
|
||||||
|
|
||||||
|
if (endfade != -1){
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
glColor4f(0, 0, 0, endfade);
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
glVertex2f(0, 0);
|
||||||
|
glVertex2f(1, 0);
|
||||||
|
glVertex2f(1, 1);
|
||||||
|
glVertex2f(0, 1);
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
disable2D();
|
||||||
|
}
|
30
src/end.h
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
* $Id: end.h,v 1.1 2002/07/22 01:14:14 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: end.h,v $
|
||||||
|
* Revision 1.1 2002/07/22 01:14:14 msell
|
||||||
|
* Lopetussysteemi
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/22 01:14:14 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __END_H_INCLUDED__
|
||||||
|
#define __END_H_INCLUDED__
|
||||||
|
|
||||||
|
#include <SDL.h>
|
||||||
|
|
||||||
|
#include "texture.h"
|
||||||
|
#include "audio.h"
|
||||||
|
|
||||||
|
|
||||||
|
void initEnd(void);
|
||||||
|
void endRestart(void);
|
||||||
|
void calculateEnd(int framecount);
|
||||||
|
void drawEnd(int framecount);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
802
src/fight.cpp
Normal file
|
@ -0,0 +1,802 @@
|
||||||
|
/*
|
||||||
|
* $Id: fight.cpp,v 1.64 2002/07/22 11:40:26 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: fight.cpp,v $
|
||||||
|
* Revision 1.64 2002/07/22 11:40:26 msell
|
||||||
|
* Loppukuvaan lattia
|
||||||
|
*
|
||||||
|
* Revision 1.63 2002/07/22 01:14:14 msell
|
||||||
|
* Lopetussysteemi
|
||||||
|
*
|
||||||
|
* Revision 1.62 2002/07/21 22:50:39 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.61 2002/07/21 20:14:28 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.60 2002/07/21 15:03:12 msell
|
||||||
|
* Äänet disabloitu
|
||||||
|
*
|
||||||
|
* Revision 1.59 2002/07/19 22:48:09 msell
|
||||||
|
* Säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.58 2002/07/19 18:59:46 msell
|
||||||
|
* Alkuhommaa ja säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.57 2002/07/19 14:05:51 msell
|
||||||
|
* Damagetextuurit näkyy
|
||||||
|
*
|
||||||
|
* Revision 1.56 2002/07/19 12:48:31 jkaarlas
|
||||||
|
* damagepää
|
||||||
|
*
|
||||||
|
* Revision 1.55 2002/07/18 23:05:31 msell
|
||||||
|
* Partikkelit ja kakkospelaajan liike
|
||||||
|
*
|
||||||
|
* Revision 1.54 2002/07/17 22:45:53 msell
|
||||||
|
* Ääniä vähän
|
||||||
|
*
|
||||||
|
* Revision 1.53 2002/07/17 19:06:39 jkaarlas
|
||||||
|
* skyboxin keskitys
|
||||||
|
*
|
||||||
|
* Revision 1.52 2002/07/17 19:02:14 jkaarlas
|
||||||
|
* skyboxin keskitys
|
||||||
|
*
|
||||||
|
* Revision 1.51 2002/07/17 16:40:33 msell
|
||||||
|
* Resoluution vaihto
|
||||||
|
*
|
||||||
|
* Revision 1.50 2002/07/16 19:54:38 jkaarlas
|
||||||
|
* poistettu turhaa roinaa ja lisätty DATAPATH tiedostonimien eteen
|
||||||
|
*
|
||||||
|
* Revision 1.49 2002/07/16 17:16:34 msell
|
||||||
|
* Fontit ja valikot
|
||||||
|
*
|
||||||
|
* Revision 1.48 2002/07/16 10:03:42 msell
|
||||||
|
* Pikkufixi
|
||||||
|
*
|
||||||
|
* Revision 1.47 2002/07/16 00:42:43 msell
|
||||||
|
* Uusia skyboxeja ja areenan säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.46 2002/07/15 21:42:58 msell
|
||||||
|
* Skybox-testi
|
||||||
|
*
|
||||||
|
* Revision 1.45 2002/07/15 20:32:35 msell
|
||||||
|
* Uudet valot ja ulkoasun parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.44 2002/07/15 15:22:07 msell
|
||||||
|
* Parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.43 2002/07/14 21:40:43 msell
|
||||||
|
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
|
||||||
|
*
|
||||||
|
* Revision 1.42 2002/07/14 21:22:40 jkaarlas
|
||||||
|
* skybox ja ukkojen säätö
|
||||||
|
*
|
||||||
|
* Revision 1.41 2002/07/10 22:22:53 msell
|
||||||
|
* Cartoon-rendaus
|
||||||
|
*
|
||||||
|
* Revision 1.40 2002/07/10 22:07:23 jkaarlas
|
||||||
|
* skaalatut ja käännellyt ruumiinosat
|
||||||
|
*
|
||||||
|
* Revision 1.39 2002/07/10 17:13:44 msell
|
||||||
|
* Törmäystarkastelun parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.38 2002/07/08 22:53:38 msell
|
||||||
|
* Säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.37 2002/07/08 18:28:47 msell
|
||||||
|
* Törmäystä ja ukkoja
|
||||||
|
*
|
||||||
|
* Revision 1.36 2002/07/07 23:21:11 msell
|
||||||
|
* Pientä parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.35 2002/07/07 23:05:22 msell
|
||||||
|
* Osien liimaaminen toisiinsa (kesken)
|
||||||
|
*
|
||||||
|
* Revision 1.34 2002/07/07 17:53:21 msell
|
||||||
|
* Legoukon alku
|
||||||
|
*
|
||||||
|
* Revision 1.33 2002/07/07 15:29:07 msell
|
||||||
|
* Törmäyksien parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.32 2002/07/04 21:05:41 msell
|
||||||
|
* Se toimii!! =)
|
||||||
|
* Törmäystarkistukset siis
|
||||||
|
*
|
||||||
|
* Revision 1.31 2002/06/30 16:05:04 msell
|
||||||
|
* Törmäyksien parantelua, transformaatioita mukana
|
||||||
|
*
|
||||||
|
* Revision 1.30 2002/06/27 21:57:06 msell
|
||||||
|
* glEnd(); lisätty tekstuuritestaukseen
|
||||||
|
*
|
||||||
|
* Revision 1.29 2002/06/27 21:46:55 jkaarlas
|
||||||
|
* lisätty testikoodi transparentille tekstuurille (kommentoitu) vaihdettu tekstuuriquadin koordinaatit oikein päin
|
||||||
|
*
|
||||||
|
* Revision 1.28 2002/06/27 14:39:48 msell
|
||||||
|
* Toimiva maila :)
|
||||||
|
* Pyörivät kappaleet siis antaa liike-energiaa liikkuville kappaleille (ei toisin päin vielä)
|
||||||
|
*
|
||||||
|
* Revision 1.27 2002/06/27 00:08:04 msell
|
||||||
|
* Kimmotukset palloille myös pyöritettyihin mesheihin
|
||||||
|
*
|
||||||
|
* Revision 1.26 2002/06/26 22:32:20 jkaarlas
|
||||||
|
* mukana initissä asc-mallin lataus, tosin kommentoituna. samoin yksinkertainen quad, johon voi kokeilla tekstuurin lataamista
|
||||||
|
*
|
||||||
|
* Revision 1.25 2002/06/24 14:12:15 msell
|
||||||
|
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
|
||||||
|
*
|
||||||
|
* Revision 1.24 2002/06/23 20:12:19 msell
|
||||||
|
* Parempi törmäystarkistus palloista mesheihin
|
||||||
|
*
|
||||||
|
* Revision 1.23 2002/06/20 22:50:12 msell
|
||||||
|
* Meshit
|
||||||
|
*
|
||||||
|
* Revision 1.22 2002/06/20 15:31:13 jkaarlas
|
||||||
|
* turhat tekstuurilataukset pois
|
||||||
|
*
|
||||||
|
* Revision 1.21 2002/06/20 00:21:01 jkaarlas
|
||||||
|
* materiaali- ja tekstuurihommia edistetty
|
||||||
|
*
|
||||||
|
* Revision 1.20 2002/06/17 20:49:04 msell
|
||||||
|
* free -> SDL_FreeSurface
|
||||||
|
*
|
||||||
|
* Revision 1.19 2002/06/17 20:34:44 jkaarlas
|
||||||
|
* kutsuu tekstuurilatausta
|
||||||
|
*
|
||||||
|
* Revision 1.18 2002/06/17 19:58:08 msell
|
||||||
|
* #includeiden parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.17 2002/06/16 01:04:58 jkaarlas
|
||||||
|
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
|
||||||
|
*
|
||||||
|
* Revision 1.16 2002/06/15 22:56:37 msell
|
||||||
|
* Säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.15 2002/06/15 17:18:37 msell
|
||||||
|
* Toimiva törmäystarkastus kiinteille laatikoille
|
||||||
|
*
|
||||||
|
* Revision 1.14 2002/06/14 19:01:09 msell
|
||||||
|
* Säätämistä ja testailua
|
||||||
|
*
|
||||||
|
* Revision 1.13 2002/06/14 00:26:17 msell
|
||||||
|
* 100 kimpoilevaa palloa ja vähän vaimennusta
|
||||||
|
*
|
||||||
|
* Revision 1.12 2002/06/14 00:05:05 msell
|
||||||
|
* Törmäyssimulaatio kunnossa toivon mukaan
|
||||||
|
*
|
||||||
|
* Revision 1.11 2002/06/11 23:11:45 msell
|
||||||
|
* Törmäystarkistusta
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/06/07 21:16:51 msell
|
||||||
|
* Fysiikkaenginen alkua
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/06/05 23:55:46 msell
|
||||||
|
* Pallo
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/06/05 18:39:04 msell
|
||||||
|
* Jotain pientä
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/06/05 15:00:41 msell
|
||||||
|
* Palikoihin lisää detailia, facet jaetaan halutun kokosiin osiin
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/03 23:06:38 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/02 16:57:37 msell
|
||||||
|
* Objektirakenteen pohja
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/05/19 13:40:19 msell
|
||||||
|
* Säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/05/18 12:29:35 msell
|
||||||
|
* Valot ja äänijärjestelmän parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/05/17 23:13:30 msell
|
||||||
|
* Valot
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/05/16 18:42:07 msell
|
||||||
|
* Vektorifunctioita ja kamera
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/22 11:40:26 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "legoblocks.h"
|
||||||
|
#include "camera.h"
|
||||||
|
#include "light.h"
|
||||||
|
#include "audio.h"
|
||||||
|
#include "object.h"
|
||||||
|
#include "appearance.h"
|
||||||
|
#include "sphere.h"
|
||||||
|
#include "vector.h"
|
||||||
|
#include "collision.h"
|
||||||
|
#include "utils.h"
|
||||||
|
#include "graphics.h"
|
||||||
|
#include "objectfactory.h"
|
||||||
|
#include "world.h"
|
||||||
|
#include "3dutils.h"
|
||||||
|
#include "legoman.h"
|
||||||
|
#include "particle.h"
|
||||||
|
#include "font.h"
|
||||||
|
#include "fight.h"
|
||||||
|
#include "menu.h"
|
||||||
|
#include "end.h"
|
||||||
|
#include "run.h"
|
||||||
|
|
||||||
|
#include "glapi.h"
|
||||||
|
|
||||||
|
Camera camera;
|
||||||
|
Light light1, light2, light3, light4;
|
||||||
|
World *arenaworld;
|
||||||
|
|
||||||
|
Sound *fightmusic;
|
||||||
|
Sound *hitsound1, *hitsound2, *hitsound3, *hitsound4;
|
||||||
|
Sound *softhitsound1, *softhitsound2;
|
||||||
|
Sound *jumpsound;
|
||||||
|
Sound *fallsound1, *fallsound2;
|
||||||
|
Sound *fightsound;
|
||||||
|
Sound *victorysound;
|
||||||
|
|
||||||
|
Legoman *man1, *man2;
|
||||||
|
int points1, points2;
|
||||||
|
|
||||||
|
#define ARENASIZE 10
|
||||||
|
#define ARENAHEIGHT 10
|
||||||
|
|
||||||
|
bool fightinitialized = false;
|
||||||
|
|
||||||
|
void initFight(void){
|
||||||
|
if (!fightinitialized){
|
||||||
|
initCollisions();
|
||||||
|
addCollisionLink(COLLISIONGROUP_ARENA, COLLISIONGROUP_PARTICLE);
|
||||||
|
//addCollisionLink(COLLISIONGROUP_PARTICLE, COLLISIONGROUP_PARTICLE);
|
||||||
|
|
||||||
|
addCollisionLink(COLLISIONGROUP_MAN1, COLLISIONGROUP_ARENA);
|
||||||
|
//addCollisionLink(COLLISIONGROUP_MAN1, COLLISIONGROUP_PARTICLE);
|
||||||
|
addCollisionLink(COLLISIONGROUP_MAN1, COLLISIONGROUP_MAN1);
|
||||||
|
addCollisionLink(COLLISIONGROUP_MAN1HAND, COLLISIONGROUP_ARENA);
|
||||||
|
//addCollisionLink(COLLISIONGROUP_MAN1HAND, COLLISIONGROUP_PARTICLE);
|
||||||
|
|
||||||
|
addCollisionLink(COLLISIONGROUP_MAN2, COLLISIONGROUP_ARENA);
|
||||||
|
//addCollisionLink(COLLISIONGROUP_MAN2, COLLISIONGROUP_PARTICLE);
|
||||||
|
addCollisionLink(COLLISIONGROUP_MAN2, COLLISIONGROUP_MAN2);
|
||||||
|
addCollisionLink(COLLISIONGROUP_MAN2HAND, COLLISIONGROUP_ARENA);
|
||||||
|
//addCollisionLink(COLLISIONGROUP_MAN2HAND, COLLISIONGROUP_PARTICLE);
|
||||||
|
|
||||||
|
addCollisionLink(COLLISIONGROUP_MAN1, COLLISIONGROUP_MAN2);
|
||||||
|
addCollisionLink(COLLISIONGROUP_MAN1, COLLISIONGROUP_MAN2HAND);
|
||||||
|
addCollisionLink(COLLISIONGROUP_MAN1HAND, COLLISIONGROUP_MAN2);
|
||||||
|
addCollisionLink(COLLISIONGROUP_MAN1HAND, COLLISIONGROUP_MAN2HAND);
|
||||||
|
|
||||||
|
//Sound* backgroundsong = new Sound("mixdown.mp3");
|
||||||
|
Sound* backgroundsong = new Sound(BGSONG, true);
|
||||||
|
camera.setPosition(-5, 8, 18);
|
||||||
|
|
||||||
|
arenaworld = new World();
|
||||||
|
|
||||||
|
|
||||||
|
//arenalight.setEnabled(true);
|
||||||
|
/*arenalight.setPosition(0, 10, 0);
|
||||||
|
Object *lamp = new Object();
|
||||||
|
lamp->appearance = new LampAppearance();
|
||||||
|
lamp->setPosition(0, 10, 0);
|
||||||
|
arenaworld->addChild(lamp);*/
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
light1.setColor(1, 1, 1);
|
||||||
|
light1.setSpecular(1, 1, 1);
|
||||||
|
light1.setPosition(-ARENASIZE+0.5, 5, -ARENASIZE+0.5);
|
||||||
|
light1.setAttenuation(0.2, 0.0, 0.02);
|
||||||
|
|
||||||
|
light2.setColor(1, 1, 1);
|
||||||
|
light2.setSpecular(1, 1, 1);
|
||||||
|
light2.setPosition(ARENASIZE-0.5, 5, -ARENASIZE+0.5);
|
||||||
|
light2.setAttenuation(0.2, 0.0, 0.02);
|
||||||
|
|
||||||
|
light3.setColor(1, 1, 1);
|
||||||
|
light3.setSpecular(1, 1, 1);
|
||||||
|
light3.setPosition(-ARENASIZE+0.5, 5, ARENASIZE-0.5);
|
||||||
|
light3.setAttenuation(0.2, 0.0, 0.02);
|
||||||
|
|
||||||
|
light4.setColor(1, 1, 1);
|
||||||
|
light4.setSpecular(1, 1, 1);
|
||||||
|
light4.setPosition(ARENASIZE-0.5, 5, ARENASIZE-0.5);
|
||||||
|
light4.setAttenuation(0.2, 0.0, 0.02);
|
||||||
|
|
||||||
|
|
||||||
|
if (!fightinitialized){
|
||||||
|
Object *lamp;
|
||||||
|
|
||||||
|
lamp = new Object();
|
||||||
|
lamp->appearance = new LampAppearance();
|
||||||
|
lamp->setPosition(-ARENASIZE+0.5, (ARENAHEIGHT+0.5)*BLOCKHEIGHT, -ARENASIZE+0.5);
|
||||||
|
arenaworld->addChild(lamp);
|
||||||
|
|
||||||
|
lamp = new Object();
|
||||||
|
lamp->appearance = new LampAppearance();
|
||||||
|
lamp->setPosition(ARENASIZE-0.5, (ARENAHEIGHT+0.5)*BLOCKHEIGHT, -ARENASIZE+0.5);
|
||||||
|
arenaworld->addChild(lamp);
|
||||||
|
|
||||||
|
lamp = new Object();
|
||||||
|
lamp->appearance = new LampAppearance();
|
||||||
|
lamp->setPosition(-ARENASIZE+0.5, (ARENAHEIGHT+0.5)*BLOCKHEIGHT, ARENASIZE-0.5);
|
||||||
|
arenaworld->addChild(lamp);
|
||||||
|
|
||||||
|
lamp = new Object();
|
||||||
|
lamp->appearance = new LampAppearance();
|
||||||
|
lamp->setPosition(ARENASIZE-0.5, (ARENAHEIGHT+0.5)*BLOCKHEIGHT, ARENASIZE-0.5);
|
||||||
|
arenaworld->addChild(lamp);
|
||||||
|
|
||||||
|
|
||||||
|
//Floor
|
||||||
|
BasicBlock *floorblock;
|
||||||
|
floorblock = new BasicBlock(ARENASIZE*2, 3, ARENASIZE*2);
|
||||||
|
floorblock->setPosition(0, -BLOCKHEIGHT*3/2.0, 0);
|
||||||
|
floorblock->setColor(0, 1, 0);
|
||||||
|
floorblock->setCollisionGroup(COLLISIONGROUP_ARENA);
|
||||||
|
arenaworld->addChild(floorblock);
|
||||||
|
|
||||||
|
|
||||||
|
//Corners
|
||||||
|
BasicBlock *arenacorner;
|
||||||
|
|
||||||
|
arenacorner = new BasicBlock(1, ARENAHEIGHT, 1);
|
||||||
|
arenacorner->setColor(1, 0, 0);
|
||||||
|
//arenacorner->setCollisionGroup(COLLISIONGROUP_ARENA);
|
||||||
|
arenacorner->setPosition(ARENASIZE-0.5, BLOCKHEIGHT*ARENAHEIGHT/2.0, ARENASIZE-0.5);
|
||||||
|
arenaworld->addChild(arenacorner);
|
||||||
|
|
||||||
|
arenacorner = new BasicBlock(1, ARENAHEIGHT, 1);
|
||||||
|
arenacorner->setColor(1, 0, 0);
|
||||||
|
//arenacorner->setCollisionGroup(COLLISIONGROUP_ARENA);
|
||||||
|
arenacorner->setPosition(-ARENASIZE+0.5, BLOCKHEIGHT*ARENAHEIGHT/2.0, ARENASIZE-0.5);
|
||||||
|
arenaworld->addChild(arenacorner);
|
||||||
|
|
||||||
|
arenacorner = new BasicBlock(1, ARENAHEIGHT, 1);
|
||||||
|
arenacorner->setColor(1, 0, 0);
|
||||||
|
//arenacorner->setCollisionGroup(COLLISIONGROUP_ARENA);
|
||||||
|
arenacorner->setPosition(ARENASIZE-0.5, BLOCKHEIGHT*ARENAHEIGHT/2.0, -ARENASIZE+0.5);
|
||||||
|
arenaworld->addChild(arenacorner);
|
||||||
|
|
||||||
|
arenacorner = new BasicBlock(1, ARENAHEIGHT, 1);
|
||||||
|
arenacorner->setColor(1, 0, 0);
|
||||||
|
//arenacorner->setCollisionGroup(COLLISIONGROUP_ARENA);
|
||||||
|
arenacorner->setPosition(-ARENASIZE+0.5, BLOCKHEIGHT*ARENAHEIGHT/2.0, -ARENASIZE+0.5);
|
||||||
|
arenaworld->addChild(arenacorner);
|
||||||
|
|
||||||
|
|
||||||
|
//"Ropes"
|
||||||
|
MeshObject *arenaline;
|
||||||
|
Mesh *linegeometry;
|
||||||
|
MultiAppearance *lineappearance;
|
||||||
|
BasicBlockAppearance *line;
|
||||||
|
int geometryheight = BLOCKHEIGHT*ARENAHEIGHT;
|
||||||
|
|
||||||
|
linegeometry = createBox(-0.5, 0.5, -geometryheight/2, geometryheight/2-BLOCKHEIGHT, -ARENASIZE, ARENASIZE);
|
||||||
|
arenaline = new MeshObject(linegeometry);
|
||||||
|
lineappearance = new MultiAppearance();
|
||||||
|
line = new BasicBlockAppearance(1, 1, ARENASIZE*2);
|
||||||
|
vectorSet(line->displacement, 0, -BLOCKHEIGHT*2.5, 0);
|
||||||
|
line->material.setColor(1, 0, 0, 1);
|
||||||
|
lineappearance->addAppearance(line),
|
||||||
|
line = new BasicBlockAppearance(1, 1, ARENASIZE*2);
|
||||||
|
vectorSet(line->displacement, 0, BLOCKHEIGHT*0.5, 0);
|
||||||
|
line->material.setColor(1, 0, 0, 1);
|
||||||
|
lineappearance->addAppearance(line),
|
||||||
|
line = new BasicBlockAppearance(1, 1, ARENASIZE*2);
|
||||||
|
vectorSet(line->displacement, 0, BLOCKHEIGHT*3.5, 0);
|
||||||
|
line->material.setColor(1, 0, 0, 1);
|
||||||
|
lineappearance->addAppearance(line),
|
||||||
|
arenaline->appearance = lineappearance;
|
||||||
|
arenaline->setCollisionGroup(COLLISIONGROUP_ARENA);
|
||||||
|
arenaline->setPosition(-ARENASIZE+0.5, geometryheight/2, 0);
|
||||||
|
arenaworld->addChild(arenaline);
|
||||||
|
|
||||||
|
linegeometry = createBox(-0.5, 0.5, -geometryheight/2, geometryheight/2-BLOCKHEIGHT, -ARENASIZE, ARENASIZE);
|
||||||
|
arenaline = new MeshObject(linegeometry);
|
||||||
|
lineappearance = new MultiAppearance();
|
||||||
|
line = new BasicBlockAppearance(1, 1, ARENASIZE*2);
|
||||||
|
vectorSet(line->displacement, 0, -BLOCKHEIGHT*2.5, 0);
|
||||||
|
line->material.setColor(1, 0, 0, 1);
|
||||||
|
lineappearance->addAppearance(line),
|
||||||
|
line = new BasicBlockAppearance(1, 1, ARENASIZE*2);
|
||||||
|
vectorSet(line->displacement, 0, BLOCKHEIGHT*0.5, 0);
|
||||||
|
line->material.setColor(1, 0, 0, 1);
|
||||||
|
lineappearance->addAppearance(line),
|
||||||
|
line = new BasicBlockAppearance(1, 1, ARENASIZE*2);
|
||||||
|
vectorSet(line->displacement, 0, BLOCKHEIGHT*3.5, 0);
|
||||||
|
line->material.setColor(1, 0, 0, 1);
|
||||||
|
lineappearance->addAppearance(line),
|
||||||
|
arenaline->appearance = lineappearance;
|
||||||
|
arenaline->setCollisionGroup(COLLISIONGROUP_ARENA);
|
||||||
|
arenaline->setPosition(ARENASIZE-0.5, geometryheight/2, 0);
|
||||||
|
arenaworld->addChild(arenaline);
|
||||||
|
|
||||||
|
linegeometry = createBox(-ARENASIZE, ARENASIZE, -geometryheight/2, geometryheight/2-BLOCKHEIGHT, -0.5, 0.5);
|
||||||
|
arenaline = new MeshObject(linegeometry);
|
||||||
|
lineappearance = new MultiAppearance();
|
||||||
|
line = new BasicBlockAppearance(ARENASIZE*2, 1, 1);
|
||||||
|
vectorSet(line->displacement, 0, -BLOCKHEIGHT*2.5, 0);
|
||||||
|
line->material.setColor(1, 0, 0, 1);
|
||||||
|
lineappearance->addAppearance(line),
|
||||||
|
line = new BasicBlockAppearance(ARENASIZE*2, 1, 1);
|
||||||
|
vectorSet(line->displacement, 0, BLOCKHEIGHT*0.5, 0);
|
||||||
|
line->material.setColor(1, 0, 0, 1);
|
||||||
|
lineappearance->addAppearance(line),
|
||||||
|
line = new BasicBlockAppearance(ARENASIZE*2, 1, 1);
|
||||||
|
vectorSet(line->displacement, 0, BLOCKHEIGHT*3.5, 0);
|
||||||
|
line->material.setColor(1, 0, 0, 1);
|
||||||
|
lineappearance->addAppearance(line),
|
||||||
|
arenaline->appearance = lineappearance;
|
||||||
|
arenaline->setCollisionGroup(COLLISIONGROUP_ARENA);
|
||||||
|
arenaline->setPosition(0, geometryheight/2, -ARENASIZE+0.5);
|
||||||
|
arenaworld->addChild(arenaline);
|
||||||
|
|
||||||
|
linegeometry = createBox(-ARENASIZE, ARENASIZE, -geometryheight/2, geometryheight/2-BLOCKHEIGHT, -0.5, 0.5);
|
||||||
|
arenaline = new MeshObject(linegeometry);
|
||||||
|
lineappearance = new MultiAppearance();
|
||||||
|
line = new BasicBlockAppearance(ARENASIZE*2, 1, 1);
|
||||||
|
vectorSet(line->displacement, 0, -BLOCKHEIGHT*2.5, 0);
|
||||||
|
line->material.setColor(1, 0, 0, 1);
|
||||||
|
lineappearance->addAppearance(line),
|
||||||
|
line = new BasicBlockAppearance(ARENASIZE*2, 1, 1);
|
||||||
|
vectorSet(line->displacement, 0, BLOCKHEIGHT*0.5, 0);
|
||||||
|
line->material.setColor(1, 0, 0, 1);
|
||||||
|
lineappearance->addAppearance(line),
|
||||||
|
line = new BasicBlockAppearance(ARENASIZE*2, 1, 1);
|
||||||
|
vectorSet(line->displacement, 0, BLOCKHEIGHT*3.5, 0);
|
||||||
|
line->material.setColor(1, 0, 0, 1);
|
||||||
|
lineappearance->addAppearance(line),
|
||||||
|
arenaline->appearance = lineappearance;
|
||||||
|
arenaline->setCollisionGroup(COLLISIONGROUP_ARENA);
|
||||||
|
arenaline->setPosition(0, geometryheight/2, ARENASIZE-0.5);
|
||||||
|
arenaworld->addChild(arenaline);
|
||||||
|
|
||||||
|
float movement[3];
|
||||||
|
|
||||||
|
man1 = new Legoman(PLAYER1);
|
||||||
|
man1->insertToWorld(arenaworld);
|
||||||
|
vectorSet(movement, -4, 0, 0);
|
||||||
|
man1->move(movement);
|
||||||
|
man1->lockPart(LEFTLEG | RIGHTLEG);
|
||||||
|
|
||||||
|
man2 = new Legoman(PLAYER2);
|
||||||
|
man2->insertToWorld(arenaworld);
|
||||||
|
vectorSet(movement, 4, 0, 0);
|
||||||
|
man2->move(movement);
|
||||||
|
man2->lockPart(LEFTLEG | RIGHTLEG);
|
||||||
|
|
||||||
|
man1->addOpponent(man2);
|
||||||
|
man2->addOpponent(man1);
|
||||||
|
|
||||||
|
|
||||||
|
initBloods(arenaworld);
|
||||||
|
|
||||||
|
|
||||||
|
hitsound1 = new Sound(DATAPATH"hit1.wav");
|
||||||
|
softhitsound1 = new Sound(DATAPATH"hitsoft1.wav");
|
||||||
|
softhitsound2 = new Sound(DATAPATH"hitsoft2.wav");
|
||||||
|
jumpsound = new Sound(DATAPATH"jump.wav");
|
||||||
|
fallsound1 = new Sound(DATAPATH"fall1.wav");
|
||||||
|
fallsound2 = new Sound(DATAPATH"fall2.wav");
|
||||||
|
fightsound = new Sound(DATAPATH"fight.wav");
|
||||||
|
victorysound = new Sound(DATAPATH"victory.wav");
|
||||||
|
|
||||||
|
fightmusic = new Sound(DATAPATH"fight.mp3", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
float cameraTarget[3] = {0, 6, 0};
|
||||||
|
camera.setTarget(cameraTarget);
|
||||||
|
arenaworld->prepare();
|
||||||
|
|
||||||
|
points1 = 0;
|
||||||
|
points2 = 0;
|
||||||
|
|
||||||
|
winner = man1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MAXSCORE 3
|
||||||
|
|
||||||
|
int trophycounter = -1;
|
||||||
|
|
||||||
|
void resetFight(void){
|
||||||
|
float movement[3];
|
||||||
|
man1->heal();
|
||||||
|
man2->heal();
|
||||||
|
|
||||||
|
vectorSet(movement, -4, 0, 0);
|
||||||
|
man1->move(movement);
|
||||||
|
vectorSet(movement, 4, 0, 0);
|
||||||
|
man2->move(movement);
|
||||||
|
|
||||||
|
man1->lockPart(LEFTLEG | RIGHTLEG);
|
||||||
|
man2->lockPart(LEFTLEG | RIGHTLEG);
|
||||||
|
}
|
||||||
|
|
||||||
|
int startcounter, endcounter;
|
||||||
|
|
||||||
|
float fightfade;
|
||||||
|
|
||||||
|
bool dead;
|
||||||
|
|
||||||
|
Legoman *winner;
|
||||||
|
|
||||||
|
void gameOver(Legoman *loser){
|
||||||
|
endcounter = 0;
|
||||||
|
dead = true;
|
||||||
|
winner = loser->getOpponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
void startFight(void){
|
||||||
|
resetFight();
|
||||||
|
fightmusic->setVolume(0);
|
||||||
|
fightmusic->play();
|
||||||
|
fightmusic->fadeIn(300);
|
||||||
|
startcounter = 0;
|
||||||
|
trophycounter = -1;
|
||||||
|
fightfade = 1;
|
||||||
|
dead = false;
|
||||||
|
points1 = 0;
|
||||||
|
points2 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDLKey player1left = SDLK_LEFT;
|
||||||
|
SDLKey player1right = SDLK_RIGHT;
|
||||||
|
SDLKey player1forward = SDLK_UP;
|
||||||
|
SDLKey player1backward = SDLK_DOWN;
|
||||||
|
SDLKey player1jump = SDLK_RSHIFT;
|
||||||
|
SDLKey player1hit = SDLK_RCTRL;
|
||||||
|
|
||||||
|
SDLKey player2left = SDLK_a;
|
||||||
|
SDLKey player2right = SDLK_d;
|
||||||
|
SDLKey player2forward = SDLK_w;
|
||||||
|
SDLKey player2backward = SDLK_s;
|
||||||
|
SDLKey player2jump = SDLK_LSHIFT;
|
||||||
|
SDLKey player2hit = SDLK_LCTRL;
|
||||||
|
|
||||||
|
|
||||||
|
void stopGame(void){
|
||||||
|
light1.setEnabled(false);
|
||||||
|
light2.setEnabled(false);
|
||||||
|
light3.setEnabled(false);
|
||||||
|
light4.setEnabled(false);
|
||||||
|
changeGameMode(MENUMODE);
|
||||||
|
fightmusic->fadeOut(300);
|
||||||
|
menuRestart();
|
||||||
|
}
|
||||||
|
|
||||||
|
void endGame(void){
|
||||||
|
trophycounter = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void endGame2(void){
|
||||||
|
light1.setEnabled(false);
|
||||||
|
light2.setEnabled(false);
|
||||||
|
light3.setEnabled(false);
|
||||||
|
light4.setEnabled(false);
|
||||||
|
changeGameMode(ENDMODE);
|
||||||
|
winner->heal();
|
||||||
|
endRestart();
|
||||||
|
}
|
||||||
|
|
||||||
|
#define READY 250
|
||||||
|
#define FIGHT 500
|
||||||
|
#define VICTORY 300
|
||||||
|
#define VICTORYEND 700
|
||||||
|
#define ENDFADE 780
|
||||||
|
#define STARTOVER 800
|
||||||
|
|
||||||
|
#define TROPHYFADE 400
|
||||||
|
|
||||||
|
void calculateFight(int framecount){
|
||||||
|
fightfade = -1;
|
||||||
|
if (startcounter < 200){
|
||||||
|
fightfade = (200-startcounter)/200.0;
|
||||||
|
}
|
||||||
|
if (startcounter == FIGHT - 30){
|
||||||
|
fightsound->play();
|
||||||
|
}
|
||||||
|
startcounter++;
|
||||||
|
|
||||||
|
if (endcounter == VICTORY){
|
||||||
|
victorysound->play();
|
||||||
|
if (winner == man1) points1++;
|
||||||
|
if (winner == man2) points2++;
|
||||||
|
}
|
||||||
|
if (endcounter >= ENDFADE && endcounter <= STARTOVER){
|
||||||
|
fightfade = (endcounter - ENDFADE)/(STARTOVER-ENDFADE);
|
||||||
|
}
|
||||||
|
if (endcounter == STARTOVER){
|
||||||
|
if (points1 == MAXSCORE || points2 == MAXSCORE){
|
||||||
|
endGame();
|
||||||
|
} else{
|
||||||
|
startcounter = 0;
|
||||||
|
resetFight();
|
||||||
|
dead = false;
|
||||||
|
endcounter = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (dead) endcounter++;
|
||||||
|
if (trophycounter != -1){
|
||||||
|
fightfade = (float)trophycounter/TROPHYFADE;
|
||||||
|
trophycounter++;
|
||||||
|
if (trophycounter == TROPHYFADE) endGame2();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*if (framecount % 10 == 0){
|
||||||
|
float pos[3] = {0, 5, 0};
|
||||||
|
float vel[3] = {randomf(2)-1, randomf(2)-1, randomf(2)-1};
|
||||||
|
createBlood(pos, vel);
|
||||||
|
}*/
|
||||||
|
//arenalight.setPosition(sin(framecount*0.01)*6, 3, cos(framecount*0.01)*4);
|
||||||
|
//light2.setPosition(sin(framecount*0.017)*6, 2, cos(framecount*0.027)*5);
|
||||||
|
//light3.setPosition(sin(framecount*0.023)*3, 4, cos(framecount*0.013)*3);
|
||||||
|
|
||||||
|
camera.setPosition(sin(framecount*0.0005)*20, sin(framecount*0.0013)*5+15, cos(framecount*0.0005)*20);
|
||||||
|
|
||||||
|
//camera.setPosition(8, 5, 5);
|
||||||
|
|
||||||
|
float upmovement[3] = {0, 0.001, 0};
|
||||||
|
man1->move(upmovement);
|
||||||
|
man2->move(upmovement);
|
||||||
|
man1->update();
|
||||||
|
man2->update();
|
||||||
|
|
||||||
|
if (startcounter >= FIGHT){
|
||||||
|
|
||||||
|
if (man1->isAlive()){
|
||||||
|
if (keys[player1left]) man1->turn(5);
|
||||||
|
if (keys[player1right]) man1->turn(-5);
|
||||||
|
if (keys[player1forward]) man1->walk(0.03);
|
||||||
|
if (keys[player1backward]) man1->walk(-0.03);
|
||||||
|
if (keys[player1jump]) man1->jump();
|
||||||
|
if (keys[player1hit]) man1->hit();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (man2->isAlive()){
|
||||||
|
if (keys[player2left]) man2->turn(5);
|
||||||
|
if (keys[player2right]) man2->turn(-5);
|
||||||
|
if (keys[player2forward]) man2->walk(0.03);
|
||||||
|
if (keys[player2backward]) man2->walk(-0.03);
|
||||||
|
if (keys[player2jump]) man2->jump();
|
||||||
|
if (keys[player2hit]) man2->hit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (keys[SDLK_ESCAPE]){
|
||||||
|
stopGame();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
arenaworld->move();
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawDamageMeters(void){
|
||||||
|
enable2D();
|
||||||
|
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef(0.925, 0.22-0.025, 0);
|
||||||
|
glScalef(0.08*3/4, 0.08, 0.1);
|
||||||
|
man1->drawVisuals();
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef(0.075, 0.22-0.025, 0);
|
||||||
|
glScalef(0.08*3/4, 0.08, 0.1);
|
||||||
|
man2->drawVisuals();
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
|
||||||
|
|
||||||
|
glColor3f(1, 1, 0);
|
||||||
|
|
||||||
|
char pointstring[5];
|
||||||
|
sprintf(pointstring, "%i", points1);
|
||||||
|
print(0.75, 0.05, pointstring, 0.15);
|
||||||
|
|
||||||
|
sprintf(pointstring, "%i", points2);
|
||||||
|
print(0.15, 0.05, pointstring, 0.15);
|
||||||
|
|
||||||
|
disable2D();
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawFight(int framecount){
|
||||||
|
glLoadIdentity();
|
||||||
|
camera.glUpdate();
|
||||||
|
//float position[3];
|
||||||
|
//camera.getPosition((float*)position);
|
||||||
|
//createSkyBox(position[0], position[1], position[2], 50, 20, 50);
|
||||||
|
|
||||||
|
createSkyBox(0, 10, 0, 50, 20, 50);
|
||||||
|
|
||||||
|
|
||||||
|
light1.setEnabled(true);
|
||||||
|
light2.setEnabled(true);
|
||||||
|
light3.setEnabled(true);
|
||||||
|
light4.setEnabled(true);
|
||||||
|
|
||||||
|
updateLights();
|
||||||
|
|
||||||
|
arenaworld->draw();
|
||||||
|
|
||||||
|
drawDamageMeters();
|
||||||
|
|
||||||
|
|
||||||
|
flaretexture->enable();
|
||||||
|
light1.createFlare();
|
||||||
|
light2.createFlare();
|
||||||
|
light3.createFlare();
|
||||||
|
light4.createFlare();
|
||||||
|
flaretexture->disable();
|
||||||
|
|
||||||
|
|
||||||
|
enable2D();
|
||||||
|
|
||||||
|
if (fightfade != -1){
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
glColor4f(0, 0, 0, fightfade);
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
glVertex2f(0, 0);
|
||||||
|
glVertex2f(1, 0);
|
||||||
|
glVertex2f(1, 1);
|
||||||
|
glVertex2f(0, 1);
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startcounter >= READY && startcounter < FIGHT){
|
||||||
|
float size = 0.2 - (startcounter - READY)*0.0001;
|
||||||
|
float alpha = 1 - (float)(startcounter - READY)/(FIGHT - READY);
|
||||||
|
float x = 0.5 - size*1.5;
|
||||||
|
float y = 0.5 - size*0.5;
|
||||||
|
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
glColor4f(alpha, 0, 0, alpha);
|
||||||
|
print(x, y, "Ready", size);
|
||||||
|
}
|
||||||
|
if (startcounter >= FIGHT && startcounter < FIGHT+200){
|
||||||
|
float size = 0.2 + (startcounter - FIGHT)*0.0005;
|
||||||
|
float alpha = 1 - (float)(startcounter - FIGHT)/200;
|
||||||
|
float x = 0.5 - size*1.4;
|
||||||
|
float y = 0.5 - size*0.5;
|
||||||
|
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
glColor4f(0, alpha, 0, alpha);
|
||||||
|
print(x, y, "Fight!", size);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dead){
|
||||||
|
if (endcounter >= VICTORY && endcounter < VICTORYEND){
|
||||||
|
float size = 0.18 + (endcounter - VICTORY)*0.0001;
|
||||||
|
float alpha = (float)(endcounter - VICTORY)/(VICTORYEND-VICTORY);
|
||||||
|
alpha = 1-4*(alpha-0.5)*(alpha-0.5);
|
||||||
|
alpha = pow(alpha, 0.5);
|
||||||
|
float x = 0.5 - size*1.9;
|
||||||
|
float y = 0.3 - size*0.5;
|
||||||
|
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
glColor4f(0, 0, alpha, alpha);
|
||||||
|
print(x, y, "Victory!", size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
disable2D();
|
||||||
|
|
||||||
|
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
}
|
91
src/fight.h
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
/*
|
||||||
|
* $Id: fight.h,v 1.17 2002/07/22 01:14:14 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: fight.h,v $
|
||||||
|
* Revision 1.17 2002/07/22 01:14:14 msell
|
||||||
|
* Lopetussysteemi
|
||||||
|
*
|
||||||
|
* Revision 1.16 2002/07/21 15:03:12 msell
|
||||||
|
* Äänet disabloitu
|
||||||
|
*
|
||||||
|
* Revision 1.15 2002/07/19 20:33:28 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.14 2002/07/19 20:06:32 msell
|
||||||
|
* Linux-porttausta
|
||||||
|
*
|
||||||
|
* Revision 1.13 2002/07/19 18:59:46 msell
|
||||||
|
* Alkuhommaa ja säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.12 2002/07/19 14:05:52 msell
|
||||||
|
* Damagetextuurit näkyy
|
||||||
|
*
|
||||||
|
* Revision 1.11 2002/07/18 23:05:31 msell
|
||||||
|
* Partikkelit ja kakkospelaajan liike
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/07/17 22:45:54 msell
|
||||||
|
* Ääniä vähän
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/07/16 17:16:34 msell
|
||||||
|
* Fontit ja valikot
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/07/15 15:22:08 msell
|
||||||
|
* Parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/07/14 21:22:40 jkaarlas
|
||||||
|
* skybox ja ukkojen säätö
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/07/08 22:53:38 msell
|
||||||
|
* Säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/07/07 15:29:07 msell
|
||||||
|
* Törmäyksien parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/07/04 21:05:41 msell
|
||||||
|
* Se toimii!! =)
|
||||||
|
* Törmäystarkistukset siis
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/04 16:28:32 msell
|
||||||
|
* #pragma once
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/02 16:57:37 msell
|
||||||
|
* Objektirakenteen pohja
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/05/16 18:42:07 msell
|
||||||
|
* Vektorifunctioita ja kamera
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/22 01:14:14 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __FIGHT_H_INCLUDED__
|
||||||
|
#define __FIGHT_H_INCLUDED__
|
||||||
|
|
||||||
|
#include <SDL.h>
|
||||||
|
#include "audio.h"
|
||||||
|
#include "legoman.h"
|
||||||
|
|
||||||
|
extern Sound *fightmusic;
|
||||||
|
extern Sound *hitsound1;
|
||||||
|
extern Sound *softhitsound1, *softhitsound2;
|
||||||
|
extern Sound *jumpsound;
|
||||||
|
extern Sound *fallsound1, *fallsound2;
|
||||||
|
|
||||||
|
extern bool dead;
|
||||||
|
|
||||||
|
extern Legoman *winner;
|
||||||
|
|
||||||
|
void initFight(void);
|
||||||
|
void gameOver(Legoman *loser);
|
||||||
|
void startFight(void);
|
||||||
|
void calculateFight(int framecount);
|
||||||
|
void drawFight(int framecount);
|
||||||
|
|
||||||
|
void handleKeydownFight(SDLKey key);
|
||||||
|
void addGraphicsVector(float *p1, float *p2, float size);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
102
src/font.cpp
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
/*
|
||||||
|
* $Id: font.cpp,v 1.6 2002/07/21 20:14:28 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: font.cpp,v $
|
||||||
|
* Revision 1.6 2002/07/21 20:14:28 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/07/19 18:59:46 msell
|
||||||
|
* Alkuhommaa ja säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/07/19 14:05:52 msell
|
||||||
|
* Damagetextuurit näkyy
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/07/19 12:10:53 msell
|
||||||
|
* Hups
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/07/17 16:40:33 msell
|
||||||
|
* Resoluution vaihto
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/07/16 17:16:34 msell
|
||||||
|
* Fontit ja valikot
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/21 20:14:28 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#include "font.h"
|
||||||
|
#include "glapi.h"
|
||||||
|
|
||||||
|
Texture *fonttexture;
|
||||||
|
|
||||||
|
void drawChar(float x, float y, char ch, float size){
|
||||||
|
fonttexture->enable();
|
||||||
|
|
||||||
|
int tx = (ch&15)*64;
|
||||||
|
int ty = (ch>>4)*64;
|
||||||
|
|
||||||
|
float w = size, h = size*4/3;
|
||||||
|
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR);
|
||||||
|
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
glTexCoord2f((tx)/1024.0, (ty)/1024.0);
|
||||||
|
glVertex2f(x, y);
|
||||||
|
|
||||||
|
glTexCoord2f((tx)/1024.0, (ty+64)/1024.0);
|
||||||
|
glVertex2f(x, y+h);
|
||||||
|
|
||||||
|
glTexCoord2f((tx+64)/1024.0, (ty+64)/1024.0);
|
||||||
|
glVertex2f(x+w, y+h);
|
||||||
|
|
||||||
|
glTexCoord2f((tx+64)/1024.0, (ty)/1024.0);
|
||||||
|
glVertex2f(x+w, y);
|
||||||
|
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
fonttexture->disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
float letterwidth[256] = {
|
||||||
|
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
|
||||||
|
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
|
||||||
|
0.5, 0.2, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.45, 0.2, 0.5,
|
||||||
|
0.6, 0.5, 0.6, 0.6, 0.65, 0.65, 0.6, 0.65, 0.6, 0.6, 0.2, 1.0, 1.0, 1.0, 1.0, 0.5,
|
||||||
|
1.0, 0.7, 0.6, 0.7, 0.7, 0.65, 0.6, 0.7, 0.8, 0.6, 0.7, 0.7, 0.6, 0.9, 0.85, 0.8,
|
||||||
|
0.6, 0.9, 0.7, 0.7, 0.7, 0.7, 0.7, 1.0, 0.8, 0.7, 0.8, 1.0, 1.0, 1.0, 1.0, 1.0,
|
||||||
|
1.0, 0.6, 0.6, 0.6, 0.6, 0.6, 0.5, 0.6, 0.6, 0.2, 0.4, 0.6, 0.2, 0.8, 0.5, 0.55,
|
||||||
|
0.55, 0.55, 0.5, 0.55, 0.55, 0.55, 0.6, 0.8, 0.6, 0.6, 0.6, 1.0, 1.0, 1.0, 1.0, 1.0,
|
||||||
|
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
|
||||||
|
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
|
||||||
|
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
|
||||||
|
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
|
||||||
|
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
|
||||||
|
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
|
||||||
|
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
|
||||||
|
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0
|
||||||
|
};
|
||||||
|
|
||||||
|
void print(float x, float y, char *text, float size){
|
||||||
|
int i;
|
||||||
|
int textlength = strlen(text);
|
||||||
|
float px = x;
|
||||||
|
float py = y;
|
||||||
|
for (i = 0; i < textlength; i++){
|
||||||
|
char ch = text[i];
|
||||||
|
if (ch == '\n'){
|
||||||
|
px = x;
|
||||||
|
py += size*1.2;
|
||||||
|
} else{
|
||||||
|
drawChar(px, py, ch, size);
|
||||||
|
px += size*letterwidth[ch];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
33
src/font.h
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
* $Id: font.h,v 1.3 2002/07/19 20:33:28 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: font.h,v $
|
||||||
|
* Revision 1.3 2002/07/19 20:33:28 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/07/19 14:05:52 msell
|
||||||
|
* Damagetextuurit näkyy
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/07/16 17:16:34 msell
|
||||||
|
* Fontit ja valikot
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 20:33:28 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __FONT_H_INCLUDED__
|
||||||
|
#define __FONT_H_INCLUDED__
|
||||||
|
|
||||||
|
#include "texture.h"
|
||||||
|
|
||||||
|
extern Texture *fonttexture;
|
||||||
|
|
||||||
|
//Top left = 0.0 , 0.0 Bottom right = 1.0 , 1.0
|
||||||
|
void drawChar(float x, float y, char ch, float size = 0.05);
|
||||||
|
void print(float x, float y, char *text, float size = 0.05);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
103
src/glapi.cpp
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
/*
|
||||||
|
* $Id: glapi.cpp,v 1.9 2002/07/21 15:03:12 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: glapi.cpp,v $
|
||||||
|
* Revision 1.9 2002/07/21 15:03:12 msell
|
||||||
|
* Äänet disabloitu
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/07/15 20:32:35 msell
|
||||||
|
* Uudet valot ja ulkoasun parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/06/17 19:58:08 msell
|
||||||
|
* #includeiden parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/05 18:39:04 msell
|
||||||
|
* Jotain pientä
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/05 15:00:41 msell
|
||||||
|
* Palikoihin lisää detailia, facet jaetaan halutun kokosiin osiin
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/03 23:06:38 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/05/17 23:13:30 msell
|
||||||
|
* Valot
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/05/16 18:41:16 msell
|
||||||
|
* Vektorifunctioita ja kamera
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/05/15 14:36:39 msell
|
||||||
|
* Yksinkertainen SDL-runko (Kääntyy toistaiseksi vain windowsissa).
|
||||||
|
* Mukana myös musiikinsoitto fmodilla.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/21 15:03:12 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#include "glapi.h"
|
||||||
|
|
||||||
|
void setupOpengl(int width, int height){
|
||||||
|
//float ratio = (float)width/height;
|
||||||
|
float ratio = 4.0/3.0;
|
||||||
|
|
||||||
|
glShadeModel(GL_SMOOTH);
|
||||||
|
|
||||||
|
glCullFace(GL_BACK);
|
||||||
|
glFrontFace(GL_CCW);
|
||||||
|
glEnable(GL_CULL_FACE);
|
||||||
|
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
glDepthFunc(GL_LEQUAL);
|
||||||
|
glClearDepth(1.0);
|
||||||
|
|
||||||
|
glClearColor(0, 0, 0, 0);
|
||||||
|
|
||||||
|
glEnable(GL_COLOR_MATERIAL);
|
||||||
|
|
||||||
|
//Enables lighting with zero initial lights. Lights are created with Light-class
|
||||||
|
glEnable(GL_LIGHTING);
|
||||||
|
glDisable(GL_LIGHT0);
|
||||||
|
|
||||||
|
float ambient[4]= {0.1, 0.1, 0.1, 1};
|
||||||
|
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
|
||||||
|
|
||||||
|
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
|
||||||
|
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
|
||||||
|
|
||||||
|
GLfloat zero[4] = {0, 0, 0, 1};
|
||||||
|
GLfloat one[4] = {1, 1, 1, 1};
|
||||||
|
|
||||||
|
//Default frontface lighting
|
||||||
|
glMaterialfv(GL_FRONT, GL_AMBIENT, one);
|
||||||
|
glMaterialfv(GL_FRONT, GL_DIFFUSE, one);
|
||||||
|
GLfloat specular[4] = {2, 2, 2, 1};
|
||||||
|
glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
|
||||||
|
glMaterialf(GL_FRONT, GL_SHININESS, 120);
|
||||||
|
|
||||||
|
//Never any backface lighting, except ambient
|
||||||
|
glMaterialfv(GL_BACK, GL_AMBIENT, one);
|
||||||
|
glMaterialfv(GL_BACK, GL_DIFFUSE, zero);
|
||||||
|
glMaterialfv(GL_BACK, GL_SPECULAR, zero);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
glViewport(0, 0, width, height);
|
||||||
|
|
||||||
|
glDepthFunc(GL_LEQUAL);
|
||||||
|
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
|
||||||
|
|
||||||
|
glEnable(GL_NORMALIZE);
|
||||||
|
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glLoadIdentity();
|
||||||
|
|
||||||
|
gluPerspective(60.0, ratio, 1.0, 1024.0);
|
||||||
|
|
||||||
|
|
||||||
|
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||||
|
}
|
40
src/glapi.h
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* $Id: glapi.h,v 1.6 2002/07/19 20:33:28 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: glapi.h,v $
|
||||||
|
* Revision 1.6 2002/07/19 20:33:28 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/17 19:58:08 msell
|
||||||
|
* #includeiden parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/16 01:04:58 jkaarlas
|
||||||
|
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/04 16:28:32 msell
|
||||||
|
* #pragma once
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/05/16 18:41:16 msell
|
||||||
|
* Vektorifunctioita ja kamera
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/05/15 14:36:39 msell
|
||||||
|
* Yksinkertainen SDL-runko (Kääntyy toistaiseksi vain windowsissa).
|
||||||
|
* Mukana myös musiikinsoitto fmodilla.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 20:33:28 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __GLAPI_H_INCLUDED__
|
||||||
|
#define __GLAPI_H_INCLUDED__
|
||||||
|
|
||||||
|
#include <SDL_opengl.h>
|
||||||
|
|
||||||
|
void setupOpengl(int width, int height);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
295
src/graphics.cpp
Normal file
|
@ -0,0 +1,295 @@
|
||||||
|
/*
|
||||||
|
* $Id: graphics.cpp,v 1.17 2002/07/21 15:03:12 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: graphics.cpp,v $
|
||||||
|
* Revision 1.17 2002/07/21 15:03:12 msell
|
||||||
|
* Äänet disabloitu
|
||||||
|
*
|
||||||
|
* Revision 1.16 2002/07/19 22:01:35 msell
|
||||||
|
* Säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.15 2002/07/19 21:32:54 msell
|
||||||
|
* Mipmap pois
|
||||||
|
*
|
||||||
|
* Revision 1.14 2002/07/19 21:17:06 msell
|
||||||
|
* bugifixi
|
||||||
|
*
|
||||||
|
* Revision 1.13 2002/07/17 16:40:33 msell
|
||||||
|
* Resoluution vaihto
|
||||||
|
*
|
||||||
|
* Revision 1.12 2002/07/14 21:22:39 jkaarlas
|
||||||
|
* skybox ja ukkojen säätö
|
||||||
|
*
|
||||||
|
* Revision 1.11 2002/06/28 14:51:40 jkaarlas
|
||||||
|
* transparenttilatausta korjailtu
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/06/27 21:42:32 jkaarlas
|
||||||
|
* lisätty transparentin tekstuurin lataus
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/06/26 18:54:43 jkaarlas
|
||||||
|
* Nyt se lataus vihdoin toimii
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/06/20 15:30:22 jkaarlas
|
||||||
|
* tekstuurisäätöä
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/06/19 22:44:56 jkaarlas
|
||||||
|
* lisätty glTexEnvf lataukseen
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/17 20:49:04 msell
|
||||||
|
* free -> SDL_FreeSurface
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/17 20:24:20 jkaarlas
|
||||||
|
* pahimmat bugit korjattu
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/17 19:58:08 msell
|
||||||
|
* #includeiden parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/17 16:51:38 jkaarlas
|
||||||
|
* realloc korjattu
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/16 01:05:18 jkaarlas
|
||||||
|
* vähän lihaa luiden ympärille näihinkin
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/21 15:03:12 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "graphics.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
GraphicsDruid *GraphicsDruid::instance = 0;
|
||||||
|
|
||||||
|
GraphicsDruid::GraphicsDruid(void){
|
||||||
|
this->reserved = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GraphicsDruid::~GraphicsDruid(void){
|
||||||
|
}
|
||||||
|
|
||||||
|
void GraphicsDruid::init(void){
|
||||||
|
instance->textureCount = 0;
|
||||||
|
instance->reserved = ID_ARRAY_INIT_SIZE;
|
||||||
|
instance->idArray = (int*) calloc(ID_ARRAY_INIT_SIZE, sizeof(int));
|
||||||
|
|
||||||
|
for (int i=0; i < instance->reserved; i++){
|
||||||
|
instance->idArray[i] = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GraphicsDruid::destroy(void){
|
||||||
|
if (instance->textureCount > 0){
|
||||||
|
glDeleteTextures(GL_TEXTURE_2D, (const unsigned int*)instance->idArray);
|
||||||
|
}
|
||||||
|
free(instance->idArray);
|
||||||
|
instance->idArray = 0;
|
||||||
|
delete instance;
|
||||||
|
instance = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GraphicsDruid &GraphicsDruid::getInstance(void){
|
||||||
|
|
||||||
|
if (!instance){
|
||||||
|
instance = new GraphicsDruid;
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
return *instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
int GraphicsDruid::loadTexture(SDL_Surface *texture, int id, int format){
|
||||||
|
|
||||||
|
int textureID = id == -1 ? getNewTextureID(id) : id;
|
||||||
|
|
||||||
|
// register texture in OpenGL
|
||||||
|
glBindTexture (GL_TEXTURE_2D, textureID);
|
||||||
|
|
||||||
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||||
|
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||||
|
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);//_MIPMAP_NEAREST);
|
||||||
|
//glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||||
|
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
||||||
|
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
||||||
|
|
||||||
|
//printf("w: %i, h: %i, format: %i, RGBA: %i, pixels: %p\n",
|
||||||
|
// texture->w, texture->h, format, GL_RGBA, texture->pixels);
|
||||||
|
//printf("Pitch: %i, Bpp: %i\n", texture->pitch, texture->format->BytesPerPixel);
|
||||||
|
|
||||||
|
/*gluBuild2DMipmaps(GL_TEXTURE_2D,
|
||||||
|
4,
|
||||||
|
texture->w,
|
||||||
|
texture->h,
|
||||||
|
format,
|
||||||
|
GL_UNSIGNED_BYTE,
|
||||||
|
texture->pixels);*/
|
||||||
|
int w = texture->w;
|
||||||
|
int h = texture->h;
|
||||||
|
/*int i;
|
||||||
|
while (w > 0){
|
||||||
|
w >>= 1;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
w = 1;
|
||||||
|
for (;i > 1; i--) w <<= 1;
|
||||||
|
while (h > 0){
|
||||||
|
h >>= 1;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
h = 1;
|
||||||
|
for (;i > 1; i--) h <<= 1;*/
|
||||||
|
//glTexImage2D(GL_TEXTURE_2D, 0, texture->format->BytesPerPixel, w, h, 0, format, GL_UNSIGNED_BYTE, texture->pixels);
|
||||||
|
if (texture->format->BytesPerPixel == 3){
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, 3, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, texture->pixels);
|
||||||
|
} else if (texture->format->BytesPerPixel == 4){
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, 4, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture->pixels);
|
||||||
|
}
|
||||||
|
//SDL_FreeSurface(texture);
|
||||||
|
//SDL_FreeSurface(alphaSurface);
|
||||||
|
return textureID;
|
||||||
|
}
|
||||||
|
|
||||||
|
int GraphicsDruid::loadTexture(char* path, int id){
|
||||||
|
|
||||||
|
SDL_Surface* texture;
|
||||||
|
texture = IMG_Load(path);
|
||||||
|
|
||||||
|
if (!texture){
|
||||||
|
#ifdef _DEBUG
|
||||||
|
printf ("Error while loading image: %s\n", SDL_GetError());
|
||||||
|
#endif
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int textureID = getNewTextureID(id);
|
||||||
|
|
||||||
|
|
||||||
|
// register texture in OpenGL
|
||||||
|
glBindTexture (GL_TEXTURE_2D, textureID);
|
||||||
|
|
||||||
|
//glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
|
||||||
|
|
||||||
|
// NOTE : Making some assumptions about texture parameters
|
||||||
|
//glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
//glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
|
||||||
|
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
|
||||||
|
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||||
|
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||||
|
glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||||
|
|
||||||
|
//printf("w: %i, h: %i, RGBA: %i, pixels: %p\n",
|
||||||
|
// texture->w, texture->h, GL_RGBA, texture->pixels);
|
||||||
|
//printf("Pitch: %i, Bpp: %i\n", texture->pitch, texture->format->BytesPerPixel);
|
||||||
|
|
||||||
|
if (texture->format->BytesPerPixel == 3){
|
||||||
|
/*gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB,
|
||||||
|
texture->w,
|
||||||
|
texture->h,
|
||||||
|
GL_RGB, GL_UNSIGNED_BYTE,
|
||||||
|
texture->pixels);*/
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, 3, texture->w, texture->h, 0, GL_RGB, GL_UNSIGNED_BYTE, texture->pixels);
|
||||||
|
}
|
||||||
|
else if (texture->format->BytesPerPixel == 4){
|
||||||
|
/*gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA,
|
||||||
|
texture->w,
|
||||||
|
texture->h,
|
||||||
|
GL_RGBA, GL_UNSIGNED_BYTE,
|
||||||
|
texture->pixels);*/
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, 4, texture->w, texture->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture->pixels);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
|
||||||
|
gluBuild2DMipmaps(GL_TEXTURE_2D,
|
||||||
|
0,
|
||||||
|
texture->w,
|
||||||
|
texture->h,
|
||||||
|
GL_RGBA,
|
||||||
|
GL_UNSIGNED_BYTE,
|
||||||
|
texture->pixels);
|
||||||
|
*/
|
||||||
|
SDL_FreeSurface(texture);
|
||||||
|
return textureID;
|
||||||
|
}
|
||||||
|
|
||||||
|
int GraphicsDruid::loadTranspTexture(char* path, float* transpColor, int id){
|
||||||
|
|
||||||
|
SDL_Surface* texture;
|
||||||
|
texture = IMG_Load(path);
|
||||||
|
if (!texture){
|
||||||
|
#ifdef _DEBUG
|
||||||
|
printf ("Error while loading image: %s\n", SDL_GetError());
|
||||||
|
#endif
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Uint32 colorKey = SDL_MapRGB(texture->format,
|
||||||
|
(Uint8)(transpColor[0] * 255),
|
||||||
|
(Uint8)(transpColor[1] * 255),
|
||||||
|
(Uint8)(transpColor[2] * 255));
|
||||||
|
//SDL_SetAlpha(texture, 0, SDL_ALPHA_OPAQUE);
|
||||||
|
|
||||||
|
SDL_SetColorKey(texture, SDL_SRCCOLORKEY, colorKey);
|
||||||
|
|
||||||
|
//SDL_Surface* alphaSurface = SDL_DisplayFormatAlpha(texture);
|
||||||
|
texture = SDL_DisplayFormatAlpha(texture);
|
||||||
|
|
||||||
|
return loadTexture(texture);
|
||||||
|
}
|
||||||
|
|
||||||
|
int GraphicsDruid::getNewTextureID(int id){
|
||||||
|
|
||||||
|
if (id != -1){
|
||||||
|
for (int i = 0; i < instance->reserved; i++){
|
||||||
|
if (instance->idArray[i] == id){
|
||||||
|
freeTexture(id);
|
||||||
|
instance->textureCount--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GLuint newId;
|
||||||
|
|
||||||
|
if (id == -1){
|
||||||
|
glGenTextures (1, &newId);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
newId = id;
|
||||||
|
|
||||||
|
int index = 0;
|
||||||
|
while (instance->idArray[index] != -1 && index < instance->reserved){
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// out of space, make more
|
||||||
|
if (index >= instance->reserved){
|
||||||
|
instance->idArray = (int*) realloc(instance->idArray, (instance->reserved + ID_ARRAY_GROW)*sizeof(int));
|
||||||
|
|
||||||
|
for (int i = instance->reserved + 1; i < instance->reserved + ID_ARRAY_GROW; i++)
|
||||||
|
instance->idArray[i] = -1;
|
||||||
|
|
||||||
|
instance->reserved += ID_ARRAY_GROW;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
instance->idArray[index] = newId;
|
||||||
|
|
||||||
|
|
||||||
|
instance->textureCount++;
|
||||||
|
return newId;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GraphicsDruid::freeTexture(int id){
|
||||||
|
if (id > -1 && id < instance->reserved){
|
||||||
|
instance->idArray[id] = -1;
|
||||||
|
const unsigned int helpInt = id;
|
||||||
|
glDeleteTextures(1, &helpInt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
89
src/graphics.h
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
/*
|
||||||
|
* $Id: graphics.h,v 1.9 2002/07/19 20:33:28 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: graphics.h,v $
|
||||||
|
* Revision 1.9 2002/07/19 20:33:28 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/07/17 16:40:33 msell
|
||||||
|
* Resoluution vaihto
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/06/28 14:51:40 jkaarlas
|
||||||
|
* transparenttilatausta korjailtu
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/27 21:42:32 jkaarlas
|
||||||
|
* lisätty transparentin tekstuurin lataus
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/17 20:49:04 msell
|
||||||
|
* free -> SDL_FreeSurface
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/17 20:24:20 jkaarlas
|
||||||
|
* pahimmat bugit korjattu
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/17 16:51:38 jkaarlas
|
||||||
|
* realloc korjattu
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/16 01:05:18 jkaarlas
|
||||||
|
* vähän lihaa luiden ympärille näihinkin
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 20:33:28 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __GRAPHICS_H_INCLUDED__
|
||||||
|
#define __GRAPHICS_H_INCLUDED__
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
#pragma warning ( disable : 4700 )
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
#include "texture.h"
|
||||||
|
#include "glapi.h"
|
||||||
|
|
||||||
|
const int ID_ARRAY_INIT_SIZE = 16;
|
||||||
|
const int ID_ARRAY_GROW = 8;
|
||||||
|
|
||||||
|
#define DRUID GraphicsDruid::getInstance()
|
||||||
|
#define DIE_DRUID_DIE GraphicsDruid::destroy()
|
||||||
|
typedef unsigned char byte;
|
||||||
|
typedef struct jpeg_pixel{
|
||||||
|
Uint8 red;
|
||||||
|
Uint8 green;
|
||||||
|
Uint8 blue;
|
||||||
|
}jpeg_pixel;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class GraphicsDruid{
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
static GraphicsDruid* instance;
|
||||||
|
int* idArray;
|
||||||
|
int textureCount;
|
||||||
|
int reserved;
|
||||||
|
|
||||||
|
GraphicsDruid(void);
|
||||||
|
~GraphicsDruid(void);
|
||||||
|
|
||||||
|
static void init(void);
|
||||||
|
static void destroy(void);
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
static GraphicsDruid &getInstance(void);
|
||||||
|
int loadTexture(SDL_Surface *texture, int id = -1, int format = GL_RGB);
|
||||||
|
int loadTexture(char* path, int id = -1);
|
||||||
|
int loadTranspTexture(char* path, float* transpColor, int id = -1);
|
||||||
|
void freeTexture(int id);
|
||||||
|
void freeAll(void);
|
||||||
|
int getNewTextureID(int id);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
522
src/legoblocks.cpp
Normal file
|
@ -0,0 +1,522 @@
|
||||||
|
/*
|
||||||
|
* $Id: legoblocks.cpp,v 1.20 2002/07/22 11:44:37 jkaarlas Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: legoblocks.cpp,v $
|
||||||
|
* Revision 1.20 2002/07/22 11:44:37 jkaarlas
|
||||||
|
* naama
|
||||||
|
*
|
||||||
|
* Revision 1.19 2002/07/18 23:05:31 msell
|
||||||
|
* Partikkelit ja kakkospelaajan liike
|
||||||
|
*
|
||||||
|
* Revision 1.18 2002/07/17 20:32:47 msell
|
||||||
|
* Detail-optio toimii
|
||||||
|
*
|
||||||
|
* Revision 1.17 2002/07/16 17:16:34 msell
|
||||||
|
* Fontit ja valikot
|
||||||
|
*
|
||||||
|
* Revision 1.16 2002/07/16 00:42:43 msell
|
||||||
|
* Uusia skyboxeja ja areenan säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.15 2002/07/15 20:32:35 msell
|
||||||
|
* Uudet valot ja ulkoasun parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.14 2002/07/15 15:22:08 msell
|
||||||
|
* Parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.13 2002/07/14 21:40:43 msell
|
||||||
|
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
|
||||||
|
*
|
||||||
|
* Revision 1.12 2002/06/30 16:05:04 msell
|
||||||
|
* Törmäyksien parantelua, transformaatioita mukana
|
||||||
|
*
|
||||||
|
* Revision 1.11 2002/06/27 00:08:04 msell
|
||||||
|
* Kimmotukset palloille myös pyöritettyihin mesheihin
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/06/24 14:12:15 msell
|
||||||
|
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/06/24 04:41:43 jkaarlas
|
||||||
|
* tekstuurikoordinaatteja korjattu
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/06/20 22:50:12 msell
|
||||||
|
* Meshit
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/06/20 00:21:01 jkaarlas
|
||||||
|
* materiaali- ja tekstuurihommia edistetty
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/17 19:58:08 msell
|
||||||
|
* #includeiden parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/15 17:18:37 msell
|
||||||
|
* Toimiva törmäystarkastus kiinteille laatikoille
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/05 18:39:04 msell
|
||||||
|
* Jotain pientä
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/05 15:00:41 msell
|
||||||
|
* Palikoihin lisää detailia, facet jaetaan halutun kokosiin osiin
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/04 16:28:32 msell
|
||||||
|
* #pragma once
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/06/03 23:06:38 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/22 11:44:37 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "legoblocks.h"
|
||||||
|
#include "utils.h"
|
||||||
|
#include "3dutils.h"
|
||||||
|
#include "objectfactory.h"
|
||||||
|
#include "vector.h"
|
||||||
|
#include "glapi.h"
|
||||||
|
|
||||||
|
BasicBlock::BasicBlock(int width, int height, int depth) : MeshObject(createBox(-width/2.0, width/2.0, -height/2.0*BLOCKHEIGHT, BLOCKHEIGHT*height/2.0, -depth/2.0, depth/2.0)){
|
||||||
|
appearance = new BasicBlockAppearance(width, height, depth);
|
||||||
|
//geometry = new MeshShape(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BasicBlock::setColor(float red, float green, float blue){
|
||||||
|
appearance->getMaterial()->setColor(red, green, blue, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BasicBlockAppearance::BasicBlockAppearance(int width, int height, int depth){
|
||||||
|
this->width = width;
|
||||||
|
this->height = height;
|
||||||
|
this->depth = depth;
|
||||||
|
vectorSet(displacement, 0, 0, 0);
|
||||||
|
gllist = glGenLists(1);
|
||||||
|
usematerial = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BasicBlockAppearance::prepare(){
|
||||||
|
glNewList(gllist, GL_COMPILE);
|
||||||
|
|
||||||
|
|
||||||
|
float width = this->width;
|
||||||
|
float height = this->height * BLOCKHEIGHT;
|
||||||
|
|
||||||
|
if (usematerial) material.enable();
|
||||||
|
{//Block
|
||||||
|
//Front Face
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef(-width/2.0, -height/2.0, depth/2.0);
|
||||||
|
drawDetailRectangle(width, height);
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
// Back Face
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef(width/2.0, -height/2.0, -depth/2.0);
|
||||||
|
glRotatef(180, 0, 1, 0);
|
||||||
|
drawDetailRectangle(width, height);
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
// Top Face
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef(-width/2.0, height/2.0, depth/2.0);
|
||||||
|
glRotatef(-90, 1, 0, 0);
|
||||||
|
drawDetailRectangle(width, depth);
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
// Bottom Face
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef(-width/2.0, -height/2.0, -depth/2.0);
|
||||||
|
glRotatef(90, 1, 0, 0);
|
||||||
|
drawDetailRectangle(width, depth);
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
// Right face
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef(width/2.0, -height/2.0, depth/2.0);
|
||||||
|
glRotatef(90, 0, 1, 0);
|
||||||
|
drawDetailRectangle(depth, height);
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
// Left Face
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef(-width/2.0, -height/2.0, -depth/2.0);
|
||||||
|
glRotatef(-90, 0, 1, 0);
|
||||||
|
drawDetailRectangle(depth, height);
|
||||||
|
glPopMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef(0.5 - width/2.0, height - height/2.0, 0.5 - depth/2.0);
|
||||||
|
int x, z;
|
||||||
|
for (x = 0; x < width; x++){
|
||||||
|
//glPushMatrix();
|
||||||
|
for (z = 0; z < depth; z++){
|
||||||
|
createKnob();
|
||||||
|
glTranslatef(0, 0, 1);
|
||||||
|
}
|
||||||
|
glTranslatef(1, 0, -depth);
|
||||||
|
//glPopMatrix();
|
||||||
|
}
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
if (usematerial) material.disable();
|
||||||
|
glEndList();
|
||||||
|
}
|
||||||
|
|
||||||
|
void BasicBlockAppearance::draw(){
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef(displacement[0], displacement[1], displacement[2]);
|
||||||
|
glCallList(gllist);
|
||||||
|
glPopMatrix();
|
||||||
|
//prepare();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define BLOCKDETAILGRID 1
|
||||||
|
|
||||||
|
void drawDetailRectangle(float width, float height){
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
float x, y, x2, y2;
|
||||||
|
glNormal3f(0, 0, 1);
|
||||||
|
|
||||||
|
for (y = 0; y < height; y += BLOCKDETAILGRID){
|
||||||
|
y2 = y + BLOCKDETAILGRID;
|
||||||
|
if (y2 > height) y2 = height;
|
||||||
|
for (x = 0; x < width; x += BLOCKDETAILGRID){
|
||||||
|
x2 = x + BLOCKDETAILGRID;
|
||||||
|
if (x2 > width) x2 = width;
|
||||||
|
|
||||||
|
glTexCoord2f(x / width, y / height);
|
||||||
|
glVertex3f(x, y, 0);
|
||||||
|
|
||||||
|
glTexCoord2f(x2 / width, y / height);
|
||||||
|
glVertex3f(x2, y, 0);
|
||||||
|
|
||||||
|
glTexCoord2f(x2 / width, y2 / height);
|
||||||
|
glVertex3f(x2, y2, 0);
|
||||||
|
|
||||||
|
glTexCoord2f(x / width, y2 / height);
|
||||||
|
glVertex3f(x, y2, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
#define KNOBROUNDNESS 0.03
|
||||||
|
|
||||||
|
int knobgllist;
|
||||||
|
int knobdetail;
|
||||||
|
|
||||||
|
void renderKnob(int knobsegments){
|
||||||
|
point2d knobpoints[4];
|
||||||
|
knobpoints[0].x = 0.3;
|
||||||
|
knobpoints[0].y = 0;
|
||||||
|
knobpoints[1].x = 0.3;
|
||||||
|
knobpoints[1].y = BLOCKHEIGHT*0.5 - KNOBROUNDNESS;
|
||||||
|
knobpoints[2].x = 0.3 - KNOBROUNDNESS;
|
||||||
|
knobpoints[2].y = BLOCKHEIGHT*0.5;
|
||||||
|
knobpoints[3].x = 0;
|
||||||
|
knobpoints[3].y = BLOCKHEIGHT*0.5;
|
||||||
|
|
||||||
|
point2d knobderivates[4];
|
||||||
|
knobderivates[0].x = 0;
|
||||||
|
knobderivates[0].y = knobpoints[1].y - knobpoints[0].y;
|
||||||
|
knobderivates[1].x = 0;
|
||||||
|
knobderivates[1].y = knobpoints[2].y - knobpoints[1].y;
|
||||||
|
knobderivates[2].x = knobpoints[2].x - knobpoints[1].x;
|
||||||
|
knobderivates[2].y = 0;
|
||||||
|
knobderivates[3].x = knobpoints[3].x - knobpoints[2].x;
|
||||||
|
knobderivates[3].y = 0;
|
||||||
|
|
||||||
|
createLathedSurface(knobpoints, knobderivates, 4, knobsegments, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void initKnob(void){
|
||||||
|
glNewList(knobgllist, GL_COMPILE);
|
||||||
|
|
||||||
|
renderKnob(knobdetail);
|
||||||
|
|
||||||
|
glEndList();
|
||||||
|
}
|
||||||
|
|
||||||
|
void createKnob(int knobsegments){
|
||||||
|
if (knobsegments != -1){
|
||||||
|
renderKnob(knobsegments);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
glCallList(knobgllist);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
float knobroundness=0.05;
|
||||||
|
float pillarroundness=0.03;
|
||||||
|
|
||||||
|
HeadAppearance::HeadAppearance(void){
|
||||||
|
gllist = glGenLists(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HeadAppearance::prepare(void){
|
||||||
|
glNewList(gllist, GL_COMPILE);
|
||||||
|
|
||||||
|
glPushMatrix();
|
||||||
|
|
||||||
|
glTranslatef(0, -0.5, 0);
|
||||||
|
|
||||||
|
point2d headpoints[14];
|
||||||
|
|
||||||
|
headpoints[0].x=0.0; headpoints[0].y=BLOCKHEIGHT*(0);
|
||||||
|
headpoints[1].x=0.4; headpoints[1].y=BLOCKHEIGHT*(0);
|
||||||
|
headpoints[2].x=0.45; headpoints[2].y=BLOCKHEIGHT*(0.35);
|
||||||
|
headpoints[3].x=0.55; headpoints[3].y=BLOCKHEIGHT*(0.5);
|
||||||
|
headpoints[4].x=0.62*1.0; headpoints[4].y=BLOCKHEIGHT*(0.65);
|
||||||
|
headpoints[5].x=0.65*1.0; headpoints[5].y=BLOCKHEIGHT*(1);
|
||||||
|
headpoints[6].x=0.65*1.0; headpoints[6].y=BLOCKHEIGHT*(1.75);
|
||||||
|
headpoints[7].x=0.65*1.0; headpoints[7].y=BLOCKHEIGHT*(2.35);
|
||||||
|
headpoints[8].x=0.62*1.0; headpoints[8].y=BLOCKHEIGHT*(2.60);
|
||||||
|
headpoints[9].x=0.55*1.0; headpoints[9].y=BLOCKHEIGHT*(2.80);
|
||||||
|
headpoints[10].x=0.4; headpoints[10].y=BLOCKHEIGHT*(2.95);
|
||||||
|
headpoints[11].x=0.3; headpoints[11].y=BLOCKHEIGHT*3.5-pillarroundness;
|
||||||
|
headpoints[12].x=0.3-pillarroundness; headpoints[12].y=BLOCKHEIGHT*3.5;
|
||||||
|
headpoints[13].x=0; headpoints[13].y=BLOCKHEIGHT*3.5;
|
||||||
|
headpoints[11].x=0; headpoints[11].y=BLOCKHEIGHT*3.0;
|
||||||
|
|
||||||
|
glColor4f(0.8,0.8,0.0,1.0);
|
||||||
|
|
||||||
|
|
||||||
|
faceTexture->enable();
|
||||||
|
glBlendFunc(GL_ONE, GL_SRC_ALPHA);
|
||||||
|
createLathedSurface(headpoints,NULL,12,16,24);
|
||||||
|
faceTexture->disable();
|
||||||
|
|
||||||
|
glTranslatef(0, BLOCKHEIGHT*3-0.05, 0);
|
||||||
|
|
||||||
|
createKnob(16);
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
glEndList();
|
||||||
|
}
|
||||||
|
|
||||||
|
void HeadAppearance::draw(void){
|
||||||
|
glCallList(gllist);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FlowerAppearance::FlowerAppearance(int color1, int color2, int color3){
|
||||||
|
gllist = glGenLists(1);
|
||||||
|
this->color1 = color1;
|
||||||
|
this->color2 = color2;
|
||||||
|
this->color3 = color3;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FlowerAppearance::prepare(void){
|
||||||
|
glNewList(gllist, GL_COMPILE);
|
||||||
|
|
||||||
|
glPushMatrix();
|
||||||
|
|
||||||
|
|
||||||
|
int colors[]={color1,color2,color3};
|
||||||
|
|
||||||
|
glColor3f(0.0,0.6,0.0);
|
||||||
|
|
||||||
|
point2d basepoints[8];
|
||||||
|
basepoints[0].x=0.4; basepoints[0].y=0;
|
||||||
|
basepoints[1].x=0.4; basepoints[1].y=BLOCKHEIGHT*1.5-pillarroundness;
|
||||||
|
basepoints[2].x=0.4-pillarroundness; basepoints[2].y=BLOCKHEIGHT*1.5;
|
||||||
|
basepoints[3].x=0.3+pillarroundness; basepoints[3].y=BLOCKHEIGHT*1.5;
|
||||||
|
basepoints[4].x=0.3; basepoints[4].y=BLOCKHEIGHT*1.5+pillarroundness;
|
||||||
|
basepoints[5].x=0.3; basepoints[5].y=BLOCKHEIGHT*2.0-pillarroundness;
|
||||||
|
basepoints[6].x=0.3-pillarroundness; basepoints[6].y=BLOCKHEIGHT*2.0;
|
||||||
|
basepoints[7].x=0; basepoints[7].y=BLOCKHEIGHT*2.0;
|
||||||
|
|
||||||
|
point2d basederivates[8];
|
||||||
|
basederivates[0].x=0; basederivates[0].y=basepoints[1].y-basepoints[0].y;
|
||||||
|
basederivates[1].x=0; basederivates[1].y=basepoints[2].y-basepoints[1].y;
|
||||||
|
basederivates[2].x=basepoints[2].x-basepoints[1].x; basederivates[2].y=0;
|
||||||
|
basederivates[3].x=basepoints[4].x-basepoints[3].x; basederivates[3].y=0;
|
||||||
|
basederivates[4].x=0; basederivates[4].y=basepoints[4].y-basepoints[3].y;
|
||||||
|
basederivates[5].x=0; basederivates[5].y=basepoints[6].y-basepoints[5].y;
|
||||||
|
basederivates[6].x=basepoints[6].x-basepoints[5].x; basederivates[6].y=0;
|
||||||
|
basederivates[7].x=basepoints[7].x-basepoints[6].x; basederivates[7].y=0;
|
||||||
|
|
||||||
|
createLathedSurface(basepoints,basederivates,8,8,8);
|
||||||
|
|
||||||
|
int i,j;
|
||||||
|
for (i=0;i<3;i++){
|
||||||
|
glColor3f(0.0,0.6,0.0);
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef(0,BLOCKHEIGHT,0.4);
|
||||||
|
glRotatef(20-90,1,0,0);
|
||||||
|
gluCylinder(gluNewQuadric(),0.1,0.1,BLOCKHEIGHT*(3+i*0.7),4,1);
|
||||||
|
glRotatef(90,1,0,0);
|
||||||
|
glTranslatef(0,BLOCKHEIGHT*(3+i*0.7),0);
|
||||||
|
|
||||||
|
float r,g,b;
|
||||||
|
switch(colors[i]){
|
||||||
|
case FLOWER_RED:
|
||||||
|
r=1.0; g=0.0; b=0.0;
|
||||||
|
break;
|
||||||
|
case FLOWER_YELLOW:
|
||||||
|
r=1.0; g=1.0; b=0.0;
|
||||||
|
break;
|
||||||
|
case FLOWER_WHITE:
|
||||||
|
r=1.0; g=1.0; b=1.0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
glColor3f(r,g,b);
|
||||||
|
createKnob();
|
||||||
|
|
||||||
|
/* Terälehdet tehdään triangle-fanilla */
|
||||||
|
glBegin(GL_TRIANGLE_FAN);
|
||||||
|
glNormal3f(0.0,1.0,0.0);
|
||||||
|
glVertex3f(0.0,0.0,0.0);
|
||||||
|
float x,z;
|
||||||
|
for (j=0;j<24;j+=4){
|
||||||
|
x=sin((j+0)*2*PI/24)*0.4;
|
||||||
|
z=cos((j+0)*2*PI/24)*0.4;
|
||||||
|
glVertex3f(x,0.0,z);
|
||||||
|
x=sin((j+1)*2*PI/24)*0.55;
|
||||||
|
z=cos((j+1)*2*PI/24)*0.55;
|
||||||
|
glVertex3f(x,0.0,z);
|
||||||
|
x=sin((j+2)*2*PI/24)*0.6;
|
||||||
|
z=cos((j+2)*2*PI/24)*0.6;
|
||||||
|
glVertex3f(x,0.0,z);
|
||||||
|
x=sin((j+3)*2*PI/24)*0.55;
|
||||||
|
z=cos((j+3)*2*PI/24)*0.55;
|
||||||
|
glVertex3f(x,0.0,z);
|
||||||
|
}
|
||||||
|
glVertex3f(0,0.0,0.4);
|
||||||
|
glEnd();
|
||||||
|
glEnable(GL_CULL_FACE);
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
glRotatef(120,0,1,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
glEndList();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FlowerAppearance::draw(void){
|
||||||
|
glCallList(gllist);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
LampAppearance::LampAppearance(void){
|
||||||
|
gllist = glGenLists(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LampAppearance::prepare(void){
|
||||||
|
glNewList(gllist, GL_COMPILE);
|
||||||
|
|
||||||
|
glPushMatrix();
|
||||||
|
|
||||||
|
//glTranslatef(0, -1, 0);
|
||||||
|
|
||||||
|
//glRotatef(180, 1, 0, 0);
|
||||||
|
|
||||||
|
glDisable(GL_LIGHTING);
|
||||||
|
|
||||||
|
point2d lightpoints[11];
|
||||||
|
lightpoints[0].x=0.4; lightpoints[0].y=BLOCKHEIGHT*(0);
|
||||||
|
lightpoints[1].x=0.55; lightpoints[1].y=BLOCKHEIGHT*(0);
|
||||||
|
lightpoints[2].x=0.62; lightpoints[2].y=BLOCKHEIGHT*(0+0.15);
|
||||||
|
lightpoints[3].x=0.65; lightpoints[3].y=BLOCKHEIGHT*(0+0.5);
|
||||||
|
lightpoints[4].x=0.68; lightpoints[4].y=BLOCKHEIGHT*(0+1.25);
|
||||||
|
lightpoints[5].x=0.65; lightpoints[5].y=BLOCKHEIGHT*(0+2);
|
||||||
|
lightpoints[6].x=0.62; lightpoints[6].y=BLOCKHEIGHT*(0+2.35);
|
||||||
|
lightpoints[7].x=0.55; lightpoints[7].y=BLOCKHEIGHT*(0+2.5);
|
||||||
|
lightpoints[8].x=0.4; lightpoints[8].y=BLOCKHEIGHT*(0+2.5);
|
||||||
|
lightpoints[9].x=0.4; lightpoints[9].y=BLOCKHEIGHT*(0+3);
|
||||||
|
lightpoints[10].x=0.0; lightpoints[10].y=BLOCKHEIGHT*(0+3);
|
||||||
|
glColor4f(0.8,0.8,0.8,0.5);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
|
||||||
|
createLathedSurface(lightpoints,NULL,11,8,11);
|
||||||
|
|
||||||
|
glEnable(GL_LIGHTING);
|
||||||
|
|
||||||
|
/*glColor3f(0.5, 0.5, 0.5);
|
||||||
|
|
||||||
|
glBegin(GL_LINES);
|
||||||
|
glVertex3f(0, 1, 0);
|
||||||
|
glVertex3f(0, -100, 0);
|
||||||
|
glEnd();*/
|
||||||
|
|
||||||
|
|
||||||
|
/*float screencoords[3]
|
||||||
|
getPointCoordinates(0,lighty,0);
|
||||||
|
|
||||||
|
glLoadIdentity();
|
||||||
|
glTranslatef(screencoords.x,screencoords.y,0);
|
||||||
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
glEnable(GL_CULL_FACE);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
|
glBlendFunc(GL_ONE,GL_ONE);
|
||||||
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
glBindTexture(GL_TEXTURE_2D,*flaretexture);
|
||||||
|
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glPushMatrix();
|
||||||
|
glLoadIdentity();
|
||||||
|
float sizey=8.0/distance*staticlightflarebrightnesses[lightnumber];
|
||||||
|
float sizex=sizey*height/width;
|
||||||
|
|
||||||
|
if (distance>0.5){
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
glColor3f(staticlightflarebrightnesses[lightnumber],staticlightflarebrightnesses[lightnumber],staticlightflarebrightnesses[lightnumber]);
|
||||||
|
|
||||||
|
glTexCoord2f(0.0, 0.0);
|
||||||
|
glVertex2f(-sizex,sizey);
|
||||||
|
|
||||||
|
glTexCoord2f(0.0, 1.0);
|
||||||
|
glVertex2f(-sizex,-sizey);
|
||||||
|
|
||||||
|
glTexCoord2f(1.0, 1.0);
|
||||||
|
glVertex2f( sizex,-sizey);
|
||||||
|
|
||||||
|
glTexCoord2f(1.0, 0.0);
|
||||||
|
glVertex2f( sizex,sizey);
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
glLoadIdentity();*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
glEndList();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LampAppearance::draw(void){
|
||||||
|
glCallList(gllist);
|
||||||
|
}
|
145
src/legoblocks.h
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
/*
|
||||||
|
* $Id: legoblocks.h,v 1.14 2002/07/19 20:33:28 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: legoblocks.h,v $
|
||||||
|
* Revision 1.14 2002/07/19 20:33:28 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.13 2002/07/18 23:05:31 msell
|
||||||
|
* Partikkelit ja kakkospelaajan liike
|
||||||
|
*
|
||||||
|
* Revision 1.12 2002/07/17 20:32:47 msell
|
||||||
|
* Detail-optio toimii
|
||||||
|
*
|
||||||
|
* Revision 1.11 2002/07/16 17:16:34 msell
|
||||||
|
* Fontit ja valikot
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/07/16 00:42:43 msell
|
||||||
|
* Uusia skyboxeja ja areenan säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/07/15 20:32:35 msell
|
||||||
|
* Uudet valot ja ulkoasun parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/07/15 15:22:08 msell
|
||||||
|
* Parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/06/24 14:12:15 msell
|
||||||
|
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/20 00:21:01 jkaarlas
|
||||||
|
* materiaali- ja tekstuurihommia edistetty
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/17 20:49:04 msell
|
||||||
|
* free -> SDL_FreeSurface
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/05 18:39:05 msell
|
||||||
|
* Jotain pientä
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/05 15:00:41 msell
|
||||||
|
* Palikoihin lisää detailia, facet jaetaan halutun kokosiin osiin
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/04 16:28:32 msell
|
||||||
|
* #pragma once
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/06/03 23:06:38 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 20:33:28 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LEGOBLOCKS_H_INCLUDED__
|
||||||
|
#define __LEGOBLOCKS_H_INCLUDED__
|
||||||
|
|
||||||
|
//#include "mesh.h"
|
||||||
|
#include "object.h"
|
||||||
|
#include "material.h"
|
||||||
|
#include "mesh.h"
|
||||||
|
|
||||||
|
#define BLOCKHEIGHT 0.4
|
||||||
|
|
||||||
|
class BasicBlock : public MeshObject{
|
||||||
|
private:
|
||||||
|
int width, height, depth;
|
||||||
|
|
||||||
|
public:
|
||||||
|
BasicBlock(int width, int height, int depth);
|
||||||
|
|
||||||
|
void setColor(float red, float green, float blue);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class BasicBlockAppearance : public Appearance{
|
||||||
|
private:
|
||||||
|
int width, height, depth;
|
||||||
|
int gllist;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool usematerial;
|
||||||
|
|
||||||
|
public:
|
||||||
|
float displacement[3];
|
||||||
|
|
||||||
|
BasicBlockAppearance(int width, int height, int depth);
|
||||||
|
|
||||||
|
virtual void prepare(void);
|
||||||
|
virtual void draw(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
void drawDetailRectangle(float width, float height);
|
||||||
|
|
||||||
|
extern int knobgllist;
|
||||||
|
extern int knobdetail;
|
||||||
|
void initKnob(void);
|
||||||
|
void createKnob(int knobsegments = -1);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class HeadAppearance : public Appearance{
|
||||||
|
private:
|
||||||
|
int gllist;
|
||||||
|
|
||||||
|
public:
|
||||||
|
HeadAppearance(void);
|
||||||
|
|
||||||
|
void prepare(void);
|
||||||
|
void draw(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define FLOWER_RED 1
|
||||||
|
#define FLOWER_YELLOW 2
|
||||||
|
#define FLOWER_WHITE 3
|
||||||
|
|
||||||
|
class FlowerAppearance : public Appearance{
|
||||||
|
private:
|
||||||
|
int gllist;
|
||||||
|
int color1, color2, color3;
|
||||||
|
|
||||||
|
public:
|
||||||
|
FlowerAppearance(int color1, int color2, int color3);
|
||||||
|
|
||||||
|
void prepare(void);
|
||||||
|
void draw(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class LampAppearance : public Appearance{
|
||||||
|
private:
|
||||||
|
int gllist;
|
||||||
|
|
||||||
|
public:
|
||||||
|
LampAppearance(void);
|
||||||
|
|
||||||
|
void prepare(void);
|
||||||
|
void draw(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
1110
src/legoman.cpp
Normal file
271
src/legoman.h
Normal file
|
@ -0,0 +1,271 @@
|
||||||
|
/*
|
||||||
|
* $Id: legoman.h,v 1.21 2002/07/22 12:07:36 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: legoman.h,v $
|
||||||
|
* Revision 1.21 2002/07/22 12:07:36 msell
|
||||||
|
* Pää kiinni
|
||||||
|
*
|
||||||
|
* Revision 1.20 2002/07/22 06:08:18 msell
|
||||||
|
* Filenimet pienellä
|
||||||
|
*
|
||||||
|
* Revision 1.19 2002/07/22 01:14:14 msell
|
||||||
|
* Lopetussysteemi
|
||||||
|
*
|
||||||
|
* Revision 1.18 2002/07/21 22:50:39 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.17 2002/07/21 20:14:28 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.16 2002/07/21 15:16:41 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.15 2002/07/21 15:03:12 msell
|
||||||
|
* Äänet disabloitu
|
||||||
|
*
|
||||||
|
* Revision 1.14 2002/07/19 20:33:28 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.13 2002/07/19 18:59:46 msell
|
||||||
|
* Alkuhommaa ja säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.12 2002/07/18 23:05:31 msell
|
||||||
|
* Partikkelit ja kakkospelaajan liike
|
||||||
|
*
|
||||||
|
* Revision 1.11 2002/07/17 22:45:54 msell
|
||||||
|
* Ääniä vähän
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/07/17 16:40:33 msell
|
||||||
|
* Resoluution vaihto
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/07/16 07:27:32 jkaarlas
|
||||||
|
* nyt latautuu kämmen. paikka ja väri pitää vielä säätää
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/07/14 21:40:43 msell
|
||||||
|
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/07/14 21:22:39 jkaarlas
|
||||||
|
* skybox ja ukkojen säätö
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/07/11 18:33:58 jkaarlas
|
||||||
|
* mallit paikoillaan, vaatii säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/07/10 17:13:44 msell
|
||||||
|
* Törmäystarkastelun parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/07/08 22:53:38 msell
|
||||||
|
* Säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/07/08 18:28:47 msell
|
||||||
|
* Törmäystä ja ukkoja
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/07/07 23:05:22 msell
|
||||||
|
* Osien liimaaminen toisiinsa (kesken)
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/07/07 17:53:21 msell
|
||||||
|
* Legoukon alku
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/22 12:07:36 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LEGOMAN_H_INCLUDED__
|
||||||
|
#define __LEGOMAN_H_INCLUDED__
|
||||||
|
|
||||||
|
class BodyPart;
|
||||||
|
class Sensor;
|
||||||
|
class Legoman;
|
||||||
|
class DamageVisual;
|
||||||
|
|
||||||
|
#include "object.h"
|
||||||
|
#include "world.h"
|
||||||
|
|
||||||
|
#define LEGHEIGHT 4
|
||||||
|
#define WAISTHEIGHT 1
|
||||||
|
#define TORSOHEIGHT 4
|
||||||
|
#define HANDHEIGHT 6
|
||||||
|
#define HEADHEIGHT 3
|
||||||
|
|
||||||
|
#define PLAYER1 1
|
||||||
|
#define PLAYER2 2
|
||||||
|
|
||||||
|
#define LEFTLEG 1
|
||||||
|
#define RIGHTLEG 2
|
||||||
|
#define LEFTHAND 4
|
||||||
|
#define RIGHTHAND 8
|
||||||
|
|
||||||
|
|
||||||
|
const char LEFTLEGASC[] = DATAPATH"blockolegscaled.asc";
|
||||||
|
const char RIGHTLEGASC[] = DATAPATH"blockolegscaled.asc";
|
||||||
|
const char WAISTASC[] = DATAPATH"blockowaistscaled.asc";
|
||||||
|
const char TORSOASC[] = DATAPATH"blockotorsoscaled.asc";
|
||||||
|
const char LEFTARMASC[] = DATAPATH"leftarm.asc";
|
||||||
|
const char RIGHTARMASC[] = DATAPATH"rightarm.asc";
|
||||||
|
const char LEFTPALMASC[] = DATAPATH"leftpalm.asc";
|
||||||
|
const char RIGHTPALMASC[] = DATAPATH"rightpalm.asc";
|
||||||
|
|
||||||
|
|
||||||
|
#define MODELSCALE 0.12
|
||||||
|
#define TORSOSCALE 0.115
|
||||||
|
|
||||||
|
|
||||||
|
class BodyPart : public Object{
|
||||||
|
private:
|
||||||
|
float energy;
|
||||||
|
float strength;
|
||||||
|
Legoman *parent;
|
||||||
|
|
||||||
|
bool attached;
|
||||||
|
|
||||||
|
int immortal;
|
||||||
|
|
||||||
|
public:
|
||||||
|
BodyPart(Legoman *parent, float strength);
|
||||||
|
|
||||||
|
void move(void);
|
||||||
|
|
||||||
|
void hitForce(float speed, float *speed2, Object *source);
|
||||||
|
|
||||||
|
void makeDamage(float amount);
|
||||||
|
|
||||||
|
void reset(void);
|
||||||
|
|
||||||
|
friend class DamageVisual;
|
||||||
|
friend class Legoman;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Sensor{
|
||||||
|
private:
|
||||||
|
float relativeposition[3];
|
||||||
|
Object *object;
|
||||||
|
|
||||||
|
float position[3], oldposition[3];
|
||||||
|
float velocity[3], oldvelocity[3];
|
||||||
|
float acceleration[3];
|
||||||
|
|
||||||
|
public:
|
||||||
|
Sensor();
|
||||||
|
|
||||||
|
void attach(Object *object, float *relativeposition);
|
||||||
|
void attach(Object *object);
|
||||||
|
void update(void);
|
||||||
|
|
||||||
|
void getPosition(float *target);
|
||||||
|
void getVelocity(float *target);
|
||||||
|
void getAcceleration(float *target);
|
||||||
|
};
|
||||||
|
|
||||||
|
class Legoman{
|
||||||
|
private:
|
||||||
|
int side;
|
||||||
|
|
||||||
|
bool alive;
|
||||||
|
|
||||||
|
BodyPart *head;
|
||||||
|
BodyPart *torso;
|
||||||
|
BodyPart *waist;
|
||||||
|
BodyPart *lefthand, *righthand;
|
||||||
|
BodyPart *leftleg, *rightleg;
|
||||||
|
|
||||||
|
DamageVisual *headvisual;
|
||||||
|
DamageVisual *torsovisual;
|
||||||
|
DamageVisual *lefthandvisual, *righthandvisual;
|
||||||
|
DamageVisual *leftlegvisual, *rightlegvisual;
|
||||||
|
|
||||||
|
ObjectLink *leftleglink, *rightleglink;
|
||||||
|
ObjectLink *lefthandlink, *righthandlink;
|
||||||
|
ObjectLink *lll, *rll;
|
||||||
|
|
||||||
|
ObjectLink *leftleglinks[3], *rightleglinks[3];
|
||||||
|
ObjectLink *lefthandlinks[3], *righthandlinks[3];
|
||||||
|
ObjectLink *headlinks[3];
|
||||||
|
|
||||||
|
objectlist *harmfulobjects;
|
||||||
|
|
||||||
|
Legoman *opponent;
|
||||||
|
|
||||||
|
Sensor *headsensor, *torsosensor;
|
||||||
|
|
||||||
|
int walkphase, walkdelay;
|
||||||
|
int jumpphase;
|
||||||
|
int hitside;
|
||||||
|
|
||||||
|
bool jumpenabled;
|
||||||
|
int hitcounter;
|
||||||
|
|
||||||
|
World *world;
|
||||||
|
|
||||||
|
void balance(void);
|
||||||
|
void updateLegs(void);
|
||||||
|
bool isStanding(void);
|
||||||
|
bool isOnGround(void);
|
||||||
|
float getInvMass(void);
|
||||||
|
|
||||||
|
void fallOff(void);
|
||||||
|
void releasePart(BodyPart *part);
|
||||||
|
void die(void);
|
||||||
|
|
||||||
|
public:
|
||||||
|
Legoman(int side);
|
||||||
|
|
||||||
|
void insertToWorld(World *world);
|
||||||
|
void heal(void);
|
||||||
|
|
||||||
|
void addHarmfulObject(Object *object);
|
||||||
|
bool isHarmfulObject(Object *object);
|
||||||
|
|
||||||
|
void addOpponent(Legoman *opponent);
|
||||||
|
|
||||||
|
//Call once per frame
|
||||||
|
void update(void);
|
||||||
|
|
||||||
|
//Lock both legs at the same time by calling
|
||||||
|
//lockLeg(LEFTLEG | RIGHTLEG);
|
||||||
|
void lockPart(int part);
|
||||||
|
void unlockPart(int part);
|
||||||
|
|
||||||
|
//Relative movement
|
||||||
|
void move(float *movement);
|
||||||
|
|
||||||
|
void turn(float amount);
|
||||||
|
void walk(float amount);
|
||||||
|
|
||||||
|
void jump(void);
|
||||||
|
void hit(void);
|
||||||
|
|
||||||
|
bool isAlive(void);
|
||||||
|
Legoman *getOpponent(void);
|
||||||
|
|
||||||
|
void drawVisuals();
|
||||||
|
|
||||||
|
friend class BodyPart;
|
||||||
|
friend void drawEnd(int framecount);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern Texture *damageHead;
|
||||||
|
extern Texture *damageTorso;
|
||||||
|
extern Texture *damageHand;
|
||||||
|
extern Texture *damageLeg;
|
||||||
|
|
||||||
|
|
||||||
|
class DamageVisual{
|
||||||
|
private:
|
||||||
|
BodyPart *object;
|
||||||
|
float x1, y1, x2, y2;
|
||||||
|
float tx1, ty1, tx2, ty2;
|
||||||
|
Texture *texture;
|
||||||
|
|
||||||
|
public:
|
||||||
|
DamageVisual(BodyPart *object, Texture *texture, bool mirror,
|
||||||
|
float x1, float y1, float x2, float y2);
|
||||||
|
|
||||||
|
void draw(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
218
src/light.cpp
Normal file
|
@ -0,0 +1,218 @@
|
||||||
|
/*
|
||||||
|
* $Id: light.cpp,v 1.5 2002/07/15 20:32:35 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: light.cpp,v $
|
||||||
|
* Revision 1.5 2002/07/15 20:32:35 msell
|
||||||
|
* Uudet valot ja ulkoasun parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/17 20:49:05 msell
|
||||||
|
* free -> SDL_FreeSurface
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/16 01:04:58 jkaarlas
|
||||||
|
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/03 23:20:43 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/05/18 12:29:35 msell
|
||||||
|
* Valot ja äänijärjestelmän parantelua
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/15 20:32:35 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#include "light.h"
|
||||||
|
#include "camera.h"
|
||||||
|
#include "vector.h"
|
||||||
|
#include "glapi.h"
|
||||||
|
|
||||||
|
static int glnextlightnum = 0;
|
||||||
|
|
||||||
|
static Light *lights[GL_MAX_LIGHTS];
|
||||||
|
|
||||||
|
Light::Light(void){
|
||||||
|
setPosition(0, 0, 0);
|
||||||
|
setColor(1, 1, 1);
|
||||||
|
setSpecular(0, 0, 0);
|
||||||
|
setAttenuation(1, 0, 0);
|
||||||
|
setEnabled(false);
|
||||||
|
glnum = GL_LIGHT0 + glnextlightnum;
|
||||||
|
lights[glnextlightnum] = this;
|
||||||
|
glnextlightnum++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Light::setPosition(float x, float y, float z){
|
||||||
|
position[0] = x;
|
||||||
|
position[1] = y;
|
||||||
|
position[2] = z;
|
||||||
|
position[3] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Light::setDirection(float x, float y, float z){
|
||||||
|
position[0] = -x;
|
||||||
|
position[1] = -y;
|
||||||
|
position[2] = -z;
|
||||||
|
position[3] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Light::setColor(float red, float green, float blue){
|
||||||
|
diffuse[0] = red;
|
||||||
|
diffuse[1] = green;
|
||||||
|
diffuse[2] = blue;
|
||||||
|
diffuse[3] = 1;
|
||||||
|
glLightfv(glnum, GL_DIFFUSE, diffuse);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Light::setSpecular(float red, float green, float blue){
|
||||||
|
specular[0] = red;
|
||||||
|
specular[1] = green;
|
||||||
|
specular[2] = blue;
|
||||||
|
specular[3] = 1;
|
||||||
|
glLightfv(glnum, GL_SPECULAR, specular);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Light::setAttenuation(float constant, float linear, float quadratic){
|
||||||
|
attenuation[0] = constant;
|
||||||
|
attenuation[1] = linear;
|
||||||
|
attenuation[2] = quadratic;
|
||||||
|
glLightf(glnum, GL_CONSTANT_ATTENUATION, attenuation[0]);
|
||||||
|
glLightf(glnum, GL_LINEAR_ATTENUATION, attenuation[1]);
|
||||||
|
glLightf(glnum, GL_QUADRATIC_ATTENUATION, attenuation[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Light::setEnabled(bool enabled){
|
||||||
|
this->enabled = enabled;
|
||||||
|
if (enabled) glEnable(glnum);
|
||||||
|
else glDisable(glnum);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Light::glUpdate(void){
|
||||||
|
glLightfv(glnum, GL_POSITION, position);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern Camera camera;
|
||||||
|
|
||||||
|
|
||||||
|
void Light::createFlare(void){
|
||||||
|
glPushMatrix();
|
||||||
|
|
||||||
|
GLint viewport[4];
|
||||||
|
glGetIntegerv(GL_VIEWPORT, viewport);
|
||||||
|
|
||||||
|
int width = viewport[2];
|
||||||
|
int height = viewport[3];
|
||||||
|
|
||||||
|
glTranslatef(position[0], position[1], position[2]);
|
||||||
|
|
||||||
|
GLboolean lightingenabled = glIsEnabled(GL_LIGHTING);
|
||||||
|
glDisable(GL_LIGHTING);
|
||||||
|
|
||||||
|
/*float cx=cameratarget.x-cameraposition.x;
|
||||||
|
float cy=cameratarget.y-cameraposition.y;
|
||||||
|
float cz=cameratarget.z-cameraposition.z;
|
||||||
|
float len=sqrt(cx*cx+cy*cy+cz*cz);
|
||||||
|
cx/=len;
|
||||||
|
cy/=len;
|
||||||
|
cz/=len;*/
|
||||||
|
float dir[3];
|
||||||
|
float cameratarget[3], cameraposition[3];
|
||||||
|
camera.getTarget(cameratarget);
|
||||||
|
camera.getPosition(cameraposition);
|
||||||
|
vectorSub(dir, cameratarget, cameraposition);
|
||||||
|
vectorNormalize(dir);
|
||||||
|
|
||||||
|
float dir2[3];
|
||||||
|
vectorSub(dir2, position, cameraposition);
|
||||||
|
float distance = vectorDot(dir2, dir);
|
||||||
|
|
||||||
|
/*float xd=(staticlightpositions[lightnumber].x-cameraposition.x)*cx;
|
||||||
|
float yd=(staticlightpositions[lightnumber].y-cameraposition.y)*cy;
|
||||||
|
float zd=(staticlightpositions[lightnumber].z-cameraposition.z)*cz;
|
||||||
|
float distance=xd+yd+zd;*/
|
||||||
|
|
||||||
|
|
||||||
|
float screencoords[3];
|
||||||
|
/*GLint viewport[4];
|
||||||
|
glGetIntegerv(GL_VIEWPORT, viewport);
|
||||||
|
|
||||||
|
int width=viewport[2];
|
||||||
|
int height=viewport[3];*/
|
||||||
|
|
||||||
|
GLdouble modelviewm[16], projectionm[16];
|
||||||
|
glGetDoublev(GL_MODELVIEW_MATRIX, modelviewm);
|
||||||
|
glGetDoublev(GL_PROJECTION_MATRIX, projectionm);
|
||||||
|
|
||||||
|
GLdouble wx,wy,wz;
|
||||||
|
if (gluProject(0, 0, 0, modelviewm, projectionm, viewport, &wx, &wy, &wz) == GL_FALSE){
|
||||||
|
printf("Failure\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
screencoords[0] = (float)(2*wx-width)/width;
|
||||||
|
screencoords[1] = (float)(2*wy-height)/height;
|
||||||
|
screencoords[2] = wz;
|
||||||
|
|
||||||
|
|
||||||
|
//getPointCoordinates(screencoords);
|
||||||
|
//point3d screencoords = getPointCoordinates(0, 0, 0);
|
||||||
|
|
||||||
|
glLoadIdentity();
|
||||||
|
glTranslatef(screencoords[0], screencoords[1], 0);
|
||||||
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
glEnable(GL_CULL_FACE);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
|
glBlendFunc(GL_ONE,GL_ONE);
|
||||||
|
//glEnable(GL_TEXTURE_2D);
|
||||||
|
//glBindTexture(GL_TEXTURE_2D, flaretexture->getId());
|
||||||
|
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glPushMatrix();
|
||||||
|
glLoadIdentity();
|
||||||
|
float sizey = 6.0/distance * 1.0;//staticlightflarebrightnesses[lightnumber];
|
||||||
|
float sizex = sizey * height/width;
|
||||||
|
|
||||||
|
if (distance>0.5){
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
//glColor3f(staticlightflarebrightnesses[lightnumber],staticlightflarebrightnesses[lightnumber],staticlightflarebrightnesses[lightnumber]);
|
||||||
|
glColor3fv(diffuse);
|
||||||
|
|
||||||
|
glTexCoord2f(0.0, 0.0);
|
||||||
|
glVertex2f(-sizex,sizey);
|
||||||
|
|
||||||
|
glTexCoord2f(0.0, 1.0);
|
||||||
|
glVertex2f(-sizex,-sizey);
|
||||||
|
|
||||||
|
glTexCoord2f(1.0, 1.0);
|
||||||
|
glVertex2f( sizex,-sizey);
|
||||||
|
|
||||||
|
glTexCoord2f(1.0, 0.0);
|
||||||
|
glVertex2f( sizex,sizey);
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
//glDisable(GL_TEXTURE_2D);
|
||||||
|
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
glLoadIdentity();
|
||||||
|
|
||||||
|
if (lightingenabled) glEnable(GL_LIGHTING);
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateLights(void){
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < glnextlightnum; i++){
|
||||||
|
Light *light = lights[i];
|
||||||
|
light->glUpdate();
|
||||||
|
}
|
||||||
|
}
|
56
src/light.h
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
* $Id: light.h,v 1.5 2002/07/19 20:33:28 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: light.h,v $
|
||||||
|
* Revision 1.5 2002/07/19 20:33:28 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/07/15 20:32:35 msell
|
||||||
|
* Uudet valot ja ulkoasun parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/04 16:28:32 msell
|
||||||
|
* #pragma once
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/03 23:20:43 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/05/18 12:29:35 msell
|
||||||
|
* Valot ja äänijärjestelmän parantelua
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 20:33:28 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LIGHT_H_INCLUDED__
|
||||||
|
#define __LIGHT_H_INCLUDED__
|
||||||
|
|
||||||
|
class Light{
|
||||||
|
private:
|
||||||
|
float position[4];
|
||||||
|
float diffuse[4];
|
||||||
|
float specular[4];
|
||||||
|
float attenuation[3];
|
||||||
|
bool enabled;
|
||||||
|
int glnum;
|
||||||
|
|
||||||
|
public:
|
||||||
|
//Creates DISABLED light
|
||||||
|
Light(void);
|
||||||
|
|
||||||
|
void setPosition(float x, float y, float z);
|
||||||
|
void setDirection(float x, float y, float z);
|
||||||
|
void setColor(float red, float green, float blue);
|
||||||
|
void setSpecular(float red, float green, float blue);
|
||||||
|
void setAttenuation(float constant, float linear, float quadratic);
|
||||||
|
void setEnabled(bool enabled);
|
||||||
|
void glUpdate(void);
|
||||||
|
void createFlare(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
void updateLights(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
248
src/main.cpp
Normal file
|
@ -0,0 +1,248 @@
|
||||||
|
/*
|
||||||
|
* $Id: main.cpp,v 1.30 2002/07/21 15:03:12 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: main.cpp,v $
|
||||||
|
* Revision 1.30 2002/07/21 15:03:12 msell
|
||||||
|
* Äänet disabloitu
|
||||||
|
*
|
||||||
|
* Revision 1.29 2002/07/19 20:39:31 msell
|
||||||
|
* Linux-porttausta
|
||||||
|
*
|
||||||
|
* Revision 1.28 2002/07/19 20:33:28 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.27 2002/07/19 20:06:32 msell
|
||||||
|
* Linux-porttausta
|
||||||
|
*
|
||||||
|
* Revision 1.26 2002/07/19 18:59:46 msell
|
||||||
|
* Alkuhommaa ja säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.25 2002/07/19 12:42:44 msell
|
||||||
|
* Loading...
|
||||||
|
*
|
||||||
|
* Revision 1.24 2002/07/19 12:28:29 msell
|
||||||
|
* 2D-mode
|
||||||
|
*
|
||||||
|
* Revision 1.23 2002/07/18 23:05:31 msell
|
||||||
|
* Partikkelit ja kakkospelaajan liike
|
||||||
|
*
|
||||||
|
* Revision 1.22 2002/07/17 16:40:33 msell
|
||||||
|
* Resoluution vaihto
|
||||||
|
*
|
||||||
|
* Revision 1.21 2002/07/16 17:16:34 msell
|
||||||
|
* Fontit ja valikot
|
||||||
|
*
|
||||||
|
* Revision 1.20 2002/07/14 21:40:43 msell
|
||||||
|
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
|
||||||
|
*
|
||||||
|
* Revision 1.19 2002/07/14 21:22:39 jkaarlas
|
||||||
|
* skybox ja ukkojen säätö
|
||||||
|
*
|
||||||
|
* Revision 1.18 2002/07/11 18:33:30 jkaarlas
|
||||||
|
* turhat äänet pois
|
||||||
|
*
|
||||||
|
* Revision 1.17 2002/07/08 22:53:38 msell
|
||||||
|
* Säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.16 2002/07/04 21:05:41 msell
|
||||||
|
* Se toimii!! =)
|
||||||
|
* Törmäystarkistukset siis
|
||||||
|
*
|
||||||
|
* Revision 1.15 2002/06/20 22:50:12 msell
|
||||||
|
* Meshit
|
||||||
|
*
|
||||||
|
* Revision 1.14 2002/06/17 20:49:05 msell
|
||||||
|
* free -> SDL_FreeSurface
|
||||||
|
*
|
||||||
|
* Revision 1.13 2002/06/17 19:58:08 msell
|
||||||
|
* #includeiden parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.12 2002/06/16 01:04:58 jkaarlas
|
||||||
|
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
|
||||||
|
*
|
||||||
|
* Revision 1.11 2002/06/15 22:56:37 msell
|
||||||
|
* Säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/06/11 23:11:45 msell
|
||||||
|
* Törmäystarkistusta
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/06/07 21:16:51 msell
|
||||||
|
* Fysiikkaenginen alkua
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/06/02 16:57:37 msell
|
||||||
|
* Objektirakenteen pohja
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/05/19 13:40:19 msell
|
||||||
|
* Säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/05/18 12:29:35 msell
|
||||||
|
* Valot ja äänijärjestelmän parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/05/17 23:13:30 msell
|
||||||
|
* Valot
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/05/16 18:41:16 msell
|
||||||
|
* Vektorifunctioita ja kamera
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/05/15 21:07:23 msell
|
||||||
|
* Äänisäätöä
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/05/15 15:21:00 msell
|
||||||
|
* Äänisäätöä
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/05/15 14:36:39 msell
|
||||||
|
* Yksinkertainen SDL-runko (Kääntyy toistaiseksi vain windowsissa).
|
||||||
|
* Mukana myös musiikinsoitto fmodilla.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/21 15:03:12 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#include <SDL.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#ifdef WIN32
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "audio.h"
|
||||||
|
#include "run.h"
|
||||||
|
#include "texture.h"
|
||||||
|
#include "fight.h"
|
||||||
|
#include "font.h"
|
||||||
|
#include "3dutils.h"
|
||||||
|
|
||||||
|
#include "glapi.h"
|
||||||
|
|
||||||
|
int screenwidth=1024;
|
||||||
|
int screenheight=768;
|
||||||
|
int screenbpp;
|
||||||
|
|
||||||
|
void exitProgram(int code){
|
||||||
|
SDL_Quit();
|
||||||
|
//uninitAudio();
|
||||||
|
exit(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
void changeResolution(int width, int height, bool fullscreen){
|
||||||
|
int mode = SDL_OPENGL;
|
||||||
|
if (fullscreen) mode |= SDL_FULLSCREEN;
|
||||||
|
if (!SDL_SetVideoMode(width, height, screenbpp, mode)){
|
||||||
|
fprintf(stderr,"Couldn't set %i*%i*%i opengl video mode: %s\n",screenwidth,screenheight,screenbpp,SDL_GetError());
|
||||||
|
exitProgram(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
setupOpengl(width, height);
|
||||||
|
|
||||||
|
screenwidth = width;
|
||||||
|
screenheight = height;
|
||||||
|
|
||||||
|
if (fullscreen) SDL_ShowCursor(SDL_DISABLE);
|
||||||
|
else SDL_ShowCursor(SDL_ENABLE);
|
||||||
|
|
||||||
|
initScenes();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool keys[SDLK_LAST] = {false};
|
||||||
|
|
||||||
|
void handleKeydown(SDL_keysym *keysym){
|
||||||
|
keys[keysym->sym] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void handleKeyup(SDL_keysym *keysym){
|
||||||
|
keys[keysym->sym] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void processEvents(void){
|
||||||
|
SDL_Event event;
|
||||||
|
while (SDL_PollEvent(&event)){
|
||||||
|
switch (event.type){
|
||||||
|
case SDL_KEYDOWN:
|
||||||
|
handleKeydown(&event.key.keysym);
|
||||||
|
break;
|
||||||
|
case SDL_KEYUP:
|
||||||
|
handleKeyup(&event.key.keysym);
|
||||||
|
break;
|
||||||
|
case SDL_VIDEORESIZE:
|
||||||
|
screenwidth=event.resize.w;
|
||||||
|
screenheight=event.resize.h;
|
||||||
|
setupOpengl(screenwidth,screenheight);
|
||||||
|
break;
|
||||||
|
case SDL_QUIT:
|
||||||
|
exitProgram(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int getTime(void){
|
||||||
|
#ifdef WIN32
|
||||||
|
return timeGetTime();
|
||||||
|
#else
|
||||||
|
return SDL_GetTicks();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]){
|
||||||
|
//printf("Initializing SDL.\n");
|
||||||
|
|
||||||
|
if ((SDL_Init(SDL_INIT_VIDEO)==-1)){
|
||||||
|
printf("Could not initialize SDL: %s.\n",SDL_GetError());
|
||||||
|
exitProgram(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const SDL_VideoInfo *info=SDL_GetVideoInfo();
|
||||||
|
if (!info){
|
||||||
|
printf("Could not get video info with SDL: %s.\n",SDL_GetError());
|
||||||
|
exitProgram(-1);
|
||||||
|
}
|
||||||
|
screenbpp=info->vfmt->BitsPerPixel;
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
||||||
|
|
||||||
|
|
||||||
|
atexit(SDL_Quit);
|
||||||
|
|
||||||
|
SDL_WM_SetCaption("BlockoFighter 2",NULL);
|
||||||
|
|
||||||
|
initAudio();
|
||||||
|
|
||||||
|
changeResolution(screenwidth, screenheight, false);
|
||||||
|
|
||||||
|
//printf("SDL initialized.\n");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
double calculatefps = 200.0;
|
||||||
|
int framecounter, oldframecounter = 0;
|
||||||
|
int currenttime;
|
||||||
|
int framesdrawn=0;
|
||||||
|
int skipframes;
|
||||||
|
int starttime = getTime();
|
||||||
|
|
||||||
|
while (1){
|
||||||
|
do{
|
||||||
|
currenttime = getTime()-starttime;
|
||||||
|
framecounter = calculatefps*currenttime/1000.0;
|
||||||
|
} while (oldframecounter == framecounter);
|
||||||
|
skipframes = framecounter - oldframecounter;
|
||||||
|
for (; skipframes > 0; skipframes--){
|
||||||
|
calculateFrame(++oldframecounter);
|
||||||
|
}
|
||||||
|
//calculateFrame(oldframecounter++);
|
||||||
|
processEvents();
|
||||||
|
drawFrame(framecounter);
|
||||||
|
framesdrawn++;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
78
src/main.h
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
* $Id: main.h,v 1.13 2002/07/19 20:33:28 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: main.h,v $
|
||||||
|
* Revision 1.13 2002/07/19 20:33:28 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.12 2002/07/19 20:06:32 msell
|
||||||
|
* Linux-porttausta
|
||||||
|
*
|
||||||
|
* Revision 1.11 2002/07/17 16:40:33 msell
|
||||||
|
* Resoluution vaihto
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/07/16 17:16:34 msell
|
||||||
|
* Fontit ja valikot
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/07/14 21:40:43 msell
|
||||||
|
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/07/14 21:22:39 jkaarlas
|
||||||
|
* skybox ja ukkojen säätö
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/07/08 22:53:38 msell
|
||||||
|
* Säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/17 19:58:08 msell
|
||||||
|
* #includeiden parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/16 01:04:58 jkaarlas
|
||||||
|
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/04 16:28:32 msell
|
||||||
|
* #pragma once
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/05/17 12:30:26 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/05/16 18:41:16 msell
|
||||||
|
* Vektorifunctioita ja kamera
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/05/15 14:36:39 msell
|
||||||
|
* Yksinkertainen SDL-runko (Kääntyy toistaiseksi vain windowsissa).
|
||||||
|
* Mukana myös musiikinsoitto fmodilla.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 20:33:28 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __MAIN_H_INCLUDED__
|
||||||
|
#define __MAIN_H_INCLUDED__
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
#pragma warning(disable:4244) //Disable: conversion from 'double' to 'double', possible loss of data
|
||||||
|
#pragma warning(disable:4305) //Disable: truncation from 'const double' to 'double'
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <SDL.h>
|
||||||
|
|
||||||
|
#define DATAPATH "data/"
|
||||||
|
extern bool keys[SDLK_LAST];
|
||||||
|
|
||||||
|
void exitProgram(int code);
|
||||||
|
void changeResolution(int width, int height, bool fullscreen);
|
||||||
|
extern int screenwidth, screenheight;
|
||||||
|
|
||||||
|
extern int debugcounter;
|
||||||
|
#ifdef DEBUG
|
||||||
|
#define DP printf("%s: %i (Debug counter: %i)\n",__FILE__,__LINE__,debugcounter++);
|
||||||
|
#else
|
||||||
|
#define DP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
98
src/material.cpp
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
/*
|
||||||
|
* $Id: material.cpp,v 1.10 2002/07/19 20:40:44 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: material.cpp,v $
|
||||||
|
* Revision 1.10 2002/07/19 20:40:44 msell
|
||||||
|
* Linux-porttausta
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/07/10 22:22:04 jkaarlas
|
||||||
|
* getColor
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/06/27 21:43:29 jkaarlas
|
||||||
|
* lisätty setTexture-funktio
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/06/27 00:08:04 msell
|
||||||
|
* Kimmotukset palloille myös pyöritettyihin mesheihin
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/20 00:21:01 jkaarlas
|
||||||
|
* materiaali- ja tekstuurihommia edistetty
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/19 22:45:29 jkaarlas
|
||||||
|
* nyt nämä menee järkevästi
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/17 20:49:05 msell
|
||||||
|
* free -> SDL_FreeSurface
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/16 01:04:58 jkaarlas
|
||||||
|
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/03 23:06:38 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 20:40:44 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#include "material.h"
|
||||||
|
#include "glapi.h"
|
||||||
|
#include "graphics.h"
|
||||||
|
|
||||||
|
Material::Material(void){
|
||||||
|
setColor(1, 1, 1, 1);
|
||||||
|
this->texture = new Texture;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Material::loadTexture(char *path){
|
||||||
|
if (!this->texture){
|
||||||
|
this->texture = new Texture;
|
||||||
|
}
|
||||||
|
if (this->texture->loadImage(path)){
|
||||||
|
setColor(1, 1, 1, 1);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Material::freeTexture(void){
|
||||||
|
this->texture->~Texture();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Material::setColor(float red, float green, float blue, float alpha){
|
||||||
|
color[0] = red;
|
||||||
|
color[1] = green;
|
||||||
|
color[2] = blue;
|
||||||
|
color[3] = alpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
const float* Material::getColor(void){
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Material::enable(void){
|
||||||
|
enabled = true;
|
||||||
|
glColor4fv(color);
|
||||||
|
this->texture->enable();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Material::disable(void){
|
||||||
|
enabled = false;
|
||||||
|
this->texture->disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Material::isEnabled(void){
|
||||||
|
return enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
Texture* Material::getTexture(void){
|
||||||
|
return this->texture;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Material::setTexture(Texture* tex){
|
||||||
|
//this->texture->~Texture;
|
||||||
|
this->texture = tex;
|
||||||
|
}
|
61
src/material.h
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
/*
|
||||||
|
* $Id: material.h,v 1.8 2002/07/19 20:33:28 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: material.h,v $
|
||||||
|
* Revision 1.8 2002/07/19 20:33:28 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/07/10 22:22:04 jkaarlas
|
||||||
|
* getColor
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/27 21:43:29 jkaarlas
|
||||||
|
* lisätty setTexture-funktio
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/20 00:21:01 jkaarlas
|
||||||
|
* materiaali- ja tekstuurihommia edistetty
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/19 22:45:29 jkaarlas
|
||||||
|
* nyt nämä menee järkevästi
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/04 16:28:32 msell
|
||||||
|
* #pragma once
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/03 23:06:38 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 20:33:28 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __MATERIAL_H_INCLUDED__
|
||||||
|
#define __MATERIAL_H_INCLUDED__
|
||||||
|
|
||||||
|
#include <SDL_image.h>
|
||||||
|
#include "texture.h"
|
||||||
|
|
||||||
|
class Material{
|
||||||
|
private:
|
||||||
|
Texture* texture;
|
||||||
|
float color[4];
|
||||||
|
bool enabled;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Material(void);
|
||||||
|
bool loadTexture(char *path);
|
||||||
|
void freeTexture(void);
|
||||||
|
|
||||||
|
void setColor(float red, float green, float blue, float alpha);
|
||||||
|
const float* getColor(void);
|
||||||
|
void enable(void);
|
||||||
|
void disable(void);
|
||||||
|
bool isEnabled(void);
|
||||||
|
Texture* getTexture(void);
|
||||||
|
void setTexture(Texture* tex);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
900
src/menu.cpp
Normal file
|
@ -0,0 +1,900 @@
|
||||||
|
/*
|
||||||
|
* $Id: menu.cpp,v 1.14 2002/07/22 01:14:14 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: menu.cpp,v $
|
||||||
|
* Revision 1.14 2002/07/22 01:14:14 msell
|
||||||
|
* Lopetussysteemi
|
||||||
|
*
|
||||||
|
* Revision 1.13 2002/07/21 22:50:39 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.12 2002/07/21 20:14:28 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.11 2002/07/21 16:37:00 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/07/19 22:38:37 msell
|
||||||
|
* Pingviini
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/07/19 14:05:52 msell
|
||||||
|
* Damagetextuurit näkyy
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/07/19 12:28:29 msell
|
||||||
|
* 2D-mode
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/07/19 12:10:53 msell
|
||||||
|
* Hups
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/07/18 23:05:31 msell
|
||||||
|
* Partikkelit ja kakkospelaajan liike
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/07/17 22:45:54 msell
|
||||||
|
* Ääniä vähän
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/07/17 20:32:47 msell
|
||||||
|
* Detail-optio toimii
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/07/17 16:40:33 msell
|
||||||
|
* Resoluution vaihto
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/07/16 18:55:16 msell
|
||||||
|
* Äänet valikkoon
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/07/16 17:16:35 msell
|
||||||
|
* Fontit ja valikot
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/22 01:14:14 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "legoblocks.h"
|
||||||
|
#include "camera.h"
|
||||||
|
#include "light.h"
|
||||||
|
#include "audio.h"
|
||||||
|
#include "object.h"
|
||||||
|
#include "appearance.h"
|
||||||
|
#include "sphere.h"
|
||||||
|
#include "vector.h"
|
||||||
|
#include "collision.h"
|
||||||
|
#include "utils.h"
|
||||||
|
#include "graphics.h"
|
||||||
|
#include "objectfactory.h"
|
||||||
|
#include "world.h"
|
||||||
|
#include "3dutils.h"
|
||||||
|
#include "legoman.h"
|
||||||
|
#include "font.h"
|
||||||
|
#include "run.h"
|
||||||
|
#include "menu.h"
|
||||||
|
#include "fight.h"
|
||||||
|
|
||||||
|
#include "glapi.h"
|
||||||
|
|
||||||
|
Camera titlecamera;
|
||||||
|
Light titlelight;
|
||||||
|
World *titleworld;
|
||||||
|
|
||||||
|
Sound *changesound;
|
||||||
|
Sound *selectsound;
|
||||||
|
Sound *menumusic;
|
||||||
|
|
||||||
|
bool menuinitialized = false;
|
||||||
|
|
||||||
|
void initMenu(void){
|
||||||
|
if (!menuinitialized){
|
||||||
|
titleworld = new World();
|
||||||
|
}
|
||||||
|
|
||||||
|
titlelight.setColor(1, 1, 1);
|
||||||
|
titlelight.setSpecular(1, 1, 1);
|
||||||
|
titlelight.setPosition(-0.5, BLOCKHEIGHT*16, 0.5);
|
||||||
|
titlelight.setAttenuation(0.0, 0.0, 0.01);
|
||||||
|
|
||||||
|
if (!menuinitialized){
|
||||||
|
Object *lamp;
|
||||||
|
lamp = new Object();
|
||||||
|
lamp->appearance = new LampAppearance();
|
||||||
|
lamp->setPosition(-0.5, BLOCKHEIGHT*15.5, 0.5);
|
||||||
|
titleworld->addChild(lamp);
|
||||||
|
|
||||||
|
|
||||||
|
//Floor
|
||||||
|
BasicBlock *floorblock;
|
||||||
|
|
||||||
|
floorblock = new BasicBlock(33, 1, 5);
|
||||||
|
floorblock->setPosition(-0.5, -BLOCKHEIGHT/2.0 + BLOCKHEIGHT*(4*3+1), 0.5-5);
|
||||||
|
floorblock->setColor(0, 1, 0);
|
||||||
|
titleworld->addChild(floorblock);
|
||||||
|
|
||||||
|
floorblock = new BasicBlock(41, 1, 10);
|
||||||
|
floorblock->setPosition(8.5-5, -BLOCKHEIGHT/2.0, 0.5-2.5);
|
||||||
|
floorblock->setColor(0, 1, 0);
|
||||||
|
titleworld->addChild(floorblock);
|
||||||
|
|
||||||
|
floorblock = new BasicBlock(1, 4*3, 1);
|
||||||
|
floorblock->setPosition(-14.5, BLOCKHEIGHT*4*3/2.0, 0.5-5);
|
||||||
|
floorblock->setColor(1, 0, 0);
|
||||||
|
titleworld->addChild(floorblock);
|
||||||
|
|
||||||
|
floorblock = new BasicBlock(1, 4*3, 1);
|
||||||
|
floorblock->setPosition(13.5, BLOCKHEIGHT*4*3/2.0, 0.5-5);
|
||||||
|
floorblock->setColor(1, 0, 0);
|
||||||
|
titleworld->addChild(floorblock);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//Letters
|
||||||
|
|
||||||
|
//B
|
||||||
|
/*int Bsize = 8;
|
||||||
|
int Bwidth = 5;
|
||||||
|
int Bletter[8][4] = {
|
||||||
|
{0, 0, 4, 1},
|
||||||
|
{0, 4, 3, 1},
|
||||||
|
{0, 8, 4, 1},
|
||||||
|
{0, 1, 1, 7},
|
||||||
|
//{3, 1, 2, 1},
|
||||||
|
{2, 3, 3, 1},
|
||||||
|
{2, 5, 3, 1},
|
||||||
|
//{3, 7, 2, 1},
|
||||||
|
{4, 0, 1, 3},
|
||||||
|
{4, 6, 1, 3}};*/
|
||||||
|
int Bsize = 10;
|
||||||
|
int Bwidth = 5;
|
||||||
|
int Bletter[10][4] = {
|
||||||
|
{0, 0, 4, 1},
|
||||||
|
{0, 4, 4, 1},
|
||||||
|
{0, 8, 4, 1},
|
||||||
|
{0, 1, 1, 7},
|
||||||
|
{3, 1, 2, 1},
|
||||||
|
{3, 3, 2, 1},
|
||||||
|
{3, 5, 2, 1},
|
||||||
|
{3, 7, 2, 1},
|
||||||
|
{4, 2, 1, 1},
|
||||||
|
{4, 6, 1, 1}};
|
||||||
|
|
||||||
|
//l
|
||||||
|
int lsize = 2;
|
||||||
|
int lwidth = 4;
|
||||||
|
int lletter[2][4] = {
|
||||||
|
{0, 0, 4, 1},
|
||||||
|
{0, 1, 1, 4}};
|
||||||
|
|
||||||
|
//o
|
||||||
|
int osize = 4;
|
||||||
|
int owidth = 4;
|
||||||
|
int oletter[4][4] = {
|
||||||
|
{0, 0, 4, 1},
|
||||||
|
{0, 4, 4, 1},
|
||||||
|
{0, 1, 1, 3},
|
||||||
|
{3, 1, 1, 3}};
|
||||||
|
|
||||||
|
//c
|
||||||
|
int csize = 5;
|
||||||
|
int cwidth = 4;
|
||||||
|
int cletter[5][4] = {
|
||||||
|
{0, 0, 4, 1},
|
||||||
|
{0, 4, 4, 1},
|
||||||
|
{0, 1, 1, 3},
|
||||||
|
{3, 1, 1, 1},
|
||||||
|
{3, 3, 1, 1}};
|
||||||
|
/* {1, 0, 2, 1},
|
||||||
|
{1, 4, 2, 1},
|
||||||
|
{0, 1, 1, 3},
|
||||||
|
{3, 1, 1, 1},
|
||||||
|
{3, 3, 1, 1}};*/
|
||||||
|
|
||||||
|
//k
|
||||||
|
int ksize = 6;
|
||||||
|
int kwidth = 4;
|
||||||
|
int kletter[6][4] = {
|
||||||
|
{0, 0, 1, 5},
|
||||||
|
{1, 2, 2, 1},
|
||||||
|
{2, 1, 2, 1},
|
||||||
|
{2, 3, 2, 1},
|
||||||
|
{3, 0, 1, 1},
|
||||||
|
{3, 4, 1, 1}};
|
||||||
|
/* {0, 0, 1, 5},
|
||||||
|
{1, 2, 1, 1},
|
||||||
|
{2, 1, 1, 1},
|
||||||
|
{2, 3, 1, 1},
|
||||||
|
{3, 0, 1, 1},
|
||||||
|
{3, 4, 1, 1}};*/
|
||||||
|
|
||||||
|
//F
|
||||||
|
int Fsize = 3;
|
||||||
|
int Fwidth = 3;
|
||||||
|
int Fletter[3][4] = {
|
||||||
|
{0, 0, 1, 7},
|
||||||
|
{0, 4, 3, 1},
|
||||||
|
{0, 7, 6, 1}};
|
||||||
|
|
||||||
|
//i
|
||||||
|
int isize = 1;
|
||||||
|
int iwidth = 1;
|
||||||
|
int iletter[1][4] = {
|
||||||
|
{0, 0, 1, 4}};
|
||||||
|
|
||||||
|
//g
|
||||||
|
int gsize = 5;
|
||||||
|
int gwidth = 4;
|
||||||
|
int gletter[5][4] = {
|
||||||
|
{0, 0, 4, 1},
|
||||||
|
{0, 4, 4, 1},
|
||||||
|
{0, 1, 1, 3},
|
||||||
|
{3, 1, 1, 1},
|
||||||
|
{2, 2, 2, 1}};
|
||||||
|
|
||||||
|
//h
|
||||||
|
int hsize = 3;
|
||||||
|
int hwidth = 1;
|
||||||
|
int hletter[3][4] = {
|
||||||
|
{0, 0, 1, 5},
|
||||||
|
{3, 0, 1, 5},
|
||||||
|
{0, 2, 4, 1}};
|
||||||
|
|
||||||
|
//t
|
||||||
|
int tsize = 2;
|
||||||
|
int twidth = 4;
|
||||||
|
int tletter[2][4] = {
|
||||||
|
{3, 0, 1, 6},
|
||||||
|
{0, 6, 7, 1}};
|
||||||
|
|
||||||
|
//e
|
||||||
|
int esize = 5;
|
||||||
|
int ewidth = 4;
|
||||||
|
int eletter[5][4] = {
|
||||||
|
{0, 0, 4, 1},
|
||||||
|
{0, 4, 4, 1},
|
||||||
|
{0, 2, 3, 1},
|
||||||
|
{0, 1, 1, 1},
|
||||||
|
{0, 3, 1, 1}};
|
||||||
|
|
||||||
|
//r
|
||||||
|
int rsize = 6;
|
||||||
|
int rwidth = 4;
|
||||||
|
int rletter[6][4] = {
|
||||||
|
{0, 0, 1, 5},
|
||||||
|
{0, 2, 3, 1},
|
||||||
|
{0, 4, 3, 1},
|
||||||
|
{2, 1, 2, 1},
|
||||||
|
{3, 0, 1, 1},
|
||||||
|
{2, 3, 2, 1}};
|
||||||
|
/*int rsize = 5;
|
||||||
|
int rwidth = 4;
|
||||||
|
int rletter[5][4] = {
|
||||||
|
{0, 0, 1, 5},
|
||||||
|
{0, 2, 3, 1},
|
||||||
|
{0, 4, 3, 1},
|
||||||
|
{3, 0, 1, 2},
|
||||||
|
{3, 3, 1, 1}};*/
|
||||||
|
|
||||||
|
#define LETTERCOUNT 6
|
||||||
|
int lettersizes[LETTERCOUNT] = {
|
||||||
|
Bsize,
|
||||||
|
lsize,
|
||||||
|
osize,
|
||||||
|
csize,
|
||||||
|
ksize,
|
||||||
|
osize
|
||||||
|
};
|
||||||
|
int letterwidths[LETTERCOUNT] = {
|
||||||
|
Bwidth,
|
||||||
|
lwidth,
|
||||||
|
owidth,
|
||||||
|
cwidth,
|
||||||
|
kwidth,
|
||||||
|
owidth
|
||||||
|
};
|
||||||
|
int *letters[LETTERCOUNT] = {
|
||||||
|
&Bletter[0][0],
|
||||||
|
&lletter[0][0],
|
||||||
|
&oletter[0][0],
|
||||||
|
&cletter[0][0],
|
||||||
|
&kletter[0][0],
|
||||||
|
&oletter[0][0]
|
||||||
|
};
|
||||||
|
|
||||||
|
#define LETTERCOUNT2 7
|
||||||
|
int lettersizes2[LETTERCOUNT2] = {
|
||||||
|
Fsize,
|
||||||
|
isize,
|
||||||
|
gsize,
|
||||||
|
hsize,
|
||||||
|
tsize,
|
||||||
|
esize,
|
||||||
|
rsize
|
||||||
|
};
|
||||||
|
int letterwidths2[LETTERCOUNT2] = {
|
||||||
|
Fwidth,
|
||||||
|
iwidth,
|
||||||
|
gwidth,
|
||||||
|
hwidth,
|
||||||
|
twidth,
|
||||||
|
ewidth,
|
||||||
|
rwidth
|
||||||
|
};
|
||||||
|
int *letters2[LETTERCOUNT2] = {
|
||||||
|
&Fletter[0][0],
|
||||||
|
&iletter[0][0],
|
||||||
|
&gletter[0][0],
|
||||||
|
&hletter[0][0],
|
||||||
|
&tletter[0][0],
|
||||||
|
&eletter[0][0],
|
||||||
|
&rletter[0][0]
|
||||||
|
};
|
||||||
|
BasicBlock *letterblock;
|
||||||
|
|
||||||
|
float z = 0.5;
|
||||||
|
int i, j;
|
||||||
|
int dx = -15;
|
||||||
|
int dy = BLOCKHEIGHT*(4*3+1);
|
||||||
|
int dz = -5;
|
||||||
|
for (i = 0; i < LETTERCOUNT; i++){
|
||||||
|
int size = lettersizes[i];
|
||||||
|
int width = letterwidths[i];
|
||||||
|
for (j = 0; j < size; j++){
|
||||||
|
int x = letters[i][j*4+0];
|
||||||
|
int y = letters[i][j*4+1]*3;
|
||||||
|
int w = letters[i][j*4+2];
|
||||||
|
int h = letters[i][j*4+3]*3;
|
||||||
|
letterblock = new BasicBlock(w, h, 1);
|
||||||
|
letterblock->setPosition(dx+x+w/2.0, dy+BLOCKHEIGHT*(y+h/2.0), dz+z + randomf(0.1));
|
||||||
|
letterblock->setColor(1, 0.5, 1);
|
||||||
|
titleworld->addChild(letterblock);
|
||||||
|
}
|
||||||
|
dx += width + 1;
|
||||||
|
}
|
||||||
|
dx = -5;
|
||||||
|
dy = 0;
|
||||||
|
dz = 0;
|
||||||
|
for (i = 0; i < LETTERCOUNT2; i++){
|
||||||
|
int size = lettersizes2[i];
|
||||||
|
int width = letterwidths2[i];
|
||||||
|
for (j = 0; j < size; j++){
|
||||||
|
int x = letters2[i][j*4+0];
|
||||||
|
int y = letters2[i][j*4+1]*3;
|
||||||
|
int w = letters2[i][j*4+2];
|
||||||
|
int h = letters2[i][j*4+3]*3;
|
||||||
|
letterblock = new BasicBlock(w, h, 1);
|
||||||
|
letterblock->setPosition(dx+x+w/2.0, dy+BLOCKHEIGHT*(y+h/2.0), dz+z + randomf(0.1));
|
||||||
|
//float rotate[3] = {0, randomf(0.1), 0};
|
||||||
|
//matrixCreateRotation(letterblock->rotation, rotate);
|
||||||
|
letterblock->setColor(1, 0.5, 1);
|
||||||
|
titleworld->addChild(letterblock);
|
||||||
|
}
|
||||||
|
dx += width + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Object *flower;
|
||||||
|
|
||||||
|
flower = new Object();
|
||||||
|
flower->appearance = new FlowerAppearance(FLOWER_RED, FLOWER_WHITE, FLOWER_YELLOW);
|
||||||
|
flower->setPosition(-7.5, 0, 1.5);
|
||||||
|
titleworld->addChild(flower);
|
||||||
|
|
||||||
|
flower = new Object();
|
||||||
|
flower->appearance = new FlowerAppearance(FLOWER_YELLOW, FLOWER_RED, FLOWER_YELLOW);
|
||||||
|
flower->setPosition(-11.5, 0, -2.5);
|
||||||
|
titleworld->addChild(flower);
|
||||||
|
|
||||||
|
flower = new Object();
|
||||||
|
flower->appearance = new FlowerAppearance(FLOWER_WHITE, FLOWER_WHITE, FLOWER_RED);
|
||||||
|
flower->setPosition(-14.5, 0, 0.5);
|
||||||
|
titleworld->addChild(flower);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
changesound = new Sound(DATAPATH"menuchange.wav");
|
||||||
|
selectsound = new Sound(DATAPATH"menuselect.wav");
|
||||||
|
menumusic = new Sound(DATAPATH"menu.mp3", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
titleworld->prepare();
|
||||||
|
|
||||||
|
menuinitialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MODEMAIN 0
|
||||||
|
#define MODEOPTIONS 1
|
||||||
|
|
||||||
|
#define MAINSTART 0
|
||||||
|
#define MAINOPTIONS 1
|
||||||
|
#define MAINQUIT 2
|
||||||
|
|
||||||
|
#define OPTIONSRESOLUTION 0
|
||||||
|
#define OPTIONSFULLSCREEN 1
|
||||||
|
#define OPTIONSDETAIL 2
|
||||||
|
#define OPTIONSRETURN 3
|
||||||
|
|
||||||
|
int menuoption = MAINSTART;
|
||||||
|
int maxoption;
|
||||||
|
int menumode = MODEMAIN;
|
||||||
|
bool pressed = false;
|
||||||
|
|
||||||
|
float obx1, oby1, obx2, oby2;
|
||||||
|
float bx1, by1, bx2, by2;
|
||||||
|
float interpolator = 1.0;
|
||||||
|
|
||||||
|
int xres, yres;
|
||||||
|
int oldresolution;
|
||||||
|
int resolution = 2;
|
||||||
|
bool fullscreen = false;
|
||||||
|
int olddetail;
|
||||||
|
int detail = 2;
|
||||||
|
|
||||||
|
#define RESOLUTIONCOUNT 6
|
||||||
|
int resolutions[RESOLUTIONCOUNT][2] = {
|
||||||
|
{640, 480},
|
||||||
|
{800, 600},
|
||||||
|
{1024, 768},
|
||||||
|
{1280, 960},
|
||||||
|
{1280, 1024},
|
||||||
|
{1600, 1200}
|
||||||
|
};
|
||||||
|
|
||||||
|
#define DETAILCOUNT 4
|
||||||
|
char *details[DETAILCOUNT] = {"Off", "Low", "Medium", "High"};
|
||||||
|
|
||||||
|
int menurestartcounter = -1;
|
||||||
|
|
||||||
|
void menuRestart(void){
|
||||||
|
menurestartcounter = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void menuMain(void){
|
||||||
|
interpolator = 0.0;
|
||||||
|
menumode = MODEMAIN;
|
||||||
|
menuoption = MAINOPTIONS;
|
||||||
|
obx1 = bx1;
|
||||||
|
oby1 = by1;
|
||||||
|
obx2 = bx2;
|
||||||
|
oby2 = by2;
|
||||||
|
}
|
||||||
|
|
||||||
|
float menufade;
|
||||||
|
|
||||||
|
int gamestart = 0;
|
||||||
|
|
||||||
|
bool loading = true;
|
||||||
|
|
||||||
|
void menuStartGame(void){
|
||||||
|
menumusic->fadeOut(300);
|
||||||
|
gamestart = 200;
|
||||||
|
menurestartcounter = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void menuStartGame2(void){
|
||||||
|
titlelight.setEnabled(false);
|
||||||
|
changeGameMode(FIGHTMODE);
|
||||||
|
startFight();
|
||||||
|
menurestartcounter = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void menuOptions(void){
|
||||||
|
interpolator = 0.0;
|
||||||
|
menumode = MODEOPTIONS;
|
||||||
|
menuoption = OPTIONSRESOLUTION;
|
||||||
|
obx1 = bx1;
|
||||||
|
oby1 = by1;
|
||||||
|
obx2 = bx2;
|
||||||
|
oby2 = by2;
|
||||||
|
oldresolution = resolution;
|
||||||
|
olddetail = detail;
|
||||||
|
}
|
||||||
|
|
||||||
|
int quitcounter = -1;
|
||||||
|
|
||||||
|
void menuEscPressed(void){
|
||||||
|
menurestartcounter = -1;
|
||||||
|
//menumusic->stop();
|
||||||
|
menumusic->fadeOut(200);
|
||||||
|
quitcounter = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void menuQuit(void){
|
||||||
|
exitProgram(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void menuResolution(int dir){
|
||||||
|
resolution += dir;
|
||||||
|
if (resolution < 0) resolution = 0;
|
||||||
|
if (resolution >= RESOLUTIONCOUNT) resolution = RESOLUTIONCOUNT-1;
|
||||||
|
//resolution = (resolution + RESOLUTIONCOUNT) % RESOLUTIONCOUNT;
|
||||||
|
}
|
||||||
|
|
||||||
|
void calculateMenu(int framecount){
|
||||||
|
if (framecount == 1){
|
||||||
|
menumusic->setVolume(0);
|
||||||
|
menumusic->play();
|
||||||
|
menumusic->fadeIn(300);
|
||||||
|
}
|
||||||
|
if (menurestartcounter != -1){
|
||||||
|
menurestartcounter++;
|
||||||
|
if (menurestartcounter == 300){
|
||||||
|
menumusic->play();
|
||||||
|
menumusic->fadeIn(100);
|
||||||
|
menurestartcounter = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
menufade = -1;
|
||||||
|
|
||||||
|
titlelight.setEnabled(true);
|
||||||
|
|
||||||
|
if (framecount < 200){
|
||||||
|
menufade = 1-framecount/200.0;
|
||||||
|
} else{
|
||||||
|
loading = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gamestart > 0){
|
||||||
|
gamestart--;
|
||||||
|
if (gamestart == 0){
|
||||||
|
menuStartGame2();
|
||||||
|
}
|
||||||
|
menufade = (200-gamestart)/200.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (quitcounter != -1){
|
||||||
|
menufade = quitcounter/200.0;
|
||||||
|
quitcounter++;
|
||||||
|
if (quitcounter == 200) menuQuit();
|
||||||
|
}
|
||||||
|
|
||||||
|
float cameratarget[3] = {0, 0, 0};
|
||||||
|
titlecamera.setPosition(sin(framecount*0.001)*2-8, sin(framecount*0.0033)*2+15, cos(framecount*0.001)*2+25);
|
||||||
|
titlecamera.setTarget(cameratarget);
|
||||||
|
|
||||||
|
titleworld->move();
|
||||||
|
|
||||||
|
xres = resolutions[resolution][0];
|
||||||
|
yres = resolutions[resolution][1];
|
||||||
|
|
||||||
|
switch(menumode){
|
||||||
|
case MODEMAIN:
|
||||||
|
maxoption = 2;
|
||||||
|
|
||||||
|
bx1 = 0.03;
|
||||||
|
by1 = 0.49;
|
||||||
|
bx2 = 0.68;
|
||||||
|
by2 = 0.96;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case MODEOPTIONS:
|
||||||
|
maxoption = 3;
|
||||||
|
|
||||||
|
bx1 = 0.1;
|
||||||
|
by1 = 0.3;
|
||||||
|
bx2 = 0.9;
|
||||||
|
by2 = 0.8;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (interpolator < 1.0){
|
||||||
|
interpolator += 0.02;
|
||||||
|
} else{
|
||||||
|
interpolator = 1.0;
|
||||||
|
if (menufade == -1){
|
||||||
|
if (keys[SDLK_DOWN]){
|
||||||
|
if (!pressed){
|
||||||
|
/*if (menuoption < maxoption){
|
||||||
|
menuoption++;
|
||||||
|
changesound->play();
|
||||||
|
}*/
|
||||||
|
menuoption = (menuoption + 1)%(maxoption+1);
|
||||||
|
changesound->play();
|
||||||
|
pressed = true;
|
||||||
|
}
|
||||||
|
} else if (keys[SDLK_UP]){
|
||||||
|
if (!pressed){
|
||||||
|
/*if (menuoption > 0){
|
||||||
|
menuoption--;
|
||||||
|
changesound->play();
|
||||||
|
}*/
|
||||||
|
menuoption = (menuoption + maxoption)%(maxoption+1);
|
||||||
|
changesound->play();
|
||||||
|
pressed = true;
|
||||||
|
}
|
||||||
|
} else if (keys[SDLK_LEFT]){
|
||||||
|
if (!pressed){
|
||||||
|
switch(menumode){
|
||||||
|
case MODEOPTIONS:
|
||||||
|
switch(menuoption){
|
||||||
|
case OPTIONSRESOLUTION:
|
||||||
|
menuResolution(-1);
|
||||||
|
break;
|
||||||
|
case OPTIONSDETAIL:
|
||||||
|
if (detail > 0) detail--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
selectsound->play();
|
||||||
|
pressed = true;
|
||||||
|
}
|
||||||
|
} else if (keys[SDLK_RIGHT]){
|
||||||
|
if (!pressed){
|
||||||
|
switch(menumode){
|
||||||
|
case MODEOPTIONS:
|
||||||
|
switch(menuoption){
|
||||||
|
case OPTIONSRESOLUTION:
|
||||||
|
menuResolution(1);
|
||||||
|
break;
|
||||||
|
case OPTIONSDETAIL:
|
||||||
|
if (detail < DETAILCOUNT-1) detail++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
selectsound->play();
|
||||||
|
pressed = true;
|
||||||
|
}
|
||||||
|
} else if (keys[SDLK_ESCAPE]){
|
||||||
|
if (!pressed){
|
||||||
|
switch(menumode){
|
||||||
|
case MODEMAIN:
|
||||||
|
if (menuoption != MAINQUIT){
|
||||||
|
menuoption = MAINQUIT;
|
||||||
|
changesound->play();
|
||||||
|
}
|
||||||
|
else menuEscPressed();
|
||||||
|
break;
|
||||||
|
case MODEOPTIONS:
|
||||||
|
selectsound->play();
|
||||||
|
resolution = oldresolution;
|
||||||
|
detail = olddetail;
|
||||||
|
menuMain();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pressed = true;
|
||||||
|
}
|
||||||
|
} else if (keys[SDLK_RETURN]){
|
||||||
|
if (!pressed){
|
||||||
|
switch(menumode){
|
||||||
|
case MODEMAIN:
|
||||||
|
switch(menuoption){
|
||||||
|
case MAINSTART:
|
||||||
|
menuStartGame();
|
||||||
|
break;
|
||||||
|
case MAINOPTIONS:
|
||||||
|
menuOptions();
|
||||||
|
break;
|
||||||
|
case MAINQUIT:
|
||||||
|
menuEscPressed();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MODEOPTIONS:
|
||||||
|
switch(menuoption){
|
||||||
|
case OPTIONSRESOLUTION:
|
||||||
|
if (resolution != oldresolution) changeResolution(xres, yres, fullscreen);
|
||||||
|
oldresolution = resolution;
|
||||||
|
break;
|
||||||
|
case OPTIONSFULLSCREEN:
|
||||||
|
fullscreen = !fullscreen;
|
||||||
|
changeResolution(xres, yres, fullscreen);
|
||||||
|
break;
|
||||||
|
case OPTIONSDETAIL:
|
||||||
|
setDetail(detail);
|
||||||
|
olddetail = detail;
|
||||||
|
break;
|
||||||
|
case OPTIONSRETURN:
|
||||||
|
if (resolution != oldresolution){
|
||||||
|
changeResolution(xres, yres, fullscreen);
|
||||||
|
oldresolution = resolution;
|
||||||
|
}
|
||||||
|
if (detail != olddetail){
|
||||||
|
setDetail(detail);
|
||||||
|
olddetail = detail;
|
||||||
|
}
|
||||||
|
menuMain();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
selectsound->play();
|
||||||
|
pressed = true;
|
||||||
|
}
|
||||||
|
} else pressed = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawMenu(int framecount){
|
||||||
|
//createSkyBox(0, -20, 0, 400, 200, 400);
|
||||||
|
createSkyBox(-200, -200, -200, 400, 400, 400);
|
||||||
|
glLoadIdentity();
|
||||||
|
titlecamera.glUpdate();
|
||||||
|
|
||||||
|
updateLights();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
titleworld->draw();
|
||||||
|
|
||||||
|
|
||||||
|
flaretexture->enable();
|
||||||
|
titlelight.createFlare();
|
||||||
|
flaretexture->disable();
|
||||||
|
|
||||||
|
|
||||||
|
/*//2D-view
|
||||||
|
glDisable(GL_LIGHTING);
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glPushMatrix();
|
||||||
|
glLoadIdentity();
|
||||||
|
gluOrtho2D(0, 1, 1, 0);
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
glPushMatrix();
|
||||||
|
glLoadIdentity();*/
|
||||||
|
enable2D();
|
||||||
|
|
||||||
|
glColor3f(1, 1, 1);
|
||||||
|
print(0.73, 0.55,
|
||||||
|
"Programming:\n" \
|
||||||
|
" Miika Sell\n" \
|
||||||
|
" Juha Kaarlas\n" \
|
||||||
|
"\n" \
|
||||||
|
"Graphics:\n" \
|
||||||
|
" Miika Sell\n" \
|
||||||
|
" Juha Kaarlas\n" \
|
||||||
|
"\n" \
|
||||||
|
"Musics:\n" \
|
||||||
|
" Osmand"
|
||||||
|
, 0.03);
|
||||||
|
|
||||||
|
print(0.35, 0.965, "http://blockofighter.kicks-ass.net/", 0.02);
|
||||||
|
|
||||||
|
print(0.88, 0.96, "Version 2.0", 0.02);
|
||||||
|
|
||||||
|
tuxtexture->enable();
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
glColor3f(1, 1, 1);
|
||||||
|
|
||||||
|
float tuxx = 0.9;
|
||||||
|
float tuxy = 0.02;
|
||||||
|
float tuxw = 0.1*3/4;
|
||||||
|
float tuxh = 0.1;
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
glTexCoord2f(0, 0);
|
||||||
|
glVertex2f(tuxx, tuxy);
|
||||||
|
|
||||||
|
glTexCoord2f(1, 0);
|
||||||
|
glVertex2f(tuxx+tuxw, tuxy);
|
||||||
|
|
||||||
|
glTexCoord2f(1, 1);
|
||||||
|
glVertex2f(tuxx+tuxw, tuxy+tuxh);
|
||||||
|
|
||||||
|
glTexCoord2f(0, 1);
|
||||||
|
glVertex2f(tuxx, tuxy+tuxh);
|
||||||
|
glEnd();
|
||||||
|
tuxtexture->disable();
|
||||||
|
|
||||||
|
glColor3f(1, 1, 1);
|
||||||
|
print(0.88, 0.12, "supported", 0.02);
|
||||||
|
|
||||||
|
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
glColor4f(0, 0, 0, 0.5);
|
||||||
|
float x1, y1, x2, y2;
|
||||||
|
x1 = (1-interpolator)*obx1 + interpolator*bx1;
|
||||||
|
y1 = (1-interpolator)*oby1 + interpolator*by1;
|
||||||
|
x2 = (1-interpolator)*obx2 + interpolator*bx2;
|
||||||
|
y2 = (1-interpolator)*oby2 + interpolator*by2;
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
glVertex2f(x1, y1);
|
||||||
|
glVertex2f(x2, y1);
|
||||||
|
glVertex2f(x2, y2);
|
||||||
|
glVertex2f(x1, y2);
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
if (interpolator == 1.0){
|
||||||
|
switch(menumode){
|
||||||
|
case MODEMAIN:
|
||||||
|
glColor3f(1, 1, 1);
|
||||||
|
print(0.05, 0.5, "Start game", 0.1);
|
||||||
|
print(0.05, 0.65, "Options", 0.1);
|
||||||
|
print(0.05, 0.8, "Quit", 0.1);
|
||||||
|
|
||||||
|
x1 = 0.04;
|
||||||
|
x2 = 0.67;
|
||||||
|
switch(menuoption){
|
||||||
|
case 0:
|
||||||
|
y1 = 0.5;
|
||||||
|
y2 = 0.65;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
y1 = 0.65;
|
||||||
|
y2 = 0.79;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
y1 = 0.79;
|
||||||
|
y2 = 0.95;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MODEOPTIONS:
|
||||||
|
glColor3f(1, 1, 1);
|
||||||
|
char resolutionstring[22];
|
||||||
|
sprintf(resolutionstring, "Resolution: %ix%i", xres, yres);
|
||||||
|
print(0.12, 0.32, resolutionstring, 0.07);
|
||||||
|
print(0.12, 0.42, "Toggle fullscreen", 0.07);
|
||||||
|
char detailstring[22];
|
||||||
|
sprintf(detailstring, "Detail: %s", details[detail]);
|
||||||
|
print(0.12, 0.52, detailstring, 0.07);
|
||||||
|
print(0.12, 0.68, "Save and return", 0.07);
|
||||||
|
|
||||||
|
x1 = 0.11;
|
||||||
|
x2 = 0.89;
|
||||||
|
switch(menuoption){
|
||||||
|
case 0:
|
||||||
|
y1 = 0.32;
|
||||||
|
y2 = 0.42;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
y1 = 0.42;
|
||||||
|
y2 = 0.52;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
y1 = 0.52;
|
||||||
|
y2 = 0.62;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
y1 = 0.68;
|
||||||
|
y2 = 0.78;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
glLineWidth(2);
|
||||||
|
|
||||||
|
glColor4f(sin(framecount*0.04)*0.4+0.6, sin(framecount*0.04)*0.4+0.6, sin(framecount*0.04)*0.4+0.6, 0.5);
|
||||||
|
glBegin(GL_LINE_LOOP);
|
||||||
|
glVertex2f(x1, y1);
|
||||||
|
glVertex2f(x2, y1);
|
||||||
|
glVertex2f(x2, y2);
|
||||||
|
glVertex2f(x1, y2);
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (menufade != -1){
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
glColor4f(0, 0, 0, menufade);
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
glVertex2f(0, 0);
|
||||||
|
glVertex2f(1, 0);
|
||||||
|
glVertex2f(1, 1);
|
||||||
|
glVertex2f(0, 1);
|
||||||
|
glEnd();
|
||||||
|
if (loading){
|
||||||
|
glColor4f(menufade, menufade, menufade, menufade);
|
||||||
|
print(0.08, 0.4, "Loading...", 0.2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
disable2D();
|
||||||
|
/*//Back to 3D-view
|
||||||
|
glPopMatrix();
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glPopMatrix();
|
||||||
|
glMatrixMode(GL_MODELVIEW);*/
|
||||||
|
}
|
48
src/menu.h
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* $Id: menu.h,v 1.6 2002/07/21 22:50:39 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: menu.h,v $
|
||||||
|
* Revision 1.6 2002/07/21 22:50:39 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/07/19 21:17:07 msell
|
||||||
|
* bugifixi
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/07/19 20:33:28 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/07/19 20:06:32 msell
|
||||||
|
* Linux-porttausta
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/07/17 20:32:47 msell
|
||||||
|
* Detail-optio toimii
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/07/16 17:16:35 msell
|
||||||
|
* Fontit ja valikot
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/21 22:50:39 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __MENU_H_INCLUDED__
|
||||||
|
#define __MENU_H_INCLUDED__
|
||||||
|
|
||||||
|
#include <SDL.h>
|
||||||
|
|
||||||
|
#include "texture.h"
|
||||||
|
#include "audio.h"
|
||||||
|
|
||||||
|
extern int detail;
|
||||||
|
|
||||||
|
extern Texture *tuxtexture;
|
||||||
|
|
||||||
|
void initMenu(void);
|
||||||
|
void calculateMenu(int framecount);
|
||||||
|
void drawMenu(int framecount);
|
||||||
|
void menuRestart(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
433
src/mesh.cpp
Normal file
|
@ -0,0 +1,433 @@
|
||||||
|
/*
|
||||||
|
* $Id: mesh.cpp,v 1.14 2002/07/19 20:08:28 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: mesh.cpp,v $
|
||||||
|
* Revision 1.14 2002/07/19 20:08:28 msell
|
||||||
|
* Linux-porttausta
|
||||||
|
*
|
||||||
|
* Revision 1.13 2002/07/15 15:22:08 msell
|
||||||
|
* Parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.12 2002/07/14 21:40:43 msell
|
||||||
|
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
|
||||||
|
*
|
||||||
|
* Revision 1.11 2002/07/14 21:22:39 jkaarlas
|
||||||
|
* skybox ja ukkojen säätö
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/07/10 22:22:53 msell
|
||||||
|
* Cartoon-rendaus
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/07/10 22:10:32 jkaarlas
|
||||||
|
* skaalatut ja käännellyt ruumiinosat
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/07/10 17:13:44 msell
|
||||||
|
* Törmäystarkastelun parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/07/07 17:53:21 msell
|
||||||
|
* Legoukon alku
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/07/07 15:29:07 msell
|
||||||
|
* Törmäyksien parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/07/04 21:05:41 msell
|
||||||
|
* Se toimii!! =)
|
||||||
|
* Törmäystarkistukset siis
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/30 16:05:04 msell
|
||||||
|
* Törmäyksien parantelua, transformaatioita mukana
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/26 22:30:29 jkaarlas
|
||||||
|
* lisätty Vertexiin tekstuurikoordinaatit
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/24 14:12:15 msell
|
||||||
|
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/06/20 22:50:12 msell
|
||||||
|
* Meshit
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 20:08:28 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#include "mesh.h"
|
||||||
|
#include "vector.h"
|
||||||
|
#include "sphere.h"
|
||||||
|
#include "collision.h"
|
||||||
|
#include "audio.h"
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "glapi.h"
|
||||||
|
|
||||||
|
Vertex::Vertex(void){
|
||||||
|
vectorSet(position, 0, 0, 0);
|
||||||
|
vectorSet(normal, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Vertex::Vertex(float x, float y, float z){
|
||||||
|
vectorSet(position, x, y, z);
|
||||||
|
vectorSet(normal, x, y, z);
|
||||||
|
vectorNormalize(normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
Vertex::Vertex(float x, float y, float z, float nx, float ny, float nz){
|
||||||
|
vectorSet(position, x, y, z);
|
||||||
|
vectorSet(normal, nx, ny, nz);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Vertex::setTexCoords(float u, float v){
|
||||||
|
this->texcoords[0] = u;
|
||||||
|
this->texcoords[1] = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
Polygon::Polygon(void){
|
||||||
|
vertexcount = 0;
|
||||||
|
edgecount = 0;
|
||||||
|
smooth = false;
|
||||||
|
realsmooth = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Mesh::Mesh(void){
|
||||||
|
vertexcount = 0;
|
||||||
|
polygoncount = 0;
|
||||||
|
edgecount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Mesh::~Mesh(void){
|
||||||
|
delete [] polygons;
|
||||||
|
delete [] vertices;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mesh::createPlanes(void){
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < polygoncount; i++){
|
||||||
|
class Polygon *polygon = &this->polygons[i];
|
||||||
|
if (polygon->vertexcount >= 3){
|
||||||
|
float v1[3], v2[3];
|
||||||
|
vectorSub(v1, polygon->vertices[1]->position,
|
||||||
|
polygon->vertices[0]->position);
|
||||||
|
vectorSub(v2, polygon->vertices[2]->position,
|
||||||
|
polygon->vertices[0]->position);
|
||||||
|
vectorCross(polygon->planenormal, v1, v2);
|
||||||
|
vectorNormalize(polygon->planenormal);
|
||||||
|
|
||||||
|
polygon->planedistance = -vectorDot(polygon->vertices[0]->position, polygon->planenormal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mesh::createVertexnormals(void){
|
||||||
|
int i, j, ii;
|
||||||
|
bool connect;
|
||||||
|
float normal[3];
|
||||||
|
for (i = 0; i < vertexcount; i++){
|
||||||
|
bool found = false;
|
||||||
|
vectorSet(normal, 0, 0, 0);
|
||||||
|
for (j = 0; j < polygoncount; j++){
|
||||||
|
connect = false;
|
||||||
|
class Polygon *polygon = &polygons[j];
|
||||||
|
for (ii = 0;ii < polygon->vertexcount; ii++){
|
||||||
|
if (polygons[j].vertices[ii] == &(vertices[i])){
|
||||||
|
connect = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (connect){
|
||||||
|
vectorAdd(normal, polygon->planenormal);
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (found){
|
||||||
|
vectorNormalize(vertices[i].normal, normal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (j = 0; j < polygoncount; j++){
|
||||||
|
class Polygon *polygon = &polygons[j];
|
||||||
|
if (!polygon->realsmooth) polygon->smooth = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mesh::createEdges(void){
|
||||||
|
int maxedgecount = 0;
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < polygoncount; i++){
|
||||||
|
class Polygon *polygon = &polygons[i];
|
||||||
|
maxedgecount += polygon->vertexcount;
|
||||||
|
}
|
||||||
|
|
||||||
|
edgecount = 0;
|
||||||
|
int j, k;
|
||||||
|
Edge *edges = new Edge[maxedgecount];
|
||||||
|
for (i = 0; i < polygoncount; i++){
|
||||||
|
class Polygon *polygon = &polygons[i];
|
||||||
|
polygon->edges = new Edge *[polygon->vertexcount];
|
||||||
|
for (j = 1; j <= polygon->vertexcount; j++){
|
||||||
|
Vertex *v1 = polygon->vertices[j-1];
|
||||||
|
Vertex *v2 = polygon->vertices[j%polygon->vertexcount];
|
||||||
|
|
||||||
|
bool found = false;
|
||||||
|
for (k = 0; k < edgecount; k++){
|
||||||
|
if (edges[k].v2 == v1 && edges[k].v1 == v2){
|
||||||
|
found = true;
|
||||||
|
edges[k].p2 = polygon;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found){
|
||||||
|
edges[edgecount].v1 = v1;
|
||||||
|
edges[edgecount].v2 = v2;
|
||||||
|
edges[edgecount].p1 = polygon;
|
||||||
|
edges[edgecount].p2 = NULL;
|
||||||
|
edgecount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this->edges = new Edge[edgecount];
|
||||||
|
//printf("%i\n", edgecount);
|
||||||
|
for (i = 0; i < edgecount; i++){
|
||||||
|
this->edges[i].v1 = edges[i].v1;
|
||||||
|
this->edges[i].v2 = edges[i].v2;
|
||||||
|
this->edges[i].p1 = edges[i].p1;
|
||||||
|
this->edges[i].p2 = edges[i].p2;
|
||||||
|
|
||||||
|
class Polygon *p;
|
||||||
|
p = edges[i].p1;
|
||||||
|
p->edges[p->edgecount++] = &this->edges[i];
|
||||||
|
p = edges[i].p2;
|
||||||
|
p->edges[p->edgecount++] = &this->edges[i];
|
||||||
|
//printf("%p, %p\n", edges[i].p1, edges[i].p2);
|
||||||
|
}
|
||||||
|
|
||||||
|
delete[] edges;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float Mesh::calculateScale(float targetLength, int axis){
|
||||||
|
|
||||||
|
float min = 0.0;
|
||||||
|
float max = 0.0;
|
||||||
|
|
||||||
|
for (int i=0; i < this->vertexcount; i++){
|
||||||
|
if (this->vertices->position[axis] > max){
|
||||||
|
max = this->vertices->position[axis];
|
||||||
|
}
|
||||||
|
if (this->vertices->position[axis] < min){
|
||||||
|
min = this->vertices->position[axis];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fabs(targetLength / (max - min));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ei toimi kunnolla kaikille objekteille (kädet ok, jalat ja torso ei) */
|
||||||
|
void Mesh::scale(float targetLength, int axis){
|
||||||
|
float newscale = this->calculateScale(targetLength, axis);
|
||||||
|
this->scale(newscale);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ei toimi kunnolla kaikille objekteille (kädet ok, jalat ja torso ei)*/
|
||||||
|
void Mesh::scale(float scale){
|
||||||
|
for (int i=0; i < this->vertexcount; i++){
|
||||||
|
this->vertices->position[0] *= scale;
|
||||||
|
this->vertices->position[1] *= scale;
|
||||||
|
this->vertices->position[2] *= scale;
|
||||||
|
}
|
||||||
|
this->createVertexnormals();
|
||||||
|
this->createPlanes();
|
||||||
|
}
|
||||||
|
|
||||||
|
MeshObject::MeshObject(Mesh *mesh){
|
||||||
|
this->mesh = mesh;
|
||||||
|
this->appearance = new MeshAppearance(mesh);
|
||||||
|
this->geometry = new MeshShape(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MeshAppearance::MeshAppearance(Mesh *mesh){
|
||||||
|
this->mesh = mesh;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void MeshAppearance::draw(void){
|
||||||
|
//glDisable(GL_CULL_FACE);
|
||||||
|
glColor4fv(this->material.getColor());
|
||||||
|
this->material.enable();
|
||||||
|
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < mesh->polygoncount; i++){
|
||||||
|
class Polygon *polygon = &mesh->polygons[i];
|
||||||
|
|
||||||
|
glBegin(GL_TRIANGLE_FAN);
|
||||||
|
|
||||||
|
if (!polygon->smooth) glNormal3fv(polygon->planenormal);
|
||||||
|
|
||||||
|
for (j = 0; j < polygon->vertexcount; j++){
|
||||||
|
Vertex *vertex = polygon->vertices[j];
|
||||||
|
|
||||||
|
if (polygon->smooth) glNormal3fv(vertex->normal);
|
||||||
|
glVertex3fv(vertex->position);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
glDisable(GL_DEPTH);
|
||||||
|
glDisable(GL_LIGHTING);
|
||||||
|
glLineWidth(5.0);
|
||||||
|
glBegin(GL_LINES);
|
||||||
|
for (i = 0; i < mesh->edgecount; i++){
|
||||||
|
glColor3f(0, 0, 0);
|
||||||
|
glVertex3fv(mesh->edges[i].v1->position);
|
||||||
|
glVertex3fv(mesh->edges[i].v2->position);
|
||||||
|
}
|
||||||
|
|
||||||
|
glEnd();
|
||||||
|
glEnable(GL_LIGHTING);
|
||||||
|
glEnable(GL_DEPTH);
|
||||||
|
|
||||||
|
|
||||||
|
this->material.disable();
|
||||||
|
//glEnable(GL_CULL_FACE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MeshShape::MeshShape(MeshObject *object) : Shape(object){
|
||||||
|
mesh = object->mesh;
|
||||||
|
}
|
||||||
|
|
||||||
|
MeshShape::MeshShape(Object *object, Mesh *mesh) : Shape(object){
|
||||||
|
this->mesh = mesh;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MeshShape::checkCollision(Object *target){
|
||||||
|
return target->geometry->checkCollisionPeer(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
float MeshShape::calculateMomentOfInertia(float *rotationvector){
|
||||||
|
if (vectorDot(rotationvector, rotationvector) < EPSILON) return 0;
|
||||||
|
int i;
|
||||||
|
float j = 0;
|
||||||
|
for (i = 0; i < mesh->vertexcount; i++){
|
||||||
|
float proj[3];
|
||||||
|
vectorProject(proj, mesh->vertices[i].position, rotationvector);
|
||||||
|
vectorSub(proj, mesh->vertices[i].position, proj);
|
||||||
|
//float r = vectorLength(proj);
|
||||||
|
float r2 = vectorDot(proj, proj);
|
||||||
|
j += r2;
|
||||||
|
}
|
||||||
|
return j / i;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MeshShape::checkCollisionPeer(SphereShape *target){
|
||||||
|
float position[3] = {0, 0, 0};
|
||||||
|
target->object->transformPoint(position, position);
|
||||||
|
object->unTransformPoint(position, position);
|
||||||
|
|
||||||
|
float normal[3];
|
||||||
|
float contactpoint[3];
|
||||||
|
float r = target->getRadius();
|
||||||
|
|
||||||
|
if (checkSphereMeshCollision(position, r, mesh, normal, contactpoint)){
|
||||||
|
vectorScale(normal, -1);
|
||||||
|
object->transformVector(normal, normal);
|
||||||
|
object->transformPoint(contactpoint, contactpoint);
|
||||||
|
|
||||||
|
addCollision(object, target->object, normal, contactpoint);
|
||||||
|
|
||||||
|
//vectorAdd(contactnormal, normal);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//extern Sound *shotsound;
|
||||||
|
|
||||||
|
bool MeshShape::checkCollisionPeer(MeshShape *target){
|
||||||
|
float normal[3];
|
||||||
|
float contactpoint[3];
|
||||||
|
|
||||||
|
bool collided = false;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
Mesh *sourcemesh, *targetmesh;
|
||||||
|
|
||||||
|
sourcemesh = this->mesh;
|
||||||
|
targetmesh = target->mesh;
|
||||||
|
for (i = 0; i < sourcemesh->vertexcount; i++){
|
||||||
|
Vertex *vertex = &sourcemesh->vertices[i];
|
||||||
|
float vertexposition[3];
|
||||||
|
object->transformPoint(vertexposition, vertex->position);
|
||||||
|
target->object->unTransformPoint(vertexposition, vertexposition);
|
||||||
|
|
||||||
|
if (checkPointMeshCollision(vertexposition, targetmesh, normal, contactpoint)){
|
||||||
|
target->object->transformVector(normal, normal);
|
||||||
|
target->object->transformPoint(contactpoint, contactpoint);
|
||||||
|
|
||||||
|
if (vectorIsZero(contactpoint)){
|
||||||
|
vectorSet(contactpoint, 0, 0, 0);
|
||||||
|
}
|
||||||
|
addCollision(object, target->object, normal, contactpoint);
|
||||||
|
collided = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sourcemesh = target->mesh;
|
||||||
|
targetmesh = this->mesh;
|
||||||
|
for (i = 0; i < sourcemesh->vertexcount; i++){
|
||||||
|
Vertex *vertex = &sourcemesh->vertices[i];
|
||||||
|
float vertexposition[3];
|
||||||
|
target->object->transformPoint(vertexposition, vertex->position);
|
||||||
|
object->unTransformPoint(vertexposition, vertexposition);
|
||||||
|
|
||||||
|
if (checkPointMeshCollision(vertexposition, targetmesh, normal, contactpoint)){
|
||||||
|
object->transformVector(normal, normal);
|
||||||
|
object->transformPoint(contactpoint, contactpoint);
|
||||||
|
|
||||||
|
addCollision(target->object, object, normal, contactpoint);
|
||||||
|
collided = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sourcemesh = this->mesh;
|
||||||
|
targetmesh = target->mesh;
|
||||||
|
for (i = 0; i < sourcemesh->edgecount; i++){
|
||||||
|
Edge *edge = &sourcemesh->edges[i];
|
||||||
|
float v1[3], v2[3];
|
||||||
|
object->transformPoint(v1, edge->v1->position);
|
||||||
|
target->object->unTransformPoint(v1, v1);
|
||||||
|
|
||||||
|
object->transformPoint(v2, edge->v2->position);
|
||||||
|
target->object->unTransformPoint(v2, v2);
|
||||||
|
|
||||||
|
if (checkEdgeMeshCollision(v1, v2, targetmesh, normal, contactpoint)){
|
||||||
|
target->object->transformVector(normal, normal);
|
||||||
|
target->object->transformPoint(contactpoint, contactpoint);
|
||||||
|
|
||||||
|
addCollision(object, target->object, normal, contactpoint);
|
||||||
|
collided = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return collided;
|
||||||
|
}
|
||||||
|
|
169
src/mesh.h
Normal file
|
@ -0,0 +1,169 @@
|
||||||
|
/*
|
||||||
|
* $Id: mesh.h,v 1.12 2002/07/19 20:33:28 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: mesh.h,v $
|
||||||
|
* Revision 1.12 2002/07/19 20:33:28 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.11 2002/07/19 20:08:28 msell
|
||||||
|
* Linux-porttausta
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/07/17 20:32:47 msell
|
||||||
|
* Detail-optio toimii
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/07/15 15:22:08 msell
|
||||||
|
* Parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/07/14 21:22:39 jkaarlas
|
||||||
|
* skybox ja ukkojen säätö
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/07/10 17:13:44 msell
|
||||||
|
* Törmäystarkastelun parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/07/07 17:53:21 msell
|
||||||
|
* Legoukon alku
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/07/04 21:05:41 msell
|
||||||
|
* Se toimii!! =)
|
||||||
|
* Törmäystarkistukset siis
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/30 16:05:04 msell
|
||||||
|
* Törmäyksien parantelua, transformaatioita mukana
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/26 22:30:29 jkaarlas
|
||||||
|
* lisätty Vertexiin tekstuurikoordinaatit
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/24 14:12:15 msell
|
||||||
|
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/06/20 22:50:12 msell
|
||||||
|
* Meshit
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 20:33:28 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __MESH_H_INCLUDED__
|
||||||
|
#define __MESH_H_INCLUDED__
|
||||||
|
|
||||||
|
#include "object.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define X_AXIS 0
|
||||||
|
#define Y_AXIS 1
|
||||||
|
#define Z_AXIS 2
|
||||||
|
|
||||||
|
|
||||||
|
class Vertex{
|
||||||
|
public:
|
||||||
|
float position[3];
|
||||||
|
float oldposition[3];
|
||||||
|
float normal[3];
|
||||||
|
float texcoords[2];
|
||||||
|
|
||||||
|
Vertex(void);
|
||||||
|
Vertex(float x, float y, float z);
|
||||||
|
Vertex(float x, float y, float z, float nx, float ny, float nz);
|
||||||
|
|
||||||
|
void setTexCoords(float u, float v);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class Edge;
|
||||||
|
|
||||||
|
class Polygon{
|
||||||
|
public:
|
||||||
|
float planenormal[3];
|
||||||
|
float planedistance;
|
||||||
|
bool smooth;
|
||||||
|
bool realsmooth;
|
||||||
|
|
||||||
|
int vertexcount;
|
||||||
|
Vertex **vertices;
|
||||||
|
int edgecount;
|
||||||
|
Edge **edges;
|
||||||
|
|
||||||
|
Polygon(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Edge{
|
||||||
|
public:
|
||||||
|
Vertex *v1, *v2;
|
||||||
|
class Polygon *p1, *p2;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Mesh{
|
||||||
|
public:
|
||||||
|
int vertexcount;
|
||||||
|
Vertex *vertices;
|
||||||
|
|
||||||
|
int polygoncount;
|
||||||
|
class Polygon *polygons;
|
||||||
|
|
||||||
|
Edge *edges;
|
||||||
|
int edgecount;
|
||||||
|
|
||||||
|
|
||||||
|
Mesh(void);
|
||||||
|
~Mesh(void);
|
||||||
|
|
||||||
|
void createPlanes(void);
|
||||||
|
void createVertexnormals(void);
|
||||||
|
void createEdges(void);
|
||||||
|
float calculateScale(float targetLength, int axis);
|
||||||
|
void scale(float targetLength, int axis);
|
||||||
|
void scale(float scale);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class MeshObject : public Object{
|
||||||
|
public:
|
||||||
|
Mesh *mesh;
|
||||||
|
|
||||||
|
MeshObject(Mesh *mesh);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class MeshAppearance : public Appearance{
|
||||||
|
private:
|
||||||
|
Mesh *mesh;
|
||||||
|
|
||||||
|
public:
|
||||||
|
MeshAppearance(Mesh *mesh);
|
||||||
|
|
||||||
|
void draw(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//Geometry of sphere
|
||||||
|
|
||||||
|
class MeshShape : public Shape{
|
||||||
|
private:
|
||||||
|
Mesh *mesh;
|
||||||
|
|
||||||
|
public:
|
||||||
|
MeshShape(MeshObject *meshobject);
|
||||||
|
MeshShape(Object *object, Mesh *mesh);
|
||||||
|
|
||||||
|
float calculateMomentOfInertia(float *rotationvector);
|
||||||
|
|
||||||
|
bool checkCollision(Object *target);
|
||||||
|
|
||||||
|
bool checkCollisionPeer(SphereShape *target);
|
||||||
|
bool checkCollisionPeer(MeshShape *target);
|
||||||
|
|
||||||
|
friend class SphereShape;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
292
src/object.cpp
Normal file
|
@ -0,0 +1,292 @@
|
||||||
|
/*
|
||||||
|
* $Id: object.cpp,v 1.22 2002/07/18 23:05:31 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: object.cpp,v $
|
||||||
|
* Revision 1.22 2002/07/18 23:05:31 msell
|
||||||
|
* Partikkelit ja kakkospelaajan liike
|
||||||
|
*
|
||||||
|
* Revision 1.21 2002/07/17 22:45:54 msell
|
||||||
|
* Ääniä vähän
|
||||||
|
*
|
||||||
|
* Revision 1.20 2002/07/15 15:22:08 msell
|
||||||
|
* Parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.19 2002/07/14 21:40:43 msell
|
||||||
|
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
|
||||||
|
*
|
||||||
|
* Revision 1.18 2002/07/14 21:22:39 jkaarlas
|
||||||
|
* skybox ja ukkojen säätö
|
||||||
|
*
|
||||||
|
* Revision 1.17 2002/07/07 15:29:07 msell
|
||||||
|
* Törmäyksien parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.16 2002/07/04 21:05:41 msell
|
||||||
|
* Se toimii!! =)
|
||||||
|
* Törmäystarkistukset siis
|
||||||
|
*
|
||||||
|
* Revision 1.15 2002/06/30 16:05:04 msell
|
||||||
|
* Törmäyksien parantelua, transformaatioita mukana
|
||||||
|
*
|
||||||
|
* Revision 1.14 2002/06/27 14:39:48 msell
|
||||||
|
* Toimiva maila :)
|
||||||
|
* Pyörivät kappaleet siis antaa liike-energiaa liikkuville kappaleille (ei toisin päin vielä)
|
||||||
|
*
|
||||||
|
* Revision 1.13 2002/06/27 00:08:04 msell
|
||||||
|
* Kimmotukset palloille myös pyöritettyihin mesheihin
|
||||||
|
*
|
||||||
|
* Revision 1.12 2002/06/24 14:12:15 msell
|
||||||
|
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
|
||||||
|
*
|
||||||
|
* Revision 1.11 2002/06/17 20:49:05 msell
|
||||||
|
* free -> SDL_FreeSurface
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/06/16 01:04:58 jkaarlas
|
||||||
|
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/06/15 17:18:37 msell
|
||||||
|
* Toimiva törmäystarkastus kiinteille laatikoille
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/06/14 00:05:05 msell
|
||||||
|
* Törmäyssimulaatio kunnossa toivon mukaan
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/06/11 23:11:45 msell
|
||||||
|
* Törmäystarkistusta
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/07 21:16:51 msell
|
||||||
|
* Fysiikkaenginen alkua
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/05 18:39:05 msell
|
||||||
|
* Jotain pientä
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/05 15:00:41 msell
|
||||||
|
* Palikoihin lisää detailia, facet jaetaan halutun kokosiin osiin
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/03 23:20:43 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/03 23:06:38 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/06/02 16:57:37 msell
|
||||||
|
* Objektirakenteen pohja
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/18 23:05:31 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "object.h"
|
||||||
|
#include "vector.h"
|
||||||
|
#include "collision.h"
|
||||||
|
#include "utils.h"
|
||||||
|
#include "fight.h"
|
||||||
|
#include "glapi.h"
|
||||||
|
|
||||||
|
Object::Object(void){
|
||||||
|
appearance = NULL;
|
||||||
|
geometry = NULL;
|
||||||
|
invmass = 0.0;
|
||||||
|
setPosition(0, 0, 0);
|
||||||
|
vectorSet(momentum, 0, 0, 0);
|
||||||
|
|
||||||
|
invmomentofinertia = 0.0;
|
||||||
|
matrixIdentity(rotation);
|
||||||
|
vectorSet(angularmomentum, 0, 0, 0);
|
||||||
|
|
||||||
|
setCollisionGroup(COLLISIONGROUP_NONE);
|
||||||
|
gravity = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::prepare(void){
|
||||||
|
if (appearance != NULL) appearance->prepare();
|
||||||
|
}
|
||||||
|
|
||||||
|
#define DT 0.01
|
||||||
|
|
||||||
|
void Object::move(void){
|
||||||
|
moveStep(DT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::moveStep(float dt){
|
||||||
|
if (invmass == 0) return;
|
||||||
|
|
||||||
|
|
||||||
|
if (vectorDot(momentum, momentum) > 1.0e+5) vectorSet(momentum, 0, 0, 0);
|
||||||
|
if (vectorDot(angularmomentum, angularmomentum) > 1.0e+5) vectorSet(angularmomentum, 0, 0, 0);
|
||||||
|
calculateStateVariables();
|
||||||
|
|
||||||
|
|
||||||
|
float velocitydt[3];
|
||||||
|
vectorScale(velocitydt, velocity, dt);
|
||||||
|
vectorAdd(position, velocitydt);
|
||||||
|
|
||||||
|
float rotationdt[9];
|
||||||
|
if (vectorIsZero(angularmomentum)){
|
||||||
|
matrixIdentity(rotationdt);
|
||||||
|
} else{
|
||||||
|
float angularvelocitydt[3];
|
||||||
|
vectorScale(angularvelocitydt, angularvelocity, dt);
|
||||||
|
matrixCreateRotation(rotationdt, angularvelocitydt);
|
||||||
|
}
|
||||||
|
matrixMultiply(rotation, rotation, rotationdt);
|
||||||
|
|
||||||
|
vectorScale(angularmomentum, 0.99);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::calculateStateVariables(void){
|
||||||
|
getVelocity(velocity);
|
||||||
|
|
||||||
|
if (vectorIsZero(angularmomentum)){
|
||||||
|
invmomentofinertia = 0;
|
||||||
|
} else{
|
||||||
|
invmomentofinertia = invmass * 1.0 / geometry->calculateMomentOfInertia(angularmomentum);
|
||||||
|
}
|
||||||
|
|
||||||
|
vectorScale(angularvelocity, angularmomentum, invmomentofinertia);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::setPosition(float x, float y, float z){
|
||||||
|
position[0] = x;
|
||||||
|
position[1] = y;
|
||||||
|
position[2] = z;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::getPosition(float *position){
|
||||||
|
vectorCopy(position, this->position);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::getVelocity(float *velocity){
|
||||||
|
vectorCopy(velocity, momentum);
|
||||||
|
vectorScale(velocity, invmass);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::getVelocity(float *velocity, float *point){
|
||||||
|
getVelocity(velocity);
|
||||||
|
|
||||||
|
float tangentialvelocity[3];
|
||||||
|
getTangentialVelocity(tangentialvelocity, point);
|
||||||
|
//float tv[3];
|
||||||
|
//transformVector(tv, tangentialvelocity);
|
||||||
|
vectorAdd(velocity, tangentialvelocity);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::getTangentialVelocity(float *target, float *point){
|
||||||
|
if (vectorIsZero(angularmomentum)){
|
||||||
|
vectorSet(target, 0, 0, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
vectorCross(target, angularmomentum, point);
|
||||||
|
vectorScale(target, invmomentofinertia);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::getMomentum(float *momentum){
|
||||||
|
vectorCopy(momentum, this->momentum);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::setMass(float mass){
|
||||||
|
if (mass == 0) this->invmass = 0;
|
||||||
|
else this->invmass = 1.0 / mass;
|
||||||
|
}
|
||||||
|
|
||||||
|
float Object::getMass(void){
|
||||||
|
if (invmass == 0) return 0;
|
||||||
|
return 1.0 / invmass;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::setCollisionGroup(int group){
|
||||||
|
this->collisiongroup = group;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Object::getCollisionGroup(void){
|
||||||
|
return collisiongroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::addImpulse(float *impulse, float *contactpoint){
|
||||||
|
if (invmass == 0) return;
|
||||||
|
float angularimpulse[3];
|
||||||
|
vectorCross(angularimpulse, contactpoint, impulse);
|
||||||
|
vectorAdd(angularmomentum, angularimpulse);
|
||||||
|
|
||||||
|
vectorAdd(momentum, impulse);
|
||||||
|
|
||||||
|
float t1[3], t2[3];
|
||||||
|
vectorAdd(t1, contactpoint, position);
|
||||||
|
vectorNormalize(t2, impulse);
|
||||||
|
vectorAdd(t2, t1);
|
||||||
|
|
||||||
|
//addGraphicsVector(t1, t2, vectorLength(impulse));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::addExternalForce(float *force){
|
||||||
|
float impulse[3];
|
||||||
|
vectorScale(impulse, force, DT);
|
||||||
|
|
||||||
|
float contact[3] = {0, 0, 0};
|
||||||
|
this->addImpulse(impulse, contact);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::transformPoint(float *newpoint, float *oldpoint){
|
||||||
|
vectorMatrixMultiply(newpoint, oldpoint, rotation);
|
||||||
|
vectorAdd(newpoint, position);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::unTransformPoint(float *newpoint, float *oldpoint){
|
||||||
|
vectorSub(newpoint, oldpoint, position);
|
||||||
|
float rotmat[9];
|
||||||
|
matrixTranspose(rotmat, rotation);
|
||||||
|
vectorMatrixMultiply(newpoint, newpoint, rotmat);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::transformVector(float *newvector, float *oldvector){
|
||||||
|
vectorMatrixMultiply(newvector, oldvector, rotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::unTransformVector(float *newvector, float *oldvector){
|
||||||
|
float rotmat[9];
|
||||||
|
matrixTranspose(rotmat, rotation);
|
||||||
|
vectorMatrixMultiply(newvector, oldvector, rotmat);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Object::hitForce(float speed, float *speed2, Object *source){
|
||||||
|
float tolerance = 1.0;
|
||||||
|
if (speed > tolerance){
|
||||||
|
Sound *sound;
|
||||||
|
if (rand()&1) sound = softhitsound1;
|
||||||
|
else sound = softhitsound2;
|
||||||
|
float volume = (speed-tolerance)*2;
|
||||||
|
if (volume > 1) volume = 1;
|
||||||
|
sound->setVolume(volume);
|
||||||
|
sound->play(30 + random(70));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Object::setGravity(bool enabled){
|
||||||
|
gravity = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::draw(void){
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef(position[0], position[1], position[2]);
|
||||||
|
|
||||||
|
GLfloat glmatrix[16] = {
|
||||||
|
rotation[0], rotation[1], rotation[2], 0,
|
||||||
|
rotation[3], rotation[4], rotation[5], 0,
|
||||||
|
rotation[6], rotation[7], rotation[8], 0,
|
||||||
|
0 , 0 , 0 , 1};
|
||||||
|
glMultMatrixf(glmatrix);
|
||||||
|
|
||||||
|
if (appearance != NULL) appearance->draw();
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
}
|
219
src/object.h
Normal file
|
@ -0,0 +1,219 @@
|
||||||
|
/*
|
||||||
|
* $Id: object.h,v 1.20 2002/07/19 20:33:28 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: object.h,v $
|
||||||
|
* Revision 1.20 2002/07/19 20:33:28 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.19 2002/07/18 23:05:31 msell
|
||||||
|
* Partikkelit ja kakkospelaajan liike
|
||||||
|
*
|
||||||
|
* Revision 1.18 2002/07/17 22:45:54 msell
|
||||||
|
* Ääniä vähän
|
||||||
|
*
|
||||||
|
* Revision 1.17 2002/07/14 21:40:43 msell
|
||||||
|
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
|
||||||
|
*
|
||||||
|
* Revision 1.16 2002/07/07 23:05:22 msell
|
||||||
|
* Osien liimaaminen toisiinsa (kesken)
|
||||||
|
*
|
||||||
|
* Revision 1.15 2002/07/04 21:05:41 msell
|
||||||
|
* Se toimii!! =)
|
||||||
|
* Törmäystarkistukset siis
|
||||||
|
*
|
||||||
|
* Revision 1.14 2002/06/30 16:05:04 msell
|
||||||
|
* Törmäyksien parantelua, transformaatioita mukana
|
||||||
|
*
|
||||||
|
* Revision 1.13 2002/06/27 14:39:48 msell
|
||||||
|
* Toimiva maila :)
|
||||||
|
* Pyörivät kappaleet siis antaa liike-energiaa liikkuville kappaleille (ei toisin päin vielä)
|
||||||
|
*
|
||||||
|
* Revision 1.12 2002/06/27 00:08:04 msell
|
||||||
|
* Kimmotukset palloille myös pyöritettyihin mesheihin
|
||||||
|
*
|
||||||
|
* Revision 1.11 2002/06/24 14:12:15 msell
|
||||||
|
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/06/15 22:56:37 msell
|
||||||
|
* Säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/06/14 00:05:05 msell
|
||||||
|
* Törmäyssimulaatio kunnossa toivon mukaan
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/06/11 23:11:45 msell
|
||||||
|
* Törmäystarkistusta
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/06/07 21:16:51 msell
|
||||||
|
* Fysiikkaenginen alkua
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/05 18:39:05 msell
|
||||||
|
* Jotain pientä
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/05 15:00:41 msell
|
||||||
|
* Palikoihin lisää detailia, facet jaetaan halutun kokosiin osiin
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/04 16:28:32 msell
|
||||||
|
* #pragma once
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/03 23:20:43 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/03 23:06:38 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/06/02 16:57:37 msell
|
||||||
|
* Objektirakenteen pohja
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 20:33:28 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __OBJECT_H_INCLUDED__
|
||||||
|
#define __OBJECT_H_INCLUDED__
|
||||||
|
|
||||||
|
class Object;
|
||||||
|
|
||||||
|
#define EPSILON 1.0e-20
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "shape.h"
|
||||||
|
#include "appearance.h"
|
||||||
|
|
||||||
|
struct objectlist{
|
||||||
|
Object *object;
|
||||||
|
objectlist *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Object{
|
||||||
|
public:
|
||||||
|
float invmass;
|
||||||
|
|
||||||
|
/* Linear movement:
|
||||||
|
* position <-> paikka (x)
|
||||||
|
* velocity <-> nopeus (v)
|
||||||
|
* momentum <-> liikemäärä (p)
|
||||||
|
* force <-> voima (F)
|
||||||
|
* x' = v
|
||||||
|
* p' = F
|
||||||
|
* p = mv
|
||||||
|
* F = ma
|
||||||
|
* v' = a
|
||||||
|
*/
|
||||||
|
|
||||||
|
float position[3];
|
||||||
|
//derivative: velocity = momentum / mass
|
||||||
|
|
||||||
|
float momentum[3];//, oldmomentum[3];
|
||||||
|
//derivative: force
|
||||||
|
|
||||||
|
//float force[3]; //Temporary properties
|
||||||
|
//float externalforce[3];
|
||||||
|
|
||||||
|
|
||||||
|
/* Angular movement:
|
||||||
|
* rotation <-> orientaatio (R)
|
||||||
|
* angular velocity <-> kulmanopeus (w)
|
||||||
|
* angular momentum <-> pyörimisliikemäärä, vääntömomentti (L)
|
||||||
|
* torque <-> voiman momentti (M,T)
|
||||||
|
* moment of inertia <-> hitausmomentti (J,I)
|
||||||
|
* angular acceleration <-> kulmakiihtyvyys (a)
|
||||||
|
* L = J*w
|
||||||
|
* R' = Star(L) * R
|
||||||
|
* T = J*a
|
||||||
|
* w' = a
|
||||||
|
* L' = T
|
||||||
|
*/
|
||||||
|
|
||||||
|
float invmomentofinertia;
|
||||||
|
|
||||||
|
float rotation[9];
|
||||||
|
//derivative: StarOperation(angularvelocity) * rotation
|
||||||
|
|
||||||
|
float angularmomentum[3];
|
||||||
|
//angular momentum = angular velocity * moment of inertia
|
||||||
|
//derivative: torque = angular acceleration * moment of inertia
|
||||||
|
|
||||||
|
//float torque[3]; //Temporary property
|
||||||
|
|
||||||
|
|
||||||
|
void moveStep(float dt);
|
||||||
|
//void applyForces(float dt);
|
||||||
|
|
||||||
|
void calculateStateVariables(void);
|
||||||
|
|
||||||
|
int collisiongroup;
|
||||||
|
|
||||||
|
void addImpulse(float *impulse, float *contactpoint);
|
||||||
|
|
||||||
|
Appearance *appearance;
|
||||||
|
Shape *geometry;
|
||||||
|
|
||||||
|
bool gravity;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Object(void);
|
||||||
|
|
||||||
|
virtual void prepare(void);
|
||||||
|
virtual void move(void);
|
||||||
|
virtual void draw(void);
|
||||||
|
|
||||||
|
void setPosition(float x, float y, float z);
|
||||||
|
void getPosition(float *position);
|
||||||
|
|
||||||
|
//Gets velocity from object and return it in "velocity"
|
||||||
|
void getVelocity(float *velocity);
|
||||||
|
|
||||||
|
//Gets velocity from object for point "point" with
|
||||||
|
//tangential speed and return it in "velocity"
|
||||||
|
void getVelocity(float *velocity, float *point);
|
||||||
|
|
||||||
|
void getTangentialVelocity(float *target, float *point);
|
||||||
|
|
||||||
|
void getMomentum(float *momentum);
|
||||||
|
//void getForce(float *force);
|
||||||
|
void setMass(float mass);
|
||||||
|
float getMass(void);
|
||||||
|
void setCollisionGroup(int group);
|
||||||
|
int getCollisionGroup(void);
|
||||||
|
|
||||||
|
void transformPoint(float *newpoint, float *oldpoint);
|
||||||
|
void unTransformPoint(float *newpoint, float *oldpoint);
|
||||||
|
void transformVector(float *newvector, float *oldvector);
|
||||||
|
void unTransformVector(float *newvector, float *oldvector);
|
||||||
|
|
||||||
|
void addExternalForce(float *force);
|
||||||
|
|
||||||
|
void setGravity(bool enabled);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
virtual void hitForce(float speed, float *speed2, Object *source);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
friend class ObjectLink;
|
||||||
|
//friend void collide(Object *source, Object *target, float *normal, float *contactpoint);
|
||||||
|
friend bool checkCollisions(Object *object, float *contactnormal);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//Temporary state variables
|
||||||
|
float velocity[3];
|
||||||
|
float angularvelocity[3];
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
371
src/objectfactory.cpp
Normal file
|
@ -0,0 +1,371 @@
|
||||||
|
/*
|
||||||
|
* $Id: objectfactory.cpp,v 1.12 2002/07/22 01:14:14 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: objectfactory.cpp,v $
|
||||||
|
* Revision 1.12 2002/07/22 01:14:14 msell
|
||||||
|
* Lopetussysteemi
|
||||||
|
*
|
||||||
|
* Revision 1.11 2002/07/15 20:32:35 msell
|
||||||
|
* Uudet valot ja ulkoasun parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/07/15 15:22:08 msell
|
||||||
|
* Parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/07/14 21:22:39 jkaarlas
|
||||||
|
* skybox ja ukkojen säätö
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/07/11 18:33:07 jkaarlas
|
||||||
|
* ascloaderi palauttaa nyt meshin
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/07/10 22:22:53 msell
|
||||||
|
* Cartoon-rendaus
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/07/10 22:07:23 jkaarlas
|
||||||
|
* skaalatut ja käännellyt ruumiinosat
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/07/09 19:54:35 msell
|
||||||
|
* intit floateiks asc-loaderista
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/26 22:30:02 jkaarlas
|
||||||
|
* lisätty asc-loaderi
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/24 14:12:15 msell
|
||||||
|
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/23 20:12:19 msell
|
||||||
|
* Parempi törmäystarkistus palloista mesheihin
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/06/20 22:50:12 msell
|
||||||
|
* Meshit
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/22 01:14:14 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "object.h"
|
||||||
|
#include "mesh.h"
|
||||||
|
#include "vector.h"
|
||||||
|
#include "utils.h"
|
||||||
|
#include "3dutils.h"
|
||||||
|
#include "objectfactory.h"
|
||||||
|
#include "glapi.h"
|
||||||
|
|
||||||
|
|
||||||
|
MeshObject *createPyramid(float width, float height){
|
||||||
|
Mesh *mesh = new Mesh();
|
||||||
|
mesh->vertexcount = 5;
|
||||||
|
mesh->vertices = new Vertex[5];
|
||||||
|
vectorSet(mesh->vertices[0].position, width, 0, 0);
|
||||||
|
vectorSet(mesh->vertices[0].normal, 1, 0, 0);
|
||||||
|
vectorSet(mesh->vertices[1].position, -width, 0, 0);
|
||||||
|
vectorSet(mesh->vertices[1].normal, -1, 0, 0);
|
||||||
|
vectorSet(mesh->vertices[2].position, 0, 0, width);
|
||||||
|
vectorSet(mesh->vertices[2].normal, 0, 0, 1);
|
||||||
|
vectorSet(mesh->vertices[3].position, 0, 0, -width);
|
||||||
|
vectorSet(mesh->vertices[3].normal, 0, 0, -1);
|
||||||
|
vectorSet(mesh->vertices[4].position, 0, height, 0);
|
||||||
|
vectorSet(mesh->vertices[4].normal, 0, 1, 0);
|
||||||
|
|
||||||
|
mesh->polygoncount = 5;
|
||||||
|
mesh->polygons = new class Polygon[5];
|
||||||
|
|
||||||
|
mesh->polygons[0].vertexcount = 3;
|
||||||
|
mesh->polygons[0].vertices = new Vertex *[3];
|
||||||
|
mesh->polygons[0].vertices[0] = &mesh->vertices[4];
|
||||||
|
mesh->polygons[0].vertices[1] = &mesh->vertices[0];
|
||||||
|
mesh->polygons[0].vertices[2] = &mesh->vertices[3];
|
||||||
|
|
||||||
|
mesh->polygons[1].vertexcount = 3;
|
||||||
|
mesh->polygons[1].vertices = new Vertex *[3];
|
||||||
|
mesh->polygons[1].vertices[0] = &mesh->vertices[4];
|
||||||
|
mesh->polygons[1].vertices[1] = &mesh->vertices[3];
|
||||||
|
mesh->polygons[1].vertices[2] = &mesh->vertices[1];
|
||||||
|
|
||||||
|
mesh->polygons[2].vertexcount = 3;
|
||||||
|
mesh->polygons[2].vertices = new Vertex *[3];
|
||||||
|
mesh->polygons[2].vertices[0] = &mesh->vertices[4];
|
||||||
|
mesh->polygons[2].vertices[1] = &mesh->vertices[1];
|
||||||
|
mesh->polygons[2].vertices[2] = &mesh->vertices[2];
|
||||||
|
|
||||||
|
mesh->polygons[3].vertexcount = 3;
|
||||||
|
mesh->polygons[3].vertices = new Vertex *[3];
|
||||||
|
mesh->polygons[3].vertices[0] = &mesh->vertices[4];
|
||||||
|
mesh->polygons[3].vertices[1] = &mesh->vertices[2];
|
||||||
|
mesh->polygons[3].vertices[2] = &mesh->vertices[0];
|
||||||
|
|
||||||
|
mesh->polygons[4].vertexcount = 4;
|
||||||
|
mesh->polygons[4].vertices = new Vertex *[4];
|
||||||
|
mesh->polygons[4].vertices[0] = &mesh->vertices[0];
|
||||||
|
mesh->polygons[4].vertices[1] = &mesh->vertices[2];
|
||||||
|
mesh->polygons[4].vertices[2] = &mesh->vertices[1];
|
||||||
|
mesh->polygons[4].vertices[3] = &mesh->vertices[3];
|
||||||
|
|
||||||
|
mesh->polygons[0].smooth = false;
|
||||||
|
mesh->polygons[1].smooth = false;
|
||||||
|
mesh->polygons[2].smooth = false;
|
||||||
|
mesh->polygons[3].smooth = false;
|
||||||
|
mesh->polygons[4].smooth = false;
|
||||||
|
|
||||||
|
mesh->createPlanes();
|
||||||
|
|
||||||
|
MeshObject *object = new MeshObject(mesh);
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
MeshObject *createSpherePool(float width, float height){
|
||||||
|
int grid = 16;
|
||||||
|
|
||||||
|
Mesh *mesh = new Mesh();
|
||||||
|
mesh->vertexcount = (grid+1)*(grid+1);
|
||||||
|
mesh->vertices = new Vertex[mesh->vertexcount];
|
||||||
|
|
||||||
|
int x, z;
|
||||||
|
for (z = 0; z < grid; z++){
|
||||||
|
float pz = (2.0*z/(grid-1) - 1)*width;
|
||||||
|
for (x = 0; x < grid; x++){
|
||||||
|
float px = (2.0*x/(grid-1) - 1)*width;
|
||||||
|
|
||||||
|
//float py = randomf(1);
|
||||||
|
float l = sqrt(pz*pz + px*px)*1;
|
||||||
|
if (l > width) l = width;
|
||||||
|
l = l/width;
|
||||||
|
//l = l*l;
|
||||||
|
float py = height*(sin(PI*(1.5+l*2))+1)/2;
|
||||||
|
vectorSet(mesh->vertices[z * grid + x].position, px, py, pz);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mesh->polygoncount = (grid-1)*(grid-1);
|
||||||
|
mesh->polygons = new class Polygon[mesh->polygoncount];
|
||||||
|
for (z = 0; z < grid-1; z++){
|
||||||
|
for (x = 0; x < grid-1; x++){
|
||||||
|
class Polygon *poly = &mesh->polygons[z * (grid-1) + x];
|
||||||
|
poly->vertexcount = 4;
|
||||||
|
poly->vertices = new Vertex *[4];
|
||||||
|
|
||||||
|
poly->vertices[0] = &mesh->vertices[z * grid + x + 1];
|
||||||
|
poly->vertices[1] = &mesh->vertices[z * grid + x ];
|
||||||
|
poly->vertices[2] = &mesh->vertices[(z + 1) * grid + x];
|
||||||
|
poly->vertices[3] = &mesh->vertices[(z + 1) * grid + x + 1];
|
||||||
|
|
||||||
|
poly->smooth = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
mesh->createPlanes();
|
||||||
|
mesh->createVertexnormals();
|
||||||
|
|
||||||
|
MeshObject *object = new MeshObject(mesh);
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
Mesh *createBox(float x1, float x2, float y1, float y2, float z1, float z2){
|
||||||
|
Mesh *mesh = new Mesh();
|
||||||
|
mesh->vertexcount = 8;
|
||||||
|
mesh->vertices = new Vertex[8];
|
||||||
|
vectorSet(mesh->vertices[0].position, x1, y1, z1);
|
||||||
|
vectorSet(mesh->vertices[1].position, x2, y1, z1);
|
||||||
|
vectorSet(mesh->vertices[2].position, x1, y2, z1);
|
||||||
|
vectorSet(mesh->vertices[3].position, x2, y2, z1);
|
||||||
|
vectorSet(mesh->vertices[4].position, x1, y1, z2);
|
||||||
|
vectorSet(mesh->vertices[5].position, x2, y1, z2);
|
||||||
|
vectorSet(mesh->vertices[6].position, x1, y2, z2);
|
||||||
|
vectorSet(mesh->vertices[7].position, x2, y2, z2);
|
||||||
|
|
||||||
|
mesh->polygoncount = 6;
|
||||||
|
mesh->polygons = new class Polygon[6];
|
||||||
|
|
||||||
|
//Back
|
||||||
|
mesh->polygons[0].vertexcount = 4;
|
||||||
|
mesh->polygons[0].vertices = new Vertex *[4];
|
||||||
|
mesh->polygons[0].vertices[0] = &mesh->vertices[0];
|
||||||
|
mesh->polygons[0].vertices[1] = &mesh->vertices[2];
|
||||||
|
mesh->polygons[0].vertices[2] = &mesh->vertices[3];
|
||||||
|
mesh->polygons[0].vertices[3] = &mesh->vertices[1];
|
||||||
|
|
||||||
|
//Front
|
||||||
|
mesh->polygons[1].vertexcount = 4;
|
||||||
|
mesh->polygons[1].vertices = new Vertex *[4];
|
||||||
|
mesh->polygons[1].vertices[0] = &mesh->vertices[4];
|
||||||
|
mesh->polygons[1].vertices[1] = &mesh->vertices[5];
|
||||||
|
mesh->polygons[1].vertices[2] = &mesh->vertices[7];
|
||||||
|
mesh->polygons[1].vertices[3] = &mesh->vertices[6];
|
||||||
|
|
||||||
|
//Left
|
||||||
|
mesh->polygons[2].vertexcount = 4;
|
||||||
|
mesh->polygons[2].vertices = new Vertex *[4];
|
||||||
|
mesh->polygons[2].vertices[0] = &mesh->vertices[0];
|
||||||
|
mesh->polygons[2].vertices[1] = &mesh->vertices[4];
|
||||||
|
mesh->polygons[2].vertices[2] = &mesh->vertices[6];
|
||||||
|
mesh->polygons[2].vertices[3] = &mesh->vertices[2];
|
||||||
|
|
||||||
|
//Right
|
||||||
|
mesh->polygons[3].vertexcount = 4;
|
||||||
|
mesh->polygons[3].vertices = new Vertex *[4];
|
||||||
|
mesh->polygons[3].vertices[0] = &mesh->vertices[1];
|
||||||
|
mesh->polygons[3].vertices[1] = &mesh->vertices[3];
|
||||||
|
mesh->polygons[3].vertices[2] = &mesh->vertices[7];
|
||||||
|
mesh->polygons[3].vertices[3] = &mesh->vertices[5];
|
||||||
|
|
||||||
|
//Top
|
||||||
|
mesh->polygons[4].vertexcount = 4;
|
||||||
|
mesh->polygons[4].vertices = new Vertex *[4];
|
||||||
|
mesh->polygons[4].vertices[0] = &mesh->vertices[2];
|
||||||
|
mesh->polygons[4].vertices[1] = &mesh->vertices[6];
|
||||||
|
mesh->polygons[4].vertices[2] = &mesh->vertices[7];
|
||||||
|
mesh->polygons[4].vertices[3] = &mesh->vertices[3];
|
||||||
|
|
||||||
|
//Bottom
|
||||||
|
mesh->polygons[5].vertexcount = 4;
|
||||||
|
mesh->polygons[5].vertices = new Vertex *[4];
|
||||||
|
mesh->polygons[5].vertices[0] = &mesh->vertices[0];
|
||||||
|
mesh->polygons[5].vertices[1] = &mesh->vertices[1];
|
||||||
|
mesh->polygons[5].vertices[2] = &mesh->vertices[5];
|
||||||
|
mesh->polygons[5].vertices[3] = &mesh->vertices[4];
|
||||||
|
|
||||||
|
mesh->createPlanes();
|
||||||
|
mesh->createEdges();
|
||||||
|
//mesh->createVertexnormals();
|
||||||
|
|
||||||
|
return mesh;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float getValueFromString(char* data){
|
||||||
|
while(*data==' ') data++;
|
||||||
|
char* enddata=data;
|
||||||
|
//char oldchar;
|
||||||
|
do{
|
||||||
|
enddata++;
|
||||||
|
if ((*enddata<'0' || *enddata>'9') && (*enddata!='.')) *enddata=0;
|
||||||
|
} while(*enddata!=0);
|
||||||
|
float ret=atof(data);
|
||||||
|
*enddata=' ';
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* findStringEnd(char* data, char* findstring){
|
||||||
|
return strstr(data,findstring)+strlen(findstring);
|
||||||
|
}
|
||||||
|
|
||||||
|
Mesh* loadAscModel(char *filename, float scale){
|
||||||
|
float zeroOffset[3] = {0.0, 0.0, 0.0};
|
||||||
|
return loadAscModel(filename, scale, (float*)zeroOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
Mesh* loadAscModel(char *filename, float scale, float* offset){
|
||||||
|
|
||||||
|
Mesh* target = new Mesh();
|
||||||
|
|
||||||
|
|
||||||
|
FILE* file;
|
||||||
|
float x, y, z;
|
||||||
|
|
||||||
|
if ((file=fopen(filename,"rt"))==NULL){
|
||||||
|
printf("Unable to open file %s\n",filename);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
fseek(file,0,SEEK_END);
|
||||||
|
int size=ftell(file);
|
||||||
|
fseek(file,0,SEEK_SET);
|
||||||
|
char* data=(char*)malloc(size*sizeof(char));
|
||||||
|
fread(data,size,1,file);
|
||||||
|
fclose(file);
|
||||||
|
char* vert=findStringEnd(data,"Vertices:");
|
||||||
|
target->vertexcount=getValueFromString(vert);
|
||||||
|
char* face=findStringEnd(data,"Faces:");
|
||||||
|
target->polygoncount=getValueFromString(face);
|
||||||
|
target->vertices = new Vertex[target->vertexcount];
|
||||||
|
target->polygons = new class Polygon[target->polygoncount];
|
||||||
|
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
vert=findStringEnd(data,"Vertex list:");
|
||||||
|
|
||||||
|
for (i=0;i<target->vertexcount;i++){
|
||||||
|
vert=findStringEnd(vert,"Vertex");
|
||||||
|
vert=findStringEnd(vert,"X:");
|
||||||
|
x = getValueFromString(vert)*scale;
|
||||||
|
vert=findStringEnd(vert,"Y:");
|
||||||
|
y = getValueFromString(vert)*scale;
|
||||||
|
vert=findStringEnd(vert,"Z:");
|
||||||
|
z = getValueFromString(vert)*scale;
|
||||||
|
vectorSet(target->vertices[i].position, x + offset[0], y + offset[1] , z + offset[2]);
|
||||||
|
//recycle variables for texture coordinates
|
||||||
|
vert = findStringEnd(vert, "U:");
|
||||||
|
x = getValueFromString(vert);
|
||||||
|
vert = findStringEnd(vert, "V:");
|
||||||
|
y = getValueFromString(vert);
|
||||||
|
target->vertices[i].setTexCoords(x, y);
|
||||||
|
}
|
||||||
|
int vnum;
|
||||||
|
face=findStringEnd(data,"Face list:");
|
||||||
|
|
||||||
|
|
||||||
|
for (i=0;i<target->polygoncount;i++){
|
||||||
|
face=findStringEnd(face,"Face");
|
||||||
|
face=findStringEnd(face,"A:");
|
||||||
|
vnum=getValueFromString(face);
|
||||||
|
target->polygons[i].vertexcount = 3;
|
||||||
|
target->polygons[i].vertices = new Vertex *[3];
|
||||||
|
target->polygons[i].vertices[0]=&(target->vertices[vnum]);
|
||||||
|
target->polygons[i].vertices[0]->setTexCoords(target->vertices[vnum].texcoords[0],
|
||||||
|
target->vertices[vnum].texcoords[1]);
|
||||||
|
face=findStringEnd(face,"B:");
|
||||||
|
vnum=getValueFromString(face);
|
||||||
|
target->polygons[i].vertices[1]=&(target->vertices[vnum]);
|
||||||
|
target->polygons[i].vertices[1]->setTexCoords(target->vertices[vnum].texcoords[0],
|
||||||
|
target->vertices[vnum].texcoords[1]);
|
||||||
|
face=findStringEnd(face,"C:");
|
||||||
|
vnum=getValueFromString(face);
|
||||||
|
target->polygons[i].vertices[2]=&(target->vertices[vnum]);
|
||||||
|
target->polygons[i].vertices[2]->setTexCoords(target->vertices[vnum].texcoords[0],
|
||||||
|
target->vertices[vnum].texcoords[1]);
|
||||||
|
char *face2=findStringEnd(face,"Nosmooth");
|
||||||
|
char *face3=findStringEnd(face,"Smoothing");
|
||||||
|
if (face2 > face && face2 < face3) target->polygons[i].realsmooth = true;
|
||||||
|
}
|
||||||
|
free(data);
|
||||||
|
data = NULL;
|
||||||
|
//target->createEdges();
|
||||||
|
target->createPlanes();
|
||||||
|
target->createVertexnormals();
|
||||||
|
//return new MeshObject(target);
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawTrophy(void){
|
||||||
|
point2d points[14];
|
||||||
|
|
||||||
|
int width = 3;
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
points[i].x = 0.0; points[i].y = 0.0; i++;
|
||||||
|
points[i].x = width; points[i].y = 0.0; i++;
|
||||||
|
points[i].x = width-2; points[i].y = 2.0; i++;
|
||||||
|
points[i].x = width-2; points[i].y = 3.0; i++;
|
||||||
|
points[i].x = width-1; points[i].y = 4.0; i++;
|
||||||
|
points[i].x = width-2; points[i].y = 5.0; i++;
|
||||||
|
points[i].x = width-2; points[i].y = 6.0; i++;
|
||||||
|
points[i].x = width-1; points[i].y = 8.0; i++;
|
||||||
|
points[i].x = width; points[i].y = 9.0; i++;
|
||||||
|
points[i].x = width+1; points[i].y = 11.0; i++;
|
||||||
|
points[i].x = width+2; points[i].y = 15.0; i++;
|
||||||
|
points[i].x = width+3; points[i].y = 21.0; i++;
|
||||||
|
points[i].x = width+2; points[i].y = 21.0; i++;
|
||||||
|
points[i].x = 0.0; points[i].y = 8.0; i++;
|
||||||
|
|
||||||
|
createLathedSurface(points, NULL, i, i*5, i*10);
|
||||||
|
}
|
48
src/objectfactory.h
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* $Id: objectfactory.h,v 1.7 2002/07/22 01:14:14 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: objectfactory.h,v $
|
||||||
|
* Revision 1.7 2002/07/22 01:14:14 msell
|
||||||
|
* Lopetussysteemi
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/07/19 20:33:28 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/07/14 21:22:39 jkaarlas
|
||||||
|
* skybox ja ukkojen säätö
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/07/11 18:33:06 jkaarlas
|
||||||
|
* ascloaderi palauttaa nyt meshin
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/26 22:30:02 jkaarlas
|
||||||
|
* lisätty asc-loaderi
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/24 14:12:15 msell
|
||||||
|
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/06/20 22:50:12 msell
|
||||||
|
* Meshit
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/22 01:14:14 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __OBJECTFACTORY_H_INCLUDED__
|
||||||
|
#define __OBJECTFACTORY_H_INCLUDED__
|
||||||
|
|
||||||
|
#include "mesh.h"
|
||||||
|
|
||||||
|
MeshObject* createPyramid(float width, float height);
|
||||||
|
MeshObject* createSpherePool(float width, float height);
|
||||||
|
|
||||||
|
|
||||||
|
Mesh* createBox(float x1, float x2, float y1, float y2, float z1, float z2);
|
||||||
|
Mesh* loadAscModel(char* filename, float scale, float* offset);
|
||||||
|
Mesh* loadAscModel(char* filename, float scale);
|
||||||
|
void drawTrophy(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
165
src/particle.cpp
Normal file
|
@ -0,0 +1,165 @@
|
||||||
|
/*
|
||||||
|
* $Id: particle.cpp,v 1.1 2002/07/19 12:10:53 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: particle.cpp,v $
|
||||||
|
* Revision 1.1 2002/07/19 12:10:53 msell
|
||||||
|
* Hups
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 12:10:53 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "particle.h"
|
||||||
|
#include "vector.h"
|
||||||
|
#include "utils.h"
|
||||||
|
#include "world.h"
|
||||||
|
#include "objectfactory.h"
|
||||||
|
#include "collision.h"
|
||||||
|
#include "glapi.h"
|
||||||
|
|
||||||
|
|
||||||
|
Particle::Particle(World *world, Mesh *mesh) : MeshObject(mesh){
|
||||||
|
this->world = world;
|
||||||
|
}
|
||||||
|
|
||||||
|
Contact *contact = new Contact();
|
||||||
|
|
||||||
|
int bloodcount;
|
||||||
|
|
||||||
|
void Particle::move(void){
|
||||||
|
/*if (position[1] + momentum[1] < 0.5){
|
||||||
|
currentparticle->velocity.x*=0.8;
|
||||||
|
currentparticle->velocity.y=fabs(currentparticle->velocity.y)*0.8;
|
||||||
|
currentparticle->velocity.z*=0.8;
|
||||||
|
currentparticle->bounces++;
|
||||||
|
}
|
||||||
|
currentparticle->position.x+=currentparticle->velocity.x;
|
||||||
|
currentparticle->position.y+=currentparticle->velocity.y;
|
||||||
|
currentparticle->position.z+=currentparticle->velocity.z;
|
||||||
|
currentparticle->angle.x+=currentparticle->velocity.x*50;
|
||||||
|
currentparticle->angle.y+=currentparticle->velocity.y*50;
|
||||||
|
currentparticle->angle.z+=currentparticle->velocity.z*50;
|
||||||
|
currentparticle->velocity.y-=0.003;
|
||||||
|
if (currentparticle->bounces==3) dieParticle(currentparticle);*/
|
||||||
|
momentum[1] -= 0.02;
|
||||||
|
int i;
|
||||||
|
vectorSet(contact->normal, 0, 1, 0);
|
||||||
|
contact->object2 = NULL;
|
||||||
|
bool die = false;
|
||||||
|
for (i = 0; i < mesh->vertexcount; i++){
|
||||||
|
float point[3];
|
||||||
|
transformPoint(point, mesh->vertices[i].position);
|
||||||
|
if (point[1] < 0){
|
||||||
|
contact->object1 = this;
|
||||||
|
vectorCopy(contact->position, point);
|
||||||
|
handleCollision(contact);
|
||||||
|
/*float impulse[3];
|
||||||
|
getMomentum(impulse);
|
||||||
|
impulse[0] = 0;
|
||||||
|
impulse[1] = fabs(impulse[1]);
|
||||||
|
impulse[2] = 0;
|
||||||
|
vectorScale(impulse, 1.1);
|
||||||
|
addImpulse(impulse, point);
|
||||||
|
position[1] -= point[1];
|
||||||
|
momentum[1] = impulse[1]*0.5;*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*if (vectorLength(momentum) < 0.5) die = true;
|
||||||
|
if (die) removeBlood(id);*/
|
||||||
|
lifetime++;
|
||||||
|
Object::move();
|
||||||
|
|
||||||
|
if (lifetime > 300) removeBlood(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Particle::hitForce(float speed, Object *source){
|
||||||
|
/*bounces++;
|
||||||
|
if (bounces == 2){
|
||||||
|
removeBlood(id);
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
|
void Particle::create(float *position, float *velocity){
|
||||||
|
vectorCopy(this->position, position);
|
||||||
|
vectorCopy(this->momentum, velocity);
|
||||||
|
float rotate[3] = {randomf(2)-1, randomf(2)-1, randomf(2)-1};
|
||||||
|
vectorCopy(this->angularmomentum, rotate);
|
||||||
|
bounces = 0;
|
||||||
|
lifetime = 0;
|
||||||
|
world->addParticle(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Particle::destroy(void){
|
||||||
|
world->removeParticle(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Particle **bloodparticles;
|
||||||
|
|
||||||
|
BloodAppearance::BloodAppearance(int *lifetime) : BasicBlockAppearance(1, 1, 1){
|
||||||
|
this->lifetime = lifetime;
|
||||||
|
usematerial = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BloodAppearance::draw(void){
|
||||||
|
glPushMatrix();
|
||||||
|
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
|
||||||
|
float alpha = 1-*lifetime*0.003;
|
||||||
|
if (alpha < 0) alpha = 0;
|
||||||
|
|
||||||
|
glColor4f(1, 0, 0, alpha);//1.0/(1+*lifetime*0.004));
|
||||||
|
|
||||||
|
glScalef(0.5, 0.5, 0.5);
|
||||||
|
BasicBlockAppearance::draw();
|
||||||
|
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
World *bloodworld;
|
||||||
|
|
||||||
|
void initBloods(World *world){
|
||||||
|
bloodcount = 0;
|
||||||
|
bloodparticles = new Particle *[MAXBLOOD];
|
||||||
|
int i;
|
||||||
|
Mesh *bloodmesh = createBox(-0.5, 0.5, -0.5*BLOCKHEIGHT, 0.5*BLOCKHEIGHT, -0.5, 0.5);
|
||||||
|
for (i = 0; i < MAXBLOOD; i++){
|
||||||
|
bloodparticles[i] = new Particle(world, bloodmesh);
|
||||||
|
bloodparticles[i]->appearance = new BloodAppearance(&(bloodparticles[i]->lifetime));
|
||||||
|
bloodparticles[i]->setMass(1);
|
||||||
|
bloodparticles[i]->prepare();
|
||||||
|
//bloodparticles[i]->setGravity(true);
|
||||||
|
//bloodparticles[i]->setCollisionGroup(COLLISIONGROUP_PARTICLE);
|
||||||
|
//bloodparticles[i]->id = i;
|
||||||
|
}
|
||||||
|
bloodworld = world;
|
||||||
|
}
|
||||||
|
|
||||||
|
void createBlood(float *position, float *velocity){
|
||||||
|
if (bloodcount < MAXBLOOD){
|
||||||
|
Particle *currentparticle = bloodparticles[bloodcount];
|
||||||
|
currentparticle->create(position, velocity);
|
||||||
|
currentparticle->id = bloodcount;
|
||||||
|
bloodcount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void removeBlood(int id){
|
||||||
|
Particle *particle = bloodparticles[id];
|
||||||
|
particle->destroy();
|
||||||
|
bloodparticles[id] = bloodparticles[bloodcount-1];
|
||||||
|
bloodparticles[id]->id = id;
|
||||||
|
bloodparticles[bloodcount-1] = particle;
|
||||||
|
bloodcount--;
|
||||||
|
}
|
73
src/particle.h
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
* $Id: particle.h,v 1.2 2002/07/19 20:33:28 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: particle.h,v $
|
||||||
|
* Revision 1.2 2002/07/19 20:33:28 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/07/19 12:10:53 msell
|
||||||
|
* Hups
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 20:33:28 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __PARTICLE_H_INCLUDED__
|
||||||
|
#define __PARTICLE_H_INCLUDED__
|
||||||
|
|
||||||
|
class Particle;
|
||||||
|
class BloodAppearance;
|
||||||
|
|
||||||
|
#include "object.h"
|
||||||
|
#include "legoblocks.h"
|
||||||
|
#include "world.h"
|
||||||
|
|
||||||
|
class Particle : public MeshObject{
|
||||||
|
private:
|
||||||
|
int bounces;
|
||||||
|
bool enabled;
|
||||||
|
|
||||||
|
World *world;
|
||||||
|
|
||||||
|
bool alive;
|
||||||
|
|
||||||
|
public:
|
||||||
|
int lifetime;
|
||||||
|
int id;
|
||||||
|
|
||||||
|
Particle(World *world, Mesh *mesh);
|
||||||
|
|
||||||
|
void move(void);
|
||||||
|
|
||||||
|
void hitForce(float speed, Object *source);
|
||||||
|
|
||||||
|
|
||||||
|
void create(float *position, float *velocity);
|
||||||
|
void destroy(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define MAXBLOOD 500
|
||||||
|
|
||||||
|
|
||||||
|
class BloodAppearance : public BasicBlockAppearance{
|
||||||
|
private:
|
||||||
|
int *lifetime;
|
||||||
|
|
||||||
|
public:
|
||||||
|
BloodAppearance(int *lifetime);
|
||||||
|
|
||||||
|
void draw(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
void initBloods(World *world);
|
||||||
|
void createBlood(float *position, float *velocity);
|
||||||
|
void removeBlood(int id);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
298
src/run.cpp
Normal file
|
@ -0,0 +1,298 @@
|
||||||
|
/*
|
||||||
|
* $Id: run.cpp,v 1.24 2002/07/22 11:44:16 jkaarlas Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: run.cpp,v $
|
||||||
|
* Revision 1.24 2002/07/22 11:44:16 jkaarlas
|
||||||
|
* naama
|
||||||
|
*
|
||||||
|
* Revision 1.23 2002/07/22 01:14:14 msell
|
||||||
|
* Lopetussysteemi
|
||||||
|
*
|
||||||
|
* Revision 1.22 2002/07/19 22:38:38 msell
|
||||||
|
* Pingviini
|
||||||
|
*
|
||||||
|
* Revision 1.21 2002/07/19 21:17:07 msell
|
||||||
|
* bugifixi
|
||||||
|
*
|
||||||
|
* Revision 1.20 2002/07/19 20:06:32 msell
|
||||||
|
* Linux-porttausta
|
||||||
|
*
|
||||||
|
* Revision 1.19 2002/07/19 19:46:07 msell
|
||||||
|
* Makefile
|
||||||
|
*
|
||||||
|
* Revision 1.18 2002/07/19 18:59:46 msell
|
||||||
|
* Alkuhommaa ja säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.17 2002/07/19 14:05:52 msell
|
||||||
|
* Damagetextuurit näkyy
|
||||||
|
*
|
||||||
|
* Revision 1.16 2002/07/19 12:48:57 jkaarlas
|
||||||
|
* damagepää
|
||||||
|
*
|
||||||
|
* Revision 1.15 2002/07/19 12:42:44 msell
|
||||||
|
* Loading...
|
||||||
|
*
|
||||||
|
* Revision 1.14 2002/07/17 20:32:48 msell
|
||||||
|
* Detail-optio toimii
|
||||||
|
*
|
||||||
|
* Revision 1.13 2002/07/17 16:40:33 msell
|
||||||
|
* Resoluution vaihto
|
||||||
|
*
|
||||||
|
* Revision 1.12 2002/07/16 19:57:14 jkaarlas
|
||||||
|
* lisätty DATAPATH tiedostonimien eteen
|
||||||
|
*
|
||||||
|
* Revision 1.11 2002/07/16 17:16:35 msell
|
||||||
|
* Fontit ja valikot
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/07/04 21:05:41 msell
|
||||||
|
* Se toimii!! =)
|
||||||
|
* Törmäystarkistukset siis
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/06/17 20:49:05 msell
|
||||||
|
* free -> SDL_FreeSurface
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/06/17 19:58:08 msell
|
||||||
|
* #includeiden parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/06/16 01:04:58 jkaarlas
|
||||||
|
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/02 16:57:37 msell
|
||||||
|
* Objektirakenteen pohja
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/05/18 12:29:35 msell
|
||||||
|
* Valot ja äänijärjestelmän parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/05/17 12:30:26 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/05/16 18:41:16 msell
|
||||||
|
* Vektorifunctioita ja kamera
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/05/15 21:07:23 msell
|
||||||
|
* Äänisäätöä
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/05/15 14:36:39 msell
|
||||||
|
* Yksinkertainen SDL-runko (Kääntyy toistaiseksi vain windowsissa).
|
||||||
|
* Mukana myös musiikinsoitto fmodilla.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/22 11:44:16 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#include <SDL.h>
|
||||||
|
|
||||||
|
#include "run.h"
|
||||||
|
#include "fight.h"
|
||||||
|
#include "menu.h"
|
||||||
|
#include "end.h"
|
||||||
|
#include "graphics.h"
|
||||||
|
#include "3dutils.h"
|
||||||
|
#include "audio.h"
|
||||||
|
#include "font.h"
|
||||||
|
#include "legoblocks.h"
|
||||||
|
#include "glapi.h"
|
||||||
|
|
||||||
|
int gamemode;
|
||||||
|
|
||||||
|
bool changed;
|
||||||
|
|
||||||
|
bool gameinitialized = false;
|
||||||
|
|
||||||
|
void initFontTexture(void);
|
||||||
|
|
||||||
|
void initScenes(void){
|
||||||
|
knobgllist = glGenLists(1);
|
||||||
|
setDetail(detail);
|
||||||
|
|
||||||
|
|
||||||
|
//Simple loading-screen
|
||||||
|
enable2D();
|
||||||
|
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
SDL_GL_SwapBuffers();
|
||||||
|
|
||||||
|
initFontTexture();
|
||||||
|
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
print(0.08, 0.4, "Loading...", 0.2);
|
||||||
|
SDL_GL_SwapBuffers();
|
||||||
|
|
||||||
|
disable2D();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
SKYBOX = -1;
|
||||||
|
initTextures();
|
||||||
|
initFight();
|
||||||
|
initMenu();
|
||||||
|
initEnd();
|
||||||
|
changeGameMode(MENUMODE);
|
||||||
|
//changeGameMode(ENDMODE);
|
||||||
|
gameinitialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void changeGameMode(int newmode){
|
||||||
|
gamemode = newmode;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void calculateFrame(int framecount){
|
||||||
|
switch(gamemode){
|
||||||
|
case MENUMODE:
|
||||||
|
calculateMenu(framecount);
|
||||||
|
break;
|
||||||
|
case FIGHTMODE:
|
||||||
|
calculateFight(framecount);
|
||||||
|
break;
|
||||||
|
case ENDMODE:
|
||||||
|
calculateEnd(framecount);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
updateAudio();
|
||||||
|
changed = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawFrame(int framecount){
|
||||||
|
if (changed) calculateFrame(framecount);
|
||||||
|
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
|
||||||
|
switch(gamemode){
|
||||||
|
case MENUMODE:
|
||||||
|
drawMenu(framecount);
|
||||||
|
break;
|
||||||
|
case FIGHTMODE:
|
||||||
|
drawFight(framecount);
|
||||||
|
break;
|
||||||
|
case ENDMODE:
|
||||||
|
drawEnd(framecount);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_GL_SwapBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*int SKY_FRONT_ID;
|
||||||
|
int SKY_BACK_ID;
|
||||||
|
int SKY_LEFT_ID;
|
||||||
|
int SKY_RIGHT_ID;
|
||||||
|
int SKY_TOP_ID;
|
||||||
|
int SKY_BOTTOM_ID;*/
|
||||||
|
|
||||||
|
bool texturesloaded = false;
|
||||||
|
|
||||||
|
Texture *flaretexture;
|
||||||
|
Texture *skyfronttexture;
|
||||||
|
Texture *skybacktexture;
|
||||||
|
Texture *skylefttexture;
|
||||||
|
Texture *skyrighttexture;
|
||||||
|
Texture *skytoptexture;
|
||||||
|
Texture *skybottomtexture;
|
||||||
|
Texture *damageHead;
|
||||||
|
Texture *damageTorso;
|
||||||
|
Texture *damageHand;
|
||||||
|
Texture *damageLeg;
|
||||||
|
Texture *tuxtexture;
|
||||||
|
Texture *faceTexture;
|
||||||
|
|
||||||
|
void initFontTexture(void){
|
||||||
|
if (!texturesloaded){
|
||||||
|
float trans[3] = {1, 0, 0};
|
||||||
|
fonttexture = new Texture();
|
||||||
|
fonttexture->loadImage(DATAPATH"font.png", trans);
|
||||||
|
} else{
|
||||||
|
fonttexture->reload();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void initTextures(void){
|
||||||
|
/*SKY_FRONT_ID = DRUID.loadTexture(SKYFRONT);
|
||||||
|
SKY_BACK_ID = DRUID.loadTexture(SKYBACK);
|
||||||
|
SKY_LEFT_ID = DRUID.loadTexture(SKYLEFT);
|
||||||
|
SKY_RIGHT_ID = DRUID.loadTexture(SKYRIGHT);
|
||||||
|
SKY_TOP_ID = DRUID.loadTexture(SKYTOP);
|
||||||
|
SKY_BOTTOM_ID = DRUID.loadTexture(SKYBOTTOM);*/
|
||||||
|
|
||||||
|
if (!texturesloaded){
|
||||||
|
skyfronttexture = new Texture();
|
||||||
|
skyfronttexture->loadImage(SKYFRONT);
|
||||||
|
skybacktexture = new Texture();
|
||||||
|
skybacktexture->loadImage(SKYBACK);
|
||||||
|
skylefttexture = new Texture();
|
||||||
|
skylefttexture->loadImage(SKYLEFT);
|
||||||
|
skyrighttexture = new Texture();
|
||||||
|
skyrighttexture->loadImage(SKYRIGHT);
|
||||||
|
skytoptexture = new Texture();
|
||||||
|
skytoptexture->loadImage(SKYTOP);
|
||||||
|
skybottomtexture = new Texture();
|
||||||
|
skybottomtexture->loadImage(SKYBOTTOM);
|
||||||
|
|
||||||
|
|
||||||
|
float something[3] = {1, 0, 0.5};
|
||||||
|
damageHead = new Texture();
|
||||||
|
damageHead->loadImage(DAMAGEHEAD, something);
|
||||||
|
damageTorso = new Texture();
|
||||||
|
damageTorso->loadImage(DAMAGETORSO, something);
|
||||||
|
damageHand = new Texture();
|
||||||
|
damageHand->loadImage(DAMAGEHAND, something);
|
||||||
|
damageLeg = new Texture();
|
||||||
|
damageLeg->loadImage(DAMAGELEG, something);
|
||||||
|
faceTexture = new Texture();
|
||||||
|
something[2] = 1;
|
||||||
|
faceTexture->loadImage(FACE, something);
|
||||||
|
|
||||||
|
float zeros[3] = {0, 0, 0};
|
||||||
|
flaretexture = new Texture();
|
||||||
|
flaretexture->loadImage(DATAPATH"flare.png", zeros);
|
||||||
|
|
||||||
|
|
||||||
|
float pink[3] = {1, 0, 1};
|
||||||
|
tuxtexture = new Texture();
|
||||||
|
tuxtexture->loadImage(DATAPATH"tux.png", pink);
|
||||||
|
} else{
|
||||||
|
skyfronttexture->reload();
|
||||||
|
skybacktexture->reload();
|
||||||
|
skylefttexture->reload();
|
||||||
|
skyrighttexture->reload();
|
||||||
|
skytoptexture->reload();
|
||||||
|
skybottomtexture->reload();
|
||||||
|
|
||||||
|
damageHead->reload();
|
||||||
|
damageTorso->reload();
|
||||||
|
damageHand->reload();
|
||||||
|
damageLeg->reload();
|
||||||
|
|
||||||
|
flaretexture->reload();
|
||||||
|
|
||||||
|
tuxtexture->reload();
|
||||||
|
}
|
||||||
|
texturesloaded = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setDetail(int detail){
|
||||||
|
switch(detail){
|
||||||
|
case 0:
|
||||||
|
knobdetail = 0;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
knobdetail = 5;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
knobdetail = 8;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
knobdetail = 16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
initKnob();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
55
src/run.h
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* $Id: run.h,v 1.9 2002/07/22 01:14:14 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: run.h,v $
|
||||||
|
* Revision 1.9 2002/07/22 01:14:14 msell
|
||||||
|
* Lopetussysteemi
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/07/19 20:33:29 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/07/17 20:32:48 msell
|
||||||
|
* Detail-optio toimii
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/07/16 17:16:35 msell
|
||||||
|
* Fontit ja valikot
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/04 16:28:32 msell
|
||||||
|
* #pragma once
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/02 16:57:37 msell
|
||||||
|
* Objektirakenteen pohja
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/05/17 12:30:26 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/05/16 18:41:16 msell
|
||||||
|
* Vektorifunctioita ja kamera
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/05/15 14:36:39 msell
|
||||||
|
* Yksinkertainen SDL-runko (Kääntyy toistaiseksi vain windowsissa).
|
||||||
|
* Mukana myös musiikinsoitto fmodilla.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/22 01:14:14 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __RUN_H_INCLUDED__
|
||||||
|
#define __RUN_H_INCLUDED__
|
||||||
|
|
||||||
|
#define MENUMODE 1
|
||||||
|
#define FIGHTMODE 2
|
||||||
|
#define ENDMODE 3
|
||||||
|
|
||||||
|
void initScenes(void);
|
||||||
|
void changeGameMode(int newmode);
|
||||||
|
void calculateFrame(int framecount);
|
||||||
|
void drawFrame(int framecount);
|
||||||
|
void initTextures(void);
|
||||||
|
void setDetail(int detail);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
52
src/shape.cpp
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* $Id: shape.cpp,v 1.7 2002/07/04 21:05:41 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: shape.cpp,v $
|
||||||
|
* Revision 1.7 2002/07/04 21:05:41 msell
|
||||||
|
* Se toimii!! =)
|
||||||
|
* Törmäystarkistukset siis
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/30 16:05:04 msell
|
||||||
|
* Törmäyksien parantelua, transformaatioita mukana
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/24 14:12:15 msell
|
||||||
|
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/20 22:50:12 msell
|
||||||
|
* Meshit
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/15 17:18:37 msell
|
||||||
|
* Toimiva törmäystarkastus kiinteille laatikoille
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/14 00:05:05 msell
|
||||||
|
* Törmäyssimulaatio kunnossa toivon mukaan
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/06/11 23:11:45 msell
|
||||||
|
* Törmäystarkistusta
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/04 21:05:41 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "shape.h"
|
||||||
|
|
||||||
|
Shape::Shape(Object *object){
|
||||||
|
this->object = object;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Shape::checkCollision(Object *target){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
bool Shape::checkCollisionPeer(Shape *target){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
bool Shape::checkCollisionPeer(SphereShape *target){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
bool Shape::checkCollisionPeer(MeshShape *target){
|
||||||
|
return false;
|
||||||
|
}
|
79
src/shape.h
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
/*
|
||||||
|
* $Id: shape.h,v 1.12 2002/07/19 20:33:29 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: shape.h,v $
|
||||||
|
* Revision 1.12 2002/07/19 20:33:29 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.11 2002/07/04 21:05:41 msell
|
||||||
|
* Se toimii!! =)
|
||||||
|
* Törmäystarkistukset siis
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/06/30 16:05:04 msell
|
||||||
|
* Törmäyksien parantelua, transformaatioita mukana
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/06/24 14:12:15 msell
|
||||||
|
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/06/20 22:50:12 msell
|
||||||
|
* Meshit
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/06/15 17:18:37 msell
|
||||||
|
* Toimiva törmäystarkastus kiinteille laatikoille
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/14 00:05:05 msell
|
||||||
|
* Törmäyssimulaatio kunnossa toivon mukaan
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/11 23:11:45 msell
|
||||||
|
* Törmäystarkistusta
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/07 21:16:51 msell
|
||||||
|
* Fysiikkaenginen alkua
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/05 23:55:46 msell
|
||||||
|
* Pallo
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/04 16:28:32 msell
|
||||||
|
* #pragma once
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/06/02 16:57:37 msell
|
||||||
|
* Objektirakenteen pohja
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 20:33:29 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SHAPE_H_INCLUDED__
|
||||||
|
#define __SHAPE_H_INCLUDED__
|
||||||
|
|
||||||
|
class Shape;
|
||||||
|
class SphereShape;
|
||||||
|
class MeshShape;
|
||||||
|
|
||||||
|
#include "object.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Abstract class for object geometry
|
||||||
|
*/
|
||||||
|
class Shape{
|
||||||
|
protected:
|
||||||
|
Object *object;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Shape(Object *object);
|
||||||
|
|
||||||
|
|
||||||
|
virtual float calculateMomentOfInertia(float *rotationvector) = 0;
|
||||||
|
|
||||||
|
virtual bool checkCollision(Object *target);
|
||||||
|
|
||||||
|
virtual bool checkCollisionPeer(Shape *target);
|
||||||
|
virtual bool checkCollisionPeer(SphereShape *target);
|
||||||
|
virtual bool checkCollisionPeer(MeshShape *target);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
333
src/sphere.cpp
Normal file
|
@ -0,0 +1,333 @@
|
||||||
|
/*
|
||||||
|
* $Id: sphere.cpp,v 1.19 2002/07/19 18:59:46 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: sphere.cpp,v $
|
||||||
|
* Revision 1.19 2002/07/19 18:59:46 msell
|
||||||
|
* Alkuhommaa ja säätöä
|
||||||
|
*
|
||||||
|
* Revision 1.18 2002/07/07 17:53:21 msell
|
||||||
|
* Legoukon alku
|
||||||
|
*
|
||||||
|
* Revision 1.17 2002/07/04 21:05:41 msell
|
||||||
|
* Se toimii!! =)
|
||||||
|
* Törmäystarkistukset siis
|
||||||
|
*
|
||||||
|
* Revision 1.16 2002/06/30 16:05:04 msell
|
||||||
|
* Törmäyksien parantelua, transformaatioita mukana
|
||||||
|
*
|
||||||
|
* Revision 1.15 2002/06/27 14:39:48 msell
|
||||||
|
* Toimiva maila :)
|
||||||
|
* Pyörivät kappaleet siis antaa liike-energiaa liikkuville kappaleille (ei toisin päin vielä)
|
||||||
|
*
|
||||||
|
* Revision 1.14 2002/06/27 00:08:04 msell
|
||||||
|
* Kimmotukset palloille myös pyöritettyihin mesheihin
|
||||||
|
*
|
||||||
|
* Revision 1.13 2002/06/24 14:12:15 msell
|
||||||
|
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
|
||||||
|
*
|
||||||
|
* Revision 1.12 2002/06/23 20:12:19 msell
|
||||||
|
* Parempi törmäystarkistus palloista mesheihin
|
||||||
|
*
|
||||||
|
* Revision 1.11 2002/06/20 22:50:12 msell
|
||||||
|
* Meshit
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/06/20 00:21:19 jkaarlas
|
||||||
|
* materiaali- ja tekstuurihommia edistetty
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/06/17 20:49:05 msell
|
||||||
|
* free -> SDL_FreeSurface
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/06/16 01:04:58 jkaarlas
|
||||||
|
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/06/15 17:18:37 msell
|
||||||
|
* Toimiva törmäystarkastus kiinteille laatikoille
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/14 00:26:17 msell
|
||||||
|
* 100 kimpoilevaa palloa ja vähän vaimennusta
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/14 00:05:05 msell
|
||||||
|
* Törmäyssimulaatio kunnossa toivon mukaan
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/11 23:23:03 msell
|
||||||
|
* Törmäystarkistusta
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/11 23:11:45 msell
|
||||||
|
* Törmäystarkistusta
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/07 21:16:51 msell
|
||||||
|
* Fysiikkaenginen alkua
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/06/05 23:55:46 msell
|
||||||
|
* Pallo
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 18:59:46 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "sphere.h"
|
||||||
|
#include "utils.h"
|
||||||
|
#include "3dutils.h"
|
||||||
|
#include "audio.h"
|
||||||
|
#include "vector.h"
|
||||||
|
#include "collision.h"
|
||||||
|
#include "glapi.h"
|
||||||
|
|
||||||
|
|
||||||
|
Sphere::Sphere(void){
|
||||||
|
appearance = new SphereAppearance();
|
||||||
|
Object::appearance = appearance;
|
||||||
|
geometry = new SphereShape(this);
|
||||||
|
Object::geometry = geometry;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Sphere::setRadius(float r){
|
||||||
|
if (r < 0) r = -r;
|
||||||
|
this->r = r;
|
||||||
|
appearance->setRadius(r);
|
||||||
|
geometry->setRadius(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
SphereAppearance::SphereAppearance(void){
|
||||||
|
setRadius(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SphereAppearance::setRadius(float r){
|
||||||
|
if (r < 0) r = -r;
|
||||||
|
this->r = r;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Sphere::setColor(float red, float green, float blue){
|
||||||
|
appearance->getMaterial()->setColor(red, green, blue, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SphereAppearance::draw(void){
|
||||||
|
material.enable();
|
||||||
|
createSphere(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
SphereShape::SphereShape(Object *sphere) : Shape(sphere){
|
||||||
|
setRadius(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SphereShape::setRadius(float r){
|
||||||
|
this->r = r;
|
||||||
|
}
|
||||||
|
|
||||||
|
float SphereShape::getRadius(void){
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SphereShape::checkCollision(Object *target){
|
||||||
|
return target->geometry->checkCollisionPeer(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
float SphereShape::calculateMomentOfInertia(float *rotationvector){
|
||||||
|
return 2.0/3.0*r*r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*bool SphereShape::checkCollisionPeer(PlaneShape *target){
|
||||||
|
float sourceposition[3], targetposition[3];
|
||||||
|
object->getPosition(sourceposition);
|
||||||
|
target->object->getPosition(targetposition);
|
||||||
|
float height = target->height + targetposition[1];
|
||||||
|
|
||||||
|
if (sourceposition[1] - r < height){
|
||||||
|
//shotsound->play();
|
||||||
|
float normal[3] = {0, 1, 0};
|
||||||
|
|
||||||
|
float contactpoint[3] = {0, target->height, 0};
|
||||||
|
collide(object, target->object, normal, contactpoint);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
bool SphereShape::checkCollisionPeer(SphereShape *target){
|
||||||
|
/*float sourceposition[3], targetposition[3];
|
||||||
|
object->getPosition(sourceposition);
|
||||||
|
target->object->getPosition(targetposition);
|
||||||
|
float impact[3];
|
||||||
|
vectorSub(impact, sourceposition, targetposition);*/
|
||||||
|
float impact[3] = {0, 0, 0};
|
||||||
|
object->transformPoint(impact, impact);
|
||||||
|
target->object->unTransformPoint(impact, impact);
|
||||||
|
float distance2 = vectorDot(impact, impact);
|
||||||
|
|
||||||
|
if (distance2 < (r + target->r)*(r + target->r)){
|
||||||
|
/*float temp[3], temp2[3], temp3[3];
|
||||||
|
object->getMomentum(temp2);
|
||||||
|
target->object->getMomentum(temp3);
|
||||||
|
vectorSub(temp, temp2, temp3);
|
||||||
|
shotsound->setVolume(1.0-1/(1+vectorLength(temp)*0.5));
|
||||||
|
shotsound->play();*/
|
||||||
|
float normal[3];
|
||||||
|
vectorNormalize(normal, impact);
|
||||||
|
|
||||||
|
float contactpoint[3];
|
||||||
|
vectorScale(contactpoint, normal, target->r);
|
||||||
|
|
||||||
|
target->object->transformVector(normal, normal);
|
||||||
|
target->object->transformPoint(contactpoint, contactpoint);
|
||||||
|
|
||||||
|
addCollision(object, target->object, normal, contactpoint);
|
||||||
|
|
||||||
|
//vectorAdd(contactnormal, normal);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool between(float x, float x1, float x2){
|
||||||
|
if ((x >= x1 && x <=x2) || (x >= x2 && x <=x1)) return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*bool SphereShape::checkCollisionPeer(BoxShape *target){
|
||||||
|
float sourceposition[3], targetposition[3];
|
||||||
|
object->getPosition(sourceposition);
|
||||||
|
target->object->getPosition(targetposition);
|
||||||
|
float x1 = target->x1 + targetposition[0];
|
||||||
|
float x2 = target->x2 + targetposition[0];
|
||||||
|
float y1 = target->y1 + targetposition[1];
|
||||||
|
float y2 = target->y2 + targetposition[1];
|
||||||
|
float z1 = target->z1 + targetposition[2];
|
||||||
|
float z2 = target->z2 + targetposition[2];
|
||||||
|
float points[3][2] = {{x1, x2}, {y1, y2}, {z1, z2}};
|
||||||
|
float p[2], op1[2], op2[2];
|
||||||
|
float c, oc1, oc2;
|
||||||
|
int i;
|
||||||
|
float normal[3];
|
||||||
|
float *normal2[3];
|
||||||
|
//Faces
|
||||||
|
for (i = 0; i < 3; i++){
|
||||||
|
p[0] = points[i][0];
|
||||||
|
p[1] = points[i][1];
|
||||||
|
op1[0] = points[(i+1)%3][0];
|
||||||
|
op1[1] = points[(i+1)%3][1];
|
||||||
|
op2[0] = points[(i+2)%3][0];
|
||||||
|
op2[1] = points[(i+2)%3][1];
|
||||||
|
c = sourceposition[i];
|
||||||
|
oc1 = sourceposition[(i+1)%3];
|
||||||
|
oc2 = sourceposition[(i+2)%3];
|
||||||
|
normal2[0] = &normal[i];
|
||||||
|
normal2[1] = &normal[(i+1)%3];
|
||||||
|
normal2[2] = &normal[(i+2)%3];
|
||||||
|
|
||||||
|
if (between(oc1, op1[0], op1[1]) &&
|
||||||
|
between(oc2, op2[0], op2[1])){
|
||||||
|
if (c < p[0] && c+r > p[0]){
|
||||||
|
*normal2[0] = -1;
|
||||||
|
*normal2[1] = 0;
|
||||||
|
*normal2[2] = 0;
|
||||||
|
collide(object, target->object, normal);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (c > p[1] && c-r < p[1]){
|
||||||
|
*normal2[0] = 1;
|
||||||
|
*normal2[1] = 0;
|
||||||
|
*normal2[2] = 0;
|
||||||
|
collide(object, target->object, normal);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Edges
|
||||||
|
for (i = 0; i < 3; i++){
|
||||||
|
p[0] = points[i][0];
|
||||||
|
p[1] = points[i][1];
|
||||||
|
op1[0] = points[(i+1)%3][0];
|
||||||
|
op1[1] = points[(i+1)%3][1];
|
||||||
|
op2[0] = points[(i+2)%3][0];
|
||||||
|
op2[1] = points[(i+2)%3][1];
|
||||||
|
c = sourceposition[i];
|
||||||
|
oc1 = sourceposition[(i+1)%3];
|
||||||
|
oc2 = sourceposition[(i+2)%3];
|
||||||
|
normal2[0] = &normal[i];
|
||||||
|
normal2[1] = &normal[(i+1)%3];
|
||||||
|
normal2[2] = &normal[(i+2)%3];
|
||||||
|
float edges[4][2] = {
|
||||||
|
{p[0], op1[0]},
|
||||||
|
{p[1], op1[0]},
|
||||||
|
{p[0], op1[1]},
|
||||||
|
{p[1], op1[1]}};
|
||||||
|
|
||||||
|
if (between(oc2, op2[0], op2[1])){
|
||||||
|
int j;
|
||||||
|
for (j = 0; j < 4; j++){
|
||||||
|
float diff[2] = {c - edges[j][0], oc1 - edges[j][1]};
|
||||||
|
if (diff[0]*diff[0] + diff[1]*diff[1] < r*r){
|
||||||
|
*normal2[0] = diff[0];
|
||||||
|
*normal2[1] = diff[1];
|
||||||
|
*normal2[2] = 0;
|
||||||
|
vectorNormalize(normal);
|
||||||
|
collide(object, target->object, normal);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Corners
|
||||||
|
float corners[8][3] = {
|
||||||
|
{x1, y1, z1},
|
||||||
|
{x1, y1, z2},
|
||||||
|
{x1, y2, z1},
|
||||||
|
{x1, y2, z2},
|
||||||
|
{x2, y1, z1},
|
||||||
|
{x2, y1, z2},
|
||||||
|
{x2, y2, z1},
|
||||||
|
{x2, y2, z2}};
|
||||||
|
for (i = 0; i < 8; i++){
|
||||||
|
float *corner = corners[i];
|
||||||
|
float difference[3];
|
||||||
|
vectorSub(difference, sourceposition, corner);
|
||||||
|
float length2 = vectorDot(difference, difference);
|
||||||
|
if (length2 < r*r){
|
||||||
|
float normal[3];
|
||||||
|
vectorNormalize(normal, difference);
|
||||||
|
collide(object, target->object, normal);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool SphereShape::checkCollisionPeer(MeshShape *target){
|
||||||
|
float position[3] = {0, 0, 0};
|
||||||
|
object->transformPoint(position, position);
|
||||||
|
target->object->unTransformPoint(position, position);
|
||||||
|
Mesh *mesh = target->mesh;
|
||||||
|
|
||||||
|
float normal[3];
|
||||||
|
float contactpoint[3];
|
||||||
|
|
||||||
|
if (checkSphereMeshCollision(position, r, mesh, normal, contactpoint)){
|
||||||
|
target->object->transformVector(normal, normal);
|
||||||
|
target->object->transformPoint(contactpoint, contactpoint);
|
||||||
|
|
||||||
|
addCollision(object, target->object, normal, contactpoint);
|
||||||
|
|
||||||
|
//vectorAdd(contactnormal, normal);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
112
src/sphere.h
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
/*
|
||||||
|
* $Id: sphere.h,v 1.11 2002/07/19 20:33:29 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: sphere.h,v $
|
||||||
|
* Revision 1.11 2002/07/19 20:33:29 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.10 2002/07/07 17:53:21 msell
|
||||||
|
* Legoukon alku
|
||||||
|
*
|
||||||
|
* Revision 1.9 2002/07/04 21:05:41 msell
|
||||||
|
* Se toimii!! =)
|
||||||
|
* Törmäystarkistukset siis
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/06/30 16:05:04 msell
|
||||||
|
* Törmäyksien parantelua, transformaatioita mukana
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/06/24 14:12:15 msell
|
||||||
|
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/20 22:50:12 msell
|
||||||
|
* Meshit
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/15 17:18:37 msell
|
||||||
|
* Toimiva törmäystarkastus kiinteille laatikoille
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/14 00:05:05 msell
|
||||||
|
* Törmäyssimulaatio kunnossa toivon mukaan
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/11 23:11:45 msell
|
||||||
|
* Törmäystarkistusta
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/07 21:16:51 msell
|
||||||
|
* Fysiikkaenginen alkua
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/06/05 23:55:46 msell
|
||||||
|
* Pallo
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 20:33:29 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SPHERE_H_INCLUDED__
|
||||||
|
#define __SPHERE_H_INCLUDED__
|
||||||
|
|
||||||
|
#include "object.h"
|
||||||
|
#include "material.h"
|
||||||
|
#include "mesh.h"
|
||||||
|
|
||||||
|
|
||||||
|
class SphereAppearance;
|
||||||
|
|
||||||
|
//Object for sphere
|
||||||
|
|
||||||
|
class Sphere : public Object{
|
||||||
|
private:
|
||||||
|
float r;
|
||||||
|
SphereAppearance *appearance;
|
||||||
|
SphereShape *geometry;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Sphere(void);
|
||||||
|
|
||||||
|
void setRadius(float r);
|
||||||
|
void setColor(float red, float green, float blue);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//Appearance of sphere
|
||||||
|
|
||||||
|
class SphereAppearance : public Appearance{
|
||||||
|
private:
|
||||||
|
float r;
|
||||||
|
|
||||||
|
public:
|
||||||
|
SphereAppearance(void);
|
||||||
|
|
||||||
|
void setRadius(float r);
|
||||||
|
void draw(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//Geometry of sphere
|
||||||
|
|
||||||
|
class SphereShape : public Shape{
|
||||||
|
private:
|
||||||
|
float r;
|
||||||
|
|
||||||
|
public:
|
||||||
|
SphereShape(Object *sphere);
|
||||||
|
|
||||||
|
void setRadius(float r);
|
||||||
|
float getRadius(void);
|
||||||
|
|
||||||
|
float calculateMomentOfInertia(float *rotationvector);
|
||||||
|
|
||||||
|
bool checkCollision(Object *target);
|
||||||
|
|
||||||
|
bool checkCollisionPeer(SphereShape *target);
|
||||||
|
bool checkCollisionPeer(MeshShape *target);
|
||||||
|
|
||||||
|
friend class Sphere;
|
||||||
|
friend class MeshShape;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
127
src/texture.cpp
Normal file
|
@ -0,0 +1,127 @@
|
||||||
|
/*
|
||||||
|
* $Id: texture.cpp,v 1.7 2002/07/17 16:40:33 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: texture.cpp,v $
|
||||||
|
* Revision 1.7 2002/07/17 16:40:33 msell
|
||||||
|
* Resoluution vaihto
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/27 21:43:50 jkaarlas
|
||||||
|
* lisätty setId-funktio
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/20 15:27:48 jkaarlas
|
||||||
|
* bindtexture siirretty oikeaan paikkaan
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/20 00:21:01 jkaarlas
|
||||||
|
* materiaali- ja tekstuurihommia edistetty
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/19 22:45:29 jkaarlas
|
||||||
|
* nyt nämä menee järkevästi
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/15 22:04:01 jkaarlas
|
||||||
|
* tähänkin jotain sisältöä
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/17 16:40:33 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "texture.h"
|
||||||
|
#include "graphics.h"
|
||||||
|
|
||||||
|
Texture::Texture(void){
|
||||||
|
this->textureId = -1;
|
||||||
|
this->enabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Texture::~Texture(void){
|
||||||
|
if (textureId != -1){
|
||||||
|
DRUID.freeTexture(textureId);
|
||||||
|
textureId = -1;
|
||||||
|
enabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Texture::Texture(int id){
|
||||||
|
if (id > -1){
|
||||||
|
this->textureId = id;
|
||||||
|
this->enabled = false;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
this->textureId = -1;
|
||||||
|
this->enabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Texture::loadImage(char* path){
|
||||||
|
format = GL_RGB;
|
||||||
|
|
||||||
|
texture = IMG_Load(path);
|
||||||
|
|
||||||
|
//texture = SDL_DisplayFormatAlpha(texture);
|
||||||
|
|
||||||
|
this->textureId = DRUID.loadTexture(texture, -1);
|
||||||
|
//this->textureId = DRUID.loadTexture(path, -1);
|
||||||
|
this->enable();
|
||||||
|
return this->isValidId();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Texture::loadImage(char* path, float *trans){
|
||||||
|
format = GL_RGBA;
|
||||||
|
|
||||||
|
texture = IMG_Load(path);
|
||||||
|
|
||||||
|
Uint32 colorKey = SDL_MapRGB(texture->format,
|
||||||
|
(Uint8)(trans[0] * 255),
|
||||||
|
(Uint8)(trans[1] * 255),
|
||||||
|
(Uint8)(trans[2] * 255));
|
||||||
|
//SDL_SetAlpha(texture, 0, SDL_ALPHA_OPAQUE);
|
||||||
|
|
||||||
|
SDL_SetColorKey(texture, SDL_SRCCOLORKEY, colorKey);
|
||||||
|
|
||||||
|
//SDL_Surface* alphaSurface = SDL_DisplayFormatAlpha(texture);
|
||||||
|
texture = SDL_DisplayFormatAlpha(texture);
|
||||||
|
|
||||||
|
this->textureId = DRUID.loadTexture(texture, -1, format);
|
||||||
|
this->enable();
|
||||||
|
return this->isValidId();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Texture::reload(void){
|
||||||
|
this->textureId = DRUID.loadTexture(texture, -1, format);
|
||||||
|
this->enable();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Texture::disable(void){
|
||||||
|
this->enabled = false;
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Texture::enable(void){
|
||||||
|
if (textureId > -1){
|
||||||
|
this->enabled = true;
|
||||||
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, textureId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Texture::isEnabled(void){
|
||||||
|
return this->enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Texture::getId(void){
|
||||||
|
return this->textureId;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Texture::setId(int id){
|
||||||
|
if (id > -1){
|
||||||
|
this->textureId = id;
|
||||||
|
this->enable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Texture::isValidId(void){
|
||||||
|
return (this->textureId > -1);
|
||||||
|
}
|
67
src/texture.h
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* $Id: texture.h,v 1.8 2002/07/19 20:33:29 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: texture.h,v $
|
||||||
|
* Revision 1.8 2002/07/19 20:33:29 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/07/17 16:40:33 msell
|
||||||
|
* Resoluution vaihto
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/27 21:43:50 jkaarlas
|
||||||
|
* lisätty setId-funktio
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/20 00:21:01 jkaarlas
|
||||||
|
* materiaali- ja tekstuurihommia edistetty
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/19 22:45:29 jkaarlas
|
||||||
|
* nyt nämä menee järkevästi
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/15 22:52:32 jkaarlas
|
||||||
|
* tekstuurimanageri ja työkalupakki
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 20:33:29 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __TEXTURE_H_INCLUDED__
|
||||||
|
#define __TEXTURE_H_INCLUDED__
|
||||||
|
|
||||||
|
#include <SDL_image.h>
|
||||||
|
#include "main.h"
|
||||||
|
class Texture{
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Texture(void);
|
||||||
|
Texture(int id);
|
||||||
|
~Texture(void);
|
||||||
|
|
||||||
|
bool loadImage(char* path);
|
||||||
|
bool loadImage(char* path, float *trans);
|
||||||
|
void enable(void);
|
||||||
|
void disable(void);
|
||||||
|
bool isEnabled(void);
|
||||||
|
int getId(void);
|
||||||
|
void setId(int id);
|
||||||
|
bool isValidId(void);
|
||||||
|
void reload(void);
|
||||||
|
|
||||||
|
//int* getOGLTexture(void);
|
||||||
|
//int* getModifiableOGLTexture(void);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
int textureId;
|
||||||
|
//int* modTexture;
|
||||||
|
bool enabled;
|
||||||
|
|
||||||
|
SDL_Surface *texture;
|
||||||
|
int format;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
59
src/utils.cpp
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
/*
|
||||||
|
* $Id: utils.cpp,v 1.3 2002/07/14 21:40:43 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: utils.cpp,v $
|
||||||
|
* Revision 1.3 2002/07/14 21:40:43 msell
|
||||||
|
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/14 00:05:05 msell
|
||||||
|
* Törmäyssimulaatio kunnossa toivon mukaan
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/06/02 16:57:37 msell
|
||||||
|
* Objektirakenteen pohja
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/14 21:40:43 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
void swapInt(int *a, int *b){
|
||||||
|
int temp = *a;
|
||||||
|
*a = *b;
|
||||||
|
*b = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void swapFloat(float *a, float *b){
|
||||||
|
float temp = *a;
|
||||||
|
*a = *b;
|
||||||
|
*b = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
int random(int x){
|
||||||
|
return rand() * x / RAND_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
float randomf(float x){
|
||||||
|
return rand() * x / RAND_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
int smod(int val, int mod){
|
||||||
|
if (val>=0) return val%mod;
|
||||||
|
int temp=-val/mod+1;
|
||||||
|
return (val+temp*mod)%mod;
|
||||||
|
}
|
||||||
|
|
||||||
|
double sdes(double val){
|
||||||
|
if (val>=0) return val-(int)(val);
|
||||||
|
return val-(int)(val)+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
double sfmod(double val, double mod){
|
||||||
|
val-=(int)(val/mod)*mod;
|
||||||
|
if (val<0) val+=mod;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
45
src/utils.h
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* $Id: utils.h,v 1.6 2002/07/19 20:33:29 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: utils.h,v $
|
||||||
|
* Revision 1.6 2002/07/19 20:33:29 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/07/14 21:40:43 msell
|
||||||
|
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/14 00:05:05 msell
|
||||||
|
* Törmäyssimulaatio kunnossa toivon mukaan
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/04 16:28:32 msell
|
||||||
|
* #pragma once
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/03 23:06:38 msell
|
||||||
|
* no message
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/06/02 16:57:37 msell
|
||||||
|
* Objektirakenteen pohja
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 20:33:29 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __UTILS_H_INCLUDED__
|
||||||
|
#define __UTILS_H_INCLUDED__
|
||||||
|
|
||||||
|
|
||||||
|
#define PI 3.14159265358979323846
|
||||||
|
|
||||||
|
void swapInt(int *a, int *b);
|
||||||
|
void swapFloat(float *a, float *b);
|
||||||
|
int random(int x);
|
||||||
|
float randomf(float x);
|
||||||
|
int smod(int val, int mod);
|
||||||
|
double sdes(double val);
|
||||||
|
double sfmod(double val, double mod);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
308
src/vector.cpp
Normal file
|
@ -0,0 +1,308 @@
|
||||||
|
/*
|
||||||
|
* $Id: vector.cpp,v 1.7 2002/07/14 21:40:43 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: vector.cpp,v $
|
||||||
|
* Revision 1.7 2002/07/14 21:40:43 msell
|
||||||
|
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/07/04 21:05:41 msell
|
||||||
|
* Se toimii!! =)
|
||||||
|
* Törmäystarkistukset siis
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/27 00:08:04 msell
|
||||||
|
* Kimmotukset palloille myös pyöritettyihin mesheihin
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/23 20:12:19 msell
|
||||||
|
* Parempi törmäystarkistus palloista mesheihin
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/17 12:42:46 msell
|
||||||
|
* Hieman parempi törmäysmallinnus taas
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/11 23:23:03 msell
|
||||||
|
* Törmäystarkistusta
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/05/16 18:42:07 msell
|
||||||
|
* Vektorifunctioita ja kamera
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/14 21:40:43 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
#include "vector.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
void vectorSet(float *target, float x, float y, float z){
|
||||||
|
target[0] = x;
|
||||||
|
target[1] = y;
|
||||||
|
target[2] = z;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vectorCopy(float *target, float *source){
|
||||||
|
target[0] = source[0];
|
||||||
|
target[1] = source[1];
|
||||||
|
target[2] = source[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
void vectorAdd(float *target, float *source1, float *source2){
|
||||||
|
target[0] = source1[0] + source2[0];
|
||||||
|
target[1] = source1[1] + source2[1];
|
||||||
|
target[2] = source1[2] + source2[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
void vectorAdd(float *target, float *source){
|
||||||
|
target[0] += source[0];
|
||||||
|
target[1] += source[1];
|
||||||
|
target[2] += source[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
void vectorSub(float *target, float *source1, float *source2){
|
||||||
|
target[0] = source1[0] - source2[0];
|
||||||
|
target[1] = source1[1] - source2[1];
|
||||||
|
target[2] = source1[2] - source2[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
void vectorSub(float *target, float *source){
|
||||||
|
target[0] -= source[0];
|
||||||
|
target[1] -= source[1];
|
||||||
|
target[2] -= source[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
void vectorNegative(float *target, float *source){
|
||||||
|
target[0] = -source[0];
|
||||||
|
target[1] = -source[1];
|
||||||
|
target[2] = -source[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
void vectorNegative(float *target){
|
||||||
|
target[0] = -target[0];
|
||||||
|
target[1] = -target[1];
|
||||||
|
target[2] = -target[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
void vectorScale(float *target, float *source, float scale){
|
||||||
|
target[0] = source[0] * scale;
|
||||||
|
target[1] = source[1] * scale;
|
||||||
|
target[2] = source[2] * scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vectorScale(float *target, float scale){
|
||||||
|
target[0] *= scale;
|
||||||
|
target[1] *= scale;
|
||||||
|
target[2] *= scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
float vectorDot(float *source1, float *source2){
|
||||||
|
return source1[0]*source2[0] + source1[1]*source2[1] + source1[2]*source2[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
float vectorNormalizedDot(float *source1, float *source2){
|
||||||
|
return vectorDot(source1, source2) / (vectorLength(source1) * vectorLength(source2));
|
||||||
|
}
|
||||||
|
|
||||||
|
float vectorLength(float *source){
|
||||||
|
return sqrtf(vectorDot(source, source));
|
||||||
|
}
|
||||||
|
|
||||||
|
void vectorCross(float *target, float *source1, float *source2){
|
||||||
|
target[0] = source1[1]*source2[2] - source1[2]*source2[1];
|
||||||
|
target[1] = source1[2]*source2[0] - source1[0]*source2[2];
|
||||||
|
target[2] = source1[0]*source2[1] - source1[1]*source2[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
void vectorNormalize(float *target, float *source){
|
||||||
|
vectorScale(target, source, 1.0/vectorLength(source));
|
||||||
|
}
|
||||||
|
|
||||||
|
void vectorNormalize(float *target){
|
||||||
|
vectorScale(target, 1.0/vectorLength(target));
|
||||||
|
}
|
||||||
|
|
||||||
|
void vectorReflect(float *target, float *source, float *normal){
|
||||||
|
vectorCopy(target, normal);
|
||||||
|
vectorScale(target, -vectorDot(source, normal)*2);
|
||||||
|
vectorAdd(target, source);
|
||||||
|
}
|
||||||
|
|
||||||
|
void vectorProject(float *target, float *source1, float *source2){
|
||||||
|
vectorScale(target, source2, vectorDot(source1, source2) / vectorDot(source2, source2));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool vectorIsZero(float *vector){
|
||||||
|
if (vector[0] == 0 && vector[1] == 0 && vector[2] == 0) return true;
|
||||||
|
//if (vectorDot(vector, vector) < 0.00001) return true;
|
||||||
|
else return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vectorSaturate(float *target, float *source, float min, float max){
|
||||||
|
float len = vectorLength(source);
|
||||||
|
if (len < min){
|
||||||
|
len = min;
|
||||||
|
} else if (len > max){
|
||||||
|
len = max;
|
||||||
|
} else{
|
||||||
|
if (target != source) vectorCopy(target, source);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
vectorNormalize(target, source);
|
||||||
|
vectorScale(target, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
void vectorSaturate(float *vector, float min, float max){
|
||||||
|
vectorSaturate(vector, vector, min, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
void vectorMatrixMultiply(float *target, float *source, float *matrix){
|
||||||
|
float source2[3];
|
||||||
|
if (source == target){
|
||||||
|
vectorCopy(source2, source);
|
||||||
|
source = source2;
|
||||||
|
}
|
||||||
|
int x;
|
||||||
|
for (x = 0; x < 3; x++){
|
||||||
|
target[x] = source[0]*matrix[0+x] +
|
||||||
|
source[1]*matrix[3+x] +
|
||||||
|
source[2]*matrix[6+x];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void matrixSet(float *matrix,
|
||||||
|
float x1, float y1, float z1,
|
||||||
|
float x2, float y2, float z2,
|
||||||
|
float x3, float y3, float z3){
|
||||||
|
matrix[0] = x1;
|
||||||
|
matrix[1] = y1;
|
||||||
|
matrix[2] = z1;
|
||||||
|
matrix[3] = x2;
|
||||||
|
matrix[4] = y2;
|
||||||
|
matrix[5] = z2;
|
||||||
|
matrix[6] = x3;
|
||||||
|
matrix[7] = y3;
|
||||||
|
matrix[8] = z3;
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrixSet(float *matrix, float *r1, float *r2, float *r3){
|
||||||
|
vectorCopy(&matrix[0], r1);
|
||||||
|
vectorCopy(&matrix[3], r2);
|
||||||
|
vectorCopy(&matrix[6], r3);
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrixCopy(float *target, float *source){
|
||||||
|
target[0] = source[0];
|
||||||
|
target[1] = source[1];
|
||||||
|
target[2] = source[2];
|
||||||
|
target[3] = source[3];
|
||||||
|
target[4] = source[4];
|
||||||
|
target[5] = source[5];
|
||||||
|
target[6] = source[6];
|
||||||
|
target[7] = source[7];
|
||||||
|
target[8] = source[8];
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrixIdentity(float *matrix){
|
||||||
|
matrixSet(matrix, 1, 0, 0, 0, 1, 0, 0, 0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrixAdd(float *target, float *source1, float *source2){
|
||||||
|
target[0] = source1[0] + source2[0];
|
||||||
|
target[1] = source1[1] + source2[1];
|
||||||
|
target[2] = source1[2] + source2[2];
|
||||||
|
target[3] = source1[3] + source2[3];
|
||||||
|
target[4] = source1[4] + source2[4];
|
||||||
|
target[5] = source1[5] + source2[5];
|
||||||
|
target[6] = source1[6] + source2[6];
|
||||||
|
target[7] = source1[7] + source2[7];
|
||||||
|
target[8] = source1[8] + source2[8];
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrixAdd(float *target, float *source){
|
||||||
|
target[0] += source[0];
|
||||||
|
target[1] += source[1];
|
||||||
|
target[2] += source[2];
|
||||||
|
target[3] += source[3];
|
||||||
|
target[4] += source[4];
|
||||||
|
target[5] += source[5];
|
||||||
|
target[6] += source[6];
|
||||||
|
target[7] += source[7];
|
||||||
|
target[8] += source[8];
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrixMultiply(float *target, float *source1, float *source2){
|
||||||
|
float target2[9];
|
||||||
|
float *oldtarget = target;
|
||||||
|
bool copy = false;
|
||||||
|
if (source1 == target || source2 == target){
|
||||||
|
copy = true;
|
||||||
|
target = target2;
|
||||||
|
}
|
||||||
|
int x, y;
|
||||||
|
for (y = 0; y < 3; y++){
|
||||||
|
for (x = 0; x < 3; x++){
|
||||||
|
*target = source1[y*3+0]*source2[x] +
|
||||||
|
source1[y*3+1]*source2[3+x] +
|
||||||
|
source1[y*3+2]*source2[6+x];
|
||||||
|
target++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (copy){
|
||||||
|
matrixCopy(oldtarget, target2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*void matrixMultiply(float *target, float *source){
|
||||||
|
matrixMultiply(target, source, source);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
/*void matrixRotate(float *matrix, float *vector){
|
||||||
|
float rotmat[9];
|
||||||
|
createRotationMatrix(rotmat, vector);
|
||||||
|
matrixMultiply(matrix, matrix, rotmat);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
void matrixCreateRotation(float *matrix, float *vector){
|
||||||
|
float angle = vectorLength(vector);
|
||||||
|
float n[3];
|
||||||
|
vectorNormalize(n, vector);
|
||||||
|
|
||||||
|
float c = cos(angle);
|
||||||
|
float s = sin(angle);
|
||||||
|
float t = 1 - c;
|
||||||
|
|
||||||
|
float x = n[0];
|
||||||
|
float y = n[1];
|
||||||
|
float z = n[2];
|
||||||
|
|
||||||
|
matrixSet(matrix,
|
||||||
|
t*x*x + c, t*y*x + s*z, t*z*x - s*y,
|
||||||
|
t*x*y - s*z, t*y*y + c, t*z*y + s*x,
|
||||||
|
t*x*z + s*y, t*y*z - s*x, t*z*z + c);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrixTranspose(float *target, float *source){
|
||||||
|
target[0] = source[0]; target[1] = source[3]; target[2] = source[6];
|
||||||
|
target[3] = source[1]; target[4] = source[4]; target[5] = source[7];
|
||||||
|
target[6] = source[2]; target[7] = source[5]; target[8] = source[8];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*void rotatePointAroundVector(float *target, float *point, float *vector){
|
||||||
|
float angle = vectorLength(vector);
|
||||||
|
float n[3];
|
||||||
|
vectorNormalize(n, vector);
|
||||||
|
|
||||||
|
float c = cos(angle);
|
||||||
|
float s = sin(angle);
|
||||||
|
float t = 1 - c;
|
||||||
|
|
||||||
|
//r' = r*c + n*(n . r)*t + (r x n)*s
|
||||||
|
}*/
|
||||||
|
|
85
src/vector.h
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
/*
|
||||||
|
* $Id: vector.h,v 1.8 2002/07/19 20:33:29 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: vector.h,v $
|
||||||
|
* Revision 1.8 2002/07/19 20:33:29 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/07/14 21:40:43 msell
|
||||||
|
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/06/27 00:08:04 msell
|
||||||
|
* Kimmotukset palloille myös pyöritettyihin mesheihin
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/06/23 20:12:19 msell
|
||||||
|
* Parempi törmäystarkistus palloista mesheihin
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/06/17 12:42:46 msell
|
||||||
|
* Hieman parempi törmäysmallinnus taas
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/06/11 23:23:03 msell
|
||||||
|
* Törmäystarkistusta
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/06/04 16:28:32 msell
|
||||||
|
* #pragma once
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/05/16 18:42:07 msell
|
||||||
|
* Vektorifunctioita ja kamera
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 20:33:29 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __VECTOR_H_INCLUDED__
|
||||||
|
#define __VECTOR_H_INCLUDED__
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
void vectorSet(float *target, float x, float y, float z);
|
||||||
|
void vectorCopy(float *target, float *source);
|
||||||
|
void vectorAdd(float *target, float *source1, float *source2);
|
||||||
|
void vectorAdd(float *target, float *source);
|
||||||
|
void vectorSub(float *target, float *source);
|
||||||
|
void vectorSub(float *target, float *source1, float *source2);
|
||||||
|
void vectorNegative(float *target, float *source);
|
||||||
|
void vectorNegative(float *target);
|
||||||
|
void vectorScale(float *target, float *source, float scale);
|
||||||
|
void vectorScale(float *target, float scale);
|
||||||
|
float vectorDot(float *source1, float *source2);
|
||||||
|
float vectorNormalizedDot(float *source1, float *source2);
|
||||||
|
float vectorLength(float *source);
|
||||||
|
void vectorCross(float *target, float *source1, float *source2);
|
||||||
|
void vectorNormalize(float *target, float *source);
|
||||||
|
void vectorNormalize(float *target);
|
||||||
|
void vectorReflect(float *target, float *source, float *normal);
|
||||||
|
bool vectorIsZero(float *vector);
|
||||||
|
void vectorSaturate(float *target, float *source, float min, float max);
|
||||||
|
void vectorSaturate(float *vector, float min, float max);
|
||||||
|
|
||||||
|
//Projects vector source1 onto vector source2
|
||||||
|
void vectorProject(float *target, float *source1, float *source2);
|
||||||
|
|
||||||
|
void vectorMatrixMultiply(float *target, float *source, float *matrix);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void matrixSet(float *matrix,
|
||||||
|
float x1, float y1, float z1,
|
||||||
|
float x2, float y2, float z2,
|
||||||
|
float x3, float y3, float z3);
|
||||||
|
void matrixSet(float *matrix, float *r1, float *r2, float *r3);
|
||||||
|
void matrixCopy(float *target, float *source);
|
||||||
|
void matrixIdentity(float *matrix);
|
||||||
|
void matrixAdd(float *target, float *source1, float *source2);
|
||||||
|
void matrixAdd(float *target, float *source);
|
||||||
|
void matrixMultiply(float *target, float *source1, float *source2);
|
||||||
|
//void matrixMultiply(float *target, float *source);
|
||||||
|
void matrixRotate(float *matrix, float *vector);
|
||||||
|
void matrixCreateRotation(float *matrix, float *vector);
|
||||||
|
void matrixTranspose(float *target, float *source);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
250
src/world.cpp
Normal file
|
@ -0,0 +1,250 @@
|
||||||
|
/*
|
||||||
|
* $Id: world.cpp,v 1.9 2002/07/18 23:05:31 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: world.cpp,v $
|
||||||
|
* Revision 1.9 2002/07/18 23:05:31 msell
|
||||||
|
* Partikkelit ja kakkospelaajan liike
|
||||||
|
*
|
||||||
|
* Revision 1.8 2002/07/15 20:32:36 msell
|
||||||
|
* Uudet valot ja ulkoasun parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.7 2002/07/15 15:22:08 msell
|
||||||
|
* Parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.6 2002/07/14 21:40:43 msell
|
||||||
|
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/07/10 17:13:44 msell
|
||||||
|
* Törmäystarkastelun parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/07/08 18:28:47 msell
|
||||||
|
* Törmäystä ja ukkoja
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/07/07 23:05:22 msell
|
||||||
|
* Osien liimaaminen toisiinsa (kesken)
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/07/07 15:29:07 msell
|
||||||
|
* Törmäyksien parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/07/04 21:05:41 msell
|
||||||
|
* Se toimii!! =)
|
||||||
|
* Törmäystarkistukset siis
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/18 23:05:31 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "world.h"
|
||||||
|
|
||||||
|
#include "object.h"
|
||||||
|
#include "collision.h"
|
||||||
|
#include "vector.h"
|
||||||
|
|
||||||
|
World::World(void){
|
||||||
|
childlist = NULL;
|
||||||
|
linklist = NULL;
|
||||||
|
maxparticles = 500;
|
||||||
|
particles = new Particle *[maxparticles];
|
||||||
|
particlecount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void World::prepare(void){
|
||||||
|
objectlist *node = childlist;
|
||||||
|
childcount = 0;
|
||||||
|
while (node != NULL){
|
||||||
|
Object *child = node->object;
|
||||||
|
child->prepare();
|
||||||
|
node = node->next;
|
||||||
|
childcount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
childs = new Object *[childcount];
|
||||||
|
node = childlist;
|
||||||
|
int i = 0;
|
||||||
|
while (node != NULL){
|
||||||
|
Object *child = node->object;
|
||||||
|
childs[i] = child;
|
||||||
|
node = node->next;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
contacts = new Contact[MAXCONTACTS];//childcount*childcount];
|
||||||
|
}
|
||||||
|
|
||||||
|
#define GRAVITY 9.81
|
||||||
|
//#define GRAVITY 15
|
||||||
|
|
||||||
|
void World::move(void){
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
|
||||||
|
//Gravity
|
||||||
|
float gravity[3];
|
||||||
|
vectorSet(gravity, 0, 0, 0);
|
||||||
|
for (i = 0; i < childcount; i++){
|
||||||
|
Object *object = childs[i];
|
||||||
|
if (object->gravity){
|
||||||
|
gravity[1] = -object->getMass()*GRAVITY;
|
||||||
|
object->addExternalForce(gravity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*for (i = 0; i < particlecount; i++){
|
||||||
|
Particle *object = particles[i];
|
||||||
|
if (object->gravity){
|
||||||
|
gravity[1] = -object->getMass()*GRAVITY;
|
||||||
|
object->addExternalForce(gravity);
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
//Collisions
|
||||||
|
contactcount = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < childcount; i++){
|
||||||
|
Object *object1 = childs[i];
|
||||||
|
int group1 = object1->getCollisionGroup();
|
||||||
|
for (j = i+1; j < childcount; j++){
|
||||||
|
Object *object2 = childs[j];
|
||||||
|
int group2 = object2->getCollisionGroup();
|
||||||
|
|
||||||
|
if (isCollisionLink(group1, group2)){
|
||||||
|
object2->geometry->checkCollision(object1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*for (i = 0; i < particlecount; i++){
|
||||||
|
Particle *object1 = particles[i];
|
||||||
|
int group1 = object1->getCollisionGroup();
|
||||||
|
for (j = 0; j < childcount; j++){
|
||||||
|
Object *object2 = childs[j];
|
||||||
|
int group2 = object2->getCollisionGroup();
|
||||||
|
|
||||||
|
if (isCollisionLink(group1, group2)){
|
||||||
|
object2->geometry->checkCollision(object1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
//printf("Contacts: %i\n", contactcount);
|
||||||
|
|
||||||
|
|
||||||
|
bool contactresponse;
|
||||||
|
|
||||||
|
j = 0;
|
||||||
|
do{
|
||||||
|
contactresponse = false;
|
||||||
|
|
||||||
|
//Links between objects
|
||||||
|
objectlinklist *node = linklist;
|
||||||
|
while (node != NULL){
|
||||||
|
ObjectLink *link = node->link;
|
||||||
|
if (handleLink(link)) contactresponse = true;
|
||||||
|
node = node->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Collision contact
|
||||||
|
for (i = 0; i < contactcount; i++){
|
||||||
|
Contact *contact = &contacts[i];
|
||||||
|
if (handleCollision(contact)) contactresponse = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
j++;
|
||||||
|
} while (contactresponse && j < 10);
|
||||||
|
|
||||||
|
/*j = 0;
|
||||||
|
do{
|
||||||
|
contactresponse = false;
|
||||||
|
|
||||||
|
//Collision contact
|
||||||
|
for (i = 0; i < contactcount; i++){
|
||||||
|
Contact *contact = &contacts[i];
|
||||||
|
if (handleCollision(contact)) contactresponse = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
j++;
|
||||||
|
} while (contactresponse && j < 10);*/
|
||||||
|
|
||||||
|
/*j = 0;
|
||||||
|
do{
|
||||||
|
contactresponse = false;
|
||||||
|
|
||||||
|
//Links between objects
|
||||||
|
objectlinklist *node = linklist;
|
||||||
|
while (node != NULL){
|
||||||
|
ObjectLink *link = node->link;
|
||||||
|
if (handleLink(link)) contactresponse = true;
|
||||||
|
node = node->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
j++;
|
||||||
|
} while (contactresponse && j < 3);*/
|
||||||
|
|
||||||
|
|
||||||
|
for (i = 0; i < childcount; i++){
|
||||||
|
childs[i]->move();
|
||||||
|
}
|
||||||
|
for (i = 0; i < particlecount; i++){
|
||||||
|
particles[i]->move();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void World::draw(void){
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < childcount; i++) childs[i]->draw();
|
||||||
|
for (i = 0; i < particlecount; i++) particles[i]->draw();
|
||||||
|
}
|
||||||
|
|
||||||
|
void World::addChild(Object *child){
|
||||||
|
objectlist *node = new objectlist;
|
||||||
|
node->object = child;
|
||||||
|
node->next = childlist;
|
||||||
|
childlist = node;
|
||||||
|
}
|
||||||
|
|
||||||
|
void World::addParticle(Particle *particle){
|
||||||
|
if (particlecount < maxparticles){
|
||||||
|
particles[particlecount++] = particle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void World::removeParticle(Particle *particle){
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < particlecount; i++){
|
||||||
|
if (particles[i] == particle){
|
||||||
|
particles[i] = particles[particlecount-1];
|
||||||
|
particlecount--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ObjectLink *World::addLink(Object *object1, Object *object2, float *point){
|
||||||
|
ObjectLink *link = new ObjectLink();
|
||||||
|
link->object1 = object1;
|
||||||
|
link->object2 = object2;
|
||||||
|
if (point != NULL){
|
||||||
|
object1->unTransformPoint(link->point1, point);
|
||||||
|
object2->unTransformPoint(link->point2, point);
|
||||||
|
link->enabled = true;
|
||||||
|
} else{
|
||||||
|
link->enabled = false;
|
||||||
|
}
|
||||||
|
objectlinklist *node = new objectlinklist;
|
||||||
|
node->link = link;
|
||||||
|
node->next = linklist;
|
||||||
|
linklist = node;
|
||||||
|
return link;
|
||||||
|
}
|
||||||
|
|
||||||
|
void World::renewLink(ObjectLink *link, float *point){
|
||||||
|
link->object1->unTransformPoint(link->point1, point);
|
||||||
|
link->object2->unTransformPoint(link->point2, point);
|
||||||
|
link->enabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
86
src/world.h
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
/*
|
||||||
|
* $Id: world.h,v 1.6 2002/07/19 20:33:29 msell Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Log: world.h,v $
|
||||||
|
* Revision 1.6 2002/07/19 20:33:29 msell
|
||||||
|
* #pragma once -> #ifndef
|
||||||
|
*
|
||||||
|
* Revision 1.5 2002/07/18 23:05:31 msell
|
||||||
|
* Partikkelit ja kakkospelaajan liike
|
||||||
|
*
|
||||||
|
* Revision 1.4 2002/07/15 15:22:08 msell
|
||||||
|
* Parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.3 2002/07/10 17:13:44 msell
|
||||||
|
* Törmäystarkastelun parantelua
|
||||||
|
*
|
||||||
|
* Revision 1.2 2002/07/07 23:05:22 msell
|
||||||
|
* Osien liimaaminen toisiinsa (kesken)
|
||||||
|
*
|
||||||
|
* Revision 1.1 2002/07/04 21:05:41 msell
|
||||||
|
* Se toimii!! =)
|
||||||
|
* Törmäystarkistukset siis
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Date: 2002/07/19 20:33:29 $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __WORLD_H_INCLUDED__
|
||||||
|
#define __WORLD_H_INCLUDED__
|
||||||
|
|
||||||
|
class World;
|
||||||
|
class ObjectLink;
|
||||||
|
|
||||||
|
#include "object.h"
|
||||||
|
#include "particle.h"
|
||||||
|
|
||||||
|
class ObjectLink{
|
||||||
|
public:
|
||||||
|
Object *object1, *object2;
|
||||||
|
float point1[3], point2[3];
|
||||||
|
bool enabled;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct objectlinklist{
|
||||||
|
ObjectLink *link;
|
||||||
|
objectlinklist *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define MAXCONTACTS 100
|
||||||
|
|
||||||
|
class World{
|
||||||
|
private:
|
||||||
|
objectlist *childlist;
|
||||||
|
|
||||||
|
int childcount;
|
||||||
|
Object **childs;
|
||||||
|
|
||||||
|
|
||||||
|
int particlecount;
|
||||||
|
int maxparticles;
|
||||||
|
Particle **particles;
|
||||||
|
|
||||||
|
|
||||||
|
objectlinklist *linklist;
|
||||||
|
public:
|
||||||
|
World(void);
|
||||||
|
|
||||||
|
void prepare(void);
|
||||||
|
void move(void);
|
||||||
|
void draw(void);
|
||||||
|
|
||||||
|
void addChild(Object *child);
|
||||||
|
|
||||||
|
void addParticle(Particle *particle);
|
||||||
|
void removeParticle(Particle *particle);
|
||||||
|
|
||||||
|
//Point is world-relative
|
||||||
|
ObjectLink *addLink(Object *object1, Object *object2, float *point);
|
||||||
|
void renewLink(ObjectLink *link, float *point);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|