mirror of
https://github.com/id-Software/Quake.git
synced 2026-03-19 16:39:38 +01:00
The Quake sources as originally release under the GPL license on December 21, 1999
This commit is contained in:
69
WinQuake/3dfx.txt
Normal file
69
WinQuake/3dfx.txt
Normal file
@@ -0,0 +1,69 @@
|
||||
GLQuake Drivers
|
||||
|
||||
Graphics Subsystem: Voodoo Graphics or Voodoo Rush
|
||||
|
||||
Copyright ( 1997 3Dfx Interactive, Inc. )
|
||||
All Rights Reserved
|
||||
|
||||
3Dfx Interactive, Inc.
|
||||
www: www.3dfx.com
|
||||
news: news.3dfx.com
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
NOTE: GLQuake requires DirectX support DirectSound. DirectX can be
|
||||
installed from the media provided with your Voodoo Based 3D Accelerator.
|
||||
|
||||
Glide 2.31 or HIGHER runtime drivers *MUST* be installed to use this
|
||||
GLQuake driver. Please download these drivers from your board
|
||||
manufacturer OR unsupported drivers from http://www.3dfx.com
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
Release Notes for GLQuake's mini-GL driver
|
||||
|
||||
What's in the distribution?
|
||||
---------------------------
|
||||
|
||||
This distribution contains GLQuake Drivers for Voodoo Based 3D
|
||||
Accelerators. These drivers were tested on the following boards:
|
||||
|
||||
Voodoo Graphics:
|
||||
- Quantum 3D Obsidian
|
||||
- Diamond Monster 3D
|
||||
- Orchid Righteous 3D
|
||||
- Deltron Realvision Flash 3D
|
||||
- Guillemot MaxiGamer
|
||||
- Skywell Magic 3D
|
||||
|
||||
Voodoo Rush:
|
||||
- Hercules Stringray 128-3D
|
||||
- Intergraph Intense 3D Voodoo
|
||||
- Jazz Multimedia Adrenaline Rush
|
||||
|
||||
NOTE: The enclosed drivers are not meant to replace any Direct3D or
|
||||
Glide drivers provided by your Voodoo Graphics card manufacturer.
|
||||
Please obtain supported drivers from your board manufacturer.
|
||||
|
||||
OEMSR2 and NT users: Do NOT replace OPENGL32.DLL located in your
|
||||
Windows\SYSTEM directory.
|
||||
|
||||
Requirements
|
||||
------------
|
||||
|
||||
- Voodoo Graphics or Voodoo Rush Based 3D Accelerator
|
||||
- Windows 95 (Windows NT is supported for Voodoo Rush)
|
||||
- A PC with a Pentium 90 or higher CPU
|
||||
- 16MB of RAM
|
||||
- 2D Video card set at 16 bit color
|
||||
|
||||
Support and Frequently Asked Questions
|
||||
--------------------------------------
|
||||
|
||||
GLQuake is currently unsupported. You may however find answers to
|
||||
questions on various Quake dedicated websites. 3Dfx provides a GLQuake
|
||||
newsgroup on news.3dfx.com (Newsgroup name is 3dfx.games.glquake ) to
|
||||
discuss GLQuake with other users. 3Dfx also provides a regularly
|
||||
updated GLQuake FAQ at: http://www.3dfx.com/game_dev/quake_faq.html
|
||||
|
||||
|
||||
Voodoo Graphics and Voodoo Rush are trademarks of 3Dfx Interactive, Inc.
|
||||
All other trademarks are the property of their respective owners.
|
||||
483
WinQuake/Makefile.Solaris
Normal file
483
WinQuake/Makefile.Solaris
Normal file
@@ -0,0 +1,483 @@
|
||||
#
|
||||
# Quake Makefile for Solaris
|
||||
#
|
||||
# Nov '97 by Zoid <zoid@idsoftware.com>
|
||||
#
|
||||
# ELF only
|
||||
#
|
||||
|
||||
VERSION=1.09
|
||||
|
||||
ifneq (,$(findstring i86pc,$(shell uname -m)))
|
||||
ARCH=i386
|
||||
else
|
||||
ARCH=sparc
|
||||
endif
|
||||
|
||||
MOUNT_DIR=/grog/Projects/WinQuake
|
||||
|
||||
BUILD_DEBUG_DIR=debug$(ARCH)
|
||||
BUILD_RELEASE_DIR=release$(ARCH)
|
||||
|
||||
CC=gcc
|
||||
BASE_CFLAGS=-I/usr/openwin/include
|
||||
|
||||
RELEASE_CFLAGS=$(BASE_CFLAGS) -O6 -ffast-math -funroll-loops -fomit-frame-pointer -fexpensive-optimizations
|
||||
DEBUG_CFLAGS=$(BASE_CFLAGS) -g
|
||||
LDFLAGS=-R /usr/openwin/lib -L /usr/openwin/lib -lm -lX11 -lXext -lsocket -lnsl -lthread -ldl
|
||||
XIL_LDFLAGS=-L /opt/SUNWits/Graphics-sw/xil/lib -R /opt/SUNWits/Graphics-sw/xil/lib:/usr/openwin/lib -L /usr/openwin/lib -lm -lxil -lX11 -lXext -lsocket -lnsl -lthread -ldl
|
||||
|
||||
DO_CC=$(CC) $(CFLAGS) -o $@ -c $<
|
||||
DO_AS=$(CC) $(CFLAGS) -DELF -x assembler-with-cpp -o $@ -c $<
|
||||
|
||||
#############################################################################
|
||||
# SETUP AND BUILD
|
||||
#############################################################################
|
||||
|
||||
TARGETS=$(BUILDDIR)/quake.sw $(BUILDDIR)/quake.xil
|
||||
|
||||
build_debug:
|
||||
@-mkdir $(BUILD_DEBUG_DIR)
|
||||
$(MAKE) targets BUILDDIR=$(BUILD_DEBUG_DIR) CFLAGS="$(DEBUG_CFLAGS)"
|
||||
|
||||
build_release:
|
||||
@-mkdir $(BUILD_RELEASE_DIR)
|
||||
$(MAKE) targets BUILDDIR=$(BUILD_RELEASE_DIR) CFLAGS="$(RELEASE_CFLAGS)"
|
||||
|
||||
all: build_debug build_release
|
||||
|
||||
targets: $(TARGETS)
|
||||
|
||||
#############################################################################
|
||||
# CLIENT/SERVER
|
||||
#############################################################################
|
||||
|
||||
QUAKE_OBJS= \
|
||||
$(BUILDDIR)/chase.o \
|
||||
$(BUILDDIR)/cl_demo.o \
|
||||
$(BUILDDIR)/cl_input.o \
|
||||
$(BUILDDIR)/cl_main.o \
|
||||
$(BUILDDIR)/cl_parse.o \
|
||||
$(BUILDDIR)/cl_tent.o \
|
||||
$(BUILDDIR)/cmd.o \
|
||||
$(BUILDDIR)/common.o \
|
||||
$(BUILDDIR)/console.o \
|
||||
$(BUILDDIR)/crc.o \
|
||||
$(BUILDDIR)/cvar.o \
|
||||
$(BUILDDIR)/draw.o \
|
||||
$(BUILDDIR)/d_edge.o \
|
||||
$(BUILDDIR)/d_fill.o \
|
||||
$(BUILDDIR)/d_init.o \
|
||||
$(BUILDDIR)/d_modech.o \
|
||||
$(BUILDDIR)/d_part.o \
|
||||
$(BUILDDIR)/d_polyse.o \
|
||||
$(BUILDDIR)/d_scan.o \
|
||||
$(BUILDDIR)/d_sky.o \
|
||||
$(BUILDDIR)/d_sprite.o \
|
||||
$(BUILDDIR)/d_surf.o \
|
||||
$(BUILDDIR)/d_vars.o \
|
||||
$(BUILDDIR)/d_zpoint.o \
|
||||
$(BUILDDIR)/host.o \
|
||||
$(BUILDDIR)/host_cmd.o \
|
||||
$(BUILDDIR)/keys.o \
|
||||
$(BUILDDIR)/menu.o \
|
||||
$(BUILDDIR)/mathlib.o \
|
||||
$(BUILDDIR)/model.o \
|
||||
$(BUILDDIR)/nonintel.o \
|
||||
$(BUILDDIR)/pr_cmds.o \
|
||||
$(BUILDDIR)/pr_edict.o \
|
||||
$(BUILDDIR)/pr_exec.o \
|
||||
$(BUILDDIR)/r_aclip.o \
|
||||
$(BUILDDIR)/r_alias.o \
|
||||
$(BUILDDIR)/r_bsp.o \
|
||||
$(BUILDDIR)/r_light.o \
|
||||
$(BUILDDIR)/r_draw.o \
|
||||
$(BUILDDIR)/r_efrag.o \
|
||||
$(BUILDDIR)/r_edge.o \
|
||||
$(BUILDDIR)/r_misc.o \
|
||||
$(BUILDDIR)/r_main.o \
|
||||
$(BUILDDIR)/r_sky.o \
|
||||
$(BUILDDIR)/r_sprite.o \
|
||||
$(BUILDDIR)/r_surf.o \
|
||||
$(BUILDDIR)/r_part.o \
|
||||
$(BUILDDIR)/r_vars.o \
|
||||
$(BUILDDIR)/screen.o \
|
||||
$(BUILDDIR)/sbar.o \
|
||||
$(BUILDDIR)/sv_main.o \
|
||||
$(BUILDDIR)/sv_phys.o \
|
||||
$(BUILDDIR)/sv_move.o \
|
||||
$(BUILDDIR)/sv_user.o \
|
||||
$(BUILDDIR)/zone.o \
|
||||
$(BUILDDIR)/view.o \
|
||||
$(BUILDDIR)/wad.o \
|
||||
$(BUILDDIR)/world.o \
|
||||
$(BUILDDIR)/cd_null.o \
|
||||
$(BUILDDIR)/snd_dma.o \
|
||||
$(BUILDDIR)/snd_mix.o \
|
||||
$(BUILDDIR)/snd_mem.o \
|
||||
$(BUILDDIR)/net_dgrm.o \
|
||||
$(BUILDDIR)/net_loop.o \
|
||||
$(BUILDDIR)/net_main.o \
|
||||
$(BUILDDIR)/net_vcr.o \
|
||||
$(BUILDDIR)/net_udp.o \
|
||||
$(BUILDDIR)/net_bsd.o \
|
||||
$(BUILDDIR)/sys_sun.o \
|
||||
$(BUILDDIR)/snd_sun.o
|
||||
|
||||
QUAKE_AS_OBJS= \
|
||||
$(BUILDDIR)/d_copy.o \
|
||||
$(BUILDDIR)/d_draw.o \
|
||||
$(BUILDDIR)/d_draw16.o \
|
||||
$(BUILDDIR)/d_parta.o \
|
||||
$(BUILDDIR)/d_polysa.o \
|
||||
$(BUILDDIR)/d_scana.o \
|
||||
$(BUILDDIR)/d_spr8.o \
|
||||
$(BUILDDIR)/d_varsa.o \
|
||||
$(BUILDDIR)/math.o \
|
||||
$(BUILDDIR)/r_aliasa.o \
|
||||
$(BUILDDIR)/r_drawa.o \
|
||||
$(BUILDDIR)/r_edgea.o \
|
||||
$(BUILDDIR)/r_varsa.o \
|
||||
$(BUILDDIR)/surf16.o \
|
||||
$(BUILDDIR)/surf8.o \
|
||||
$(BUILDDIR)/worlda.o \
|
||||
$(BUILDDIR)/r_aclipa.o \
|
||||
$(BUILDDIR)/snd_mixa.o \
|
||||
$(BUILDDIR)/sys_dosa.o
|
||||
|
||||
QUAKE_X_OBJS = $(BUILDDIR)/vid_sunx.o
|
||||
|
||||
QUAKE_XIL_OBJS = $(BUILDDIR)/vid_sunxil.o
|
||||
|
||||
ifeq ($(ARCH),i386)
|
||||
$(BUILDDIR)/quake.sw : $(QUAKE_OBJS) $(QUAKE_AS_OBJS) $(QUAKE_X_OBJS)
|
||||
$(CC) -o $(@) $(QUAKE_OBJS) $(QUAKE_AS_OBJS) $(QUAKE_X_OBJS) $(LDFLAGS)
|
||||
|
||||
$(BUILDDIR)/quake.xil: $(QUAKE_OBJS) $(QUAKE_AS_OBJS) $(QUAKE_XIL_OBJS)
|
||||
$(CC) -o $(@) $(QUAKE_OBJS) $(QUAKE_AS_OBJS) $(QUAKE_XIL_OBJS) $(XIL_LDFLAGS)
|
||||
else
|
||||
$(BUILDDIR)/quake.sw : $(QUAKE_OBJS) $(QUAKE_X_OBJS)
|
||||
$(CC) -o $(@) $(QUAKE_OBJS) $(QUAKE_X_OBJS) $(LDFLAGS)
|
||||
|
||||
$(BUILDDIR)/quake.xil: $(QUAKE_OBJS) $(QUAKE_XIL_OBJS)
|
||||
$(CC) -o $(@) $(QUAKE_OBJS) $(QUAKE_XIL_OBJS) $(XIL_LDFLAGS)
|
||||
endif
|
||||
|
||||
##
|
||||
|
||||
$(BUILDDIR)/chase.o : $(MOUNT_DIR)/chase.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/cl_demo.o : $(MOUNT_DIR)/cl_demo.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/cl_input.o : $(MOUNT_DIR)/cl_input.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/cl_main.o : $(MOUNT_DIR)/cl_main.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/cl_parse.o : $(MOUNT_DIR)/cl_parse.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/cl_tent.o : $(MOUNT_DIR)/cl_tent.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/cmd.o : $(MOUNT_DIR)/cmd.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/common.o : $(MOUNT_DIR)/common.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/console.o : $(MOUNT_DIR)/console.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/crc.o : $(MOUNT_DIR)/crc.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/cvar.o : $(MOUNT_DIR)/cvar.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/draw.o : $(MOUNT_DIR)/draw.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/d_edge.o : $(MOUNT_DIR)/d_edge.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/d_fill.o : $(MOUNT_DIR)/d_fill.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/d_init.o : $(MOUNT_DIR)/d_init.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/d_modech.o : $(MOUNT_DIR)/d_modech.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/d_part.o : $(MOUNT_DIR)/d_part.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/d_polyse.o : $(MOUNT_DIR)/d_polyse.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/d_scan.o : $(MOUNT_DIR)/d_scan.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/d_sky.o : $(MOUNT_DIR)/d_sky.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/d_sprite.o : $(MOUNT_DIR)/d_sprite.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/d_surf.o : $(MOUNT_DIR)/d_surf.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/d_vars.o : $(MOUNT_DIR)/d_vars.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/d_zpoint.o : $(MOUNT_DIR)/d_zpoint.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/host.o : $(MOUNT_DIR)/host.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/host_cmd.o : $(MOUNT_DIR)/host_cmd.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/keys.o : $(MOUNT_DIR)/keys.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/menu.o : $(MOUNT_DIR)/menu.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/mathlib.o : $(MOUNT_DIR)/mathlib.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/model.o : $(MOUNT_DIR)/model.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/nonintel.o : $(MOUNT_DIR)/nonintel.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/pr_cmds.o : $(MOUNT_DIR)/pr_cmds.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/pr_edict.o : $(MOUNT_DIR)/pr_edict.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/pr_exec.o : $(MOUNT_DIR)/pr_exec.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/r_aclip.o : $(MOUNT_DIR)/r_aclip.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/r_alias.o : $(MOUNT_DIR)/r_alias.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/r_bsp.o : $(MOUNT_DIR)/r_bsp.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/r_light.o : $(MOUNT_DIR)/r_light.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/r_draw.o : $(MOUNT_DIR)/r_draw.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/r_efrag.o : $(MOUNT_DIR)/r_efrag.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/r_edge.o : $(MOUNT_DIR)/r_edge.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/r_misc.o : $(MOUNT_DIR)/r_misc.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/r_main.o : $(MOUNT_DIR)/r_main.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/r_sky.o : $(MOUNT_DIR)/r_sky.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/r_sprite.o : $(MOUNT_DIR)/r_sprite.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/r_surf.o : $(MOUNT_DIR)/r_surf.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/r_part.o : $(MOUNT_DIR)/r_part.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/r_vars.o : $(MOUNT_DIR)/r_vars.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/screen.o : $(MOUNT_DIR)/screen.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/sbar.o : $(MOUNT_DIR)/sbar.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/sv_main.o : $(MOUNT_DIR)/sv_main.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/sv_phys.o : $(MOUNT_DIR)/sv_phys.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/sv_move.o : $(MOUNT_DIR)/sv_move.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/sv_user.o : $(MOUNT_DIR)/sv_user.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/zone.o : $(MOUNT_DIR)/zone.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/view.o : $(MOUNT_DIR)/view.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/wad.o : $(MOUNT_DIR)/wad.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/world.o : $(MOUNT_DIR)/world.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/cd_null.o : $(MOUNT_DIR)/cd_null.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/snd_dma.o : $(MOUNT_DIR)/snd_dma.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/snd_mix.o : $(MOUNT_DIR)/snd_mix.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/snd_mem.o : $(MOUNT_DIR)/snd_mem.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/net_dgrm.o : $(MOUNT_DIR)/net_dgrm.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/net_loop.o : $(MOUNT_DIR)/net_loop.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/net_main.o : $(MOUNT_DIR)/net_main.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/net_vcr.o : $(MOUNT_DIR)/net_vcr.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/net_udp.o : $(MOUNT_DIR)/net_udp.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/net_bsd.o : $(MOUNT_DIR)/net_bsd.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/sys_sun.o : $(MOUNT_DIR)/sys_sun.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/snd_sun.o : $(MOUNT_DIR)/snd_sun.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/in_sun.o : $(MOUNT_DIR)/in_sun.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/vid_sunx.o : $(MOUNT_DIR)/vid_sunx.c
|
||||
$(DO_CC)
|
||||
|
||||
$(BUILDDIR)/vid_sunxil.o : $(MOUNT_DIR)/vid_sunxil.c
|
||||
$(DO_CC)
|
||||
|
||||
#####
|
||||
|
||||
$(BUILDDIR)/d_copy.o : $(MOUNT_DIR)/d_copy.s
|
||||
$(DO_AS)
|
||||
|
||||
$(BUILDDIR)/d_draw.o : $(MOUNT_DIR)/d_draw.s
|
||||
$(DO_AS)
|
||||
|
||||
$(BUILDDIR)/d_draw16.o : $(MOUNT_DIR)/d_draw16.s
|
||||
$(DO_AS)
|
||||
|
||||
$(BUILDDIR)/d_parta.o : $(MOUNT_DIR)/d_parta.s
|
||||
$(DO_AS)
|
||||
|
||||
$(BUILDDIR)/d_polysa.o : $(MOUNT_DIR)/d_polysa.s
|
||||
$(DO_AS)
|
||||
|
||||
$(BUILDDIR)/d_scana.o : $(MOUNT_DIR)/d_scana.s
|
||||
$(DO_AS)
|
||||
|
||||
$(BUILDDIR)/d_spr8.o : $(MOUNT_DIR)/d_spr8.s
|
||||
$(DO_AS)
|
||||
|
||||
$(BUILDDIR)/d_varsa.o : $(MOUNT_DIR)/d_varsa.s
|
||||
$(DO_AS)
|
||||
|
||||
$(BUILDDIR)/math.o : $(MOUNT_DIR)/math.s
|
||||
$(DO_AS)
|
||||
|
||||
$(BUILDDIR)/r_aliasa.o : $(MOUNT_DIR)/r_aliasa.s
|
||||
$(DO_AS)
|
||||
|
||||
$(BUILDDIR)/r_drawa.o : $(MOUNT_DIR)/r_drawa.s
|
||||
$(DO_AS)
|
||||
|
||||
$(BUILDDIR)/r_edgea.o : $(MOUNT_DIR)/r_edgea.s
|
||||
$(DO_AS)
|
||||
|
||||
$(BUILDDIR)/r_varsa.o : $(MOUNT_DIR)/r_varsa.s
|
||||
$(DO_AS)
|
||||
|
||||
$(BUILDDIR)/surf16.o : $(MOUNT_DIR)/surf16.s
|
||||
$(DO_AS)
|
||||
|
||||
$(BUILDDIR)/surf8.o : $(MOUNT_DIR)/surf8.s
|
||||
$(DO_AS)
|
||||
|
||||
$(BUILDDIR)/worlda.o : $(MOUNT_DIR)/worlda.s
|
||||
$(DO_AS)
|
||||
|
||||
$(BUILDDIR)/r_aclipa.o : $(MOUNT_DIR)/r_aclipa.s
|
||||
$(DO_AS)
|
||||
|
||||
$(BUILDDIR)/snd_mixa.o : $(MOUNT_DIR)/snd_mixa.s
|
||||
$(DO_AS)
|
||||
|
||||
$(BUILDDIR)/sys_dosa.o : $(MOUNT_DIR)/sys_dosa.s
|
||||
$(DO_AS)
|
||||
|
||||
#############################################################################
|
||||
# TAR
|
||||
#############################################################################
|
||||
|
||||
# Make RPMs. You need to be root to make this work
|
||||
RPMDIR = /var/tmp/quake-$(VERSION)
|
||||
|
||||
tar:
|
||||
if [ ! -d archives ];then mkdir archives;fi
|
||||
$(MAKE) copyfiles COPYDIR=$(RPMDIR)
|
||||
cd $(RPMDIR); tar cvf q2ded-$(VERSION)-$(ARCH)-sun-solaris2.5.1.tar *
|
||||
cd $(RPMDIR); compress q2ded-$(VERSION)-$(ARCH)-sun-solaris2.5.1.tar
|
||||
mv $(RPMDIR)/*.tar.Z archives/.
|
||||
rm -rf $(RPMDIR)
|
||||
|
||||
copyfiles:
|
||||
-mkdirhier $(COPYDIR)
|
||||
cp $(BUILD_RELEASE_DIR)/quake.sw $(COPYDIR)
|
||||
cp $(BUILD_RELEASE_DIR)/quake.xil $(COPYDIR)
|
||||
strip $(COPYDIR)/quake
|
||||
strip $(COPYDIR)/quake.xil
|
||||
cp $(MOUNT_DIR)/README.Solaris $(COPYDIR)/README.Solaris
|
||||
|
||||
#############################################################################
|
||||
# MISC
|
||||
#############################################################################
|
||||
|
||||
clean: clean-debug clean-release
|
||||
|
||||
clean-debug:
|
||||
$(MAKE) clean2 BUILDDIR=$(BUILD_DEBUG_DIR) CFLAGS="$(DEBUG_CFLAGS)"
|
||||
|
||||
clean-release:
|
||||
$(MAKE) clean2 BUILDDIR=$(BUILD_RELEASE_DIR) CFLAGS="$(DEBUG_CFLAGS)"
|
||||
|
||||
clean2:
|
||||
-rm -f $(QUAKE_OBJS) $(QUAKE_X_OBJS) $(QUAKE_XIL_OBJS)
|
||||
|
||||
1240
WinQuake/Makefile.linuxi386
Normal file
1240
WinQuake/Makefile.linuxi386
Normal file
File diff suppressed because it is too large
Load Diff
98
WinQuake/README.Solaris
Normal file
98
WinQuake/README.Solaris
Normal file
@@ -0,0 +1,98 @@
|
||||
Solaris 2 Quake / QuakeWorld
|
||||
----------------------------
|
||||
|
||||
This is an UNSUPPORTED version of Quake and QuakeWorld. Don't
|
||||
bother id software about it. Bug reports will be ignored.
|
||||
|
||||
PORT DETAILS
|
||||
------------
|
||||
|
||||
There are a few major difference between this port and the
|
||||
vanilla Quake/QuakeWorld available on the internet. For
|
||||
optimum performance, you should copy everything to a directory
|
||||
on your local system before starting play so that you are
|
||||
not mounting files from a remote filesystem.
|
||||
|
||||
In order to use this program, you need the files pak0.pak
|
||||
and pak1.pak in the id1 directory found on a registered copy of
|
||||
Quake. You can ftp them to your Solaris host from a Windows95
|
||||
machine for example. The files must be in an id1 subdirectory from
|
||||
the directory you install Quake/QuakeWorld, and all file names must
|
||||
be lowercase. Add on packages such as ThreeWave CTF work fine as
|
||||
well, just place such addon packages in their own directory as you
|
||||
would on a Windows95 installation. But again, make sure all files
|
||||
are lowercase.
|
||||
|
||||
COMMAND LINE FLAGS:
|
||||
|
||||
+pixel_multiply
|
||||
|
||||
You can magnify the screen by using this flag:
|
||||
|
||||
Ex: % quake +pixel_multiply 2
|
||||
|
||||
You can also use this command (without the dash)
|
||||
from the Quake console. pixel_multiply is a Quake
|
||||
cvar and is saved from session to session in the
|
||||
config.cfg file.
|
||||
|
||||
-winsize <width> <height>
|
||||
|
||||
Set the size of the window when you start
|
||||
|
||||
-count_frames
|
||||
|
||||
See how many frames per second you're getting
|
||||
|
||||
GAME SETTINGS
|
||||
|
||||
mouse binding
|
||||
|
||||
You can bind and unbind the mouse to the Quake window
|
||||
by using the Use Mouse selection in the Options menu,
|
||||
or with the "_windowed_mouse" command in the console,
|
||||
ex "_windowed_mouse 1" Now, moving the mouse will move
|
||||
your player. Use "_windowed_mouse 0" to unbind. You
|
||||
can bind or alias this to a key.
|
||||
|
||||
Example command:
|
||||
|
||||
% quake.xil +pixel_multiply 2 -winsize 400 300
|
||||
|
||||
WHAT IS "QUAKEWORLD" AND HOW DO I USE IT?
|
||||
-----------------------------------------
|
||||
|
||||
In a nutshell, QuakeWorld is an extension of Quake that is
|
||||
much more user friendly. It allows the user to dynamically
|
||||
download changes from the server, such as new maps and new
|
||||
weapons while inside the Quake client. It is not directly
|
||||
compatible with Quake (ie, you can't connect to a Quake server
|
||||
from a QuakeWorld client) but in general it is superior to
|
||||
Quake. QuakeWorld also offers much smoother play over the
|
||||
Internet by using client prediction. For more information,
|
||||
check out http://www.quakeworld.net/.
|
||||
|
||||
In order to use it, you must make a copy of the "qw"
|
||||
directory. Any new stuff that is downloaded from a QuakeWorld
|
||||
server will be stored in this directory. All regular Quake
|
||||
flags apply so you can use the same command line as before.
|
||||
|
||||
Example command:
|
||||
|
||||
% qwcl.xil +pixel_multiply 2 -winsize 400 300
|
||||
|
||||
WHERE CAN I FIND OUT ABOUT...
|
||||
-----------------------------
|
||||
|
||||
If you've got questions about Quake, rest assured that there
|
||||
are answers out there. Try checking out these web sites:
|
||||
|
||||
http://www.planetquake.com/
|
||||
http://www.stomped.com/
|
||||
http://www.quakeworld.net/
|
||||
|
||||
If all else fails use a search engine.
|
||||
|
||||
Happy fragging,
|
||||
the Quake/Solaris team
|
||||
|
||||
2240
WinQuake/WinQuake.dsp
Normal file
2240
WinQuake/WinQuake.dsp
Normal file
File diff suppressed because it is too large
Load Diff
44
WinQuake/WinQuake.dsw
Normal file
44
WinQuake/WinQuake.dsw
Normal file
@@ -0,0 +1,44 @@
|
||||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "gas2masm"=.\gas2masm\gas2masm.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "winquake"=.\WinQuake.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name gas2masm
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
BIN
WinQuake/WinQuake.mdp
Normal file
BIN
WinQuake/WinQuake.mdp
Normal file
Binary file not shown.
BIN
WinQuake/WinQuake.ncb
Normal file
BIN
WinQuake/WinQuake.ncb
Normal file
Binary file not shown.
BIN
WinQuake/WinQuake.opt
Normal file
BIN
WinQuake/WinQuake.opt
Normal file
Binary file not shown.
595
WinQuake/WinQuake.plg
Normal file
595
WinQuake/WinQuake.plg
Normal file
@@ -0,0 +1,595 @@
|
||||
<html>
|
||||
<body>
|
||||
<pre>
|
||||
<h1>Build Log</h1>
|
||||
<h3>
|
||||
--------------------Configuration: winquake - Win32 Release--------------------
|
||||
</h3>
|
||||
<h3>Command Lines</h3>
|
||||
Creating temporary file "C:\TEMP\RSP74A.bat" with contents
|
||||
[
|
||||
@echo off
|
||||
cl /EP > .\Release\worlda.spp .\worlda.s
|
||||
gas2masm\debug\gas2masm < .\Release\worlda.spp > .\Release\worlda.asm
|
||||
ml /c /Cp /coff /Fo.\Release\worlda.obj /Zm /Zi .\Release\worlda.asm
|
||||
del .\Release\worlda.spp
|
||||
]
|
||||
Creating command line "C:\TEMP\RSP74A.bat"
|
||||
Creating temporary file "C:\TEMP\RSP74B.bat" with contents
|
||||
[
|
||||
@echo off
|
||||
cl /EP > .\Release\sys_wina.spp .\sys_wina.s
|
||||
gas2masm\debug\gas2masm < .\Release\sys_wina.spp > .\Release\sys_wina.asm
|
||||
ml /c /Cp /coff /Fo.\Release\sys_wina.obj /Zm /Zi .\Release\sys_wina.asm
|
||||
del .\Release\sys_wina.spp
|
||||
]
|
||||
Creating command line "C:\TEMP\RSP74B.bat"
|
||||
Creating temporary file "C:\TEMP\RSP74C.bat" with contents
|
||||
[
|
||||
@echo off
|
||||
cl /EP > .\Release\surf8.spp .\surf8.s
|
||||
gas2masm\debug\gas2masm < .\Release\surf8.spp > .\Release\surf8.asm
|
||||
ml /c /Cp /coff /Fo.\Release\surf8.obj /Zm /Zi .\Release\surf8.asm
|
||||
del .\Release\surf8.spp
|
||||
]
|
||||
Creating command line "C:\TEMP\RSP74C.bat"
|
||||
Creating temporary file "C:\TEMP\RSP74D.bat" with contents
|
||||
[
|
||||
@echo off
|
||||
cl /EP > .\Release\surf16.spp .\surf16.s
|
||||
gas2masm\debug\gas2masm < .\Release\surf16.spp > .\Release\surf16.asm
|
||||
ml /c /Cp /coff /Fo.\Release\surf16.obj /Zm /Zi .\Release\surf16.asm
|
||||
del .\Release\surf16.spp
|
||||
]
|
||||
Creating command line "C:\TEMP\RSP74D.bat"
|
||||
Creating temporary file "C:\TEMP\RSP74E.bat" with contents
|
||||
[
|
||||
@echo off
|
||||
cl /EP > .\Release\snd_mixa.spp .\snd_mixa.s
|
||||
gas2masm\debug\gas2masm < .\Release\snd_mixa.spp > .\Release\snd_mixa.asm
|
||||
ml /c /Cp /coff /Fo.\Release\snd_mixa.obj /Zm /Zi .\Release\snd_mixa.asm
|
||||
del .\Release\snd_mixa.spp
|
||||
]
|
||||
Creating command line "C:\TEMP\RSP74E.bat"
|
||||
Creating temporary file "C:\TEMP\RSP74F.bat" with contents
|
||||
[
|
||||
@echo off
|
||||
cl /EP > .\Release\r_varsa.spp .\r_varsa.s
|
||||
gas2masm\debug\gas2masm < .\Release\r_varsa.spp > .\Release\r_varsa.asm
|
||||
ml /c /Cp /coff /Fo.\Release\r_varsa.obj /Zm /Zi .\Release\r_varsa.asm
|
||||
del .\Release\r_varsa.spp
|
||||
]
|
||||
Creating command line "C:\TEMP\RSP74F.bat"
|
||||
Creating temporary file "C:\TEMP\RSP750.bat" with contents
|
||||
[
|
||||
@echo off
|
||||
cl /EP > .\Release\r_edgea.spp .\r_edgea.s
|
||||
gas2masm\debug\gas2masm < .\Release\r_edgea.spp > .\Release\r_edgea.asm
|
||||
ml /c /Cp /coff /Fo.\Release\r_edgea.obj /Zm /Zi .\Release\r_edgea.asm
|
||||
del .\Release\r_edgea.spp
|
||||
]
|
||||
Creating command line "C:\TEMP\RSP750.bat"
|
||||
Creating temporary file "C:\TEMP\RSP751.bat" with contents
|
||||
[
|
||||
@echo off
|
||||
cl /EP > .\Release\r_drawa.spp .\r_drawa.s
|
||||
gas2masm\debug\gas2masm < .\Release\r_drawa.spp > .\Release\r_drawa.asm
|
||||
ml /c /Cp /coff /Fo.\Release\r_drawa.obj /Zm /Zi .\Release\r_drawa.asm
|
||||
del .\Release\r_drawa.spp
|
||||
]
|
||||
Creating command line "C:\TEMP\RSP751.bat"
|
||||
Creating temporary file "C:\TEMP\RSP752.bat" with contents
|
||||
[
|
||||
@echo off
|
||||
cl /EP > .\Release\r_aliasa.spp .\r_aliasa.s
|
||||
gas2masm\debug\gas2masm < .\Release\r_aliasa.spp > .\Release\r_aliasa.asm
|
||||
ml /c /Cp /coff /Fo.\Release\r_aliasa.obj /Zm /Zi .\Release\r_aliasa.asm
|
||||
del .\Release\r_aliasa.spp
|
||||
]
|
||||
Creating command line "C:\TEMP\RSP752.bat"
|
||||
Creating temporary file "C:\TEMP\RSP753.bat" with contents
|
||||
[
|
||||
@echo off
|
||||
cl /EP > .\Release\r_aclipa.spp .\r_aclipa.s
|
||||
gas2masm\debug\gas2masm < .\Release\r_aclipa.spp > .\Release\r_aclipa.asm
|
||||
ml /c /Cp /coff /Fo.\Release\r_aclipa.obj /Zm /Zi .\Release\r_aclipa.asm
|
||||
del .\Release\r_aclipa.spp
|
||||
]
|
||||
Creating command line "C:\TEMP\RSP753.bat"
|
||||
Creating temporary file "C:\TEMP\RSP754.bat" with contents
|
||||
[
|
||||
@echo off
|
||||
cl /EP > .\Release\math.spp .\math.s
|
||||
gas2masm\debug\gas2masm < .\Release\math.spp > .\Release\math.asm
|
||||
ml /c /Cp /coff /Fo.\Release\math.obj /Zm /Zi .\Release\math.asm
|
||||
del .\Release\math.spp
|
||||
]
|
||||
Creating command line "C:\TEMP\RSP754.bat"
|
||||
Creating temporary file "C:\TEMP\RSP755.bat" with contents
|
||||
[
|
||||
@echo off
|
||||
cl /EP > .\Release\d_varsa.spp .\d_varsa.s
|
||||
gas2masm\debug\gas2masm < .\Release\d_varsa.spp > .\Release\d_varsa.asm
|
||||
ml /c /Cp /coff /Fo.\Release\d_varsa.obj /Zm /Zi .\Release\d_varsa.asm
|
||||
del .\Release\d_varsa.spp
|
||||
]
|
||||
Creating command line "C:\TEMP\RSP755.bat"
|
||||
Creating temporary file "C:\TEMP\RSP756.bat" with contents
|
||||
[
|
||||
@echo off
|
||||
cl /EP > .\Release\d_spr8.spp .\d_spr8.s
|
||||
gas2masm\debug\gas2masm < .\Release\d_spr8.spp > .\Release\d_spr8.asm
|
||||
ml /c /Cp /coff /Fo.\Release\d_spr8.obj /Zm /Zi .\Release\d_spr8.asm
|
||||
del .\Release\d_spr8.spp
|
||||
]
|
||||
Creating command line "C:\TEMP\RSP756.bat"
|
||||
Creating temporary file "C:\TEMP\RSP757.bat" with contents
|
||||
[
|
||||
@echo off
|
||||
cl /EP > .\Release\d_scana.spp .\d_scana.s
|
||||
gas2masm\debug\gas2masm < .\Release\d_scana.spp > .\Release\d_scana.asm
|
||||
ml /c /Cp /coff /Fo.\Release\d_scana.obj /Zm /Zi .\Release\d_scana.asm
|
||||
del .\Release\d_scana.spp
|
||||
]
|
||||
Creating command line "C:\TEMP\RSP757.bat"
|
||||
Creating temporary file "C:\TEMP\RSP758.bat" with contents
|
||||
[
|
||||
@echo off
|
||||
cl /EP > .\Release\d_polysa.spp .\d_polysa.s
|
||||
gas2masm\debug\gas2masm < .\Release\d_polysa.spp > .\Release\d_polysa.asm
|
||||
ml /c /Cp /coff /Fo.\Release\d_polysa.obj /Zm /Zi .\Release\d_polysa.asm
|
||||
del .\Release\d_polysa.spp
|
||||
]
|
||||
Creating command line "C:\TEMP\RSP758.bat"
|
||||
Creating temporary file "C:\TEMP\RSP759.bat" with contents
|
||||
[
|
||||
@echo off
|
||||
cl /EP > .\Release\d_parta.spp .\d_parta.s
|
||||
gas2masm\debug\gas2masm < .\Release\d_parta.spp > .\Release\d_parta.asm
|
||||
ml /c /Cp /coff /Fo.\Release\d_parta.obj /Zm /Zi .\Release\d_parta.asm
|
||||
del .\Release\d_parta.spp
|
||||
]
|
||||
Creating command line "C:\TEMP\RSP759.bat"
|
||||
Creating temporary file "C:\TEMP\RSP75A.bat" with contents
|
||||
[
|
||||
@echo off
|
||||
cl /EP > .\Release\d_draw16.spp .\d_draw16.s
|
||||
gas2masm\debug\gas2masm < .\Release\d_draw16.spp > .\Release\d_draw16.asm
|
||||
ml /c /Cp /coff /Fo.\Release\d_draw16.obj /Zm /Zi .\Release\d_draw16.asm
|
||||
del .\Release\d_draw16.spp
|
||||
]
|
||||
Creating command line "C:\TEMP\RSP75A.bat"
|
||||
Creating temporary file "C:\TEMP\RSP75B.bat" with contents
|
||||
[
|
||||
@echo off
|
||||
cl /EP > .\Release\d_draw.spp .\d_draw.s
|
||||
gas2masm\debug\gas2masm < .\Release\d_draw.spp > .\Release\d_draw.asm
|
||||
ml /c /Cp /coff /Fo.\Release\d_draw.obj /Zm /Zi .\Release\d_draw.asm
|
||||
del .\Release\d_draw.spp
|
||||
]
|
||||
Creating command line "C:\TEMP\RSP75B.bat"
|
||||
Creating command line "rc.exe /l 0x409 /fo".\Release/winquake.res" /d "NDEBUG" "D:\Work\quake source\WinQuake\winquake.rc""
|
||||
mycoolbuild
|
||||
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
|
||||
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
|
||||
|
||||
worlda.s
|
||||
Microsoft (R) Macro Assembler Version 6.11
|
||||
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.
|
||||
|
||||
Assembling: .\Release\worlda.asm
|
||||
mycoolbuild
|
||||
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
|
||||
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
|
||||
|
||||
sys_wina.s
|
||||
Microsoft (R) Macro Assembler Version 6.11
|
||||
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.
|
||||
|
||||
Assembling: .\Release\sys_wina.asm
|
||||
mycoolbuild
|
||||
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
|
||||
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
|
||||
|
||||
surf8.s
|
||||
Microsoft (R) Macro Assembler Version 6.11
|
||||
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.
|
||||
|
||||
Assembling: .\Release\surf8.asm
|
||||
mycoolbuild
|
||||
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
|
||||
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
|
||||
|
||||
surf16.s
|
||||
Microsoft (R) Macro Assembler Version 6.11
|
||||
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.
|
||||
|
||||
Assembling: .\Release\surf16.asm
|
||||
mycoolbuild
|
||||
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
|
||||
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
|
||||
|
||||
snd_mixa.s
|
||||
Microsoft (R) Macro Assembler Version 6.11
|
||||
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.
|
||||
|
||||
Assembling: .\Release\snd_mixa.asm
|
||||
mycoolbuild
|
||||
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
|
||||
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
|
||||
|
||||
r_varsa.s
|
||||
Microsoft (R) Macro Assembler Version 6.11
|
||||
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.
|
||||
|
||||
Assembling: .\Release\r_varsa.asm
|
||||
mycoolbuild
|
||||
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
|
||||
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
|
||||
|
||||
r_edgea.s
|
||||
Microsoft (R) Macro Assembler Version 6.11
|
||||
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.
|
||||
|
||||
Assembling: .\Release\r_edgea.asm
|
||||
mycoolbuild
|
||||
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
|
||||
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
|
||||
|
||||
r_drawa.s
|
||||
Microsoft (R) Macro Assembler Version 6.11
|
||||
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.
|
||||
|
||||
Assembling: .\Release\r_drawa.asm
|
||||
mycoolbuild
|
||||
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
|
||||
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
|
||||
|
||||
r_aliasa.s
|
||||
Microsoft (R) Macro Assembler Version 6.11
|
||||
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.
|
||||
|
||||
Assembling: .\Release\r_aliasa.asm
|
||||
mycoolbuild
|
||||
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
|
||||
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
|
||||
|
||||
r_aclipa.s
|
||||
Microsoft (R) Macro Assembler Version 6.11
|
||||
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.
|
||||
|
||||
Assembling: .\Release\r_aclipa.asm
|
||||
mycoolbuild
|
||||
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
|
||||
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
|
||||
|
||||
math.s
|
||||
Microsoft (R) Macro Assembler Version 6.11
|
||||
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.
|
||||
|
||||
Assembling: .\Release\math.asm
|
||||
mycoolbuild
|
||||
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
|
||||
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
|
||||
|
||||
d_varsa.s
|
||||
Microsoft (R) Macro Assembler Version 6.11
|
||||
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.
|
||||
|
||||
Assembling: .\Release\d_varsa.asm
|
||||
mycoolbuild
|
||||
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
|
||||
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
|
||||
|
||||
d_spr8.s
|
||||
Microsoft (R) Macro Assembler Version 6.11
|
||||
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.
|
||||
|
||||
Assembling: .\Release\d_spr8.asm
|
||||
mycoolbuild
|
||||
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
|
||||
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
|
||||
|
||||
d_scana.s
|
||||
Microsoft (R) Macro Assembler Version 6.11
|
||||
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.
|
||||
|
||||
Assembling: .\Release\d_scana.asm
|
||||
mycoolbuild
|
||||
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
|
||||
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
|
||||
|
||||
d_polysa.s
|
||||
Microsoft (R) Macro Assembler Version 6.11
|
||||
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.
|
||||
|
||||
Assembling: .\Release\d_polysa.asm
|
||||
mycoolbuild
|
||||
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
|
||||
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
|
||||
|
||||
d_parta.s
|
||||
Microsoft (R) Macro Assembler Version 6.11
|
||||
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.
|
||||
|
||||
Assembling: .\Release\d_parta.asm
|
||||
mycoolbuild
|
||||
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
|
||||
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
|
||||
|
||||
d_draw16.s
|
||||
Microsoft (R) Macro Assembler Version 6.11
|
||||
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.
|
||||
|
||||
Assembling: .\Release\d_draw16.asm
|
||||
mycoolbuild
|
||||
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
|
||||
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
|
||||
|
||||
d_draw.s
|
||||
Microsoft (R) Macro Assembler Version 6.11
|
||||
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.
|
||||
|
||||
Assembling: .\Release\d_draw.asm
|
||||
Creating temporary file "C:\TEMP\RSP75C.tmp" with contents
|
||||
[
|
||||
/nologo /G5 /ML /GX /Ox /Ot /Ow /I ".\scitech\include" /I ".\dxsdk\sdk\inc" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR".\Release/" /Fp".\Release/WinQuake.pch" /YX /Fo".\Release/" /Fd".\Release/" /FD /c
|
||||
"D:\Work\quake source\WinQuake\cd_win.c"
|
||||
"D:\Work\quake source\WinQuake\chase.c"
|
||||
"D:\Work\quake source\WinQuake\cl_demo.c"
|
||||
"D:\Work\quake source\WinQuake\cl_input.c"
|
||||
"D:\Work\quake source\WinQuake\cl_main.c"
|
||||
"D:\Work\quake source\WinQuake\cl_parse.c"
|
||||
"D:\Work\quake source\WinQuake\cl_tent.c"
|
||||
"D:\Work\quake source\WinQuake\cmd.c"
|
||||
"D:\Work\quake source\WinQuake\common.c"
|
||||
"D:\Work\quake source\WinQuake\conproc.c"
|
||||
"D:\Work\quake source\WinQuake\console.c"
|
||||
"D:\Work\quake source\WinQuake\crc.c"
|
||||
"D:\Work\quake source\WinQuake\cvar.c"
|
||||
"D:\Work\quake source\WinQuake\d_edge.c"
|
||||
"D:\Work\quake source\WinQuake\d_fill.c"
|
||||
"D:\Work\quake source\WinQuake\d_init.c"
|
||||
"D:\Work\quake source\WinQuake\d_modech.c"
|
||||
"D:\Work\quake source\WinQuake\d_part.c"
|
||||
"D:\Work\quake source\WinQuake\d_polyse.c"
|
||||
"D:\Work\quake source\WinQuake\d_scan.c"
|
||||
"D:\Work\quake source\WinQuake\d_sky.c"
|
||||
"D:\Work\quake source\WinQuake\d_sprite.c"
|
||||
"D:\Work\quake source\WinQuake\d_surf.c"
|
||||
"D:\Work\quake source\WinQuake\d_vars.c"
|
||||
"D:\Work\quake source\WinQuake\d_zpoint.c"
|
||||
"D:\Work\quake source\WinQuake\draw.c"
|
||||
"D:\Work\quake source\WinQuake\host.c"
|
||||
"D:\Work\quake source\WinQuake\host_cmd.c"
|
||||
"D:\Work\quake source\WinQuake\in_win.c"
|
||||
"D:\Work\quake source\WinQuake\keys.c"
|
||||
"D:\Work\quake source\WinQuake\mathlib.c"
|
||||
"D:\Work\quake source\WinQuake\menu.c"
|
||||
"D:\Work\quake source\WinQuake\model.c"
|
||||
"D:\Work\quake source\WinQuake\net_dgrm.c"
|
||||
"D:\Work\quake source\WinQuake\net_loop.c"
|
||||
"D:\Work\quake source\WinQuake\net_main.c"
|
||||
"D:\Work\quake source\WinQuake\net_vcr.c"
|
||||
"D:\Work\quake source\WinQuake\net_win.c"
|
||||
"D:\Work\quake source\WinQuake\net_wins.c"
|
||||
"D:\Work\quake source\WinQuake\net_wipx.c"
|
||||
"D:\Work\quake source\WinQuake\pr_cmds.c"
|
||||
"D:\Work\quake source\WinQuake\pr_edict.c"
|
||||
"D:\Work\quake source\WinQuake\pr_exec.c"
|
||||
"D:\Work\quake source\WinQuake\r_aclip.c"
|
||||
"D:\Work\quake source\WinQuake\r_alias.c"
|
||||
"D:\Work\quake source\WinQuake\r_bsp.c"
|
||||
"D:\Work\quake source\WinQuake\r_draw.c"
|
||||
"D:\Work\quake source\WinQuake\r_edge.c"
|
||||
"D:\Work\quake source\WinQuake\r_efrag.c"
|
||||
"D:\Work\quake source\WinQuake\r_light.c"
|
||||
"D:\Work\quake source\WinQuake\r_main.c"
|
||||
"D:\Work\quake source\WinQuake\r_misc.c"
|
||||
"D:\Work\quake source\WinQuake\r_part.c"
|
||||
"D:\Work\quake source\WinQuake\r_sky.c"
|
||||
"D:\Work\quake source\WinQuake\r_sprite.c"
|
||||
"D:\Work\quake source\WinQuake\r_surf.c"
|
||||
"D:\Work\quake source\WinQuake\r_vars.c"
|
||||
"D:\Work\quake source\WinQuake\sbar.c"
|
||||
"D:\Work\quake source\WinQuake\screen.c"
|
||||
"D:\Work\quake source\WinQuake\snd_dma.c"
|
||||
"D:\Work\quake source\WinQuake\snd_mem.c"
|
||||
"D:\Work\quake source\WinQuake\snd_mix.c"
|
||||
"D:\Work\quake source\WinQuake\snd_win.c"
|
||||
"D:\Work\quake source\WinQuake\sv_main.c"
|
||||
"D:\Work\quake source\WinQuake\sv_move.c"
|
||||
"D:\Work\quake source\WinQuake\sv_phys.c"
|
||||
"D:\Work\quake source\WinQuake\sv_user.c"
|
||||
"D:\Work\quake source\WinQuake\sys_win.c"
|
||||
"D:\Work\quake source\WinQuake\vid_win.c"
|
||||
"D:\Work\quake source\WinQuake\view.c"
|
||||
"D:\Work\quake source\WinQuake\wad.c"
|
||||
"D:\Work\quake source\WinQuake\world.c"
|
||||
"D:\Work\quake source\WinQuake\zone.c"
|
||||
]
|
||||
Creating command line "cl.exe @C:\TEMP\RSP75C.tmp"
|
||||
Creating temporary file "C:\TEMP\RSP75D.tmp" with contents
|
||||
[
|
||||
.\dxsdk\sdk\lib\dxguid.lib .\scitech\lib\win32\vc\mgllt.lib winmm.lib wsock32.lib opengl32.lib glu32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /profile /machine:I386 /out:".\Release/WinQuake.exe"
|
||||
".\Release\cd_win.obj"
|
||||
".\Release\chase.obj"
|
||||
".\Release\cl_demo.obj"
|
||||
".\Release\cl_input.obj"
|
||||
".\Release\cl_main.obj"
|
||||
".\Release\cl_parse.obj"
|
||||
".\Release\cl_tent.obj"
|
||||
".\Release\cmd.obj"
|
||||
".\Release\common.obj"
|
||||
".\Release\conproc.obj"
|
||||
".\Release\console.obj"
|
||||
".\Release\crc.obj"
|
||||
".\Release\cvar.obj"
|
||||
".\Release\d_edge.obj"
|
||||
".\Release\d_fill.obj"
|
||||
".\Release\d_init.obj"
|
||||
".\Release\d_modech.obj"
|
||||
".\Release\d_part.obj"
|
||||
".\Release\d_polyse.obj"
|
||||
".\Release\d_scan.obj"
|
||||
".\Release\d_sky.obj"
|
||||
".\Release\d_sprite.obj"
|
||||
".\Release\d_surf.obj"
|
||||
".\Release\d_vars.obj"
|
||||
".\Release\d_zpoint.obj"
|
||||
".\Release\draw.obj"
|
||||
".\Release\host.obj"
|
||||
".\Release\host_cmd.obj"
|
||||
".\Release\in_win.obj"
|
||||
".\Release\keys.obj"
|
||||
".\Release\mathlib.obj"
|
||||
".\Release\menu.obj"
|
||||
".\Release\model.obj"
|
||||
".\Release\net_dgrm.obj"
|
||||
".\Release\net_loop.obj"
|
||||
".\Release\net_main.obj"
|
||||
".\Release\net_vcr.obj"
|
||||
".\Release\net_win.obj"
|
||||
".\Release\net_wins.obj"
|
||||
".\Release\net_wipx.obj"
|
||||
".\Release\pr_cmds.obj"
|
||||
".\Release\pr_edict.obj"
|
||||
".\Release\pr_exec.obj"
|
||||
".\Release\r_aclip.obj"
|
||||
".\Release\r_alias.obj"
|
||||
".\Release\r_bsp.obj"
|
||||
".\Release\r_draw.obj"
|
||||
".\Release\r_edge.obj"
|
||||
".\Release\r_efrag.obj"
|
||||
".\Release\r_light.obj"
|
||||
".\Release\r_main.obj"
|
||||
".\Release\r_misc.obj"
|
||||
".\Release\r_part.obj"
|
||||
".\Release\r_sky.obj"
|
||||
".\Release\r_sprite.obj"
|
||||
".\Release\r_surf.obj"
|
||||
".\Release\r_vars.obj"
|
||||
".\Release\sbar.obj"
|
||||
".\Release\screen.obj"
|
||||
".\Release\snd_dma.obj"
|
||||
".\Release\snd_mem.obj"
|
||||
".\Release\snd_mix.obj"
|
||||
".\Release\snd_win.obj"
|
||||
".\Release\sv_main.obj"
|
||||
".\Release\sv_move.obj"
|
||||
".\Release\sv_phys.obj"
|
||||
".\Release\sv_user.obj"
|
||||
".\Release\sys_win.obj"
|
||||
".\Release\vid_win.obj"
|
||||
".\Release\view.obj"
|
||||
".\Release\wad.obj"
|
||||
".\Release\world.obj"
|
||||
".\Release\zone.obj"
|
||||
".\Release\winquake.res"
|
||||
".\Release\d_draw.obj"
|
||||
".\Release\d_draw16.obj"
|
||||
".\Release\d_parta.obj"
|
||||
".\Release\d_polysa.obj"
|
||||
".\Release\d_scana.obj"
|
||||
".\Release\d_spr8.obj"
|
||||
".\Release\d_varsa.obj"
|
||||
".\Release\math.obj"
|
||||
".\Release\r_aclipa.obj"
|
||||
".\Release\r_aliasa.obj"
|
||||
".\Release\r_drawa.obj"
|
||||
".\Release\r_edgea.obj"
|
||||
".\Release\r_varsa.obj"
|
||||
".\Release\snd_mixa.obj"
|
||||
".\Release\surf16.obj"
|
||||
".\Release\surf8.obj"
|
||||
".\Release\sys_wina.obj"
|
||||
".\Release\worlda.obj"
|
||||
]
|
||||
Creating command line "link.exe @C:\TEMP\RSP75D.tmp"
|
||||
<h3>Output Window</h3>
|
||||
Compiling resources...
|
||||
Compiling...
|
||||
cd_win.c
|
||||
chase.c
|
||||
cl_demo.c
|
||||
cl_input.c
|
||||
cl_main.c
|
||||
cl_parse.c
|
||||
cl_tent.c
|
||||
cmd.c
|
||||
common.c
|
||||
conproc.c
|
||||
console.c
|
||||
crc.c
|
||||
cvar.c
|
||||
d_edge.c
|
||||
d_fill.c
|
||||
d_init.c
|
||||
d_modech.c
|
||||
d_part.c
|
||||
d_polyse.c
|
||||
d_scan.c
|
||||
d_sky.c
|
||||
d_sprite.c
|
||||
d_surf.c
|
||||
d_vars.c
|
||||
d_zpoint.c
|
||||
draw.c
|
||||
host.c
|
||||
host_cmd.c
|
||||
in_win.c
|
||||
keys.c
|
||||
D:\Work\quake source\WinQuake\in_win.c(883) : warning C4715: 'RawValuePointer' : not all control paths return a value
|
||||
mathlib.c
|
||||
menu.c
|
||||
model.c
|
||||
net_dgrm.c
|
||||
net_loop.c
|
||||
net_main.c
|
||||
net_vcr.c
|
||||
net_win.c
|
||||
net_wins.c
|
||||
net_wipx.c
|
||||
pr_cmds.c
|
||||
pr_edict.c
|
||||
pr_exec.c
|
||||
r_aclip.c
|
||||
r_alias.c
|
||||
r_bsp.c
|
||||
r_draw.c
|
||||
r_edge.c
|
||||
r_efrag.c
|
||||
r_light.c
|
||||
r_main.c
|
||||
r_misc.c
|
||||
r_part.c
|
||||
r_sky.c
|
||||
r_sprite.c
|
||||
r_surf.c
|
||||
r_vars.c
|
||||
sbar.c
|
||||
screen.c
|
||||
snd_dma.c
|
||||
snd_mem.c
|
||||
snd_mix.c
|
||||
snd_win.c
|
||||
sv_main.c
|
||||
sv_move.c
|
||||
sv_phys.c
|
||||
sv_user.c
|
||||
sys_win.c
|
||||
vid_win.c
|
||||
view.c
|
||||
D:\Work\quake source\WinQuake\vid_win.c(348) : warning C4715: 'VID_Suspend' : not all control paths return a value
|
||||
wad.c
|
||||
world.c
|
||||
zone.c
|
||||
Linking...
|
||||
|
||||
|
||||
|
||||
<h3>Results</h3>
|
||||
WinQuake.exe - 0 error(s), 2 warning(s)
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
||||
1077
WinQuake/adivtab.h
Normal file
1077
WinQuake/adivtab.h
Normal file
File diff suppressed because it is too large
Load Diff
37
WinQuake/anorm_dots.h
Normal file
37
WinQuake/anorm_dots.h
Normal file
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
{
|
||||
{1.23,1.30,1.47,1.35,1.56,1.71,1.37,1.38,1.59,1.60,1.79,1.97,1.88,1.92,1.79,1.02,0.93,1.07,0.82,0.87,0.88,0.94,0.96,1.14,1.11,0.82,0.83,0.89,0.89,0.86,0.94,0.91,1.00,1.21,0.98,1.48,1.30,1.57,0.96,1.07,1.14,1.60,1.61,1.40,1.37,1.72,1.78,1.79,1.93,1.99,1.90,1.68,1.71,1.86,1.60,1.68,1.78,1.86,1.93,1.99,1.97,1.44,1.22,1.49,0.93,0.99,0.99,1.23,1.22,1.44,1.49,0.89,0.89,0.97,0.91,0.98,1.19,0.82,0.76,0.82,0.71,0.72,0.73,0.76,0.79,0.86,0.83,0.72,0.76,0.76,0.89,0.82,0.89,0.82,0.89,0.91,0.83,0.96,1.14,0.97,1.40,1.19,0.98,0.94,1.00,1.07,1.37,1.21,1.48,1.30,1.57,1.61,1.37,0.86,0.83,0.91,0.82,0.82,0.88,0.89,0.96,1.14,0.98,0.87,0.93,0.94,1.02,1.30,1.07,1.35,1.38,1.11,1.56,1.92,1.79,1.79,1.59,1.60,1.72,1.90,1.79,0.80,0.85,0.79,0.93,0.80,0.85,0.77,0.74,0.72,0.77,0.74,0.72,0.70,0.70,0.71,0.76,0.73,0.79,0.79,0.73,0.76,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
|
||||
{1.26,1.26,1.48,1.23,1.50,1.71,1.14,1.19,1.38,1.46,1.64,1.94,1.87,1.84,1.71,1.02,0.92,1.00,0.79,0.85,0.84,0.91,0.90,0.98,0.99,0.77,0.77,0.83,0.82,0.79,0.86,0.84,0.92,0.99,0.91,1.24,1.03,1.33,0.88,0.94,0.97,1.41,1.39,1.18,1.11,1.51,1.61,1.59,1.80,1.91,1.76,1.54,1.65,1.76,1.70,1.70,1.85,1.85,1.97,1.99,1.93,1.28,1.09,1.39,0.92,0.97,0.99,1.18,1.26,1.52,1.48,0.83,0.85,0.90,0.88,0.93,1.00,0.77,0.73,0.78,0.72,0.71,0.74,0.75,0.79,0.86,0.81,0.75,0.81,0.79,0.96,0.88,0.94,0.86,0.93,0.92,0.85,1.08,1.33,1.05,1.55,1.31,1.01,1.05,1.27,1.31,1.60,1.47,1.70,1.54,1.76,1.76,1.57,0.93,0.90,0.99,0.88,0.88,0.95,0.97,1.11,1.39,1.20,0.92,0.97,1.01,1.10,1.39,1.22,1.51,1.58,1.32,1.64,1.97,1.85,1.91,1.77,1.74,1.88,1.99,1.91,0.79,0.86,0.80,0.94,0.84,0.88,0.74,0.74,0.71,0.82,0.77,0.76,0.70,0.73,0.72,0.73,0.70,0.74,0.85,0.77,0.82,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
|
||||
{1.34,1.27,1.53,1.17,1.46,1.71,0.98,1.05,1.20,1.34,1.48,1.86,1.82,1.71,1.62,1.09,0.94,0.99,0.79,0.85,0.82,0.90,0.87,0.93,0.96,0.76,0.74,0.79,0.76,0.74,0.79,0.78,0.85,0.92,0.85,1.00,0.93,1.06,0.81,0.86,0.89,1.16,1.12,0.97,0.95,1.28,1.38,1.35,1.60,1.77,1.57,1.33,1.50,1.58,1.69,1.63,1.82,1.74,1.91,1.92,1.80,1.04,0.97,1.21,0.90,0.93,0.97,1.05,1.21,1.48,1.37,0.77,0.80,0.84,0.85,0.88,0.92,0.73,0.71,0.74,0.74,0.71,0.75,0.73,0.79,0.84,0.78,0.79,0.86,0.81,1.05,0.94,0.99,0.90,0.95,0.92,0.86,1.24,1.44,1.14,1.59,1.34,1.02,1.27,1.50,1.49,1.80,1.69,1.86,1.72,1.87,1.80,1.69,1.00,0.98,1.23,0.95,0.96,1.09,1.16,1.37,1.63,1.46,0.99,1.10,1.25,1.24,1.51,1.41,1.67,1.77,1.55,1.72,1.95,1.89,1.98,1.91,1.86,1.97,1.99,1.94,0.81,0.89,0.85,0.98,0.90,0.94,0.75,0.78,0.73,0.89,0.83,0.82,0.72,0.77,0.76,0.72,0.70,0.71,0.91,0.83,0.89,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
|
||||
{1.46,1.34,1.60,1.16,1.46,1.71,0.94,0.99,1.05,1.26,1.33,1.74,1.76,1.57,1.54,1.23,0.98,1.05,0.83,0.89,0.84,0.92,0.87,0.91,0.96,0.78,0.74,0.79,0.72,0.72,0.75,0.76,0.80,0.88,0.83,0.94,0.87,0.95,0.76,0.80,0.82,0.97,0.96,0.89,0.88,1.08,1.11,1.10,1.37,1.59,1.37,1.07,1.27,1.34,1.57,1.45,1.69,1.55,1.77,1.79,1.60,0.93,0.90,0.99,0.86,0.87,0.93,0.96,1.07,1.35,1.18,0.73,0.76,0.77,0.81,0.82,0.85,0.70,0.71,0.72,0.78,0.73,0.77,0.73,0.79,0.82,0.76,0.83,0.90,0.84,1.18,0.98,1.03,0.92,0.95,0.90,0.86,1.32,1.45,1.15,1.53,1.27,0.99,1.42,1.65,1.58,1.93,1.83,1.94,1.81,1.88,1.74,1.70,1.19,1.17,1.44,1.11,1.15,1.36,1.41,1.61,1.81,1.67,1.22,1.34,1.50,1.42,1.65,1.61,1.82,1.91,1.75,1.80,1.89,1.89,1.98,1.99,1.94,1.98,1.92,1.87,0.86,0.95,0.92,1.14,0.98,1.03,0.79,0.84,0.77,0.97,0.90,0.89,0.76,0.82,0.82,0.74,0.72,0.71,0.98,0.89,0.97,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
|
||||
{1.60,1.44,1.68,1.22,1.49,1.71,0.93,0.99,0.99,1.23,1.22,1.60,1.68,1.44,1.49,1.40,1.14,1.19,0.89,0.96,0.89,0.97,0.89,0.91,0.98,0.82,0.76,0.82,0.71,0.72,0.73,0.76,0.79,0.86,0.83,0.91,0.83,0.89,0.72,0.76,0.76,0.89,0.89,0.82,0.82,0.98,0.96,0.97,1.14,1.40,1.19,0.94,1.00,1.07,1.37,1.21,1.48,1.30,1.57,1.61,1.37,0.86,0.83,0.91,0.82,0.82,0.88,0.89,0.96,1.14,0.98,0.70,0.72,0.73,0.77,0.76,0.79,0.70,0.72,0.71,0.82,0.77,0.80,0.74,0.79,0.80,0.74,0.87,0.93,0.85,1.23,1.02,1.02,0.93,0.93,0.87,0.85,1.30,1.35,1.07,1.38,1.11,0.94,1.47,1.71,1.56,1.97,1.88,1.92,1.79,1.79,1.59,1.60,1.30,1.35,1.56,1.37,1.38,1.59,1.60,1.79,1.92,1.79,1.48,1.57,1.72,1.61,1.78,1.79,1.93,1.99,1.90,1.86,1.78,1.86,1.93,1.99,1.97,1.90,1.79,1.72,0.94,1.07,1.00,1.37,1.21,1.30,0.86,0.91,0.83,1.14,0.98,0.96,0.82,0.88,0.89,0.79,0.76,0.73,1.07,0.94,1.11,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
|
||||
{1.74,1.57,1.76,1.33,1.54,1.71,0.94,1.05,0.99,1.26,1.16,1.46,1.60,1.34,1.46,1.59,1.37,1.37,0.97,1.11,0.96,1.10,0.95,0.94,1.08,0.89,0.82,0.88,0.72,0.76,0.75,0.80,0.80,0.88,0.87,0.91,0.83,0.87,0.72,0.76,0.74,0.83,0.84,0.78,0.79,0.96,0.89,0.92,0.98,1.23,1.05,0.86,0.92,0.95,1.11,0.98,1.22,1.03,1.34,1.42,1.14,0.79,0.77,0.84,0.78,0.76,0.82,0.82,0.89,0.97,0.90,0.70,0.71,0.71,0.73,0.72,0.74,0.73,0.76,0.72,0.86,0.81,0.82,0.76,0.79,0.77,0.73,0.90,0.95,0.86,1.18,1.03,0.98,0.92,0.90,0.83,0.84,1.19,1.17,0.98,1.15,0.97,0.89,1.42,1.65,1.44,1.93,1.83,1.81,1.67,1.61,1.36,1.41,1.32,1.45,1.58,1.57,1.53,1.74,1.70,1.88,1.94,1.81,1.69,1.77,1.87,1.79,1.89,1.92,1.98,1.99,1.98,1.89,1.65,1.80,1.82,1.91,1.94,1.75,1.61,1.50,1.07,1.34,1.27,1.60,1.45,1.55,0.93,0.99,0.90,1.35,1.18,1.07,0.87,0.93,0.96,0.85,0.82,0.77,1.15,0.99,1.27,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
|
||||
{1.86,1.71,1.82,1.48,1.62,1.71,0.98,1.20,1.05,1.34,1.17,1.34,1.53,1.27,1.46,1.77,1.60,1.57,1.16,1.38,1.12,1.35,1.06,1.00,1.28,0.97,0.89,0.95,0.76,0.81,0.79,0.86,0.85,0.92,0.93,0.93,0.85,0.87,0.74,0.78,0.74,0.79,0.82,0.76,0.79,0.96,0.85,0.90,0.94,1.09,0.99,0.81,0.85,0.89,0.95,0.90,0.99,0.94,1.10,1.24,0.98,0.75,0.73,0.78,0.74,0.72,0.77,0.76,0.82,0.89,0.83,0.73,0.71,0.71,0.71,0.70,0.72,0.77,0.80,0.74,0.90,0.85,0.84,0.78,0.79,0.75,0.73,0.92,0.95,0.86,1.05,0.99,0.94,0.90,0.86,0.79,0.81,1.00,0.98,0.91,0.96,0.89,0.83,1.27,1.50,1.23,1.80,1.69,1.63,1.46,1.37,1.09,1.16,1.24,1.44,1.49,1.69,1.59,1.80,1.69,1.87,1.86,1.72,1.82,1.91,1.94,1.92,1.95,1.99,1.98,1.91,1.97,1.89,1.51,1.72,1.67,1.77,1.86,1.55,1.41,1.25,1.33,1.58,1.50,1.80,1.63,1.74,1.04,1.21,0.97,1.48,1.37,1.21,0.93,0.97,1.05,0.92,0.88,0.84,1.14,1.02,1.34,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
|
||||
{1.94,1.84,1.87,1.64,1.71,1.71,1.14,1.38,1.19,1.46,1.23,1.26,1.48,1.26,1.50,1.91,1.80,1.76,1.41,1.61,1.39,1.59,1.33,1.24,1.51,1.18,0.97,1.11,0.82,0.88,0.86,0.94,0.92,0.99,1.03,0.98,0.91,0.90,0.79,0.84,0.77,0.79,0.84,0.77,0.83,0.99,0.85,0.91,0.92,1.02,1.00,0.79,0.80,0.86,0.88,0.84,0.92,0.88,0.97,1.10,0.94,0.74,0.71,0.74,0.72,0.70,0.73,0.72,0.76,0.82,0.77,0.77,0.73,0.74,0.71,0.70,0.73,0.83,0.85,0.78,0.92,0.88,0.86,0.81,0.79,0.74,0.75,0.92,0.93,0.85,0.96,0.94,0.88,0.86,0.81,0.75,0.79,0.93,0.90,0.85,0.88,0.82,0.77,1.05,1.27,0.99,1.60,1.47,1.39,1.20,1.11,0.95,0.97,1.08,1.33,1.31,1.70,1.55,1.76,1.57,1.76,1.70,1.54,1.85,1.97,1.91,1.99,1.97,1.99,1.91,1.77,1.88,1.85,1.39,1.64,1.51,1.58,1.74,1.32,1.22,1.01,1.54,1.76,1.65,1.93,1.70,1.85,1.28,1.39,1.09,1.52,1.48,1.26,0.97,0.99,1.18,1.00,0.93,0.90,1.05,1.01,1.31,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
|
||||
{1.97,1.92,1.88,1.79,1.79,1.71,1.37,1.59,1.38,1.60,1.35,1.23,1.47,1.30,1.56,1.99,1.93,1.90,1.60,1.78,1.61,1.79,1.57,1.48,1.72,1.40,1.14,1.37,0.89,0.96,0.94,1.07,1.00,1.21,1.30,1.14,0.98,0.96,0.86,0.91,0.83,0.82,0.88,0.82,0.89,1.11,0.87,0.94,0.93,1.02,1.07,0.80,0.79,0.85,0.82,0.80,0.87,0.85,0.93,1.02,0.93,0.77,0.72,0.74,0.71,0.70,0.70,0.71,0.72,0.77,0.74,0.82,0.76,0.79,0.72,0.73,0.76,0.89,0.89,0.82,0.93,0.91,0.86,0.83,0.79,0.73,0.76,0.91,0.89,0.83,0.89,0.89,0.82,0.82,0.76,0.72,0.76,0.86,0.83,0.79,0.82,0.76,0.73,0.94,1.00,0.91,1.37,1.21,1.14,0.98,0.96,0.88,0.89,0.96,1.14,1.07,1.60,1.40,1.61,1.37,1.57,1.48,1.30,1.78,1.93,1.79,1.99,1.92,1.90,1.79,1.59,1.72,1.79,1.30,1.56,1.35,1.38,1.60,1.11,1.07,0.94,1.68,1.86,1.71,1.97,1.68,1.86,1.44,1.49,1.22,1.44,1.49,1.22,0.99,0.99,1.23,1.19,0.98,0.97,0.97,0.98,1.19,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
|
||||
{1.94,1.97,1.87,1.91,1.85,1.71,1.60,1.77,1.58,1.74,1.51,1.26,1.48,1.39,1.64,1.99,1.97,1.99,1.70,1.85,1.76,1.91,1.76,1.70,1.88,1.55,1.33,1.57,0.96,1.08,1.05,1.31,1.27,1.47,1.54,1.39,1.20,1.11,0.93,0.99,0.90,0.88,0.95,0.88,0.97,1.32,0.92,1.01,0.97,1.10,1.22,0.84,0.80,0.88,0.79,0.79,0.85,0.86,0.92,1.02,0.94,0.82,0.76,0.77,0.72,0.73,0.70,0.72,0.71,0.74,0.74,0.88,0.81,0.85,0.75,0.77,0.82,0.94,0.93,0.86,0.92,0.92,0.86,0.85,0.79,0.74,0.79,0.88,0.85,0.81,0.82,0.83,0.77,0.78,0.73,0.71,0.75,0.79,0.77,0.74,0.77,0.73,0.70,0.86,0.92,0.84,1.14,0.99,0.98,0.91,0.90,0.84,0.83,0.88,0.97,0.94,1.41,1.18,1.39,1.11,1.33,1.24,1.03,1.61,1.80,1.59,1.91,1.84,1.76,1.64,1.38,1.51,1.71,1.26,1.50,1.23,1.19,1.46,0.99,1.00,0.91,1.70,1.85,1.65,1.93,1.54,1.76,1.52,1.48,1.26,1.28,1.39,1.09,0.99,0.97,1.18,1.31,1.01,1.05,0.90,0.93,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
|
||||
{1.86,1.95,1.82,1.98,1.89,1.71,1.80,1.91,1.77,1.86,1.67,1.34,1.53,1.51,1.72,1.92,1.91,1.99,1.69,1.82,1.80,1.94,1.87,1.86,1.97,1.59,1.44,1.69,1.05,1.24,1.27,1.49,1.50,1.69,1.72,1.63,1.46,1.37,1.00,1.23,0.98,0.95,1.09,0.96,1.16,1.55,0.99,1.25,1.10,1.24,1.41,0.90,0.85,0.94,0.79,0.81,0.85,0.89,0.94,1.09,0.98,0.89,0.82,0.83,0.74,0.77,0.72,0.76,0.73,0.75,0.78,0.94,0.86,0.91,0.79,0.83,0.89,0.99,0.95,0.90,0.90,0.92,0.84,0.86,0.79,0.75,0.81,0.85,0.80,0.78,0.76,0.77,0.73,0.74,0.71,0.71,0.73,0.74,0.74,0.71,0.76,0.72,0.70,0.79,0.85,0.78,0.98,0.92,0.93,0.85,0.87,0.82,0.79,0.81,0.89,0.86,1.16,0.97,1.12,0.95,1.06,1.00,0.93,1.38,1.60,1.35,1.77,1.71,1.57,1.48,1.20,1.28,1.62,1.27,1.46,1.17,1.05,1.34,0.96,0.99,0.90,1.63,1.74,1.50,1.80,1.33,1.58,1.48,1.37,1.21,1.04,1.21,0.97,0.97,0.93,1.05,1.34,1.02,1.14,0.84,0.88,0.92,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
|
||||
{1.74,1.89,1.76,1.98,1.89,1.71,1.93,1.99,1.91,1.94,1.82,1.46,1.60,1.65,1.80,1.79,1.77,1.92,1.57,1.69,1.74,1.87,1.88,1.94,1.98,1.53,1.45,1.70,1.18,1.32,1.42,1.58,1.65,1.83,1.81,1.81,1.67,1.61,1.19,1.44,1.17,1.11,1.36,1.15,1.41,1.75,1.22,1.50,1.34,1.42,1.61,0.98,0.92,1.03,0.83,0.86,0.89,0.95,0.98,1.23,1.14,0.97,0.89,0.90,0.78,0.82,0.76,0.82,0.77,0.79,0.84,0.98,0.90,0.98,0.83,0.89,0.97,1.03,0.95,0.92,0.86,0.90,0.82,0.86,0.79,0.77,0.84,0.81,0.76,0.76,0.72,0.73,0.70,0.72,0.71,0.73,0.73,0.72,0.74,0.71,0.78,0.74,0.72,0.75,0.80,0.76,0.94,0.88,0.91,0.83,0.87,0.84,0.79,0.76,0.82,0.80,0.97,0.89,0.96,0.88,0.95,0.94,0.87,1.11,1.37,1.10,1.59,1.57,1.37,1.33,1.05,1.08,1.54,1.34,1.46,1.16,0.99,1.26,0.96,1.05,0.92,1.45,1.55,1.27,1.60,1.07,1.34,1.35,1.18,1.07,0.93,0.99,0.90,0.93,0.87,0.96,1.27,0.99,1.15,0.77,0.82,0.85,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
|
||||
{1.60,1.78,1.68,1.93,1.86,1.71,1.97,1.99,1.99,1.97,1.93,1.60,1.68,1.78,1.86,1.61,1.57,1.79,1.37,1.48,1.59,1.72,1.79,1.92,1.90,1.38,1.35,1.60,1.23,1.30,1.47,1.56,1.71,1.88,1.79,1.92,1.79,1.79,1.30,1.56,1.35,1.37,1.59,1.38,1.60,1.90,1.48,1.72,1.57,1.61,1.79,1.21,1.00,1.30,0.89,0.94,0.96,1.07,1.14,1.40,1.37,1.14,0.96,0.98,0.82,0.88,0.82,0.89,0.83,0.86,0.91,1.02,0.93,1.07,0.87,0.94,1.11,1.02,0.93,0.93,0.82,0.87,0.80,0.85,0.79,0.80,0.85,0.77,0.72,0.74,0.71,0.70,0.70,0.71,0.72,0.77,0.74,0.72,0.76,0.73,0.82,0.79,0.76,0.73,0.79,0.76,0.93,0.86,0.91,0.83,0.89,0.89,0.82,0.72,0.76,0.76,0.89,0.82,0.89,0.82,0.89,0.91,0.83,0.96,1.14,0.97,1.40,1.44,1.19,1.22,0.99,0.98,1.49,1.44,1.49,1.22,0.99,1.23,0.98,1.19,0.97,1.21,1.30,1.00,1.37,0.94,1.07,1.14,0.98,0.96,0.86,0.91,0.83,0.88,0.82,0.89,1.11,0.94,1.07,0.73,0.76,0.79,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
|
||||
{1.46,1.65,1.60,1.82,1.80,1.71,1.93,1.91,1.99,1.94,1.98,1.74,1.76,1.89,1.89,1.42,1.34,1.61,1.11,1.22,1.36,1.50,1.61,1.81,1.75,1.15,1.17,1.41,1.18,1.19,1.42,1.44,1.65,1.83,1.67,1.94,1.81,1.88,1.32,1.58,1.45,1.57,1.74,1.53,1.70,1.98,1.69,1.87,1.77,1.79,1.92,1.45,1.27,1.55,0.97,1.07,1.11,1.34,1.37,1.59,1.60,1.35,1.07,1.18,0.86,0.93,0.87,0.96,0.90,0.93,0.99,1.03,0.95,1.15,0.90,0.99,1.27,0.98,0.90,0.92,0.78,0.83,0.77,0.84,0.79,0.82,0.86,0.73,0.71,0.73,0.72,0.70,0.73,0.72,0.76,0.81,0.76,0.76,0.82,0.77,0.89,0.85,0.82,0.75,0.80,0.80,0.94,0.88,0.94,0.87,0.95,0.96,0.88,0.72,0.74,0.76,0.83,0.78,0.84,0.79,0.87,0.91,0.83,0.89,0.98,0.92,1.23,1.34,1.05,1.16,0.99,0.96,1.46,1.57,1.54,1.33,1.05,1.26,1.08,1.37,1.10,0.98,1.03,0.92,1.14,0.86,0.95,0.97,0.90,0.89,0.79,0.84,0.77,0.82,0.76,0.82,0.97,0.89,0.98,0.71,0.72,0.74,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
|
||||
{1.34,1.51,1.53,1.67,1.72,1.71,1.80,1.77,1.91,1.86,1.98,1.86,1.82,1.95,1.89,1.24,1.10,1.41,0.95,0.99,1.09,1.25,1.37,1.63,1.55,0.96,0.98,1.16,1.05,1.00,1.27,1.23,1.50,1.69,1.46,1.86,1.72,1.87,1.24,1.49,1.44,1.69,1.80,1.59,1.69,1.97,1.82,1.94,1.91,1.92,1.99,1.63,1.50,1.74,1.16,1.33,1.38,1.58,1.60,1.77,1.80,1.48,1.21,1.37,0.90,0.97,0.93,1.05,0.97,1.04,1.21,0.99,0.95,1.14,0.92,1.02,1.34,0.94,0.86,0.90,0.74,0.79,0.75,0.81,0.79,0.84,0.86,0.71,0.71,0.73,0.76,0.73,0.77,0.74,0.80,0.85,0.78,0.81,0.89,0.84,0.97,0.92,0.88,0.79,0.85,0.86,0.98,0.92,1.00,0.93,1.06,1.12,0.95,0.74,0.74,0.78,0.79,0.76,0.82,0.79,0.87,0.93,0.85,0.85,0.94,0.90,1.09,1.27,0.99,1.17,1.05,0.96,1.46,1.71,1.62,1.48,1.20,1.34,1.28,1.57,1.35,0.90,0.94,0.85,0.98,0.81,0.89,0.89,0.83,0.82,0.75,0.78,0.73,0.77,0.72,0.76,0.89,0.83,0.91,0.71,0.70,0.72,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00},
|
||||
{1.26,1.39,1.48,1.51,1.64,1.71,1.60,1.58,1.77,1.74,1.91,1.94,1.87,1.97,1.85,1.10,0.97,1.22,0.88,0.92,0.95,1.01,1.11,1.39,1.32,0.88,0.90,0.97,0.96,0.93,1.05,0.99,1.27,1.47,1.20,1.70,1.54,1.76,1.08,1.31,1.33,1.70,1.76,1.55,1.57,1.88,1.85,1.91,1.97,1.99,1.99,1.70,1.65,1.85,1.41,1.54,1.61,1.76,1.80,1.91,1.93,1.52,1.26,1.48,0.92,0.99,0.97,1.18,1.09,1.28,1.39,0.94,0.93,1.05,0.92,1.01,1.31,0.88,0.81,0.86,0.72,0.75,0.74,0.79,0.79,0.86,0.85,0.71,0.73,0.75,0.82,0.77,0.83,0.78,0.85,0.88,0.81,0.88,0.97,0.90,1.18,1.00,0.93,0.86,0.92,0.94,1.14,0.99,1.24,1.03,1.33,1.39,1.11,0.79,0.77,0.84,0.79,0.77,0.84,0.83,0.90,0.98,0.91,0.85,0.92,0.91,1.02,1.26,1.00,1.23,1.19,0.99,1.50,1.84,1.71,1.64,1.38,1.46,1.51,1.76,1.59,0.84,0.88,0.80,0.94,0.79,0.86,0.82,0.77,0.76,0.74,0.74,0.71,0.73,0.70,0.72,0.82,0.77,0.85,0.74,0.70,0.73,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00,1.00}
|
||||
}
|
||||
181
WinQuake/anorms.h
Normal file
181
WinQuake/anorms.h
Normal file
@@ -0,0 +1,181 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
{-0.525731, 0.000000, 0.850651},
|
||||
{-0.442863, 0.238856, 0.864188},
|
||||
{-0.295242, 0.000000, 0.955423},
|
||||
{-0.309017, 0.500000, 0.809017},
|
||||
{-0.162460, 0.262866, 0.951056},
|
||||
{0.000000, 0.000000, 1.000000},
|
||||
{0.000000, 0.850651, 0.525731},
|
||||
{-0.147621, 0.716567, 0.681718},
|
||||
{0.147621, 0.716567, 0.681718},
|
||||
{0.000000, 0.525731, 0.850651},
|
||||
{0.309017, 0.500000, 0.809017},
|
||||
{0.525731, 0.000000, 0.850651},
|
||||
{0.295242, 0.000000, 0.955423},
|
||||
{0.442863, 0.238856, 0.864188},
|
||||
{0.162460, 0.262866, 0.951056},
|
||||
{-0.681718, 0.147621, 0.716567},
|
||||
{-0.809017, 0.309017, 0.500000},
|
||||
{-0.587785, 0.425325, 0.688191},
|
||||
{-0.850651, 0.525731, 0.000000},
|
||||
{-0.864188, 0.442863, 0.238856},
|
||||
{-0.716567, 0.681718, 0.147621},
|
||||
{-0.688191, 0.587785, 0.425325},
|
||||
{-0.500000, 0.809017, 0.309017},
|
||||
{-0.238856, 0.864188, 0.442863},
|
||||
{-0.425325, 0.688191, 0.587785},
|
||||
{-0.716567, 0.681718, -0.147621},
|
||||
{-0.500000, 0.809017, -0.309017},
|
||||
{-0.525731, 0.850651, 0.000000},
|
||||
{0.000000, 0.850651, -0.525731},
|
||||
{-0.238856, 0.864188, -0.442863},
|
||||
{0.000000, 0.955423, -0.295242},
|
||||
{-0.262866, 0.951056, -0.162460},
|
||||
{0.000000, 1.000000, 0.000000},
|
||||
{0.000000, 0.955423, 0.295242},
|
||||
{-0.262866, 0.951056, 0.162460},
|
||||
{0.238856, 0.864188, 0.442863},
|
||||
{0.262866, 0.951056, 0.162460},
|
||||
{0.500000, 0.809017, 0.309017},
|
||||
{0.238856, 0.864188, -0.442863},
|
||||
{0.262866, 0.951056, -0.162460},
|
||||
{0.500000, 0.809017, -0.309017},
|
||||
{0.850651, 0.525731, 0.000000},
|
||||
{0.716567, 0.681718, 0.147621},
|
||||
{0.716567, 0.681718, -0.147621},
|
||||
{0.525731, 0.850651, 0.000000},
|
||||
{0.425325, 0.688191, 0.587785},
|
||||
{0.864188, 0.442863, 0.238856},
|
||||
{0.688191, 0.587785, 0.425325},
|
||||
{0.809017, 0.309017, 0.500000},
|
||||
{0.681718, 0.147621, 0.716567},
|
||||
{0.587785, 0.425325, 0.688191},
|
||||
{0.955423, 0.295242, 0.000000},
|
||||
{1.000000, 0.000000, 0.000000},
|
||||
{0.951056, 0.162460, 0.262866},
|
||||
{0.850651, -0.525731, 0.000000},
|
||||
{0.955423, -0.295242, 0.000000},
|
||||
{0.864188, -0.442863, 0.238856},
|
||||
{0.951056, -0.162460, 0.262866},
|
||||
{0.809017, -0.309017, 0.500000},
|
||||
{0.681718, -0.147621, 0.716567},
|
||||
{0.850651, 0.000000, 0.525731},
|
||||
{0.864188, 0.442863, -0.238856},
|
||||
{0.809017, 0.309017, -0.500000},
|
||||
{0.951056, 0.162460, -0.262866},
|
||||
{0.525731, 0.000000, -0.850651},
|
||||
{0.681718, 0.147621, -0.716567},
|
||||
{0.681718, -0.147621, -0.716567},
|
||||
{0.850651, 0.000000, -0.525731},
|
||||
{0.809017, -0.309017, -0.500000},
|
||||
{0.864188, -0.442863, -0.238856},
|
||||
{0.951056, -0.162460, -0.262866},
|
||||
{0.147621, 0.716567, -0.681718},
|
||||
{0.309017, 0.500000, -0.809017},
|
||||
{0.425325, 0.688191, -0.587785},
|
||||
{0.442863, 0.238856, -0.864188},
|
||||
{0.587785, 0.425325, -0.688191},
|
||||
{0.688191, 0.587785, -0.425325},
|
||||
{-0.147621, 0.716567, -0.681718},
|
||||
{-0.309017, 0.500000, -0.809017},
|
||||
{0.000000, 0.525731, -0.850651},
|
||||
{-0.525731, 0.000000, -0.850651},
|
||||
{-0.442863, 0.238856, -0.864188},
|
||||
{-0.295242, 0.000000, -0.955423},
|
||||
{-0.162460, 0.262866, -0.951056},
|
||||
{0.000000, 0.000000, -1.000000},
|
||||
{0.295242, 0.000000, -0.955423},
|
||||
{0.162460, 0.262866, -0.951056},
|
||||
{-0.442863, -0.238856, -0.864188},
|
||||
{-0.309017, -0.500000, -0.809017},
|
||||
{-0.162460, -0.262866, -0.951056},
|
||||
{0.000000, -0.850651, -0.525731},
|
||||
{-0.147621, -0.716567, -0.681718},
|
||||
{0.147621, -0.716567, -0.681718},
|
||||
{0.000000, -0.525731, -0.850651},
|
||||
{0.309017, -0.500000, -0.809017},
|
||||
{0.442863, -0.238856, -0.864188},
|
||||
{0.162460, -0.262866, -0.951056},
|
||||
{0.238856, -0.864188, -0.442863},
|
||||
{0.500000, -0.809017, -0.309017},
|
||||
{0.425325, -0.688191, -0.587785},
|
||||
{0.716567, -0.681718, -0.147621},
|
||||
{0.688191, -0.587785, -0.425325},
|
||||
{0.587785, -0.425325, -0.688191},
|
||||
{0.000000, -0.955423, -0.295242},
|
||||
{0.000000, -1.000000, 0.000000},
|
||||
{0.262866, -0.951056, -0.162460},
|
||||
{0.000000, -0.850651, 0.525731},
|
||||
{0.000000, -0.955423, 0.295242},
|
||||
{0.238856, -0.864188, 0.442863},
|
||||
{0.262866, -0.951056, 0.162460},
|
||||
{0.500000, -0.809017, 0.309017},
|
||||
{0.716567, -0.681718, 0.147621},
|
||||
{0.525731, -0.850651, 0.000000},
|
||||
{-0.238856, -0.864188, -0.442863},
|
||||
{-0.500000, -0.809017, -0.309017},
|
||||
{-0.262866, -0.951056, -0.162460},
|
||||
{-0.850651, -0.525731, 0.000000},
|
||||
{-0.716567, -0.681718, -0.147621},
|
||||
{-0.716567, -0.681718, 0.147621},
|
||||
{-0.525731, -0.850651, 0.000000},
|
||||
{-0.500000, -0.809017, 0.309017},
|
||||
{-0.238856, -0.864188, 0.442863},
|
||||
{-0.262866, -0.951056, 0.162460},
|
||||
{-0.864188, -0.442863, 0.238856},
|
||||
{-0.809017, -0.309017, 0.500000},
|
||||
{-0.688191, -0.587785, 0.425325},
|
||||
{-0.681718, -0.147621, 0.716567},
|
||||
{-0.442863, -0.238856, 0.864188},
|
||||
{-0.587785, -0.425325, 0.688191},
|
||||
{-0.309017, -0.500000, 0.809017},
|
||||
{-0.147621, -0.716567, 0.681718},
|
||||
{-0.425325, -0.688191, 0.587785},
|
||||
{-0.162460, -0.262866, 0.951056},
|
||||
{0.442863, -0.238856, 0.864188},
|
||||
{0.162460, -0.262866, 0.951056},
|
||||
{0.309017, -0.500000, 0.809017},
|
||||
{0.147621, -0.716567, 0.681718},
|
||||
{0.000000, -0.525731, 0.850651},
|
||||
{0.425325, -0.688191, 0.587785},
|
||||
{0.587785, -0.425325, 0.688191},
|
||||
{0.688191, -0.587785, 0.425325},
|
||||
{-0.955423, 0.295242, 0.000000},
|
||||
{-0.951056, 0.162460, 0.262866},
|
||||
{-1.000000, 0.000000, 0.000000},
|
||||
{-0.850651, 0.000000, 0.525731},
|
||||
{-0.955423, -0.295242, 0.000000},
|
||||
{-0.951056, -0.162460, 0.262866},
|
||||
{-0.864188, 0.442863, -0.238856},
|
||||
{-0.951056, 0.162460, -0.262866},
|
||||
{-0.809017, 0.309017, -0.500000},
|
||||
{-0.864188, -0.442863, -0.238856},
|
||||
{-0.951056, -0.162460, -0.262866},
|
||||
{-0.809017, -0.309017, -0.500000},
|
||||
{-0.681718, 0.147621, -0.716567},
|
||||
{-0.681718, -0.147621, -0.716567},
|
||||
{-0.850651, 0.000000, -0.525731},
|
||||
{-0.688191, 0.587785, -0.425325},
|
||||
{-0.587785, 0.425325, -0.688191},
|
||||
{-0.425325, 0.688191, -0.587785},
|
||||
{-0.425325, -0.688191, -0.587785},
|
||||
{-0.587785, -0.425325, -0.688191},
|
||||
{-0.688191, -0.587785, -0.425325},
|
||||
151
WinQuake/asm_draw.h
Normal file
151
WinQuake/asm_draw.h
Normal file
@@ -0,0 +1,151 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
//
|
||||
// asm_draw.h
|
||||
//
|
||||
// Include file for asm drawing routines.
|
||||
//
|
||||
|
||||
//
|
||||
// !!! note that this file must match the corresponding C structures at all
|
||||
// times !!!
|
||||
//
|
||||
|
||||
// !!! if this is changed, it must be changed in r_local.h too !!!
|
||||
#define NEAR_CLIP 0.01
|
||||
|
||||
// !!! if this is changed, it must be changed in r_local.h too !!!
|
||||
#define CYCLE 128
|
||||
|
||||
// espan_t structure
|
||||
// !!! if this is changed, it must be changed in r_shared.h too !!!
|
||||
#define espan_t_u 0
|
||||
#define espan_t_v 4
|
||||
#define espan_t_count 8
|
||||
#define espan_t_pnext 12
|
||||
#define espan_t_size 16
|
||||
|
||||
// sspan_t structure
|
||||
// !!! if this is changed, it must be changed in d_local.h too !!!
|
||||
#define sspan_t_u 0
|
||||
#define sspan_t_v 4
|
||||
#define sspan_t_count 8
|
||||
#define sspan_t_size 12
|
||||
|
||||
// spanpackage_t structure
|
||||
// !!! if this is changed, it must be changed in d_polyset.c too !!!
|
||||
#define spanpackage_t_pdest 0
|
||||
#define spanpackage_t_pz 4
|
||||
#define spanpackage_t_count 8
|
||||
#define spanpackage_t_ptex 12
|
||||
#define spanpackage_t_sfrac 16
|
||||
#define spanpackage_t_tfrac 20
|
||||
#define spanpackage_t_light 24
|
||||
#define spanpackage_t_zi 28
|
||||
#define spanpackage_t_size 32
|
||||
|
||||
// edge_t structure
|
||||
// !!! if this is changed, it must be changed in r_shared.h too !!!
|
||||
#define et_u 0
|
||||
#define et_u_step 4
|
||||
#define et_prev 8
|
||||
#define et_next 12
|
||||
#define et_surfs 16
|
||||
#define et_nextremove 20
|
||||
#define et_nearzi 24
|
||||
#define et_owner 28
|
||||
#define et_size 32
|
||||
|
||||
// surf_t structure
|
||||
// !!! if this is changed, it must be changed in r_shared.h too !!!
|
||||
#define SURF_T_SHIFT 6
|
||||
#define st_next 0
|
||||
#define st_prev 4
|
||||
#define st_spans 8
|
||||
#define st_key 12
|
||||
#define st_last_u 16
|
||||
#define st_spanstate 20
|
||||
#define st_flags 24
|
||||
#define st_data 28
|
||||
#define st_entity 32
|
||||
#define st_nearzi 36
|
||||
#define st_insubmodel 40
|
||||
#define st_d_ziorigin 44
|
||||
#define st_d_zistepu 48
|
||||
#define st_d_zistepv 52
|
||||
#define st_pad 56
|
||||
#define st_size 64
|
||||
|
||||
// clipplane_t structure
|
||||
// !!! if this is changed, it must be changed in r_local.h too !!!
|
||||
#define cp_normal 0
|
||||
#define cp_dist 12
|
||||
#define cp_next 16
|
||||
#define cp_leftedge 20
|
||||
#define cp_rightedge 21
|
||||
#define cp_reserved 22
|
||||
#define cp_size 24
|
||||
|
||||
// medge_t structure
|
||||
// !!! if this is changed, it must be changed in model.h too !!!
|
||||
#define me_v 0
|
||||
#define me_cachededgeoffset 4
|
||||
#define me_size 8
|
||||
|
||||
// mvertex_t structure
|
||||
// !!! if this is changed, it must be changed in model.h too !!!
|
||||
#define mv_position 0
|
||||
#define mv_size 12
|
||||
|
||||
// refdef_t structure
|
||||
// !!! if this is changed, it must be changed in render.h too !!!
|
||||
#define rd_vrect 0
|
||||
#define rd_aliasvrect 20
|
||||
#define rd_vrectright 40
|
||||
#define rd_vrectbottom 44
|
||||
#define rd_aliasvrectright 48
|
||||
#define rd_aliasvrectbottom 52
|
||||
#define rd_vrectrightedge 56
|
||||
#define rd_fvrectx 60
|
||||
#define rd_fvrecty 64
|
||||
#define rd_fvrectx_adj 68
|
||||
#define rd_fvrecty_adj 72
|
||||
#define rd_vrect_x_adj_shift20 76
|
||||
#define rd_vrectright_adj_shift20 80
|
||||
#define rd_fvrectright_adj 84
|
||||
#define rd_fvrectbottom_adj 88
|
||||
#define rd_fvrectright 92
|
||||
#define rd_fvrectbottom 96
|
||||
#define rd_horizontalFieldOfView 100
|
||||
#define rd_xOrigin 104
|
||||
#define rd_yOrigin 108
|
||||
#define rd_vieworg 112
|
||||
#define rd_viewangles 124
|
||||
#define rd_ambientlight 136
|
||||
#define rd_size 140
|
||||
|
||||
// mtriangle_t structure
|
||||
// !!! if this is changed, it must be changed in model.h too !!!
|
||||
#define mtri_facesfront 0
|
||||
#define mtri_vertindex 4
|
||||
#define mtri_size 16 // !!! if this changes, array indexing in !!!
|
||||
// !!! d_polysa.s must be changed to match !!!
|
||||
#define mtri_shift 4
|
||||
|
||||
97
WinQuake/asm_i386.h
Normal file
97
WinQuake/asm_i386.h
Normal file
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __ASM_I386__
|
||||
#define __ASM_I386__
|
||||
|
||||
#ifdef ELF
|
||||
#define C(label) label
|
||||
#else
|
||||
#define C(label) _##label
|
||||
#endif
|
||||
|
||||
//
|
||||
// !!! note that this file must match the corresponding C structures at all
|
||||
// times !!!
|
||||
//
|
||||
|
||||
// plane_t structure
|
||||
// !!! if this is changed, it must be changed in model.h too !!!
|
||||
// !!! if the size of this is changed, the array lookup in SV_HullPointContents
|
||||
// must be changed too !!!
|
||||
#define pl_normal 0
|
||||
#define pl_dist 12
|
||||
#define pl_type 16
|
||||
#define pl_signbits 17
|
||||
#define pl_pad 18
|
||||
#define pl_size 20
|
||||
|
||||
// hull_t structure
|
||||
// !!! if this is changed, it must be changed in model.h too !!!
|
||||
#define hu_clipnodes 0
|
||||
#define hu_planes 4
|
||||
#define hu_firstclipnode 8
|
||||
#define hu_lastclipnode 12
|
||||
#define hu_clip_mins 16
|
||||
#define hu_clip_maxs 28
|
||||
#define hu_size 40
|
||||
|
||||
// dnode_t structure
|
||||
// !!! if this is changed, it must be changed in bspfile.h too !!!
|
||||
#define nd_planenum 0
|
||||
#define nd_children 4
|
||||
#define nd_mins 8
|
||||
#define nd_maxs 20
|
||||
#define nd_firstface 32
|
||||
#define nd_numfaces 36
|
||||
#define nd_size 40
|
||||
|
||||
// sfxcache_t structure
|
||||
// !!! if this is changed, it much be changed in sound.h too !!!
|
||||
#define sfxc_length 0
|
||||
#define sfxc_loopstart 4
|
||||
#define sfxc_speed 8
|
||||
#define sfxc_width 12
|
||||
#define sfxc_stereo 16
|
||||
#define sfxc_data 20
|
||||
|
||||
// channel_t structure
|
||||
// !!! if this is changed, it much be changed in sound.h too !!!
|
||||
#define ch_sfx 0
|
||||
#define ch_leftvol 4
|
||||
#define ch_rightvol 8
|
||||
#define ch_end 12
|
||||
#define ch_pos 16
|
||||
#define ch_looping 20
|
||||
#define ch_entnum 24
|
||||
#define ch_entchannel 28
|
||||
#define ch_origin 32
|
||||
#define ch_dist_mult 44
|
||||
#define ch_master_vol 48
|
||||
#define ch_size 52
|
||||
|
||||
// portable_samplepair_t structure
|
||||
// !!! if this is changed, it much be changed in sound.h too !!!
|
||||
#define psp_left 0
|
||||
#define psp_right 4
|
||||
#define psp_size 8
|
||||
|
||||
#endif
|
||||
|
||||
142
WinQuake/block16.h
Normal file
142
WinQuake/block16.h
Normal file
@@ -0,0 +1,142 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
LEnter16_16:
|
||||
movb (%esi),%al
|
||||
movb (%esi,%ebx,),%cl
|
||||
movb %dh,%ah
|
||||
addl %ebp,%edx
|
||||
movb %dh,%ch
|
||||
leal (%esi,%ebx,2),%esi
|
||||
movw 0x12345678(,%eax,2),%ax
|
||||
LBPatch0:
|
||||
addl %ebp,%edx
|
||||
movw %ax,(%edi)
|
||||
movw 0x12345678(,%ecx,2),%cx
|
||||
LBPatch1:
|
||||
movw %cx,2(%edi)
|
||||
addl $0x4,%edi
|
||||
|
||||
movb (%esi),%al
|
||||
movb (%esi,%ebx,),%cl
|
||||
movb %dh,%ah
|
||||
addl %ebp,%edx
|
||||
movb %dh,%ch
|
||||
leal (%esi,%ebx,2),%esi
|
||||
movw 0x12345678(,%eax,2),%ax
|
||||
LBPatch2:
|
||||
addl %ebp,%edx
|
||||
movw %ax,(%edi)
|
||||
movw 0x12345678(,%ecx,2),%cx
|
||||
LBPatch3:
|
||||
movw %cx,2(%edi)
|
||||
addl $0x4,%edi
|
||||
|
||||
movb (%esi),%al
|
||||
movb (%esi,%ebx,),%cl
|
||||
movb %dh,%ah
|
||||
addl %ebp,%edx
|
||||
movb %dh,%ch
|
||||
leal (%esi,%ebx,2),%esi
|
||||
movw 0x12345678(,%eax,2),%ax
|
||||
LBPatch4:
|
||||
addl %ebp,%edx
|
||||
movw %ax,(%edi)
|
||||
movw 0x12345678(,%ecx,2),%cx
|
||||
LBPatch5:
|
||||
movw %cx,2(%edi)
|
||||
addl $0x4,%edi
|
||||
|
||||
movb (%esi),%al
|
||||
movb (%esi,%ebx,),%cl
|
||||
movb %dh,%ah
|
||||
addl %ebp,%edx
|
||||
movb %dh,%ch
|
||||
leal (%esi,%ebx,2),%esi
|
||||
movw 0x12345678(,%eax,2),%ax
|
||||
LBPatch6:
|
||||
addl %ebp,%edx
|
||||
movw %ax,(%edi)
|
||||
movw 0x12345678(,%ecx,2),%cx
|
||||
LBPatch7:
|
||||
movw %cx,2(%edi)
|
||||
addl $0x4,%edi
|
||||
|
||||
LEnter8_16:
|
||||
movb (%esi),%al
|
||||
movb (%esi,%ebx,),%cl
|
||||
movb %dh,%ah
|
||||
addl %ebp,%edx
|
||||
movb %dh,%ch
|
||||
leal (%esi,%ebx,2),%esi
|
||||
movw 0x12345678(,%eax,2),%ax
|
||||
LBPatch8:
|
||||
addl %ebp,%edx
|
||||
movw %ax,(%edi)
|
||||
movw 0x12345678(,%ecx,2),%cx
|
||||
LBPatch9:
|
||||
movw %cx,2(%edi)
|
||||
addl $0x4,%edi
|
||||
|
||||
movb (%esi),%al
|
||||
movb (%esi,%ebx,),%cl
|
||||
movb %dh,%ah
|
||||
addl %ebp,%edx
|
||||
movb %dh,%ch
|
||||
leal (%esi,%ebx,2),%esi
|
||||
movw 0x12345678(,%eax,2),%ax
|
||||
LBPatch10:
|
||||
addl %ebp,%edx
|
||||
movw %ax,(%edi)
|
||||
movw 0x12345678(,%ecx,2),%cx
|
||||
LBPatch11:
|
||||
movw %cx,2(%edi)
|
||||
addl $0x4,%edi
|
||||
|
||||
LEnter4_16:
|
||||
movb (%esi),%al
|
||||
movb (%esi,%ebx,),%cl
|
||||
movb %dh,%ah
|
||||
addl %ebp,%edx
|
||||
movb %dh,%ch
|
||||
leal (%esi,%ebx,2),%esi
|
||||
movw 0x12345678(,%eax,2),%ax
|
||||
LBPatch12:
|
||||
addl %ebp,%edx
|
||||
movw %ax,(%edi)
|
||||
movw 0x12345678(,%ecx,2),%cx
|
||||
LBPatch13:
|
||||
movw %cx,2(%edi)
|
||||
addl $0x4,%edi
|
||||
|
||||
LEnter2_16:
|
||||
movb (%esi),%al
|
||||
movb (%esi,%ebx,),%cl
|
||||
movb %dh,%ah
|
||||
addl %ebp,%edx
|
||||
movb %dh,%ch
|
||||
leal (%esi,%ebx,2),%esi
|
||||
movw 0x12345678(,%eax,2),%ax
|
||||
LBPatch14:
|
||||
addl %ebp,%edx
|
||||
movw %ax,(%edi)
|
||||
movw 0x12345678(,%ecx,2),%cx
|
||||
LBPatch15:
|
||||
movw %cx,2(%edi)
|
||||
addl $0x4,%edi
|
||||
143
WinQuake/block8.h
Normal file
143
WinQuake/block8.h
Normal file
@@ -0,0 +1,143 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
LEnter16_8:
|
||||
movb (%esi),%al
|
||||
movb (%esi,%ebx,),%cl
|
||||
movb %dh,%ah
|
||||
addl %ebp,%edx
|
||||
movb %dh,%ch
|
||||
leal (%esi,%ebx,2),%esi
|
||||
movb 0x12345678(%eax),%al
|
||||
LBPatch0:
|
||||
addl %ebp,%edx
|
||||
movb %al,(%edi)
|
||||
movb 0x12345678(%ecx),%cl
|
||||
LBPatch1:
|
||||
movb %cl,1(%edi)
|
||||
addl $0x2,%edi
|
||||
|
||||
movb (%esi),%al
|
||||
movb (%esi,%ebx,),%cl
|
||||
movb %dh,%ah
|
||||
addl %ebp,%edx
|
||||
movb %dh,%ch
|
||||
leal (%esi,%ebx,2),%esi
|
||||
movb 0x12345678(%eax),%al
|
||||
LBPatch2:
|
||||
addl %ebp,%edx
|
||||
movb %al,(%edi)
|
||||
movb 0x12345678(%ecx),%cl
|
||||
LBPatch3:
|
||||
movb %cl,1(%edi)
|
||||
addl $0x2,%edi
|
||||
|
||||
movb (%esi),%al
|
||||
movb (%esi,%ebx,),%cl
|
||||
movb %dh,%ah
|
||||
addl %ebp,%edx
|
||||
movb %dh,%ch
|
||||
leal (%esi,%ebx,2),%esi
|
||||
movb 0x12345678(%eax),%al
|
||||
LBPatch4:
|
||||
addl %ebp,%edx
|
||||
movb %al,(%edi)
|
||||
movb 0x12345678(%ecx),%cl
|
||||
LBPatch5:
|
||||
movb %cl,1(%edi)
|
||||
addl $0x2,%edi
|
||||
|
||||
movb (%esi),%al
|
||||
movb (%esi,%ebx,),%cl
|
||||
movb %dh,%ah
|
||||
addl %ebp,%edx
|
||||
movb %dh,%ch
|
||||
leal (%esi,%ebx,2),%esi
|
||||
movb 0x12345678(%eax),%al
|
||||
LBPatch6:
|
||||
addl %ebp,%edx
|
||||
movb %al,(%edi)
|
||||
movb 0x12345678(%ecx),%cl
|
||||
LBPatch7:
|
||||
movb %cl,1(%edi)
|
||||
addl $0x2,%edi
|
||||
|
||||
LEnter8_8:
|
||||
movb (%esi),%al
|
||||
movb (%esi,%ebx,),%cl
|
||||
movb %dh,%ah
|
||||
addl %ebp,%edx
|
||||
movb %dh,%ch
|
||||
leal (%esi,%ebx,2),%esi
|
||||
movb 0x12345678(%eax),%al
|
||||
LBPatch8:
|
||||
addl %ebp,%edx
|
||||
movb %al,(%edi)
|
||||
movb 0x12345678(%ecx),%cl
|
||||
LBPatch9:
|
||||
movb %cl,1(%edi)
|
||||
addl $0x2,%edi
|
||||
|
||||
movb (%esi),%al
|
||||
movb (%esi,%ebx,),%cl
|
||||
movb %dh,%ah
|
||||
addl %ebp,%edx
|
||||
movb %dh,%ch
|
||||
leal (%esi,%ebx,2),%esi
|
||||
movb 0x12345678(%eax),%al
|
||||
LBPatch10:
|
||||
addl %ebp,%edx
|
||||
movb %al,(%edi)
|
||||
movb 0x12345678(%ecx),%cl
|
||||
LBPatch11:
|
||||
movb %cl,1(%edi)
|
||||
addl $0x2,%edi
|
||||
|
||||
LEnter4_8:
|
||||
movb (%esi),%al
|
||||
movb (%esi,%ebx,),%cl
|
||||
movb %dh,%ah
|
||||
addl %ebp,%edx
|
||||
movb %dh,%ch
|
||||
leal (%esi,%ebx,2),%esi
|
||||
movb 0x12345678(%eax),%al
|
||||
LBPatch12:
|
||||
addl %ebp,%edx
|
||||
movb %al,(%edi)
|
||||
movb 0x12345678(%ecx),%cl
|
||||
LBPatch13:
|
||||
movb %cl,1(%edi)
|
||||
addl $0x2,%edi
|
||||
|
||||
LEnter2_8:
|
||||
movb (%esi),%al
|
||||
movb (%esi,%ebx,),%cl
|
||||
movb %dh,%ah
|
||||
addl %ebp,%edx
|
||||
movb %dh,%ch
|
||||
leal (%esi,%ebx,2),%esi
|
||||
movb 0x12345678(%eax),%al
|
||||
LBPatch14:
|
||||
addl %ebp,%edx
|
||||
movb %al,(%edi)
|
||||
movb 0x12345678(%ecx),%cl
|
||||
LBPatch15:
|
||||
movb %cl,1(%edi)
|
||||
addl $0x2,%edi
|
||||
|
||||
324
WinQuake/bspfile.h
Normal file
324
WinQuake/bspfile.h
Normal file
@@ -0,0 +1,324 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
// upper design bounds
|
||||
|
||||
#define MAX_MAP_HULLS 4
|
||||
|
||||
#define MAX_MAP_MODELS 256
|
||||
#define MAX_MAP_BRUSHES 4096
|
||||
#define MAX_MAP_ENTITIES 1024
|
||||
#define MAX_MAP_ENTSTRING 65536
|
||||
|
||||
#define MAX_MAP_PLANES 32767
|
||||
#define MAX_MAP_NODES 32767 // because negative shorts are contents
|
||||
#define MAX_MAP_CLIPNODES 32767 //
|
||||
#define MAX_MAP_LEAFS 8192
|
||||
#define MAX_MAP_VERTS 65535
|
||||
#define MAX_MAP_FACES 65535
|
||||
#define MAX_MAP_MARKSURFACES 65535
|
||||
#define MAX_MAP_TEXINFO 4096
|
||||
#define MAX_MAP_EDGES 256000
|
||||
#define MAX_MAP_SURFEDGES 512000
|
||||
#define MAX_MAP_TEXTURES 512
|
||||
#define MAX_MAP_MIPTEX 0x200000
|
||||
#define MAX_MAP_LIGHTING 0x100000
|
||||
#define MAX_MAP_VISIBILITY 0x100000
|
||||
|
||||
#define MAX_MAP_PORTALS 65536
|
||||
|
||||
// key / value pair sizes
|
||||
|
||||
#define MAX_KEY 32
|
||||
#define MAX_VALUE 1024
|
||||
|
||||
//=============================================================================
|
||||
|
||||
|
||||
#define BSPVERSION 29
|
||||
#define TOOLVERSION 2
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int fileofs, filelen;
|
||||
} lump_t;
|
||||
|
||||
#define LUMP_ENTITIES 0
|
||||
#define LUMP_PLANES 1
|
||||
#define LUMP_TEXTURES 2
|
||||
#define LUMP_VERTEXES 3
|
||||
#define LUMP_VISIBILITY 4
|
||||
#define LUMP_NODES 5
|
||||
#define LUMP_TEXINFO 6
|
||||
#define LUMP_FACES 7
|
||||
#define LUMP_LIGHTING 8
|
||||
#define LUMP_CLIPNODES 9
|
||||
#define LUMP_LEAFS 10
|
||||
#define LUMP_MARKSURFACES 11
|
||||
#define LUMP_EDGES 12
|
||||
#define LUMP_SURFEDGES 13
|
||||
#define LUMP_MODELS 14
|
||||
|
||||
#define HEADER_LUMPS 15
|
||||
|
||||
typedef struct
|
||||
{
|
||||
float mins[3], maxs[3];
|
||||
float origin[3];
|
||||
int headnode[MAX_MAP_HULLS];
|
||||
int visleafs; // not including the solid leaf 0
|
||||
int firstface, numfaces;
|
||||
} dmodel_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int version;
|
||||
lump_t lumps[HEADER_LUMPS];
|
||||
} dheader_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int nummiptex;
|
||||
int dataofs[4]; // [nummiptex]
|
||||
} dmiptexlump_t;
|
||||
|
||||
#define MIPLEVELS 4
|
||||
typedef struct miptex_s
|
||||
{
|
||||
char name[16];
|
||||
unsigned width, height;
|
||||
unsigned offsets[MIPLEVELS]; // four mip maps stored
|
||||
} miptex_t;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
float point[3];
|
||||
} dvertex_t;
|
||||
|
||||
|
||||
// 0-2 are axial planes
|
||||
#define PLANE_X 0
|
||||
#define PLANE_Y 1
|
||||
#define PLANE_Z 2
|
||||
|
||||
// 3-5 are non-axial planes snapped to the nearest
|
||||
#define PLANE_ANYX 3
|
||||
#define PLANE_ANYY 4
|
||||
#define PLANE_ANYZ 5
|
||||
|
||||
typedef struct
|
||||
{
|
||||
float normal[3];
|
||||
float dist;
|
||||
int type; // PLANE_X - PLANE_ANYZ ?remove? trivial to regenerate
|
||||
} dplane_t;
|
||||
|
||||
|
||||
|
||||
#define CONTENTS_EMPTY -1
|
||||
#define CONTENTS_SOLID -2
|
||||
#define CONTENTS_WATER -3
|
||||
#define CONTENTS_SLIME -4
|
||||
#define CONTENTS_LAVA -5
|
||||
#define CONTENTS_SKY -6
|
||||
#define CONTENTS_ORIGIN -7 // removed at csg time
|
||||
#define CONTENTS_CLIP -8 // changed to contents_solid
|
||||
|
||||
#define CONTENTS_CURRENT_0 -9
|
||||
#define CONTENTS_CURRENT_90 -10
|
||||
#define CONTENTS_CURRENT_180 -11
|
||||
#define CONTENTS_CURRENT_270 -12
|
||||
#define CONTENTS_CURRENT_UP -13
|
||||
#define CONTENTS_CURRENT_DOWN -14
|
||||
|
||||
|
||||
// !!! if this is changed, it must be changed in asm_i386.h too !!!
|
||||
typedef struct
|
||||
{
|
||||
int planenum;
|
||||
short children[2]; // negative numbers are -(leafs+1), not nodes
|
||||
short mins[3]; // for sphere culling
|
||||
short maxs[3];
|
||||
unsigned short firstface;
|
||||
unsigned short numfaces; // counting both sides
|
||||
} dnode_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int planenum;
|
||||
short children[2]; // negative numbers are contents
|
||||
} dclipnode_t;
|
||||
|
||||
|
||||
typedef struct texinfo_s
|
||||
{
|
||||
float vecs[2][4]; // [s/t][xyz offset]
|
||||
int miptex;
|
||||
int flags;
|
||||
} texinfo_t;
|
||||
#define TEX_SPECIAL 1 // sky or slime, no lightmap or 256 subdivision
|
||||
|
||||
// note that edge 0 is never used, because negative edge nums are used for
|
||||
// counterclockwise use of the edge in a face
|
||||
typedef struct
|
||||
{
|
||||
unsigned short v[2]; // vertex numbers
|
||||
} dedge_t;
|
||||
|
||||
#define MAXLIGHTMAPS 4
|
||||
typedef struct
|
||||
{
|
||||
short planenum;
|
||||
short side;
|
||||
|
||||
int firstedge; // we must support > 64k edges
|
||||
short numedges;
|
||||
short texinfo;
|
||||
|
||||
// lighting info
|
||||
byte styles[MAXLIGHTMAPS];
|
||||
int lightofs; // start of [numstyles*surfsize] samples
|
||||
} dface_t;
|
||||
|
||||
|
||||
|
||||
#define AMBIENT_WATER 0
|
||||
#define AMBIENT_SKY 1
|
||||
#define AMBIENT_SLIME 2
|
||||
#define AMBIENT_LAVA 3
|
||||
|
||||
#define NUM_AMBIENTS 4 // automatic ambient sounds
|
||||
|
||||
// leaf 0 is the generic CONTENTS_SOLID leaf, used for all solid areas
|
||||
// all other leafs need visibility info
|
||||
typedef struct
|
||||
{
|
||||
int contents;
|
||||
int visofs; // -1 = no visibility info
|
||||
|
||||
short mins[3]; // for frustum culling
|
||||
short maxs[3];
|
||||
|
||||
unsigned short firstmarksurface;
|
||||
unsigned short nummarksurfaces;
|
||||
|
||||
byte ambient_level[NUM_AMBIENTS];
|
||||
} dleaf_t;
|
||||
|
||||
|
||||
//============================================================================
|
||||
|
||||
#ifndef QUAKE_GAME
|
||||
|
||||
#define ANGLE_UP -1
|
||||
#define ANGLE_DOWN -2
|
||||
|
||||
|
||||
// the utilities get to be lazy and just use large static arrays
|
||||
|
||||
extern int nummodels;
|
||||
extern dmodel_t dmodels[MAX_MAP_MODELS];
|
||||
|
||||
extern int visdatasize;
|
||||
extern byte dvisdata[MAX_MAP_VISIBILITY];
|
||||
|
||||
extern int lightdatasize;
|
||||
extern byte dlightdata[MAX_MAP_LIGHTING];
|
||||
|
||||
extern int texdatasize;
|
||||
extern byte dtexdata[MAX_MAP_MIPTEX]; // (dmiptexlump_t)
|
||||
|
||||
extern int entdatasize;
|
||||
extern char dentdata[MAX_MAP_ENTSTRING];
|
||||
|
||||
extern int numleafs;
|
||||
extern dleaf_t dleafs[MAX_MAP_LEAFS];
|
||||
|
||||
extern int numplanes;
|
||||
extern dplane_t dplanes[MAX_MAP_PLANES];
|
||||
|
||||
extern int numvertexes;
|
||||
extern dvertex_t dvertexes[MAX_MAP_VERTS];
|
||||
|
||||
extern int numnodes;
|
||||
extern dnode_t dnodes[MAX_MAP_NODES];
|
||||
|
||||
extern int numtexinfo;
|
||||
extern texinfo_t texinfo[MAX_MAP_TEXINFO];
|
||||
|
||||
extern int numfaces;
|
||||
extern dface_t dfaces[MAX_MAP_FACES];
|
||||
|
||||
extern int numclipnodes;
|
||||
extern dclipnode_t dclipnodes[MAX_MAP_CLIPNODES];
|
||||
|
||||
extern int numedges;
|
||||
extern dedge_t dedges[MAX_MAP_EDGES];
|
||||
|
||||
extern int nummarksurfaces;
|
||||
extern unsigned short dmarksurfaces[MAX_MAP_MARKSURFACES];
|
||||
|
||||
extern int numsurfedges;
|
||||
extern int dsurfedges[MAX_MAP_SURFEDGES];
|
||||
|
||||
|
||||
void DecompressVis (byte *in, byte *decompressed);
|
||||
int CompressVis (byte *vis, byte *dest);
|
||||
|
||||
void LoadBSPFile (char *filename);
|
||||
void WriteBSPFile (char *filename);
|
||||
void PrintBSPFileSizes (void);
|
||||
|
||||
//===============
|
||||
|
||||
|
||||
typedef struct epair_s
|
||||
{
|
||||
struct epair_s *next;
|
||||
char *key;
|
||||
char *value;
|
||||
} epair_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
vec3_t origin;
|
||||
int firstbrush;
|
||||
int numbrushes;
|
||||
epair_t *epairs;
|
||||
} entity_t;
|
||||
|
||||
extern int num_entities;
|
||||
extern entity_t entities[MAX_MAP_ENTITIES];
|
||||
|
||||
void ParseEntities (void);
|
||||
void UnparseEntities (void);
|
||||
|
||||
void SetKeyValue (entity_t *ent, char *key, char *value);
|
||||
char *ValueForKey (entity_t *ent, char *key);
|
||||
// will return "" if not present
|
||||
|
||||
vec_t FloatForKey (entity_t *ent, char *key);
|
||||
void GetVectorForKey (entity_t *ent, char *key, vec3_t vec);
|
||||
|
||||
epair_t *ParseEpair (void);
|
||||
|
||||
#endif
|
||||
886
WinQuake/cd_audio.c
Normal file
886
WinQuake/cd_audio.c
Normal file
@@ -0,0 +1,886 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// Quake is a trademark of Id Software, Inc., (c) 1996 Id Software, Inc. All
|
||||
// rights reserved.
|
||||
|
||||
#include <dpmi.h>
|
||||
#include "quakedef.h"
|
||||
#include "dosisms.h"
|
||||
|
||||
extern cvar_t bgmvolume;
|
||||
|
||||
#define ADDRESS_MODE_HSG 0
|
||||
#define ADDRESS_MODE_RED_BOOK 1
|
||||
|
||||
#define STATUS_ERROR_BIT 0x8000
|
||||
#define STATUS_BUSY_BIT 0x0200
|
||||
#define STATUS_DONE_BIT 0x0100
|
||||
#define STATUS_ERROR_MASK 0x00ff
|
||||
|
||||
#define ERROR_WRITE_PROTECT 0
|
||||
#define ERROR_UNKNOWN_UNIT 1
|
||||
#define ERROR_DRIVE_NOT_READY 2
|
||||
#define ERROR_UNKNOWN_COMMAND 3
|
||||
#define ERROR_CRC_ERROR 4
|
||||
#define ERROR_BAD_REQUEST_LEN 5
|
||||
#define ERROR_SEEK_ERROR 6
|
||||
#define ERROR_UNKNOWN_MEDIA 7
|
||||
#define ERROR_SECTOR_NOT_FOUND 8
|
||||
#define ERROR_OUT_OF_PAPER 9
|
||||
#define ERROR_WRITE_FAULT 10
|
||||
#define ERROR_READ_FAULT 11
|
||||
#define ERROR_GENERAL_FAILURE 12
|
||||
#define ERROR_RESERVED_13 13
|
||||
#define ERROR_RESERVED_14 14
|
||||
#define ERROR_BAD_DISK_CHANGE 15
|
||||
|
||||
#define COMMAND_READ 3
|
||||
#define COMMAND_WRITE 12
|
||||
#define COMMAND_PLAY_AUDIO 132
|
||||
#define COMMAND_STOP_AUDIO 133
|
||||
#define COMMAND_RESUME_AUDIO 136
|
||||
|
||||
#define READ_REQUEST_AUDIO_CHANNEL_INFO 4
|
||||
#define READ_REQUEST_DEVICE_STATUS 6
|
||||
#define READ_REQUEST_MEDIA_CHANGE 9
|
||||
#define READ_REQUEST_AUDIO_DISK_INFO 10
|
||||
#define READ_REQUEST_AUDIO_TRACK_INFO 11
|
||||
#define READ_REQUEST_AUDIO_STATUS 15
|
||||
|
||||
#define WRITE_REQUEST_EJECT 0
|
||||
#define WRITE_REQUEST_RESET 2
|
||||
#define WRITE_REQUEST_AUDIO_CHANNEL_INFO 3
|
||||
|
||||
#define STATUS_DOOR_OPEN 0x00000001
|
||||
#define STATUS_DOOR_UNLOCKED 0x00000002
|
||||
#define STATUS_RAW_SUPPORT 0x00000004
|
||||
#define STATUS_READ_WRITE 0x00000008
|
||||
#define STATUS_AUDIO_SUPPORT 0x00000010
|
||||
#define STATUS_INTERLEAVE_SUPPORT 0x00000020
|
||||
#define STATUS_BIT_6_RESERVED 0x00000040
|
||||
#define STATUS_PREFETCH_SUPPORT 0x00000080
|
||||
#define STATUS_AUDIO_MANIPLUATION_SUPPORT 0x00000100
|
||||
#define STATUS_RED_BOOK_ADDRESS_SUPPORT 0x00000200
|
||||
|
||||
#define MEDIA_NOT_CHANGED 1
|
||||
#define MEDIA_STATUS_UNKNOWN 0
|
||||
#define MEDIA_CHANGED -1
|
||||
|
||||
#define AUDIO_CONTROL_MASK 0xd0
|
||||
#define AUDIO_CONTROL_DATA_TRACK 0x40
|
||||
#define AUDIO_CONTROL_AUDIO_2_TRACK 0x00
|
||||
#define AUDIO_CONTROL_AUDIO_2P_TRACK 0x10
|
||||
#define AUDIO_CONTROL_AUDIO_4_TRACK 0x80
|
||||
#define AUDIO_CONTROL_AUDIO_4P_TRACK 0x90
|
||||
|
||||
#define AUDIO_STATUS_PAUSED 0x0001
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
struct playAudioRequest
|
||||
{
|
||||
char addressingMode;
|
||||
int startLocation;
|
||||
int sectors;
|
||||
};
|
||||
|
||||
struct readRequest
|
||||
{
|
||||
char mediaDescriptor;
|
||||
short bufferOffset;
|
||||
short bufferSegment;
|
||||
short length;
|
||||
short startSector;
|
||||
int volumeID;
|
||||
};
|
||||
|
||||
struct writeRequest
|
||||
{
|
||||
char mediaDescriptor;
|
||||
short bufferOffset;
|
||||
short bufferSegment;
|
||||
short length;
|
||||
short startSector;
|
||||
int volumeID;
|
||||
};
|
||||
|
||||
struct cd_request
|
||||
{
|
||||
char headerLength;
|
||||
char unit;
|
||||
char command;
|
||||
short status;
|
||||
char reserved[8];
|
||||
union
|
||||
{
|
||||
struct playAudioRequest playAudio;
|
||||
struct readRequest read;
|
||||
struct writeRequest write;
|
||||
} x;
|
||||
};
|
||||
|
||||
|
||||
struct audioChannelInfo_s
|
||||
{
|
||||
char code;
|
||||
char channel0input;
|
||||
char channel0volume;
|
||||
char channel1input;
|
||||
char channel1volume;
|
||||
char channel2input;
|
||||
char channel2volume;
|
||||
char channel3input;
|
||||
char channel3volume;
|
||||
};
|
||||
|
||||
struct deviceStatus_s
|
||||
{
|
||||
char code;
|
||||
int status;
|
||||
};
|
||||
|
||||
struct mediaChange_s
|
||||
{
|
||||
char code;
|
||||
char status;
|
||||
};
|
||||
|
||||
struct audioDiskInfo_s
|
||||
{
|
||||
char code;
|
||||
char lowTrack;
|
||||
char highTrack;
|
||||
int leadOutStart;
|
||||
};
|
||||
|
||||
struct audioTrackInfo_s
|
||||
{
|
||||
char code;
|
||||
char track;
|
||||
int start;
|
||||
char control;
|
||||
};
|
||||
|
||||
struct audioStatus_s
|
||||
{
|
||||
char code;
|
||||
short status;
|
||||
int PRstartLocation;
|
||||
int PRendLocation;
|
||||
};
|
||||
|
||||
struct reset_s
|
||||
{
|
||||
char code;
|
||||
};
|
||||
|
||||
union readInfo_u
|
||||
{
|
||||
struct audioChannelInfo_s audioChannelInfo;
|
||||
struct deviceStatus_s deviceStatus;
|
||||
struct mediaChange_s mediaChange;
|
||||
struct audioDiskInfo_s audioDiskInfo;
|
||||
struct audioTrackInfo_s audioTrackInfo;
|
||||
struct audioStatus_s audioStatus;
|
||||
struct reset_s reset;
|
||||
};
|
||||
|
||||
#pragma pack()
|
||||
|
||||
#define MAXIMUM_TRACKS 100
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int start;
|
||||
int length;
|
||||
qboolean isData;
|
||||
} track_info;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
qboolean valid;
|
||||
int leadOutAddress;
|
||||
track_info track[MAXIMUM_TRACKS];
|
||||
byte lowTrack;
|
||||
byte highTrack;
|
||||
} cd_info;
|
||||
|
||||
static struct cd_request *cdRequest;
|
||||
static union readInfo_u *readInfo;
|
||||
static cd_info cd;
|
||||
|
||||
static qboolean playing = false;
|
||||
static qboolean wasPlaying = false;
|
||||
static qboolean mediaCheck = false;
|
||||
static qboolean initialized = false;
|
||||
static qboolean enabled = true;
|
||||
static qboolean playLooping = false;
|
||||
static short cdRequestSegment;
|
||||
static short cdRequestOffset;
|
||||
static short readInfoSegment;
|
||||
static short readInfoOffset;
|
||||
static byte remap[256];
|
||||
static byte cdrom;
|
||||
static byte playTrack;
|
||||
static byte cdvolume;
|
||||
|
||||
|
||||
static int RedBookToSector(int rb)
|
||||
{
|
||||
byte minute;
|
||||
byte second;
|
||||
byte frame;
|
||||
|
||||
minute = (rb >> 16) & 0xff;
|
||||
second = (rb >> 8) & 0xff;
|
||||
frame = rb & 0xff;
|
||||
return minute * 60 * 75 + second * 75 + frame;
|
||||
}
|
||||
|
||||
|
||||
static void CDAudio_Reset(void)
|
||||
{
|
||||
cdRequest->headerLength = 13;
|
||||
cdRequest->unit = 0;
|
||||
cdRequest->command = COMMAND_WRITE;
|
||||
cdRequest->status = 0;
|
||||
|
||||
cdRequest->x.write.mediaDescriptor = 0;
|
||||
cdRequest->x.write.bufferOffset = readInfoOffset;
|
||||
cdRequest->x.write.bufferSegment = readInfoSegment;
|
||||
cdRequest->x.write.length = sizeof(struct reset_s);
|
||||
cdRequest->x.write.startSector = 0;
|
||||
cdRequest->x.write.volumeID = 0;
|
||||
|
||||
readInfo->reset.code = WRITE_REQUEST_RESET;
|
||||
|
||||
regs.x.ax = 0x1510;
|
||||
regs.x.cx = cdrom;
|
||||
regs.x.es = cdRequestSegment;
|
||||
regs.x.bx = cdRequestOffset;
|
||||
dos_int86 (0x2f);
|
||||
}
|
||||
|
||||
|
||||
static void CDAudio_Eject(void)
|
||||
{
|
||||
cdRequest->headerLength = 13;
|
||||
cdRequest->unit = 0;
|
||||
cdRequest->command = COMMAND_WRITE;
|
||||
cdRequest->status = 0;
|
||||
|
||||
cdRequest->x.write.mediaDescriptor = 0;
|
||||
cdRequest->x.write.bufferOffset = readInfoOffset;
|
||||
cdRequest->x.write.bufferSegment = readInfoSegment;
|
||||
cdRequest->x.write.length = sizeof(struct reset_s);
|
||||
cdRequest->x.write.startSector = 0;
|
||||
cdRequest->x.write.volumeID = 0;
|
||||
|
||||
readInfo->reset.code = WRITE_REQUEST_EJECT;
|
||||
|
||||
regs.x.ax = 0x1510;
|
||||
regs.x.cx = cdrom;
|
||||
regs.x.es = cdRequestSegment;
|
||||
regs.x.bx = cdRequestOffset;
|
||||
dos_int86 (0x2f);
|
||||
}
|
||||
|
||||
|
||||
static int CDAudio_GetAudioTrackInfo(byte track, int *start)
|
||||
{
|
||||
byte control;
|
||||
|
||||
cdRequest->headerLength = 13;
|
||||
cdRequest->unit = 0;
|
||||
cdRequest->command = COMMAND_READ;
|
||||
cdRequest->status = 0;
|
||||
|
||||
cdRequest->x.read.mediaDescriptor = 0;
|
||||
cdRequest->x.read.bufferOffset = readInfoOffset;
|
||||
cdRequest->x.read.bufferSegment = readInfoSegment;
|
||||
cdRequest->x.read.length = sizeof(struct audioTrackInfo_s);
|
||||
cdRequest->x.read.startSector = 0;
|
||||
cdRequest->x.read.volumeID = 0;
|
||||
|
||||
readInfo->audioTrackInfo.code = READ_REQUEST_AUDIO_TRACK_INFO;
|
||||
readInfo->audioTrackInfo.track = track;
|
||||
|
||||
regs.x.ax = 0x1510;
|
||||
regs.x.cx = cdrom;
|
||||
regs.x.es = cdRequestSegment;
|
||||
regs.x.bx = cdRequestOffset;
|
||||
dos_int86 (0x2f);
|
||||
|
||||
if (cdRequest->status & STATUS_ERROR_BIT)
|
||||
{
|
||||
Con_DPrintf("CDAudio_GetAudioTrackInfo %04x\n", cdRequest->status & 0xffff);
|
||||
return -1;
|
||||
}
|
||||
|
||||
*start = readInfo->audioTrackInfo.start;
|
||||
control = readInfo->audioTrackInfo.control & AUDIO_CONTROL_MASK;
|
||||
return (control & AUDIO_CONTROL_DATA_TRACK);
|
||||
}
|
||||
|
||||
|
||||
static int CDAudio_GetAudioDiskInfo(void)
|
||||
{
|
||||
int n;
|
||||
|
||||
cdRequest->headerLength = 13;
|
||||
cdRequest->unit = 0;
|
||||
cdRequest->command = COMMAND_READ;
|
||||
cdRequest->status = 0;
|
||||
|
||||
cdRequest->x.read.mediaDescriptor = 0;
|
||||
cdRequest->x.read.bufferOffset = readInfoOffset;
|
||||
cdRequest->x.read.bufferSegment = readInfoSegment;
|
||||
cdRequest->x.read.length = sizeof(struct audioDiskInfo_s);
|
||||
cdRequest->x.read.startSector = 0;
|
||||
cdRequest->x.read.volumeID = 0;
|
||||
|
||||
readInfo->audioDiskInfo.code = READ_REQUEST_AUDIO_DISK_INFO;
|
||||
|
||||
regs.x.ax = 0x1510;
|
||||
regs.x.cx = cdrom;
|
||||
regs.x.es = cdRequestSegment;
|
||||
regs.x.bx = cdRequestOffset;
|
||||
dos_int86 (0x2f);
|
||||
|
||||
if (cdRequest->status & STATUS_ERROR_BIT)
|
||||
{
|
||||
Con_DPrintf("CDAudio_GetAudioDiskInfo %04x\n", cdRequest->status & 0xffff);
|
||||
return -1;
|
||||
}
|
||||
|
||||
cd.valid = true;
|
||||
cd.lowTrack = readInfo->audioDiskInfo.lowTrack;
|
||||
cd.highTrack = readInfo->audioDiskInfo.highTrack;
|
||||
cd.leadOutAddress = readInfo->audioDiskInfo.leadOutStart;
|
||||
|
||||
for (n = cd.lowTrack; n <= cd.highTrack; n++)
|
||||
{
|
||||
cd.track[n].isData = CDAudio_GetAudioTrackInfo (n, &cd.track[n].start);
|
||||
if (n > cd.lowTrack)
|
||||
{
|
||||
cd.track[n-1].length = RedBookToSector(cd.track[n].start) - RedBookToSector(cd.track[n-1].start);
|
||||
if (n == cd.highTrack)
|
||||
cd.track[n].length = RedBookToSector(cd.leadOutAddress) - RedBookToSector(cd.track[n].start);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int CDAudio_GetAudioStatus(void)
|
||||
{
|
||||
cdRequest->headerLength = 13;
|
||||
cdRequest->unit = 0;
|
||||
cdRequest->command = COMMAND_READ;
|
||||
cdRequest->status = 0;
|
||||
|
||||
cdRequest->x.read.mediaDescriptor = 0;
|
||||
cdRequest->x.read.bufferOffset = readInfoOffset;
|
||||
cdRequest->x.read.bufferSegment = readInfoSegment;
|
||||
cdRequest->x.read.length = sizeof(struct audioStatus_s);
|
||||
cdRequest->x.read.startSector = 0;
|
||||
cdRequest->x.read.volumeID = 0;
|
||||
|
||||
readInfo->audioDiskInfo.code = READ_REQUEST_AUDIO_STATUS;
|
||||
|
||||
regs.x.ax = 0x1510;
|
||||
regs.x.cx = cdrom;
|
||||
regs.x.es = cdRequestSegment;
|
||||
regs.x.bx = cdRequestOffset;
|
||||
dos_int86 (0x2f);
|
||||
|
||||
if (cdRequest->status & STATUS_ERROR_BIT)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int CDAudio_MediaChange(void)
|
||||
{
|
||||
cdRequest->headerLength = 13;
|
||||
cdRequest->unit = 0;
|
||||
cdRequest->command = COMMAND_READ;
|
||||
cdRequest->status = 0;
|
||||
|
||||
cdRequest->x.read.mediaDescriptor = 0;
|
||||
cdRequest->x.read.bufferOffset = readInfoOffset;
|
||||
cdRequest->x.read.bufferSegment = readInfoSegment;
|
||||
cdRequest->x.read.length = sizeof(struct mediaChange_s);
|
||||
cdRequest->x.read.startSector = 0;
|
||||
cdRequest->x.read.volumeID = 0;
|
||||
|
||||
readInfo->mediaChange.code = READ_REQUEST_MEDIA_CHANGE;
|
||||
|
||||
regs.x.ax = 0x1510;
|
||||
regs.x.cx = cdrom;
|
||||
regs.x.es = cdRequestSegment;
|
||||
regs.x.bx = cdRequestOffset;
|
||||
dos_int86 (0x2f);
|
||||
|
||||
return readInfo->mediaChange.status;
|
||||
}
|
||||
|
||||
|
||||
// we set the volume to 0 first and then to the desired volume
|
||||
// some cd-rom drivers seem to need it done this way
|
||||
void CDAudio_SetVolume (byte volume)
|
||||
{
|
||||
if (!initialized || !enabled)
|
||||
return;
|
||||
|
||||
cdRequest->headerLength = 13;
|
||||
cdRequest->unit = 0;
|
||||
cdRequest->command = COMMAND_WRITE;
|
||||
cdRequest->status = 0;
|
||||
|
||||
cdRequest->x.read.mediaDescriptor = 0;
|
||||
cdRequest->x.read.bufferOffset = readInfoOffset;
|
||||
cdRequest->x.read.bufferSegment = readInfoSegment;
|
||||
cdRequest->x.read.length = sizeof(struct audioChannelInfo_s);
|
||||
cdRequest->x.read.startSector = 0;
|
||||
cdRequest->x.read.volumeID = 0;
|
||||
|
||||
readInfo->audioChannelInfo.code = WRITE_REQUEST_AUDIO_CHANNEL_INFO;
|
||||
readInfo->audioChannelInfo.channel0input = 0;
|
||||
readInfo->audioChannelInfo.channel0volume = 0;
|
||||
readInfo->audioChannelInfo.channel1input = 1;
|
||||
readInfo->audioChannelInfo.channel1volume = 0;
|
||||
readInfo->audioChannelInfo.channel2input = 2;
|
||||
readInfo->audioChannelInfo.channel2volume = 0;
|
||||
readInfo->audioChannelInfo.channel3input = 3;
|
||||
readInfo->audioChannelInfo.channel3volume = 0;
|
||||
|
||||
regs.x.ax = 0x1510;
|
||||
regs.x.cx = cdrom;
|
||||
regs.x.es = cdRequestSegment;
|
||||
regs.x.bx = cdRequestOffset;
|
||||
dos_int86 (0x2f);
|
||||
|
||||
readInfo->audioChannelInfo.channel0volume = volume;
|
||||
readInfo->audioChannelInfo.channel1volume = volume;
|
||||
|
||||
regs.x.ax = 0x1510;
|
||||
regs.x.cx = cdrom;
|
||||
regs.x.es = cdRequestSegment;
|
||||
regs.x.bx = cdRequestOffset;
|
||||
dos_int86 (0x2f);
|
||||
|
||||
cdvolume = volume;
|
||||
}
|
||||
|
||||
|
||||
void CDAudio_Play(byte track, qboolean looping)
|
||||
{
|
||||
int volume;
|
||||
|
||||
if (!initialized || !enabled)
|
||||
return;
|
||||
|
||||
if (!cd.valid)
|
||||
return;
|
||||
|
||||
track = remap[track];
|
||||
|
||||
if (playing)
|
||||
{
|
||||
if (playTrack == track)
|
||||
return;
|
||||
CDAudio_Stop();
|
||||
}
|
||||
|
||||
playLooping = looping;
|
||||
|
||||
if (track < cd.lowTrack || track > cd.highTrack)
|
||||
{
|
||||
Con_DPrintf("CDAudio_Play: Bad track number %u.\n", track);
|
||||
return;
|
||||
}
|
||||
|
||||
playTrack = track;
|
||||
|
||||
if (cd.track[track].isData)
|
||||
{
|
||||
Con_DPrintf("CDAudio_Play: Can not play data.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
volume = (int)(bgmvolume.value * 255.0);
|
||||
if (volume < 0)
|
||||
{
|
||||
Cvar_SetValue ("bgmvolume", 0.0);
|
||||
volume = 0;
|
||||
}
|
||||
else if (volume > 255)
|
||||
{
|
||||
Cvar_SetValue ("bgmvolume", 1.0);
|
||||
volume = 255;
|
||||
}
|
||||
CDAudio_SetVolume (volume);
|
||||
|
||||
cdRequest->headerLength = 13;
|
||||
cdRequest->unit = 0;
|
||||
cdRequest->command = COMMAND_PLAY_AUDIO;
|
||||
cdRequest->status = 0;
|
||||
|
||||
cdRequest->x.playAudio.addressingMode = ADDRESS_MODE_RED_BOOK;
|
||||
cdRequest->x.playAudio.startLocation = cd.track[track].start;
|
||||
cdRequest->x.playAudio.sectors = cd.track[track].length;
|
||||
|
||||
regs.x.ax = 0x1510;
|
||||
regs.x.cx = cdrom;
|
||||
regs.x.es = cdRequestSegment;
|
||||
regs.x.bx = cdRequestOffset;
|
||||
dos_int86 (0x2f);
|
||||
|
||||
if (cdRequest->status & STATUS_ERROR_BIT)
|
||||
{
|
||||
Con_DPrintf("CDAudio_Play: track %u failed\n", track);
|
||||
cd.valid = false;
|
||||
playing = false;
|
||||
return;
|
||||
}
|
||||
|
||||
playing = true;
|
||||
}
|
||||
|
||||
|
||||
void CDAudio_Stop(void)
|
||||
{
|
||||
if (!initialized || !enabled)
|
||||
return;
|
||||
|
||||
cdRequest->headerLength = 13;
|
||||
cdRequest->unit = 0;
|
||||
cdRequest->command = COMMAND_STOP_AUDIO;
|
||||
cdRequest->status = 0;
|
||||
|
||||
regs.x.ax = 0x1510;
|
||||
regs.x.cx = cdrom;
|
||||
regs.x.es = cdRequestSegment;
|
||||
regs.x.bx = cdRequestOffset;
|
||||
dos_int86 (0x2f);
|
||||
|
||||
wasPlaying = playing;
|
||||
playing = false;
|
||||
}
|
||||
|
||||
|
||||
void CDAudio_Pause(void)
|
||||
{
|
||||
CDAudio_Stop();
|
||||
}
|
||||
|
||||
|
||||
void CDAudio_Resume(void)
|
||||
{
|
||||
if (!initialized || !enabled)
|
||||
return;
|
||||
|
||||
if (!cd.valid)
|
||||
return;
|
||||
|
||||
if (!wasPlaying)
|
||||
return;
|
||||
|
||||
cdRequest->headerLength = 13;
|
||||
cdRequest->unit = 0;
|
||||
cdRequest->command = COMMAND_RESUME_AUDIO;
|
||||
cdRequest->status = 0;
|
||||
|
||||
regs.x.ax = 0x1510;
|
||||
regs.x.cx = cdrom;
|
||||
regs.x.es = cdRequestSegment;
|
||||
regs.x.bx = cdRequestOffset;
|
||||
dos_int86 (0x2f);
|
||||
|
||||
playing = true;
|
||||
}
|
||||
|
||||
|
||||
static void CD_f (void)
|
||||
{
|
||||
char *command;
|
||||
int ret;
|
||||
int n;
|
||||
int startAddress;
|
||||
|
||||
if (Cmd_Argc() < 2)
|
||||
return;
|
||||
|
||||
command = Cmd_Argv (1);
|
||||
|
||||
if (Q_strcasecmp(command, "on") == 0)
|
||||
{
|
||||
enabled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "off") == 0)
|
||||
{
|
||||
if (playing)
|
||||
CDAudio_Stop();
|
||||
enabled = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "reset") == 0)
|
||||
{
|
||||
enabled = true;
|
||||
if (playing)
|
||||
CDAudio_Stop();
|
||||
for (n = 0; n < 256; n++)
|
||||
remap[n] = n;
|
||||
CDAudio_Reset();
|
||||
CDAudio_GetAudioDiskInfo();
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "remap") == 0)
|
||||
{
|
||||
ret = Cmd_Argc() - 2;
|
||||
if (ret <= 0)
|
||||
{
|
||||
for (n = 1; n < 256; n++)
|
||||
if (remap[n] != n)
|
||||
Con_Printf(" %u -> %u\n", n, remap[n]);
|
||||
return;
|
||||
}
|
||||
for (n = 1; n <= ret; n++)
|
||||
remap[n] = Q_atoi(Cmd_Argv (n+1));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!cd.valid)
|
||||
{
|
||||
Con_Printf("No CD in player.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "play") == 0)
|
||||
{
|
||||
CDAudio_Play(Q_atoi(Cmd_Argv (2)), false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "loop") == 0)
|
||||
{
|
||||
CDAudio_Play(Q_atoi(Cmd_Argv (2)), true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "stop") == 0)
|
||||
{
|
||||
CDAudio_Stop();
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "pause") == 0)
|
||||
{
|
||||
CDAudio_Pause();
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "resume") == 0)
|
||||
{
|
||||
CDAudio_Resume();
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "eject") == 0)
|
||||
{
|
||||
if (playing)
|
||||
CDAudio_Stop();
|
||||
CDAudio_Eject();
|
||||
cd.valid = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "info") == 0)
|
||||
{
|
||||
Con_Printf("%u tracks\n", cd.highTrack - cd.lowTrack + 1);
|
||||
for (n = cd.lowTrack; n <= cd.highTrack; n++)
|
||||
{
|
||||
ret = CDAudio_GetAudioTrackInfo (n, &startAddress);
|
||||
Con_Printf("Track %2u: %s at %2u:%02u\n", n, ret ? "data " : "music", (startAddress >> 16) & 0xff, (startAddress >> 8) & 0xff);
|
||||
}
|
||||
if (playing)
|
||||
Con_Printf("Currently %s track %u\n", playLooping ? "looping" : "playing", playTrack);
|
||||
Con_Printf("Volume is %u\n", cdvolume);
|
||||
CDAudio_MediaChange();
|
||||
Con_Printf("Status %04x\n", cdRequest->status & 0xffff);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CDAudio_Update(void)
|
||||
{
|
||||
int ret;
|
||||
int newVolume;
|
||||
static double lastUpdate;
|
||||
|
||||
if (!initialized || !enabled)
|
||||
return;
|
||||
|
||||
if ((realtime - lastUpdate) < 0.25)
|
||||
return;
|
||||
lastUpdate = realtime;
|
||||
|
||||
if (mediaCheck)
|
||||
{
|
||||
static double lastCheck;
|
||||
|
||||
if ((realtime - lastCheck) < 5.0)
|
||||
return;
|
||||
lastCheck = realtime;
|
||||
|
||||
ret = CDAudio_MediaChange();
|
||||
if (ret == MEDIA_CHANGED)
|
||||
{
|
||||
Con_DPrintf("CDAudio: media changed\n");
|
||||
playing = false;
|
||||
wasPlaying = false;
|
||||
cd.valid = false;
|
||||
CDAudio_GetAudioDiskInfo();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
newVolume = (int)(bgmvolume.value * 255.0);
|
||||
if (newVolume != cdvolume)
|
||||
{
|
||||
if (newVolume < 0)
|
||||
{
|
||||
Cvar_SetValue ("bgmvolume", 0.0);
|
||||
newVolume = 0;
|
||||
}
|
||||
else if (newVolume > 255)
|
||||
{
|
||||
Cvar_SetValue ("bgmvolume", 1.0);
|
||||
newVolume = 255;
|
||||
}
|
||||
CDAudio_SetVolume (newVolume);
|
||||
}
|
||||
|
||||
if (playing)
|
||||
{
|
||||
CDAudio_GetAudioStatus();
|
||||
if ((cdRequest->status & STATUS_BUSY_BIT) == 0)
|
||||
{
|
||||
playing = false;
|
||||
if (playLooping)
|
||||
CDAudio_Play(playTrack, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int CDAudio_Init(void)
|
||||
{
|
||||
char *memory;
|
||||
int n;
|
||||
|
||||
if (cls.state == ca_dedicated)
|
||||
return -1;
|
||||
|
||||
if (COM_CheckParm("-nocdaudio"))
|
||||
return -1;
|
||||
|
||||
if (COM_CheckParm("-cdmediacheck"))
|
||||
mediaCheck = true;
|
||||
|
||||
regs.x.ax = 0x1500;
|
||||
regs.x.bx = 0;
|
||||
dos_int86 (0x2f);
|
||||
if (regs.x.bx == 0)
|
||||
{
|
||||
Con_NotifyBox (
|
||||
"MSCDEX not loaded, music is\n"
|
||||
"disabled. Use \"-nocdaudio\" if you\n"
|
||||
"wish to avoid this message in the\n"
|
||||
"future. See README.TXT for help.\n"
|
||||
);
|
||||
return -1;
|
||||
}
|
||||
if (regs.x.bx > 1)
|
||||
Con_DPrintf("CDAudio_Init: First CD-ROM drive will be used\n");
|
||||
cdrom = regs.x.cx;
|
||||
|
||||
regs.x.ax = 0x150c;
|
||||
regs.x.bx = 0;
|
||||
dos_int86 (0x2f);
|
||||
if (regs.x.bx == 0)
|
||||
{
|
||||
Con_NotifyBox (
|
||||
"MSCDEX version 2.00 or later\n"
|
||||
"required for music. See README.TXT\n"
|
||||
"for help.\n"
|
||||
);
|
||||
Con_DPrintf("CDAudio_Init: MSCDEX version 2.00 or later required.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
memory = dos_getmemory(sizeof(struct cd_request
|
||||
) + sizeof(union readInfo_u));
|
||||
if (memory == NULL)
|
||||
{
|
||||
Con_DPrintf("CDAudio_Init: Unable to allocate low memory.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
cdRequest = (struct cd_request *)memory;
|
||||
cdRequestSegment = ptr2real(cdRequest) >> 4;
|
||||
cdRequestOffset = ptr2real(cdRequest) & 0xf;
|
||||
|
||||
readInfo = (union readInfo_u *)(memory + sizeof(struct cd_request));
|
||||
readInfoSegment = ptr2real(readInfo) >> 4;
|
||||
readInfoOffset = ptr2real(readInfo) & 0xf;
|
||||
|
||||
for (n = 0; n < 256; n++)
|
||||
remap[n] = n;
|
||||
initialized = true;
|
||||
|
||||
CDAudio_SetVolume (255);
|
||||
if (CDAudio_GetAudioDiskInfo())
|
||||
{
|
||||
Con_Printf("CDAudio_Init: No CD in player.\n");
|
||||
enabled = false;
|
||||
}
|
||||
|
||||
Cmd_AddCommand ("cd", CD_f);
|
||||
|
||||
Con_Printf("CD Audio Initialized\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void CDAudio_Shutdown(void)
|
||||
{
|
||||
if (!initialized)
|
||||
return;
|
||||
CDAudio_Stop();
|
||||
}
|
||||
416
WinQuake/cd_linux.c
Normal file
416
WinQuake/cd_linux.c
Normal file
@@ -0,0 +1,416 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// Quake is a trademark of Id Software, Inc., (c) 1996 Id Software, Inc. All
|
||||
// rights reserved.
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <linux/cdrom.h>
|
||||
|
||||
#include "quakedef.h"
|
||||
|
||||
static qboolean cdValid = false;
|
||||
static qboolean playing = false;
|
||||
static qboolean wasPlaying = false;
|
||||
static qboolean initialized = false;
|
||||
static qboolean enabled = true;
|
||||
static qboolean playLooping = false;
|
||||
static float cdvolume;
|
||||
static byte remap[100];
|
||||
static byte playTrack;
|
||||
static byte maxTrack;
|
||||
|
||||
static int cdfile = -1;
|
||||
static char cd_dev[64] = "/dev/cdrom";
|
||||
|
||||
static void CDAudio_Eject(void)
|
||||
{
|
||||
if (cdfile == -1 || !enabled)
|
||||
return; // no cd init'd
|
||||
|
||||
if ( ioctl(cdfile, CDROMEJECT) == -1 )
|
||||
Con_DPrintf("ioctl cdromeject failed\n");
|
||||
}
|
||||
|
||||
|
||||
static void CDAudio_CloseDoor(void)
|
||||
{
|
||||
if (cdfile == -1 || !enabled)
|
||||
return; // no cd init'd
|
||||
|
||||
if ( ioctl(cdfile, CDROMCLOSETRAY) == -1 )
|
||||
Con_DPrintf("ioctl cdromclosetray failed\n");
|
||||
}
|
||||
|
||||
static int CDAudio_GetAudioDiskInfo(void)
|
||||
{
|
||||
struct cdrom_tochdr tochdr;
|
||||
|
||||
cdValid = false;
|
||||
|
||||
if ( ioctl(cdfile, CDROMREADTOCHDR, &tochdr) == -1 )
|
||||
{
|
||||
Con_DPrintf("ioctl cdromreadtochdr failed\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (tochdr.cdth_trk0 < 1)
|
||||
{
|
||||
Con_DPrintf("CDAudio: no music tracks\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
cdValid = true;
|
||||
maxTrack = tochdr.cdth_trk1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void CDAudio_Play(byte track, qboolean looping)
|
||||
{
|
||||
struct cdrom_tocentry entry;
|
||||
struct cdrom_ti ti;
|
||||
|
||||
if (cdfile == -1 || !enabled)
|
||||
return;
|
||||
|
||||
if (!cdValid)
|
||||
{
|
||||
CDAudio_GetAudioDiskInfo();
|
||||
if (!cdValid)
|
||||
return;
|
||||
}
|
||||
|
||||
track = remap[track];
|
||||
|
||||
if (track < 1 || track > maxTrack)
|
||||
{
|
||||
Con_DPrintf("CDAudio: Bad track number %u.\n", track);
|
||||
return;
|
||||
}
|
||||
|
||||
// don't try to play a non-audio track
|
||||
entry.cdte_track = track;
|
||||
entry.cdte_format = CDROM_MSF;
|
||||
if ( ioctl(cdfile, CDROMREADTOCENTRY, &entry) == -1 )
|
||||
{
|
||||
Con_DPrintf("ioctl cdromreadtocentry failed\n");
|
||||
return;
|
||||
}
|
||||
if (entry.cdte_ctrl == CDROM_DATA_TRACK)
|
||||
{
|
||||
Con_Printf("CDAudio: track %i is not audio\n", track);
|
||||
return;
|
||||
}
|
||||
|
||||
if (playing)
|
||||
{
|
||||
if (playTrack == track)
|
||||
return;
|
||||
CDAudio_Stop();
|
||||
}
|
||||
|
||||
ti.cdti_trk0 = track;
|
||||
ti.cdti_trk1 = track;
|
||||
ti.cdti_ind0 = 1;
|
||||
ti.cdti_ind1 = 99;
|
||||
|
||||
if ( ioctl(cdfile, CDROMPLAYTRKIND, &ti) == -1 )
|
||||
{
|
||||
Con_DPrintf("ioctl cdromplaytrkind failed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ioctl(cdfile, CDROMRESUME) == -1 )
|
||||
Con_DPrintf("ioctl cdromresume failed\n");
|
||||
|
||||
playLooping = looping;
|
||||
playTrack = track;
|
||||
playing = true;
|
||||
|
||||
if (cdvolume == 0.0)
|
||||
CDAudio_Pause ();
|
||||
}
|
||||
|
||||
|
||||
void CDAudio_Stop(void)
|
||||
{
|
||||
if (cdfile == -1 || !enabled)
|
||||
return;
|
||||
|
||||
if (!playing)
|
||||
return;
|
||||
|
||||
if ( ioctl(cdfile, CDROMSTOP) == -1 )
|
||||
Con_DPrintf("ioctl cdromstop failed (%d)\n", errno);
|
||||
|
||||
wasPlaying = false;
|
||||
playing = false;
|
||||
}
|
||||
|
||||
void CDAudio_Pause(void)
|
||||
{
|
||||
if (cdfile == -1 || !enabled)
|
||||
return;
|
||||
|
||||
if (!playing)
|
||||
return;
|
||||
|
||||
if ( ioctl(cdfile, CDROMPAUSE) == -1 )
|
||||
Con_DPrintf("ioctl cdrompause failed\n");
|
||||
|
||||
wasPlaying = playing;
|
||||
playing = false;
|
||||
}
|
||||
|
||||
|
||||
void CDAudio_Resume(void)
|
||||
{
|
||||
if (cdfile == -1 || !enabled)
|
||||
return;
|
||||
|
||||
if (!cdValid)
|
||||
return;
|
||||
|
||||
if (!wasPlaying)
|
||||
return;
|
||||
|
||||
if ( ioctl(cdfile, CDROMRESUME) == -1 )
|
||||
Con_DPrintf("ioctl cdromresume failed\n");
|
||||
playing = true;
|
||||
}
|
||||
|
||||
static void CD_f (void)
|
||||
{
|
||||
char *command;
|
||||
int ret;
|
||||
int n;
|
||||
|
||||
if (Cmd_Argc() < 2)
|
||||
return;
|
||||
|
||||
command = Cmd_Argv (1);
|
||||
|
||||
if (Q_strcasecmp(command, "on") == 0)
|
||||
{
|
||||
enabled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "off") == 0)
|
||||
{
|
||||
if (playing)
|
||||
CDAudio_Stop();
|
||||
enabled = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "reset") == 0)
|
||||
{
|
||||
enabled = true;
|
||||
if (playing)
|
||||
CDAudio_Stop();
|
||||
for (n = 0; n < 100; n++)
|
||||
remap[n] = n;
|
||||
CDAudio_GetAudioDiskInfo();
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "remap") == 0)
|
||||
{
|
||||
ret = Cmd_Argc() - 2;
|
||||
if (ret <= 0)
|
||||
{
|
||||
for (n = 1; n < 100; n++)
|
||||
if (remap[n] != n)
|
||||
Con_Printf(" %u -> %u\n", n, remap[n]);
|
||||
return;
|
||||
}
|
||||
for (n = 1; n <= ret; n++)
|
||||
remap[n] = Q_atoi(Cmd_Argv (n+1));
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "close") == 0)
|
||||
{
|
||||
CDAudio_CloseDoor();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!cdValid)
|
||||
{
|
||||
CDAudio_GetAudioDiskInfo();
|
||||
if (!cdValid)
|
||||
{
|
||||
Con_Printf("No CD in player.\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "play") == 0)
|
||||
{
|
||||
CDAudio_Play((byte)Q_atoi(Cmd_Argv (2)), false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "loop") == 0)
|
||||
{
|
||||
CDAudio_Play((byte)Q_atoi(Cmd_Argv (2)), true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "stop") == 0)
|
||||
{
|
||||
CDAudio_Stop();
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "pause") == 0)
|
||||
{
|
||||
CDAudio_Pause();
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "resume") == 0)
|
||||
{
|
||||
CDAudio_Resume();
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "eject") == 0)
|
||||
{
|
||||
if (playing)
|
||||
CDAudio_Stop();
|
||||
CDAudio_Eject();
|
||||
cdValid = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "info") == 0)
|
||||
{
|
||||
Con_Printf("%u tracks\n", maxTrack);
|
||||
if (playing)
|
||||
Con_Printf("Currently %s track %u\n", playLooping ? "looping" : "playing", playTrack);
|
||||
else if (wasPlaying)
|
||||
Con_Printf("Paused %s track %u\n", playLooping ? "looping" : "playing", playTrack);
|
||||
Con_Printf("Volume is %f\n", cdvolume);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void CDAudio_Update(void)
|
||||
{
|
||||
struct cdrom_subchnl subchnl;
|
||||
static time_t lastchk;
|
||||
|
||||
if (!enabled)
|
||||
return;
|
||||
|
||||
if (bgmvolume.value != cdvolume)
|
||||
{
|
||||
if (cdvolume)
|
||||
{
|
||||
Cvar_SetValue ("bgmvolume", 0.0);
|
||||
cdvolume = bgmvolume.value;
|
||||
CDAudio_Pause ();
|
||||
}
|
||||
else
|
||||
{
|
||||
Cvar_SetValue ("bgmvolume", 1.0);
|
||||
cdvolume = bgmvolume.value;
|
||||
CDAudio_Resume ();
|
||||
}
|
||||
}
|
||||
|
||||
if (playing && lastchk < time(NULL)) {
|
||||
lastchk = time(NULL) + 2; //two seconds between chks
|
||||
subchnl.cdsc_format = CDROM_MSF;
|
||||
if (ioctl(cdfile, CDROMSUBCHNL, &subchnl) == -1 ) {
|
||||
Con_DPrintf("ioctl cdromsubchnl failed\n");
|
||||
playing = false;
|
||||
return;
|
||||
}
|
||||
if (subchnl.cdsc_audiostatus != CDROM_AUDIO_PLAY &&
|
||||
subchnl.cdsc_audiostatus != CDROM_AUDIO_PAUSED) {
|
||||
playing = false;
|
||||
if (playLooping)
|
||||
CDAudio_Play(playTrack, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int CDAudio_Init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (cls.state == ca_dedicated)
|
||||
return -1;
|
||||
|
||||
if (COM_CheckParm("-nocdaudio"))
|
||||
return -1;
|
||||
|
||||
if ((i = COM_CheckParm("-cddev")) != 0 && i < com_argc - 1) {
|
||||
strncpy(cd_dev, com_argv[i + 1], sizeof(cd_dev));
|
||||
cd_dev[sizeof(cd_dev) - 1] = 0;
|
||||
}
|
||||
|
||||
if ((cdfile = open(cd_dev, O_RDONLY)) == -1) {
|
||||
Con_Printf("CDAudio_Init: open of \"%s\" failed (%i)\n", cd_dev, errno);
|
||||
cdfile = -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (i = 0; i < 100; i++)
|
||||
remap[i] = i;
|
||||
initialized = true;
|
||||
enabled = true;
|
||||
|
||||
if (CDAudio_GetAudioDiskInfo())
|
||||
{
|
||||
Con_Printf("CDAudio_Init: No CD in player.\n");
|
||||
cdValid = false;
|
||||
}
|
||||
|
||||
Cmd_AddCommand ("cd", CD_f);
|
||||
|
||||
Con_Printf("CD Audio Initialized\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void CDAudio_Shutdown(void)
|
||||
{
|
||||
if (!initialized)
|
||||
return;
|
||||
CDAudio_Stop();
|
||||
close(cdfile);
|
||||
cdfile = -1;
|
||||
}
|
||||
55
WinQuake/cd_null.c
Normal file
55
WinQuake/cd_null.c
Normal file
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
#include "quakedef.h"
|
||||
|
||||
void CDAudio_Play(byte track, qboolean looping)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void CDAudio_Stop(void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void CDAudio_Pause(void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void CDAudio_Resume(void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void CDAudio_Update(void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
int CDAudio_Init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void CDAudio_Shutdown(void)
|
||||
{
|
||||
}
|
||||
477
WinQuake/cd_win.c
Normal file
477
WinQuake/cd_win.c
Normal file
@@ -0,0 +1,477 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// Quake is a trademark of Id Software, Inc., (c) 1996 Id Software, Inc. All
|
||||
// rights reserved.
|
||||
|
||||
#include <windows.h>
|
||||
#include "quakedef.h"
|
||||
|
||||
extern HWND mainwindow;
|
||||
extern cvar_t bgmvolume;
|
||||
|
||||
static qboolean cdValid = false;
|
||||
static qboolean playing = false;
|
||||
static qboolean wasPlaying = false;
|
||||
static qboolean initialized = false;
|
||||
static qboolean enabled = false;
|
||||
static qboolean playLooping = false;
|
||||
static float cdvolume;
|
||||
static byte remap[100];
|
||||
static byte cdrom;
|
||||
static byte playTrack;
|
||||
static byte maxTrack;
|
||||
|
||||
UINT wDeviceID;
|
||||
|
||||
|
||||
static void CDAudio_Eject(void)
|
||||
{
|
||||
DWORD dwReturn;
|
||||
|
||||
if (dwReturn = mciSendCommand(wDeviceID, MCI_SET, MCI_SET_DOOR_OPEN, (DWORD)NULL))
|
||||
Con_DPrintf("MCI_SET_DOOR_OPEN failed (%i)\n", dwReturn);
|
||||
}
|
||||
|
||||
|
||||
static void CDAudio_CloseDoor(void)
|
||||
{
|
||||
DWORD dwReturn;
|
||||
|
||||
if (dwReturn = mciSendCommand(wDeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, (DWORD)NULL))
|
||||
Con_DPrintf("MCI_SET_DOOR_CLOSED failed (%i)\n", dwReturn);
|
||||
}
|
||||
|
||||
|
||||
static int CDAudio_GetAudioDiskInfo(void)
|
||||
{
|
||||
DWORD dwReturn;
|
||||
MCI_STATUS_PARMS mciStatusParms;
|
||||
|
||||
|
||||
cdValid = false;
|
||||
|
||||
mciStatusParms.dwItem = MCI_STATUS_READY;
|
||||
dwReturn = mciSendCommand(wDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_WAIT, (DWORD) (LPVOID) &mciStatusParms);
|
||||
if (dwReturn)
|
||||
{
|
||||
Con_DPrintf("CDAudio: drive ready test - get status failed\n");
|
||||
return -1;
|
||||
}
|
||||
if (!mciStatusParms.dwReturn)
|
||||
{
|
||||
Con_DPrintf("CDAudio: drive not ready\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
mciStatusParms.dwItem = MCI_STATUS_NUMBER_OF_TRACKS;
|
||||
dwReturn = mciSendCommand(wDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_WAIT, (DWORD) (LPVOID) &mciStatusParms);
|
||||
if (dwReturn)
|
||||
{
|
||||
Con_DPrintf("CDAudio: get tracks - status failed\n");
|
||||
return -1;
|
||||
}
|
||||
if (mciStatusParms.dwReturn < 1)
|
||||
{
|
||||
Con_DPrintf("CDAudio: no music tracks\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
cdValid = true;
|
||||
maxTrack = mciStatusParms.dwReturn;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void CDAudio_Play(byte track, qboolean looping)
|
||||
{
|
||||
DWORD dwReturn;
|
||||
MCI_PLAY_PARMS mciPlayParms;
|
||||
MCI_STATUS_PARMS mciStatusParms;
|
||||
|
||||
if (!enabled)
|
||||
return;
|
||||
|
||||
if (!cdValid)
|
||||
{
|
||||
CDAudio_GetAudioDiskInfo();
|
||||
if (!cdValid)
|
||||
return;
|
||||
}
|
||||
|
||||
track = remap[track];
|
||||
|
||||
if (track < 1 || track > maxTrack)
|
||||
{
|
||||
Con_DPrintf("CDAudio: Bad track number %u.\n", track);
|
||||
return;
|
||||
}
|
||||
|
||||
// don't try to play a non-audio track
|
||||
mciStatusParms.dwItem = MCI_CDA_STATUS_TYPE_TRACK;
|
||||
mciStatusParms.dwTrack = track;
|
||||
dwReturn = mciSendCommand(wDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_TRACK | MCI_WAIT, (DWORD) (LPVOID) &mciStatusParms);
|
||||
if (dwReturn)
|
||||
{
|
||||
Con_DPrintf("MCI_STATUS failed (%i)\n", dwReturn);
|
||||
return;
|
||||
}
|
||||
if (mciStatusParms.dwReturn != MCI_CDA_TRACK_AUDIO)
|
||||
{
|
||||
Con_Printf("CDAudio: track %i is not audio\n", track);
|
||||
return;
|
||||
}
|
||||
|
||||
// get the length of the track to be played
|
||||
mciStatusParms.dwItem = MCI_STATUS_LENGTH;
|
||||
mciStatusParms.dwTrack = track;
|
||||
dwReturn = mciSendCommand(wDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_TRACK | MCI_WAIT, (DWORD) (LPVOID) &mciStatusParms);
|
||||
if (dwReturn)
|
||||
{
|
||||
Con_DPrintf("MCI_STATUS failed (%i)\n", dwReturn);
|
||||
return;
|
||||
}
|
||||
|
||||
if (playing)
|
||||
{
|
||||
if (playTrack == track)
|
||||
return;
|
||||
CDAudio_Stop();
|
||||
}
|
||||
|
||||
mciPlayParms.dwFrom = MCI_MAKE_TMSF(track, 0, 0, 0);
|
||||
mciPlayParms.dwTo = (mciStatusParms.dwReturn << 8) | track;
|
||||
mciPlayParms.dwCallback = (DWORD)mainwindow;
|
||||
dwReturn = mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY | MCI_FROM | MCI_TO, (DWORD)(LPVOID) &mciPlayParms);
|
||||
if (dwReturn)
|
||||
{
|
||||
Con_DPrintf("CDAudio: MCI_PLAY failed (%i)\n", dwReturn);
|
||||
return;
|
||||
}
|
||||
|
||||
playLooping = looping;
|
||||
playTrack = track;
|
||||
playing = true;
|
||||
|
||||
if (cdvolume == 0.0)
|
||||
CDAudio_Pause ();
|
||||
}
|
||||
|
||||
|
||||
void CDAudio_Stop(void)
|
||||
{
|
||||
DWORD dwReturn;
|
||||
|
||||
if (!enabled)
|
||||
return;
|
||||
|
||||
if (!playing)
|
||||
return;
|
||||
|
||||
if (dwReturn = mciSendCommand(wDeviceID, MCI_STOP, 0, (DWORD)NULL))
|
||||
Con_DPrintf("MCI_STOP failed (%i)", dwReturn);
|
||||
|
||||
wasPlaying = false;
|
||||
playing = false;
|
||||
}
|
||||
|
||||
|
||||
void CDAudio_Pause(void)
|
||||
{
|
||||
DWORD dwReturn;
|
||||
MCI_GENERIC_PARMS mciGenericParms;
|
||||
|
||||
if (!enabled)
|
||||
return;
|
||||
|
||||
if (!playing)
|
||||
return;
|
||||
|
||||
mciGenericParms.dwCallback = (DWORD)mainwindow;
|
||||
if (dwReturn = mciSendCommand(wDeviceID, MCI_PAUSE, 0, (DWORD)(LPVOID) &mciGenericParms))
|
||||
Con_DPrintf("MCI_PAUSE failed (%i)", dwReturn);
|
||||
|
||||
wasPlaying = playing;
|
||||
playing = false;
|
||||
}
|
||||
|
||||
|
||||
void CDAudio_Resume(void)
|
||||
{
|
||||
DWORD dwReturn;
|
||||
MCI_PLAY_PARMS mciPlayParms;
|
||||
|
||||
if (!enabled)
|
||||
return;
|
||||
|
||||
if (!cdValid)
|
||||
return;
|
||||
|
||||
if (!wasPlaying)
|
||||
return;
|
||||
|
||||
mciPlayParms.dwFrom = MCI_MAKE_TMSF(playTrack, 0, 0, 0);
|
||||
mciPlayParms.dwTo = MCI_MAKE_TMSF(playTrack + 1, 0, 0, 0);
|
||||
mciPlayParms.dwCallback = (DWORD)mainwindow;
|
||||
dwReturn = mciSendCommand(wDeviceID, MCI_PLAY, MCI_TO | MCI_NOTIFY, (DWORD)(LPVOID) &mciPlayParms);
|
||||
if (dwReturn)
|
||||
{
|
||||
Con_DPrintf("CDAudio: MCI_PLAY failed (%i)\n", dwReturn);
|
||||
return;
|
||||
}
|
||||
playing = true;
|
||||
}
|
||||
|
||||
|
||||
static void CD_f (void)
|
||||
{
|
||||
char *command;
|
||||
int ret;
|
||||
int n;
|
||||
int startAddress;
|
||||
|
||||
if (Cmd_Argc() < 2)
|
||||
return;
|
||||
|
||||
command = Cmd_Argv (1);
|
||||
|
||||
if (Q_strcasecmp(command, "on") == 0)
|
||||
{
|
||||
enabled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "off") == 0)
|
||||
{
|
||||
if (playing)
|
||||
CDAudio_Stop();
|
||||
enabled = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "reset") == 0)
|
||||
{
|
||||
enabled = true;
|
||||
if (playing)
|
||||
CDAudio_Stop();
|
||||
for (n = 0; n < 100; n++)
|
||||
remap[n] = n;
|
||||
CDAudio_GetAudioDiskInfo();
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "remap") == 0)
|
||||
{
|
||||
ret = Cmd_Argc() - 2;
|
||||
if (ret <= 0)
|
||||
{
|
||||
for (n = 1; n < 100; n++)
|
||||
if (remap[n] != n)
|
||||
Con_Printf(" %u -> %u\n", n, remap[n]);
|
||||
return;
|
||||
}
|
||||
for (n = 1; n <= ret; n++)
|
||||
remap[n] = Q_atoi(Cmd_Argv (n+1));
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "close") == 0)
|
||||
{
|
||||
CDAudio_CloseDoor();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!cdValid)
|
||||
{
|
||||
CDAudio_GetAudioDiskInfo();
|
||||
if (!cdValid)
|
||||
{
|
||||
Con_Printf("No CD in player.\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "play") == 0)
|
||||
{
|
||||
CDAudio_Play((byte)Q_atoi(Cmd_Argv (2)), false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "loop") == 0)
|
||||
{
|
||||
CDAudio_Play((byte)Q_atoi(Cmd_Argv (2)), true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "stop") == 0)
|
||||
{
|
||||
CDAudio_Stop();
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "pause") == 0)
|
||||
{
|
||||
CDAudio_Pause();
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "resume") == 0)
|
||||
{
|
||||
CDAudio_Resume();
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "eject") == 0)
|
||||
{
|
||||
if (playing)
|
||||
CDAudio_Stop();
|
||||
CDAudio_Eject();
|
||||
cdValid = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_strcasecmp(command, "info") == 0)
|
||||
{
|
||||
Con_Printf("%u tracks\n", maxTrack);
|
||||
if (playing)
|
||||
Con_Printf("Currently %s track %u\n", playLooping ? "looping" : "playing", playTrack);
|
||||
else if (wasPlaying)
|
||||
Con_Printf("Paused %s track %u\n", playLooping ? "looping" : "playing", playTrack);
|
||||
Con_Printf("Volume is %f\n", cdvolume);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
LONG CDAudio_MessageHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
if (lParam != wDeviceID)
|
||||
return 1;
|
||||
|
||||
switch (wParam)
|
||||
{
|
||||
case MCI_NOTIFY_SUCCESSFUL:
|
||||
if (playing)
|
||||
{
|
||||
playing = false;
|
||||
if (playLooping)
|
||||
CDAudio_Play(playTrack, true);
|
||||
}
|
||||
break;
|
||||
|
||||
case MCI_NOTIFY_ABORTED:
|
||||
case MCI_NOTIFY_SUPERSEDED:
|
||||
break;
|
||||
|
||||
case MCI_NOTIFY_FAILURE:
|
||||
Con_DPrintf("MCI_NOTIFY_FAILURE\n");
|
||||
CDAudio_Stop ();
|
||||
cdValid = false;
|
||||
break;
|
||||
|
||||
default:
|
||||
Con_DPrintf("Unexpected MM_MCINOTIFY type (%i)\n", wParam);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void CDAudio_Update(void)
|
||||
{
|
||||
if (!enabled)
|
||||
return;
|
||||
|
||||
if (bgmvolume.value != cdvolume)
|
||||
{
|
||||
if (cdvolume)
|
||||
{
|
||||
Cvar_SetValue ("bgmvolume", 0.0);
|
||||
cdvolume = bgmvolume.value;
|
||||
CDAudio_Pause ();
|
||||
}
|
||||
else
|
||||
{
|
||||
Cvar_SetValue ("bgmvolume", 1.0);
|
||||
cdvolume = bgmvolume.value;
|
||||
CDAudio_Resume ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int CDAudio_Init(void)
|
||||
{
|
||||
DWORD dwReturn;
|
||||
MCI_OPEN_PARMS mciOpenParms;
|
||||
MCI_SET_PARMS mciSetParms;
|
||||
int n;
|
||||
|
||||
if (cls.state == ca_dedicated)
|
||||
return -1;
|
||||
|
||||
if (COM_CheckParm("-nocdaudio"))
|
||||
return -1;
|
||||
|
||||
mciOpenParms.lpstrDeviceType = "cdaudio";
|
||||
if (dwReturn = mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_SHAREABLE, (DWORD) (LPVOID) &mciOpenParms))
|
||||
{
|
||||
Con_Printf("CDAudio_Init: MCI_OPEN failed (%i)\n", dwReturn);
|
||||
return -1;
|
||||
}
|
||||
wDeviceID = mciOpenParms.wDeviceID;
|
||||
|
||||
// Set the time format to track/minute/second/frame (TMSF).
|
||||
mciSetParms.dwTimeFormat = MCI_FORMAT_TMSF;
|
||||
if (dwReturn = mciSendCommand(wDeviceID, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD)(LPVOID) &mciSetParms))
|
||||
{
|
||||
Con_Printf("MCI_SET_TIME_FORMAT failed (%i)\n", dwReturn);
|
||||
mciSendCommand(wDeviceID, MCI_CLOSE, 0, (DWORD)NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (n = 0; n < 100; n++)
|
||||
remap[n] = n;
|
||||
initialized = true;
|
||||
enabled = true;
|
||||
|
||||
if (CDAudio_GetAudioDiskInfo())
|
||||
{
|
||||
Con_Printf("CDAudio_Init: No CD in player.\n");
|
||||
cdValid = false;
|
||||
}
|
||||
|
||||
Cmd_AddCommand ("cd", CD_f);
|
||||
|
||||
Con_Printf("CD Audio Initialized\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void CDAudio_Shutdown(void)
|
||||
{
|
||||
if (!initialized)
|
||||
return;
|
||||
CDAudio_Stop();
|
||||
if (mciSendCommand(wDeviceID, MCI_CLOSE, MCI_WAIT, (DWORD)NULL))
|
||||
Con_DPrintf("CDAudio_Shutdown: MCI_CLOSE failed\n");
|
||||
}
|
||||
27
WinQuake/cdaudio.h
Normal file
27
WinQuake/cdaudio.h
Normal file
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
|
||||
int CDAudio_Init(void);
|
||||
void CDAudio_Play(byte track, qboolean looping);
|
||||
void CDAudio_Stop(void);
|
||||
void CDAudio_Pause(void);
|
||||
void CDAudio_Resume(void);
|
||||
void CDAudio_Shutdown(void);
|
||||
void CDAudio_Update(void);
|
||||
92
WinQuake/chase.c
Normal file
92
WinQuake/chase.c
Normal file
@@ -0,0 +1,92 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// chase.c -- chase camera code
|
||||
|
||||
#include "quakedef.h"
|
||||
|
||||
cvar_t chase_back = {"chase_back", "100"};
|
||||
cvar_t chase_up = {"chase_up", "16"};
|
||||
cvar_t chase_right = {"chase_right", "0"};
|
||||
cvar_t chase_active = {"chase_active", "0"};
|
||||
|
||||
vec3_t chase_pos;
|
||||
vec3_t chase_angles;
|
||||
|
||||
vec3_t chase_dest;
|
||||
vec3_t chase_dest_angles;
|
||||
|
||||
|
||||
void Chase_Init (void)
|
||||
{
|
||||
Cvar_RegisterVariable (&chase_back);
|
||||
Cvar_RegisterVariable (&chase_up);
|
||||
Cvar_RegisterVariable (&chase_right);
|
||||
Cvar_RegisterVariable (&chase_active);
|
||||
}
|
||||
|
||||
void Chase_Reset (void)
|
||||
{
|
||||
// for respawning and teleporting
|
||||
// start position 12 units behind head
|
||||
}
|
||||
|
||||
void TraceLine (vec3_t start, vec3_t end, vec3_t impact)
|
||||
{
|
||||
trace_t trace;
|
||||
|
||||
memset (&trace, 0, sizeof(trace));
|
||||
SV_RecursiveHullCheck (cl.worldmodel->hulls, 0, 0, 1, start, end, &trace);
|
||||
|
||||
VectorCopy (trace.endpos, impact);
|
||||
}
|
||||
|
||||
void Chase_Update (void)
|
||||
{
|
||||
int i;
|
||||
float dist;
|
||||
vec3_t forward, up, right;
|
||||
vec3_t dest, stop;
|
||||
|
||||
|
||||
// if can't see player, reset
|
||||
AngleVectors (cl.viewangles, forward, right, up);
|
||||
|
||||
// calc exact destination
|
||||
for (i=0 ; i<3 ; i++)
|
||||
chase_dest[i] = r_refdef.vieworg[i]
|
||||
- forward[i]*chase_back.value
|
||||
- right[i]*chase_right.value;
|
||||
chase_dest[2] = r_refdef.vieworg[2] + chase_up.value;
|
||||
|
||||
// find the spot the player is looking at
|
||||
VectorMA (r_refdef.vieworg, 4096, forward, dest);
|
||||
TraceLine (r_refdef.vieworg, dest, stop);
|
||||
|
||||
// calculate pitch to look at the same spot from camera
|
||||
VectorSubtract (stop, r_refdef.vieworg, stop);
|
||||
dist = DotProduct (stop, forward);
|
||||
if (dist < 1)
|
||||
dist = 1;
|
||||
r_refdef.viewangles[PITCH] = -atan(stop[2] / dist) / M_PI * 180;
|
||||
|
||||
// move towards destination
|
||||
VectorCopy (chase_dest, r_refdef.vieworg);
|
||||
}
|
||||
|
||||
367
WinQuake/cl_demo.c
Normal file
367
WinQuake/cl_demo.c
Normal file
@@ -0,0 +1,367 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
|
||||
#include "quakedef.h"
|
||||
|
||||
void CL_FinishTimeDemo (void);
|
||||
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
DEMO CODE
|
||||
|
||||
When a demo is playing back, all NET_SendMessages are skipped, and
|
||||
NET_GetMessages are read from the demo file.
|
||||
|
||||
Whenever cl.time gets past the last received message, another message is
|
||||
read from the demo file.
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
/*
|
||||
==============
|
||||
CL_StopPlayback
|
||||
|
||||
Called when a demo file runs out, or the user starts a game
|
||||
==============
|
||||
*/
|
||||
void CL_StopPlayback (void)
|
||||
{
|
||||
if (!cls.demoplayback)
|
||||
return;
|
||||
|
||||
fclose (cls.demofile);
|
||||
cls.demoplayback = false;
|
||||
cls.demofile = NULL;
|
||||
cls.state = ca_disconnected;
|
||||
|
||||
if (cls.timedemo)
|
||||
CL_FinishTimeDemo ();
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
CL_WriteDemoMessage
|
||||
|
||||
Dumps the current net message, prefixed by the length and view angles
|
||||
====================
|
||||
*/
|
||||
void CL_WriteDemoMessage (void)
|
||||
{
|
||||
int len;
|
||||
int i;
|
||||
float f;
|
||||
|
||||
len = LittleLong (net_message.cursize);
|
||||
fwrite (&len, 4, 1, cls.demofile);
|
||||
for (i=0 ; i<3 ; i++)
|
||||
{
|
||||
f = LittleFloat (cl.viewangles[i]);
|
||||
fwrite (&f, 4, 1, cls.demofile);
|
||||
}
|
||||
fwrite (net_message.data, net_message.cursize, 1, cls.demofile);
|
||||
fflush (cls.demofile);
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
CL_GetMessage
|
||||
|
||||
Handles recording and playback of demos, on top of NET_ code
|
||||
====================
|
||||
*/
|
||||
int CL_GetMessage (void)
|
||||
{
|
||||
int r, i;
|
||||
float f;
|
||||
|
||||
if (cls.demoplayback)
|
||||
{
|
||||
// decide if it is time to grab the next message
|
||||
if (cls.signon == SIGNONS) // allways grab until fully connected
|
||||
{
|
||||
if (cls.timedemo)
|
||||
{
|
||||
if (host_framecount == cls.td_lastframe)
|
||||
return 0; // allready read this frame's message
|
||||
cls.td_lastframe = host_framecount;
|
||||
// if this is the second frame, grab the real td_starttime
|
||||
// so the bogus time on the first frame doesn't count
|
||||
if (host_framecount == cls.td_startframe + 1)
|
||||
cls.td_starttime = realtime;
|
||||
}
|
||||
else if ( /* cl.time > 0 && */ cl.time <= cl.mtime[0])
|
||||
{
|
||||
return 0; // don't need another message yet
|
||||
}
|
||||
}
|
||||
|
||||
// get the next message
|
||||
fread (&net_message.cursize, 4, 1, cls.demofile);
|
||||
VectorCopy (cl.mviewangles[0], cl.mviewangles[1]);
|
||||
for (i=0 ; i<3 ; i++)
|
||||
{
|
||||
r = fread (&f, 4, 1, cls.demofile);
|
||||
cl.mviewangles[0][i] = LittleFloat (f);
|
||||
}
|
||||
|
||||
net_message.cursize = LittleLong (net_message.cursize);
|
||||
if (net_message.cursize > MAX_MSGLEN)
|
||||
Sys_Error ("Demo message > MAX_MSGLEN");
|
||||
r = fread (net_message.data, net_message.cursize, 1, cls.demofile);
|
||||
if (r != 1)
|
||||
{
|
||||
CL_StopPlayback ();
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
while (1)
|
||||
{
|
||||
r = NET_GetMessage (cls.netcon);
|
||||
|
||||
if (r != 1 && r != 2)
|
||||
return r;
|
||||
|
||||
// discard nop keepalive message
|
||||
if (net_message.cursize == 1 && net_message.data[0] == svc_nop)
|
||||
Con_Printf ("<-- server to client keepalive\n");
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
if (cls.demorecording)
|
||||
CL_WriteDemoMessage ();
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
====================
|
||||
CL_Stop_f
|
||||
|
||||
stop recording a demo
|
||||
====================
|
||||
*/
|
||||
void CL_Stop_f (void)
|
||||
{
|
||||
if (cmd_source != src_command)
|
||||
return;
|
||||
|
||||
if (!cls.demorecording)
|
||||
{
|
||||
Con_Printf ("Not recording a demo.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// write a disconnect message to the demo file
|
||||
SZ_Clear (&net_message);
|
||||
MSG_WriteByte (&net_message, svc_disconnect);
|
||||
CL_WriteDemoMessage ();
|
||||
|
||||
// finish up
|
||||
fclose (cls.demofile);
|
||||
cls.demofile = NULL;
|
||||
cls.demorecording = false;
|
||||
Con_Printf ("Completed demo\n");
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
CL_Record_f
|
||||
|
||||
record <demoname> <map> [cd track]
|
||||
====================
|
||||
*/
|
||||
void CL_Record_f (void)
|
||||
{
|
||||
int c;
|
||||
char name[MAX_OSPATH];
|
||||
int track;
|
||||
|
||||
if (cmd_source != src_command)
|
||||
return;
|
||||
|
||||
c = Cmd_Argc();
|
||||
if (c != 2 && c != 3 && c != 4)
|
||||
{
|
||||
Con_Printf ("record <demoname> [<map> [cd track]]\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (strstr(Cmd_Argv(1), ".."))
|
||||
{
|
||||
Con_Printf ("Relative pathnames are not allowed.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (c == 2 && cls.state == ca_connected)
|
||||
{
|
||||
Con_Printf("Can not record - already connected to server\nClient demo recording must be started before connecting\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// write the forced cd track number, or -1
|
||||
if (c == 4)
|
||||
{
|
||||
track = atoi(Cmd_Argv(3));
|
||||
Con_Printf ("Forcing CD track to %i\n", cls.forcetrack);
|
||||
}
|
||||
else
|
||||
track = -1;
|
||||
|
||||
sprintf (name, "%s/%s", com_gamedir, Cmd_Argv(1));
|
||||
|
||||
//
|
||||
// start the map up
|
||||
//
|
||||
if (c > 2)
|
||||
Cmd_ExecuteString ( va("map %s", Cmd_Argv(2)), src_command);
|
||||
|
||||
//
|
||||
// open the demo file
|
||||
//
|
||||
COM_DefaultExtension (name, ".dem");
|
||||
|
||||
Con_Printf ("recording to %s.\n", name);
|
||||
cls.demofile = fopen (name, "wb");
|
||||
if (!cls.demofile)
|
||||
{
|
||||
Con_Printf ("ERROR: couldn't open.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
cls.forcetrack = track;
|
||||
fprintf (cls.demofile, "%i\n", cls.forcetrack);
|
||||
|
||||
cls.demorecording = true;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
====================
|
||||
CL_PlayDemo_f
|
||||
|
||||
play [demoname]
|
||||
====================
|
||||
*/
|
||||
void CL_PlayDemo_f (void)
|
||||
{
|
||||
char name[256];
|
||||
int c;
|
||||
qboolean neg = false;
|
||||
|
||||
if (cmd_source != src_command)
|
||||
return;
|
||||
|
||||
if (Cmd_Argc() != 2)
|
||||
{
|
||||
Con_Printf ("play <demoname> : plays a demo\n");
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// disconnect from server
|
||||
//
|
||||
CL_Disconnect ();
|
||||
|
||||
//
|
||||
// open the demo file
|
||||
//
|
||||
strcpy (name, Cmd_Argv(1));
|
||||
COM_DefaultExtension (name, ".dem");
|
||||
|
||||
Con_Printf ("Playing demo from %s.\n", name);
|
||||
COM_FOpenFile (name, &cls.demofile);
|
||||
if (!cls.demofile)
|
||||
{
|
||||
Con_Printf ("ERROR: couldn't open.\n");
|
||||
cls.demonum = -1; // stop demo loop
|
||||
return;
|
||||
}
|
||||
|
||||
cls.demoplayback = true;
|
||||
cls.state = ca_connected;
|
||||
cls.forcetrack = 0;
|
||||
|
||||
while ((c = getc(cls.demofile)) != '\n')
|
||||
if (c == '-')
|
||||
neg = true;
|
||||
else
|
||||
cls.forcetrack = cls.forcetrack * 10 + (c - '0');
|
||||
|
||||
if (neg)
|
||||
cls.forcetrack = -cls.forcetrack;
|
||||
// ZOID, fscanf is evil
|
||||
// fscanf (cls.demofile, "%i\n", &cls.forcetrack);
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
CL_FinishTimeDemo
|
||||
|
||||
====================
|
||||
*/
|
||||
void CL_FinishTimeDemo (void)
|
||||
{
|
||||
int frames;
|
||||
float time;
|
||||
|
||||
cls.timedemo = false;
|
||||
|
||||
// the first frame didn't count
|
||||
frames = (host_framecount - cls.td_startframe) - 1;
|
||||
time = realtime - cls.td_starttime;
|
||||
if (!time)
|
||||
time = 1;
|
||||
Con_Printf ("%i frames %5.1f seconds %5.1f fps\n", frames, time, frames/time);
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
CL_TimeDemo_f
|
||||
|
||||
timedemo [demoname]
|
||||
====================
|
||||
*/
|
||||
void CL_TimeDemo_f (void)
|
||||
{
|
||||
if (cmd_source != src_command)
|
||||
return;
|
||||
|
||||
if (Cmd_Argc() != 2)
|
||||
{
|
||||
Con_Printf ("timedemo <demoname> : gets demo speeds\n");
|
||||
return;
|
||||
}
|
||||
|
||||
CL_PlayDemo_f ();
|
||||
|
||||
// cls.td_starttime will be grabbed at the second frame of the demo, so
|
||||
// all the loading time doesn't get counted
|
||||
|
||||
cls.timedemo = true;
|
||||
cls.td_startframe = host_framecount;
|
||||
cls.td_lastframe = -1; // get a new message this frame
|
||||
}
|
||||
|
||||
448
WinQuake/cl_input.c
Normal file
448
WinQuake/cl_input.c
Normal file
@@ -0,0 +1,448 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// cl.input.c -- builds an intended movement command to send to the server
|
||||
|
||||
// Quake is a trademark of Id Software, Inc., (c) 1996 Id Software, Inc. All
|
||||
// rights reserved.
|
||||
|
||||
#include "quakedef.h"
|
||||
|
||||
/*
|
||||
===============================================================================
|
||||
|
||||
KEY BUTTONS
|
||||
|
||||
Continuous button event tracking is complicated by the fact that two different
|
||||
input sources (say, mouse button 1 and the control key) can both press the
|
||||
same button, but the button should only be released when both of the
|
||||
pressing key have been released.
|
||||
|
||||
When a key event issues a button command (+forward, +attack, etc), it appends
|
||||
its key number as a parameter to the command so it can be matched up with
|
||||
the release.
|
||||
|
||||
state bit 0 is the current state of the key
|
||||
state bit 1 is edge triggered on the up to down transition
|
||||
state bit 2 is edge triggered on the down to up transition
|
||||
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
|
||||
kbutton_t in_mlook, in_klook;
|
||||
kbutton_t in_left, in_right, in_forward, in_back;
|
||||
kbutton_t in_lookup, in_lookdown, in_moveleft, in_moveright;
|
||||
kbutton_t in_strafe, in_speed, in_use, in_jump, in_attack;
|
||||
kbutton_t in_up, in_down;
|
||||
|
||||
int in_impulse;
|
||||
|
||||
|
||||
void KeyDown (kbutton_t *b)
|
||||
{
|
||||
int k;
|
||||
char *c;
|
||||
|
||||
c = Cmd_Argv(1);
|
||||
if (c[0])
|
||||
k = atoi(c);
|
||||
else
|
||||
k = -1; // typed manually at the console for continuous down
|
||||
|
||||
if (k == b->down[0] || k == b->down[1])
|
||||
return; // repeating key
|
||||
|
||||
if (!b->down[0])
|
||||
b->down[0] = k;
|
||||
else if (!b->down[1])
|
||||
b->down[1] = k;
|
||||
else
|
||||
{
|
||||
Con_Printf ("Three keys down for a button!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (b->state & 1)
|
||||
return; // still down
|
||||
b->state |= 1 + 2; // down + impulse down
|
||||
}
|
||||
|
||||
void KeyUp (kbutton_t *b)
|
||||
{
|
||||
int k;
|
||||
char *c;
|
||||
|
||||
c = Cmd_Argv(1);
|
||||
if (c[0])
|
||||
k = atoi(c);
|
||||
else
|
||||
{ // typed manually at the console, assume for unsticking, so clear all
|
||||
b->down[0] = b->down[1] = 0;
|
||||
b->state = 4; // impulse up
|
||||
return;
|
||||
}
|
||||
|
||||
if (b->down[0] == k)
|
||||
b->down[0] = 0;
|
||||
else if (b->down[1] == k)
|
||||
b->down[1] = 0;
|
||||
else
|
||||
return; // key up without coresponding down (menu pass through)
|
||||
if (b->down[0] || b->down[1])
|
||||
return; // some other key is still holding it down
|
||||
|
||||
if (!(b->state & 1))
|
||||
return; // still up (this should not happen)
|
||||
b->state &= ~1; // now up
|
||||
b->state |= 4; // impulse up
|
||||
}
|
||||
|
||||
void IN_KLookDown (void) {KeyDown(&in_klook);}
|
||||
void IN_KLookUp (void) {KeyUp(&in_klook);}
|
||||
void IN_MLookDown (void) {KeyDown(&in_mlook);}
|
||||
void IN_MLookUp (void) {
|
||||
KeyUp(&in_mlook);
|
||||
if ( !(in_mlook.state&1) && lookspring.value)
|
||||
V_StartPitchDrift();
|
||||
}
|
||||
void IN_UpDown(void) {KeyDown(&in_up);}
|
||||
void IN_UpUp(void) {KeyUp(&in_up);}
|
||||
void IN_DownDown(void) {KeyDown(&in_down);}
|
||||
void IN_DownUp(void) {KeyUp(&in_down);}
|
||||
void IN_LeftDown(void) {KeyDown(&in_left);}
|
||||
void IN_LeftUp(void) {KeyUp(&in_left);}
|
||||
void IN_RightDown(void) {KeyDown(&in_right);}
|
||||
void IN_RightUp(void) {KeyUp(&in_right);}
|
||||
void IN_ForwardDown(void) {KeyDown(&in_forward);}
|
||||
void IN_ForwardUp(void) {KeyUp(&in_forward);}
|
||||
void IN_BackDown(void) {KeyDown(&in_back);}
|
||||
void IN_BackUp(void) {KeyUp(&in_back);}
|
||||
void IN_LookupDown(void) {KeyDown(&in_lookup);}
|
||||
void IN_LookupUp(void) {KeyUp(&in_lookup);}
|
||||
void IN_LookdownDown(void) {KeyDown(&in_lookdown);}
|
||||
void IN_LookdownUp(void) {KeyUp(&in_lookdown);}
|
||||
void IN_MoveleftDown(void) {KeyDown(&in_moveleft);}
|
||||
void IN_MoveleftUp(void) {KeyUp(&in_moveleft);}
|
||||
void IN_MoverightDown(void) {KeyDown(&in_moveright);}
|
||||
void IN_MoverightUp(void) {KeyUp(&in_moveright);}
|
||||
|
||||
void IN_SpeedDown(void) {KeyDown(&in_speed);}
|
||||
void IN_SpeedUp(void) {KeyUp(&in_speed);}
|
||||
void IN_StrafeDown(void) {KeyDown(&in_strafe);}
|
||||
void IN_StrafeUp(void) {KeyUp(&in_strafe);}
|
||||
|
||||
void IN_AttackDown(void) {KeyDown(&in_attack);}
|
||||
void IN_AttackUp(void) {KeyUp(&in_attack);}
|
||||
|
||||
void IN_UseDown (void) {KeyDown(&in_use);}
|
||||
void IN_UseUp (void) {KeyUp(&in_use);}
|
||||
void IN_JumpDown (void) {KeyDown(&in_jump);}
|
||||
void IN_JumpUp (void) {KeyUp(&in_jump);}
|
||||
|
||||
void IN_Impulse (void) {in_impulse=Q_atoi(Cmd_Argv(1));}
|
||||
|
||||
/*
|
||||
===============
|
||||
CL_KeyState
|
||||
|
||||
Returns 0.25 if a key was pressed and released during the frame,
|
||||
0.5 if it was pressed and held
|
||||
0 if held then released, and
|
||||
1.0 if held for the entire time
|
||||
===============
|
||||
*/
|
||||
float CL_KeyState (kbutton_t *key)
|
||||
{
|
||||
float val;
|
||||
qboolean impulsedown, impulseup, down;
|
||||
|
||||
impulsedown = key->state & 2;
|
||||
impulseup = key->state & 4;
|
||||
down = key->state & 1;
|
||||
val = 0;
|
||||
|
||||
if (impulsedown && !impulseup)
|
||||
if (down)
|
||||
val = 0.5; // pressed and held this frame
|
||||
else
|
||||
val = 0; // I_Error ();
|
||||
if (impulseup && !impulsedown)
|
||||
if (down)
|
||||
val = 0; // I_Error ();
|
||||
else
|
||||
val = 0; // released this frame
|
||||
if (!impulsedown && !impulseup)
|
||||
if (down)
|
||||
val = 1.0; // held the entire frame
|
||||
else
|
||||
val = 0; // up the entire frame
|
||||
if (impulsedown && impulseup)
|
||||
if (down)
|
||||
val = 0.75; // released and re-pressed this frame
|
||||
else
|
||||
val = 0.25; // pressed and released this frame
|
||||
|
||||
key->state &= 1; // clear impulses
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//==========================================================================
|
||||
|
||||
cvar_t cl_upspeed = {"cl_upspeed","200"};
|
||||
cvar_t cl_forwardspeed = {"cl_forwardspeed","200", true};
|
||||
cvar_t cl_backspeed = {"cl_backspeed","200", true};
|
||||
cvar_t cl_sidespeed = {"cl_sidespeed","350"};
|
||||
|
||||
cvar_t cl_movespeedkey = {"cl_movespeedkey","2.0"};
|
||||
|
||||
cvar_t cl_yawspeed = {"cl_yawspeed","140"};
|
||||
cvar_t cl_pitchspeed = {"cl_pitchspeed","150"};
|
||||
|
||||
cvar_t cl_anglespeedkey = {"cl_anglespeedkey","1.5"};
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
CL_AdjustAngles
|
||||
|
||||
Moves the local angle positions
|
||||
================
|
||||
*/
|
||||
void CL_AdjustAngles (void)
|
||||
{
|
||||
float speed;
|
||||
float up, down;
|
||||
|
||||
if (in_speed.state & 1)
|
||||
speed = host_frametime * cl_anglespeedkey.value;
|
||||
else
|
||||
speed = host_frametime;
|
||||
|
||||
if (!(in_strafe.state & 1))
|
||||
{
|
||||
cl.viewangles[YAW] -= speed*cl_yawspeed.value*CL_KeyState (&in_right);
|
||||
cl.viewangles[YAW] += speed*cl_yawspeed.value*CL_KeyState (&in_left);
|
||||
cl.viewangles[YAW] = anglemod(cl.viewangles[YAW]);
|
||||
}
|
||||
if (in_klook.state & 1)
|
||||
{
|
||||
V_StopPitchDrift ();
|
||||
cl.viewangles[PITCH] -= speed*cl_pitchspeed.value * CL_KeyState (&in_forward);
|
||||
cl.viewangles[PITCH] += speed*cl_pitchspeed.value * CL_KeyState (&in_back);
|
||||
}
|
||||
|
||||
up = CL_KeyState (&in_lookup);
|
||||
down = CL_KeyState(&in_lookdown);
|
||||
|
||||
cl.viewangles[PITCH] -= speed*cl_pitchspeed.value * up;
|
||||
cl.viewangles[PITCH] += speed*cl_pitchspeed.value * down;
|
||||
|
||||
if (up || down)
|
||||
V_StopPitchDrift ();
|
||||
|
||||
if (cl.viewangles[PITCH] > 80)
|
||||
cl.viewangles[PITCH] = 80;
|
||||
if (cl.viewangles[PITCH] < -70)
|
||||
cl.viewangles[PITCH] = -70;
|
||||
|
||||
if (cl.viewangles[ROLL] > 50)
|
||||
cl.viewangles[ROLL] = 50;
|
||||
if (cl.viewangles[ROLL] < -50)
|
||||
cl.viewangles[ROLL] = -50;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
CL_BaseMove
|
||||
|
||||
Send the intended movement message to the server
|
||||
================
|
||||
*/
|
||||
void CL_BaseMove (usercmd_t *cmd)
|
||||
{
|
||||
if (cls.signon != SIGNONS)
|
||||
return;
|
||||
|
||||
CL_AdjustAngles ();
|
||||
|
||||
Q_memset (cmd, 0, sizeof(*cmd));
|
||||
|
||||
if (in_strafe.state & 1)
|
||||
{
|
||||
cmd->sidemove += cl_sidespeed.value * CL_KeyState (&in_right);
|
||||
cmd->sidemove -= cl_sidespeed.value * CL_KeyState (&in_left);
|
||||
}
|
||||
|
||||
cmd->sidemove += cl_sidespeed.value * CL_KeyState (&in_moveright);
|
||||
cmd->sidemove -= cl_sidespeed.value * CL_KeyState (&in_moveleft);
|
||||
|
||||
cmd->upmove += cl_upspeed.value * CL_KeyState (&in_up);
|
||||
cmd->upmove -= cl_upspeed.value * CL_KeyState (&in_down);
|
||||
|
||||
if (! (in_klook.state & 1) )
|
||||
{
|
||||
cmd->forwardmove += cl_forwardspeed.value * CL_KeyState (&in_forward);
|
||||
cmd->forwardmove -= cl_backspeed.value * CL_KeyState (&in_back);
|
||||
}
|
||||
|
||||
//
|
||||
// adjust for speed key
|
||||
//
|
||||
if (in_speed.state & 1)
|
||||
{
|
||||
cmd->forwardmove *= cl_movespeedkey.value;
|
||||
cmd->sidemove *= cl_movespeedkey.value;
|
||||
cmd->upmove *= cl_movespeedkey.value;
|
||||
}
|
||||
|
||||
#ifdef QUAKE2
|
||||
cmd->lightlevel = cl.light_level;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
==============
|
||||
CL_SendMove
|
||||
==============
|
||||
*/
|
||||
void CL_SendMove (usercmd_t *cmd)
|
||||
{
|
||||
int i;
|
||||
int bits;
|
||||
sizebuf_t buf;
|
||||
byte data[128];
|
||||
|
||||
buf.maxsize = 128;
|
||||
buf.cursize = 0;
|
||||
buf.data = data;
|
||||
|
||||
cl.cmd = *cmd;
|
||||
|
||||
//
|
||||
// send the movement message
|
||||
//
|
||||
MSG_WriteByte (&buf, clc_move);
|
||||
|
||||
MSG_WriteFloat (&buf, cl.mtime[0]); // so server can get ping times
|
||||
|
||||
for (i=0 ; i<3 ; i++)
|
||||
MSG_WriteAngle (&buf, cl.viewangles[i]);
|
||||
|
||||
MSG_WriteShort (&buf, cmd->forwardmove);
|
||||
MSG_WriteShort (&buf, cmd->sidemove);
|
||||
MSG_WriteShort (&buf, cmd->upmove);
|
||||
|
||||
//
|
||||
// send button bits
|
||||
//
|
||||
bits = 0;
|
||||
|
||||
if ( in_attack.state & 3 )
|
||||
bits |= 1;
|
||||
in_attack.state &= ~2;
|
||||
|
||||
if (in_jump.state & 3)
|
||||
bits |= 2;
|
||||
in_jump.state &= ~2;
|
||||
|
||||
MSG_WriteByte (&buf, bits);
|
||||
|
||||
MSG_WriteByte (&buf, in_impulse);
|
||||
in_impulse = 0;
|
||||
|
||||
#ifdef QUAKE2
|
||||
//
|
||||
// light level
|
||||
//
|
||||
MSG_WriteByte (&buf, cmd->lightlevel);
|
||||
#endif
|
||||
|
||||
//
|
||||
// deliver the message
|
||||
//
|
||||
if (cls.demoplayback)
|
||||
return;
|
||||
|
||||
//
|
||||
// allways dump the first two message, because it may contain leftover inputs
|
||||
// from the last level
|
||||
//
|
||||
if (++cl.movemessages <= 2)
|
||||
return;
|
||||
|
||||
if (NET_SendUnreliableMessage (cls.netcon, &buf) == -1)
|
||||
{
|
||||
Con_Printf ("CL_SendMove: lost server connection\n");
|
||||
CL_Disconnect ();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
CL_InitInput
|
||||
============
|
||||
*/
|
||||
void CL_InitInput (void)
|
||||
{
|
||||
Cmd_AddCommand ("+moveup",IN_UpDown);
|
||||
Cmd_AddCommand ("-moveup",IN_UpUp);
|
||||
Cmd_AddCommand ("+movedown",IN_DownDown);
|
||||
Cmd_AddCommand ("-movedown",IN_DownUp);
|
||||
Cmd_AddCommand ("+left",IN_LeftDown);
|
||||
Cmd_AddCommand ("-left",IN_LeftUp);
|
||||
Cmd_AddCommand ("+right",IN_RightDown);
|
||||
Cmd_AddCommand ("-right",IN_RightUp);
|
||||
Cmd_AddCommand ("+forward",IN_ForwardDown);
|
||||
Cmd_AddCommand ("-forward",IN_ForwardUp);
|
||||
Cmd_AddCommand ("+back",IN_BackDown);
|
||||
Cmd_AddCommand ("-back",IN_BackUp);
|
||||
Cmd_AddCommand ("+lookup", IN_LookupDown);
|
||||
Cmd_AddCommand ("-lookup", IN_LookupUp);
|
||||
Cmd_AddCommand ("+lookdown", IN_LookdownDown);
|
||||
Cmd_AddCommand ("-lookdown", IN_LookdownUp);
|
||||
Cmd_AddCommand ("+strafe", IN_StrafeDown);
|
||||
Cmd_AddCommand ("-strafe", IN_StrafeUp);
|
||||
Cmd_AddCommand ("+moveleft", IN_MoveleftDown);
|
||||
Cmd_AddCommand ("-moveleft", IN_MoveleftUp);
|
||||
Cmd_AddCommand ("+moveright", IN_MoverightDown);
|
||||
Cmd_AddCommand ("-moveright", IN_MoverightUp);
|
||||
Cmd_AddCommand ("+speed", IN_SpeedDown);
|
||||
Cmd_AddCommand ("-speed", IN_SpeedUp);
|
||||
Cmd_AddCommand ("+attack", IN_AttackDown);
|
||||
Cmd_AddCommand ("-attack", IN_AttackUp);
|
||||
Cmd_AddCommand ("+use", IN_UseDown);
|
||||
Cmd_AddCommand ("-use", IN_UseUp);
|
||||
Cmd_AddCommand ("+jump", IN_JumpDown);
|
||||
Cmd_AddCommand ("-jump", IN_JumpUp);
|
||||
Cmd_AddCommand ("impulse", IN_Impulse);
|
||||
Cmd_AddCommand ("+klook", IN_KLookDown);
|
||||
Cmd_AddCommand ("-klook", IN_KLookUp);
|
||||
Cmd_AddCommand ("+mlook", IN_MLookDown);
|
||||
Cmd_AddCommand ("-mlook", IN_MLookUp);
|
||||
|
||||
}
|
||||
|
||||
757
WinQuake/cl_main.c
Normal file
757
WinQuake/cl_main.c
Normal file
@@ -0,0 +1,757 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// cl_main.c -- client main loop
|
||||
|
||||
#include "quakedef.h"
|
||||
|
||||
// we need to declare some mouse variables here, because the menu system
|
||||
// references them even when on a unix system.
|
||||
|
||||
// these two are not intended to be set directly
|
||||
cvar_t cl_name = {"_cl_name", "player", true};
|
||||
cvar_t cl_color = {"_cl_color", "0", true};
|
||||
|
||||
cvar_t cl_shownet = {"cl_shownet","0"}; // can be 0, 1, or 2
|
||||
cvar_t cl_nolerp = {"cl_nolerp","0"};
|
||||
|
||||
cvar_t lookspring = {"lookspring","0", true};
|
||||
cvar_t lookstrafe = {"lookstrafe","0", true};
|
||||
cvar_t sensitivity = {"sensitivity","3", true};
|
||||
|
||||
cvar_t m_pitch = {"m_pitch","0.022", true};
|
||||
cvar_t m_yaw = {"m_yaw","0.022", true};
|
||||
cvar_t m_forward = {"m_forward","1", true};
|
||||
cvar_t m_side = {"m_side","0.8", true};
|
||||
|
||||
|
||||
client_static_t cls;
|
||||
client_state_t cl;
|
||||
// FIXME: put these on hunk?
|
||||
efrag_t cl_efrags[MAX_EFRAGS];
|
||||
entity_t cl_entities[MAX_EDICTS];
|
||||
entity_t cl_static_entities[MAX_STATIC_ENTITIES];
|
||||
lightstyle_t cl_lightstyle[MAX_LIGHTSTYLES];
|
||||
dlight_t cl_dlights[MAX_DLIGHTS];
|
||||
|
||||
int cl_numvisedicts;
|
||||
entity_t *cl_visedicts[MAX_VISEDICTS];
|
||||
|
||||
/*
|
||||
=====================
|
||||
CL_ClearState
|
||||
|
||||
=====================
|
||||
*/
|
||||
void CL_ClearState (void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!sv.active)
|
||||
Host_ClearMemory ();
|
||||
|
||||
// wipe the entire cl structure
|
||||
memset (&cl, 0, sizeof(cl));
|
||||
|
||||
SZ_Clear (&cls.message);
|
||||
|
||||
// clear other arrays
|
||||
memset (cl_efrags, 0, sizeof(cl_efrags));
|
||||
memset (cl_entities, 0, sizeof(cl_entities));
|
||||
memset (cl_dlights, 0, sizeof(cl_dlights));
|
||||
memset (cl_lightstyle, 0, sizeof(cl_lightstyle));
|
||||
memset (cl_temp_entities, 0, sizeof(cl_temp_entities));
|
||||
memset (cl_beams, 0, sizeof(cl_beams));
|
||||
|
||||
//
|
||||
// allocate the efrags and chain together into a free list
|
||||
//
|
||||
cl.free_efrags = cl_efrags;
|
||||
for (i=0 ; i<MAX_EFRAGS-1 ; i++)
|
||||
cl.free_efrags[i].entnext = &cl.free_efrags[i+1];
|
||||
cl.free_efrags[i].entnext = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
=====================
|
||||
CL_Disconnect
|
||||
|
||||
Sends a disconnect message to the server
|
||||
This is also called on Host_Error, so it shouldn't cause any errors
|
||||
=====================
|
||||
*/
|
||||
void CL_Disconnect (void)
|
||||
{
|
||||
// stop sounds (especially looping!)
|
||||
S_StopAllSounds (true);
|
||||
|
||||
// bring the console down and fade the colors back to normal
|
||||
// SCR_BringDownConsole ();
|
||||
|
||||
// if running a local server, shut it down
|
||||
if (cls.demoplayback)
|
||||
CL_StopPlayback ();
|
||||
else if (cls.state == ca_connected)
|
||||
{
|
||||
if (cls.demorecording)
|
||||
CL_Stop_f ();
|
||||
|
||||
Con_DPrintf ("Sending clc_disconnect\n");
|
||||
SZ_Clear (&cls.message);
|
||||
MSG_WriteByte (&cls.message, clc_disconnect);
|
||||
NET_SendUnreliableMessage (cls.netcon, &cls.message);
|
||||
SZ_Clear (&cls.message);
|
||||
NET_Close (cls.netcon);
|
||||
|
||||
cls.state = ca_disconnected;
|
||||
if (sv.active)
|
||||
Host_ShutdownServer(false);
|
||||
}
|
||||
|
||||
cls.demoplayback = cls.timedemo = false;
|
||||
cls.signon = 0;
|
||||
}
|
||||
|
||||
void CL_Disconnect_f (void)
|
||||
{
|
||||
CL_Disconnect ();
|
||||
if (sv.active)
|
||||
Host_ShutdownServer (false);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
=====================
|
||||
CL_EstablishConnection
|
||||
|
||||
Host should be either "local" or a net address to be passed on
|
||||
=====================
|
||||
*/
|
||||
void CL_EstablishConnection (char *host)
|
||||
{
|
||||
if (cls.state == ca_dedicated)
|
||||
return;
|
||||
|
||||
if (cls.demoplayback)
|
||||
return;
|
||||
|
||||
CL_Disconnect ();
|
||||
|
||||
cls.netcon = NET_Connect (host);
|
||||
if (!cls.netcon)
|
||||
Host_Error ("CL_Connect: connect failed\n");
|
||||
Con_DPrintf ("CL_EstablishConnection: connected to %s\n", host);
|
||||
|
||||
cls.demonum = -1; // not in the demo loop now
|
||||
cls.state = ca_connected;
|
||||
cls.signon = 0; // need all the signon messages before playing
|
||||
}
|
||||
|
||||
/*
|
||||
=====================
|
||||
CL_SignonReply
|
||||
|
||||
An svc_signonnum has been received, perform a client side setup
|
||||
=====================
|
||||
*/
|
||||
void CL_SignonReply (void)
|
||||
{
|
||||
char str[8192];
|
||||
|
||||
Con_DPrintf ("CL_SignonReply: %i\n", cls.signon);
|
||||
|
||||
switch (cls.signon)
|
||||
{
|
||||
case 1:
|
||||
MSG_WriteByte (&cls.message, clc_stringcmd);
|
||||
MSG_WriteString (&cls.message, "prespawn");
|
||||
break;
|
||||
|
||||
case 2:
|
||||
MSG_WriteByte (&cls.message, clc_stringcmd);
|
||||
MSG_WriteString (&cls.message, va("name \"%s\"\n", cl_name.string));
|
||||
|
||||
MSG_WriteByte (&cls.message, clc_stringcmd);
|
||||
MSG_WriteString (&cls.message, va("color %i %i\n", ((int)cl_color.value)>>4, ((int)cl_color.value)&15));
|
||||
|
||||
MSG_WriteByte (&cls.message, clc_stringcmd);
|
||||
sprintf (str, "spawn %s", cls.spawnparms);
|
||||
MSG_WriteString (&cls.message, str);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
MSG_WriteByte (&cls.message, clc_stringcmd);
|
||||
MSG_WriteString (&cls.message, "begin");
|
||||
Cache_Report (); // print remaining memory
|
||||
break;
|
||||
|
||||
case 4:
|
||||
SCR_EndLoadingPlaque (); // allow normal screen updates
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
=====================
|
||||
CL_NextDemo
|
||||
|
||||
Called to play the next demo in the demo loop
|
||||
=====================
|
||||
*/
|
||||
void CL_NextDemo (void)
|
||||
{
|
||||
char str[1024];
|
||||
|
||||
if (cls.demonum == -1)
|
||||
return; // don't play demos
|
||||
|
||||
SCR_BeginLoadingPlaque ();
|
||||
|
||||
if (!cls.demos[cls.demonum][0] || cls.demonum == MAX_DEMOS)
|
||||
{
|
||||
cls.demonum = 0;
|
||||
if (!cls.demos[cls.demonum][0])
|
||||
{
|
||||
Con_Printf ("No demos listed with startdemos\n");
|
||||
cls.demonum = -1;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
sprintf (str,"playdemo %s\n", cls.demos[cls.demonum]);
|
||||
Cbuf_InsertText (str);
|
||||
cls.demonum++;
|
||||
}
|
||||
|
||||
/*
|
||||
==============
|
||||
CL_PrintEntities_f
|
||||
==============
|
||||
*/
|
||||
void CL_PrintEntities_f (void)
|
||||
{
|
||||
entity_t *ent;
|
||||
int i;
|
||||
|
||||
for (i=0,ent=cl_entities ; i<cl.num_entities ; i++,ent++)
|
||||
{
|
||||
Con_Printf ("%3i:",i);
|
||||
if (!ent->model)
|
||||
{
|
||||
Con_Printf ("EMPTY\n");
|
||||
continue;
|
||||
}
|
||||
Con_Printf ("%s:%2i (%5.1f,%5.1f,%5.1f) [%5.1f %5.1f %5.1f]\n"
|
||||
,ent->model->name,ent->frame, ent->origin[0], ent->origin[1], ent->origin[2], ent->angles[0], ent->angles[1], ent->angles[2]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
===============
|
||||
SetPal
|
||||
|
||||
Debugging tool, just flashes the screen
|
||||
===============
|
||||
*/
|
||||
void SetPal (int i)
|
||||
{
|
||||
#if 0
|
||||
static int old;
|
||||
byte pal[768];
|
||||
int c;
|
||||
|
||||
if (i == old)
|
||||
return;
|
||||
old = i;
|
||||
|
||||
if (i==0)
|
||||
VID_SetPalette (host_basepal);
|
||||
else if (i==1)
|
||||
{
|
||||
for (c=0 ; c<768 ; c+=3)
|
||||
{
|
||||
pal[c] = 0;
|
||||
pal[c+1] = 255;
|
||||
pal[c+2] = 0;
|
||||
}
|
||||
VID_SetPalette (pal);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (c=0 ; c<768 ; c+=3)
|
||||
{
|
||||
pal[c] = 0;
|
||||
pal[c+1] = 0;
|
||||
pal[c+2] = 255;
|
||||
}
|
||||
VID_SetPalette (pal);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
CL_AllocDlight
|
||||
|
||||
===============
|
||||
*/
|
||||
dlight_t *CL_AllocDlight (int key)
|
||||
{
|
||||
int i;
|
||||
dlight_t *dl;
|
||||
|
||||
// first look for an exact key match
|
||||
if (key)
|
||||
{
|
||||
dl = cl_dlights;
|
||||
for (i=0 ; i<MAX_DLIGHTS ; i++, dl++)
|
||||
{
|
||||
if (dl->key == key)
|
||||
{
|
||||
memset (dl, 0, sizeof(*dl));
|
||||
dl->key = key;
|
||||
return dl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// then look for anything else
|
||||
dl = cl_dlights;
|
||||
for (i=0 ; i<MAX_DLIGHTS ; i++, dl++)
|
||||
{
|
||||
if (dl->die < cl.time)
|
||||
{
|
||||
memset (dl, 0, sizeof(*dl));
|
||||
dl->key = key;
|
||||
return dl;
|
||||
}
|
||||
}
|
||||
|
||||
dl = &cl_dlights[0];
|
||||
memset (dl, 0, sizeof(*dl));
|
||||
dl->key = key;
|
||||
return dl;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
===============
|
||||
CL_DecayLights
|
||||
|
||||
===============
|
||||
*/
|
||||
void CL_DecayLights (void)
|
||||
{
|
||||
int i;
|
||||
dlight_t *dl;
|
||||
float time;
|
||||
|
||||
time = cl.time - cl.oldtime;
|
||||
|
||||
dl = cl_dlights;
|
||||
for (i=0 ; i<MAX_DLIGHTS ; i++, dl++)
|
||||
{
|
||||
if (dl->die < cl.time || !dl->radius)
|
||||
continue;
|
||||
|
||||
dl->radius -= time*dl->decay;
|
||||
if (dl->radius < 0)
|
||||
dl->radius = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
===============
|
||||
CL_LerpPoint
|
||||
|
||||
Determines the fraction between the last two messages that the objects
|
||||
should be put at.
|
||||
===============
|
||||
*/
|
||||
float CL_LerpPoint (void)
|
||||
{
|
||||
float f, frac;
|
||||
|
||||
f = cl.mtime[0] - cl.mtime[1];
|
||||
|
||||
if (!f || cl_nolerp.value || cls.timedemo || sv.active)
|
||||
{
|
||||
cl.time = cl.mtime[0];
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (f > 0.1)
|
||||
{ // dropped packet, or start of demo
|
||||
cl.mtime[1] = cl.mtime[0] - 0.1;
|
||||
f = 0.1;
|
||||
}
|
||||
frac = (cl.time - cl.mtime[1]) / f;
|
||||
//Con_Printf ("frac: %f\n",frac);
|
||||
if (frac < 0)
|
||||
{
|
||||
if (frac < -0.01)
|
||||
{
|
||||
SetPal(1);
|
||||
cl.time = cl.mtime[1];
|
||||
// Con_Printf ("low frac\n");
|
||||
}
|
||||
frac = 0;
|
||||
}
|
||||
else if (frac > 1)
|
||||
{
|
||||
if (frac > 1.01)
|
||||
{
|
||||
SetPal(2);
|
||||
cl.time = cl.mtime[0];
|
||||
// Con_Printf ("high frac\n");
|
||||
}
|
||||
frac = 1;
|
||||
}
|
||||
else
|
||||
SetPal(0);
|
||||
|
||||
return frac;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
===============
|
||||
CL_RelinkEntities
|
||||
===============
|
||||
*/
|
||||
void CL_RelinkEntities (void)
|
||||
{
|
||||
entity_t *ent;
|
||||
int i, j;
|
||||
float frac, f, d;
|
||||
vec3_t delta;
|
||||
float bobjrotate;
|
||||
vec3_t oldorg;
|
||||
dlight_t *dl;
|
||||
|
||||
// determine partial update time
|
||||
frac = CL_LerpPoint ();
|
||||
|
||||
cl_numvisedicts = 0;
|
||||
|
||||
//
|
||||
// interpolate player info
|
||||
//
|
||||
for (i=0 ; i<3 ; i++)
|
||||
cl.velocity[i] = cl.mvelocity[1][i] +
|
||||
frac * (cl.mvelocity[0][i] - cl.mvelocity[1][i]);
|
||||
|
||||
if (cls.demoplayback)
|
||||
{
|
||||
// interpolate the angles
|
||||
for (j=0 ; j<3 ; j++)
|
||||
{
|
||||
d = cl.mviewangles[0][j] - cl.mviewangles[1][j];
|
||||
if (d > 180)
|
||||
d -= 360;
|
||||
else if (d < -180)
|
||||
d += 360;
|
||||
cl.viewangles[j] = cl.mviewangles[1][j] + frac*d;
|
||||
}
|
||||
}
|
||||
|
||||
bobjrotate = anglemod(100*cl.time);
|
||||
|
||||
// start on the entity after the world
|
||||
for (i=1,ent=cl_entities+1 ; i<cl.num_entities ; i++,ent++)
|
||||
{
|
||||
if (!ent->model)
|
||||
{ // empty slot
|
||||
if (ent->forcelink)
|
||||
R_RemoveEfrags (ent); // just became empty
|
||||
continue;
|
||||
}
|
||||
|
||||
// if the object wasn't included in the last packet, remove it
|
||||
if (ent->msgtime != cl.mtime[0])
|
||||
{
|
||||
ent->model = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
VectorCopy (ent->origin, oldorg);
|
||||
|
||||
if (ent->forcelink)
|
||||
{ // the entity was not updated in the last message
|
||||
// so move to the final spot
|
||||
VectorCopy (ent->msg_origins[0], ent->origin);
|
||||
VectorCopy (ent->msg_angles[0], ent->angles);
|
||||
}
|
||||
else
|
||||
{ // if the delta is large, assume a teleport and don't lerp
|
||||
f = frac;
|
||||
for (j=0 ; j<3 ; j++)
|
||||
{
|
||||
delta[j] = ent->msg_origins[0][j] - ent->msg_origins[1][j];
|
||||
if (delta[j] > 100 || delta[j] < -100)
|
||||
f = 1; // assume a teleportation, not a motion
|
||||
}
|
||||
|
||||
// interpolate the origin and angles
|
||||
for (j=0 ; j<3 ; j++)
|
||||
{
|
||||
ent->origin[j] = ent->msg_origins[1][j] + f*delta[j];
|
||||
|
||||
d = ent->msg_angles[0][j] - ent->msg_angles[1][j];
|
||||
if (d > 180)
|
||||
d -= 360;
|
||||
else if (d < -180)
|
||||
d += 360;
|
||||
ent->angles[j] = ent->msg_angles[1][j] + f*d;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// rotate binary objects locally
|
||||
if (ent->model->flags & EF_ROTATE)
|
||||
ent->angles[1] = bobjrotate;
|
||||
|
||||
if (ent->effects & EF_BRIGHTFIELD)
|
||||
R_EntityParticles (ent);
|
||||
#ifdef QUAKE2
|
||||
if (ent->effects & EF_DARKFIELD)
|
||||
R_DarkFieldParticles (ent);
|
||||
#endif
|
||||
if (ent->effects & EF_MUZZLEFLASH)
|
||||
{
|
||||
vec3_t fv, rv, uv;
|
||||
|
||||
dl = CL_AllocDlight (i);
|
||||
VectorCopy (ent->origin, dl->origin);
|
||||
dl->origin[2] += 16;
|
||||
AngleVectors (ent->angles, fv, rv, uv);
|
||||
|
||||
VectorMA (dl->origin, 18, fv, dl->origin);
|
||||
dl->radius = 200 + (rand()&31);
|
||||
dl->minlight = 32;
|
||||
dl->die = cl.time + 0.1;
|
||||
}
|
||||
if (ent->effects & EF_BRIGHTLIGHT)
|
||||
{
|
||||
dl = CL_AllocDlight (i);
|
||||
VectorCopy (ent->origin, dl->origin);
|
||||
dl->origin[2] += 16;
|
||||
dl->radius = 400 + (rand()&31);
|
||||
dl->die = cl.time + 0.001;
|
||||
}
|
||||
if (ent->effects & EF_DIMLIGHT)
|
||||
{
|
||||
dl = CL_AllocDlight (i);
|
||||
VectorCopy (ent->origin, dl->origin);
|
||||
dl->radius = 200 + (rand()&31);
|
||||
dl->die = cl.time + 0.001;
|
||||
}
|
||||
#ifdef QUAKE2
|
||||
if (ent->effects & EF_DARKLIGHT)
|
||||
{
|
||||
dl = CL_AllocDlight (i);
|
||||
VectorCopy (ent->origin, dl->origin);
|
||||
dl->radius = 200.0 + (rand()&31);
|
||||
dl->die = cl.time + 0.001;
|
||||
dl->dark = true;
|
||||
}
|
||||
if (ent->effects & EF_LIGHT)
|
||||
{
|
||||
dl = CL_AllocDlight (i);
|
||||
VectorCopy (ent->origin, dl->origin);
|
||||
dl->radius = 200;
|
||||
dl->die = cl.time + 0.001;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (ent->model->flags & EF_GIB)
|
||||
R_RocketTrail (oldorg, ent->origin, 2);
|
||||
else if (ent->model->flags & EF_ZOMGIB)
|
||||
R_RocketTrail (oldorg, ent->origin, 4);
|
||||
else if (ent->model->flags & EF_TRACER)
|
||||
R_RocketTrail (oldorg, ent->origin, 3);
|
||||
else if (ent->model->flags & EF_TRACER2)
|
||||
R_RocketTrail (oldorg, ent->origin, 5);
|
||||
else if (ent->model->flags & EF_ROCKET)
|
||||
{
|
||||
R_RocketTrail (oldorg, ent->origin, 0);
|
||||
dl = CL_AllocDlight (i);
|
||||
VectorCopy (ent->origin, dl->origin);
|
||||
dl->radius = 200;
|
||||
dl->die = cl.time + 0.01;
|
||||
}
|
||||
else if (ent->model->flags & EF_GRENADE)
|
||||
R_RocketTrail (oldorg, ent->origin, 1);
|
||||
else if (ent->model->flags & EF_TRACER3)
|
||||
R_RocketTrail (oldorg, ent->origin, 6);
|
||||
|
||||
ent->forcelink = false;
|
||||
|
||||
if (i == cl.viewentity && !chase_active.value)
|
||||
continue;
|
||||
|
||||
#ifdef QUAKE2
|
||||
if ( ent->effects & EF_NODRAW )
|
||||
continue;
|
||||
#endif
|
||||
if (cl_numvisedicts < MAX_VISEDICTS)
|
||||
{
|
||||
cl_visedicts[cl_numvisedicts] = ent;
|
||||
cl_numvisedicts++;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
===============
|
||||
CL_ReadFromServer
|
||||
|
||||
Read all incoming data from the server
|
||||
===============
|
||||
*/
|
||||
int CL_ReadFromServer (void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
cl.oldtime = cl.time;
|
||||
cl.time += host_frametime;
|
||||
|
||||
do
|
||||
{
|
||||
ret = CL_GetMessage ();
|
||||
if (ret == -1)
|
||||
Host_Error ("CL_ReadFromServer: lost server connection");
|
||||
if (!ret)
|
||||
break;
|
||||
|
||||
cl.last_received_message = realtime;
|
||||
CL_ParseServerMessage ();
|
||||
} while (ret && cls.state == ca_connected);
|
||||
|
||||
if (cl_shownet.value)
|
||||
Con_Printf ("\n");
|
||||
|
||||
CL_RelinkEntities ();
|
||||
CL_UpdateTEnts ();
|
||||
|
||||
//
|
||||
// bring the links up to date
|
||||
//
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
CL_SendCmd
|
||||
=================
|
||||
*/
|
||||
void CL_SendCmd (void)
|
||||
{
|
||||
usercmd_t cmd;
|
||||
|
||||
if (cls.state != ca_connected)
|
||||
return;
|
||||
|
||||
if (cls.signon == SIGNONS)
|
||||
{
|
||||
// get basic movement from keyboard
|
||||
CL_BaseMove (&cmd);
|
||||
|
||||
// allow mice or other external controllers to add to the move
|
||||
IN_Move (&cmd);
|
||||
|
||||
// send the unreliable message
|
||||
CL_SendMove (&cmd);
|
||||
|
||||
}
|
||||
|
||||
if (cls.demoplayback)
|
||||
{
|
||||
SZ_Clear (&cls.message);
|
||||
return;
|
||||
}
|
||||
|
||||
// send the reliable message
|
||||
if (!cls.message.cursize)
|
||||
return; // no message at all
|
||||
|
||||
if (!NET_CanSendMessage (cls.netcon))
|
||||
{
|
||||
Con_DPrintf ("CL_WriteToServer: can't send\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (NET_SendMessage (cls.netcon, &cls.message) == -1)
|
||||
Host_Error ("CL_WriteToServer: lost server connection");
|
||||
|
||||
SZ_Clear (&cls.message);
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
CL_Init
|
||||
=================
|
||||
*/
|
||||
void CL_Init (void)
|
||||
{
|
||||
SZ_Alloc (&cls.message, 1024);
|
||||
|
||||
CL_InitInput ();
|
||||
CL_InitTEnts ();
|
||||
|
||||
//
|
||||
// register our commands
|
||||
//
|
||||
Cvar_RegisterVariable (&cl_name);
|
||||
Cvar_RegisterVariable (&cl_color);
|
||||
Cvar_RegisterVariable (&cl_upspeed);
|
||||
Cvar_RegisterVariable (&cl_forwardspeed);
|
||||
Cvar_RegisterVariable (&cl_backspeed);
|
||||
Cvar_RegisterVariable (&cl_sidespeed);
|
||||
Cvar_RegisterVariable (&cl_movespeedkey);
|
||||
Cvar_RegisterVariable (&cl_yawspeed);
|
||||
Cvar_RegisterVariable (&cl_pitchspeed);
|
||||
Cvar_RegisterVariable (&cl_anglespeedkey);
|
||||
Cvar_RegisterVariable (&cl_shownet);
|
||||
Cvar_RegisterVariable (&cl_nolerp);
|
||||
Cvar_RegisterVariable (&lookspring);
|
||||
Cvar_RegisterVariable (&lookstrafe);
|
||||
Cvar_RegisterVariable (&sensitivity);
|
||||
|
||||
Cvar_RegisterVariable (&m_pitch);
|
||||
Cvar_RegisterVariable (&m_yaw);
|
||||
Cvar_RegisterVariable (&m_forward);
|
||||
Cvar_RegisterVariable (&m_side);
|
||||
|
||||
// Cvar_RegisterVariable (&cl_autofire);
|
||||
|
||||
Cmd_AddCommand ("entities", CL_PrintEntities_f);
|
||||
Cmd_AddCommand ("disconnect", CL_Disconnect_f);
|
||||
Cmd_AddCommand ("record", CL_Record_f);
|
||||
Cmd_AddCommand ("stop", CL_Stop_f);
|
||||
Cmd_AddCommand ("playdemo", CL_PlayDemo_f);
|
||||
Cmd_AddCommand ("timedemo", CL_TimeDemo_f);
|
||||
}
|
||||
|
||||
963
WinQuake/cl_parse.c
Normal file
963
WinQuake/cl_parse.c
Normal file
@@ -0,0 +1,963 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// cl_parse.c -- parse a message received from the server
|
||||
|
||||
#include "quakedef.h"
|
||||
|
||||
char *svc_strings[] =
|
||||
{
|
||||
"svc_bad",
|
||||
"svc_nop",
|
||||
"svc_disconnect",
|
||||
"svc_updatestat",
|
||||
"svc_version", // [long] server version
|
||||
"svc_setview", // [short] entity number
|
||||
"svc_sound", // <see code>
|
||||
"svc_time", // [float] server time
|
||||
"svc_print", // [string] null terminated string
|
||||
"svc_stufftext", // [string] stuffed into client's console buffer
|
||||
// the string should be \n terminated
|
||||
"svc_setangle", // [vec3] set the view angle to this absolute value
|
||||
|
||||
"svc_serverinfo", // [long] version
|
||||
// [string] signon string
|
||||
// [string]..[0]model cache [string]...[0]sounds cache
|
||||
// [string]..[0]item cache
|
||||
"svc_lightstyle", // [byte] [string]
|
||||
"svc_updatename", // [byte] [string]
|
||||
"svc_updatefrags", // [byte] [short]
|
||||
"svc_clientdata", // <shortbits + data>
|
||||
"svc_stopsound", // <see code>
|
||||
"svc_updatecolors", // [byte] [byte]
|
||||
"svc_particle", // [vec3] <variable>
|
||||
"svc_damage", // [byte] impact [byte] blood [vec3] from
|
||||
|
||||
"svc_spawnstatic",
|
||||
"OBSOLETE svc_spawnbinary",
|
||||
"svc_spawnbaseline",
|
||||
|
||||
"svc_temp_entity", // <variable>
|
||||
"svc_setpause",
|
||||
"svc_signonnum",
|
||||
"svc_centerprint",
|
||||
"svc_killedmonster",
|
||||
"svc_foundsecret",
|
||||
"svc_spawnstaticsound",
|
||||
"svc_intermission",
|
||||
"svc_finale", // [string] music [string] text
|
||||
"svc_cdtrack", // [byte] track [byte] looptrack
|
||||
"svc_sellscreen",
|
||||
"svc_cutscene"
|
||||
};
|
||||
|
||||
//=============================================================================
|
||||
|
||||
/*
|
||||
===============
|
||||
CL_EntityNum
|
||||
|
||||
This error checks and tracks the total number of entities
|
||||
===============
|
||||
*/
|
||||
entity_t *CL_EntityNum (int num)
|
||||
{
|
||||
if (num >= cl.num_entities)
|
||||
{
|
||||
if (num >= MAX_EDICTS)
|
||||
Host_Error ("CL_EntityNum: %i is an invalid number",num);
|
||||
while (cl.num_entities<=num)
|
||||
{
|
||||
cl_entities[cl.num_entities].colormap = vid.colormap;
|
||||
cl.num_entities++;
|
||||
}
|
||||
}
|
||||
|
||||
return &cl_entities[num];
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==================
|
||||
CL_ParseStartSoundPacket
|
||||
==================
|
||||
*/
|
||||
void CL_ParseStartSoundPacket(void)
|
||||
{
|
||||
vec3_t pos;
|
||||
int channel, ent;
|
||||
int sound_num;
|
||||
int volume;
|
||||
int field_mask;
|
||||
float attenuation;
|
||||
int i;
|
||||
|
||||
field_mask = MSG_ReadByte();
|
||||
|
||||
if (field_mask & SND_VOLUME)
|
||||
volume = MSG_ReadByte ();
|
||||
else
|
||||
volume = DEFAULT_SOUND_PACKET_VOLUME;
|
||||
|
||||
if (field_mask & SND_ATTENUATION)
|
||||
attenuation = MSG_ReadByte () / 64.0;
|
||||
else
|
||||
attenuation = DEFAULT_SOUND_PACKET_ATTENUATION;
|
||||
|
||||
channel = MSG_ReadShort ();
|
||||
sound_num = MSG_ReadByte ();
|
||||
|
||||
ent = channel >> 3;
|
||||
channel &= 7;
|
||||
|
||||
if (ent > MAX_EDICTS)
|
||||
Host_Error ("CL_ParseStartSoundPacket: ent = %i", ent);
|
||||
|
||||
for (i=0 ; i<3 ; i++)
|
||||
pos[i] = MSG_ReadCoord ();
|
||||
|
||||
S_StartSound (ent, channel, cl.sound_precache[sound_num], pos, volume/255.0, attenuation);
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
CL_KeepaliveMessage
|
||||
|
||||
When the client is taking a long time to load stuff, send keepalive messages
|
||||
so the server doesn't disconnect.
|
||||
==================
|
||||
*/
|
||||
void CL_KeepaliveMessage (void)
|
||||
{
|
||||
float time;
|
||||
static float lastmsg;
|
||||
int ret;
|
||||
sizebuf_t old;
|
||||
byte olddata[8192];
|
||||
|
||||
if (sv.active)
|
||||
return; // no need if server is local
|
||||
if (cls.demoplayback)
|
||||
return;
|
||||
|
||||
// read messages from server, should just be nops
|
||||
old = net_message;
|
||||
memcpy (olddata, net_message.data, net_message.cursize);
|
||||
|
||||
do
|
||||
{
|
||||
ret = CL_GetMessage ();
|
||||
switch (ret)
|
||||
{
|
||||
default:
|
||||
Host_Error ("CL_KeepaliveMessage: CL_GetMessage failed");
|
||||
case 0:
|
||||
break; // nothing waiting
|
||||
case 1:
|
||||
Host_Error ("CL_KeepaliveMessage: received a message");
|
||||
break;
|
||||
case 2:
|
||||
if (MSG_ReadByte() != svc_nop)
|
||||
Host_Error ("CL_KeepaliveMessage: datagram wasn't a nop");
|
||||
break;
|
||||
}
|
||||
} while (ret);
|
||||
|
||||
net_message = old;
|
||||
memcpy (net_message.data, olddata, net_message.cursize);
|
||||
|
||||
// check time
|
||||
time = Sys_FloatTime ();
|
||||
if (time - lastmsg < 5)
|
||||
return;
|
||||
lastmsg = time;
|
||||
|
||||
// write out a nop
|
||||
Con_Printf ("--> client to server keepalive\n");
|
||||
|
||||
MSG_WriteByte (&cls.message, clc_nop);
|
||||
NET_SendMessage (cls.netcon, &cls.message);
|
||||
SZ_Clear (&cls.message);
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
CL_ParseServerInfo
|
||||
==================
|
||||
*/
|
||||
void CL_ParseServerInfo (void)
|
||||
{
|
||||
char *str;
|
||||
int i;
|
||||
int nummodels, numsounds;
|
||||
char model_precache[MAX_MODELS][MAX_QPATH];
|
||||
char sound_precache[MAX_SOUNDS][MAX_QPATH];
|
||||
|
||||
Con_DPrintf ("Serverinfo packet received.\n");
|
||||
//
|
||||
// wipe the client_state_t struct
|
||||
//
|
||||
CL_ClearState ();
|
||||
|
||||
// parse protocol version number
|
||||
i = MSG_ReadLong ();
|
||||
if (i != PROTOCOL_VERSION)
|
||||
{
|
||||
Con_Printf ("Server returned version %i, not %i", i, PROTOCOL_VERSION);
|
||||
return;
|
||||
}
|
||||
|
||||
// parse maxclients
|
||||
cl.maxclients = MSG_ReadByte ();
|
||||
if (cl.maxclients < 1 || cl.maxclients > MAX_SCOREBOARD)
|
||||
{
|
||||
Con_Printf("Bad maxclients (%u) from server\n", cl.maxclients);
|
||||
return;
|
||||
}
|
||||
cl.scores = Hunk_AllocName (cl.maxclients*sizeof(*cl.scores), "scores");
|
||||
|
||||
// parse gametype
|
||||
cl.gametype = MSG_ReadByte ();
|
||||
|
||||
// parse signon message
|
||||
str = MSG_ReadString ();
|
||||
strncpy (cl.levelname, str, sizeof(cl.levelname)-1);
|
||||
|
||||
// seperate the printfs so the server message can have a color
|
||||
Con_Printf("\n\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n\n");
|
||||
Con_Printf ("%c%s\n", 2, str);
|
||||
|
||||
//
|
||||
// first we go through and touch all of the precache data that still
|
||||
// happens to be in the cache, so precaching something else doesn't
|
||||
// needlessly purge it
|
||||
//
|
||||
|
||||
// precache models
|
||||
memset (cl.model_precache, 0, sizeof(cl.model_precache));
|
||||
for (nummodels=1 ; ; nummodels++)
|
||||
{
|
||||
str = MSG_ReadString ();
|
||||
if (!str[0])
|
||||
break;
|
||||
if (nummodels==MAX_MODELS)
|
||||
{
|
||||
Con_Printf ("Server sent too many model precaches\n");
|
||||
return;
|
||||
}
|
||||
strcpy (model_precache[nummodels], str);
|
||||
Mod_TouchModel (str);
|
||||
}
|
||||
|
||||
// precache sounds
|
||||
memset (cl.sound_precache, 0, sizeof(cl.sound_precache));
|
||||
for (numsounds=1 ; ; numsounds++)
|
||||
{
|
||||
str = MSG_ReadString ();
|
||||
if (!str[0])
|
||||
break;
|
||||
if (numsounds==MAX_SOUNDS)
|
||||
{
|
||||
Con_Printf ("Server sent too many sound precaches\n");
|
||||
return;
|
||||
}
|
||||
strcpy (sound_precache[numsounds], str);
|
||||
S_TouchSound (str);
|
||||
}
|
||||
|
||||
//
|
||||
// now we try to load everything else until a cache allocation fails
|
||||
//
|
||||
|
||||
for (i=1 ; i<nummodels ; i++)
|
||||
{
|
||||
cl.model_precache[i] = Mod_ForName (model_precache[i], false);
|
||||
if (cl.model_precache[i] == NULL)
|
||||
{
|
||||
Con_Printf("Model %s not found\n", model_precache[i]);
|
||||
return;
|
||||
}
|
||||
CL_KeepaliveMessage ();
|
||||
}
|
||||
|
||||
S_BeginPrecaching ();
|
||||
for (i=1 ; i<numsounds ; i++)
|
||||
{
|
||||
cl.sound_precache[i] = S_PrecacheSound (sound_precache[i]);
|
||||
CL_KeepaliveMessage ();
|
||||
}
|
||||
S_EndPrecaching ();
|
||||
|
||||
|
||||
// local state
|
||||
cl_entities[0].model = cl.worldmodel = cl.model_precache[1];
|
||||
|
||||
R_NewMap ();
|
||||
|
||||
Hunk_Check (); // make sure nothing is hurt
|
||||
|
||||
noclip_anglehack = false; // noclip is turned off at start
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==================
|
||||
CL_ParseUpdate
|
||||
|
||||
Parse an entity update message from the server
|
||||
If an entities model or origin changes from frame to frame, it must be
|
||||
relinked. Other attributes can change without relinking.
|
||||
==================
|
||||
*/
|
||||
int bitcounts[16];
|
||||
|
||||
void CL_ParseUpdate (int bits)
|
||||
{
|
||||
int i;
|
||||
model_t *model;
|
||||
int modnum;
|
||||
qboolean forcelink;
|
||||
entity_t *ent;
|
||||
int num;
|
||||
int skin;
|
||||
|
||||
if (cls.signon == SIGNONS - 1)
|
||||
{ // first update is the final signon stage
|
||||
cls.signon = SIGNONS;
|
||||
CL_SignonReply ();
|
||||
}
|
||||
|
||||
if (bits & U_MOREBITS)
|
||||
{
|
||||
i = MSG_ReadByte ();
|
||||
bits |= (i<<8);
|
||||
}
|
||||
|
||||
if (bits & U_LONGENTITY)
|
||||
num = MSG_ReadShort ();
|
||||
else
|
||||
num = MSG_ReadByte ();
|
||||
|
||||
ent = CL_EntityNum (num);
|
||||
|
||||
for (i=0 ; i<16 ; i++)
|
||||
if (bits&(1<<i))
|
||||
bitcounts[i]++;
|
||||
|
||||
if (ent->msgtime != cl.mtime[1])
|
||||
forcelink = true; // no previous frame to lerp from
|
||||
else
|
||||
forcelink = false;
|
||||
|
||||
ent->msgtime = cl.mtime[0];
|
||||
|
||||
if (bits & U_MODEL)
|
||||
{
|
||||
modnum = MSG_ReadByte ();
|
||||
if (modnum >= MAX_MODELS)
|
||||
Host_Error ("CL_ParseModel: bad modnum");
|
||||
}
|
||||
else
|
||||
modnum = ent->baseline.modelindex;
|
||||
|
||||
model = cl.model_precache[modnum];
|
||||
if (model != ent->model)
|
||||
{
|
||||
ent->model = model;
|
||||
// automatic animation (torches, etc) can be either all together
|
||||
// or randomized
|
||||
if (model)
|
||||
{
|
||||
if (model->synctype == ST_RAND)
|
||||
ent->syncbase = (float)(rand()&0x7fff) / 0x7fff;
|
||||
else
|
||||
ent->syncbase = 0.0;
|
||||
}
|
||||
else
|
||||
forcelink = true; // hack to make null model players work
|
||||
#ifdef GLQUAKE
|
||||
if (num > 0 && num <= cl.maxclients)
|
||||
R_TranslatePlayerSkin (num - 1);
|
||||
#endif
|
||||
}
|
||||
|
||||
if (bits & U_FRAME)
|
||||
ent->frame = MSG_ReadByte ();
|
||||
else
|
||||
ent->frame = ent->baseline.frame;
|
||||
|
||||
if (bits & U_COLORMAP)
|
||||
i = MSG_ReadByte();
|
||||
else
|
||||
i = ent->baseline.colormap;
|
||||
if (!i)
|
||||
ent->colormap = vid.colormap;
|
||||
else
|
||||
{
|
||||
if (i > cl.maxclients)
|
||||
Sys_Error ("i >= cl.maxclients");
|
||||
ent->colormap = cl.scores[i-1].translations;
|
||||
}
|
||||
|
||||
#ifdef GLQUAKE
|
||||
if (bits & U_SKIN)
|
||||
skin = MSG_ReadByte();
|
||||
else
|
||||
skin = ent->baseline.skin;
|
||||
if (skin != ent->skinnum) {
|
||||
ent->skinnum = skin;
|
||||
if (num > 0 && num <= cl.maxclients)
|
||||
R_TranslatePlayerSkin (num - 1);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
if (bits & U_SKIN)
|
||||
ent->skinnum = MSG_ReadByte();
|
||||
else
|
||||
ent->skinnum = ent->baseline.skin;
|
||||
#endif
|
||||
|
||||
if (bits & U_EFFECTS)
|
||||
ent->effects = MSG_ReadByte();
|
||||
else
|
||||
ent->effects = ent->baseline.effects;
|
||||
|
||||
// shift the known values for interpolation
|
||||
VectorCopy (ent->msg_origins[0], ent->msg_origins[1]);
|
||||
VectorCopy (ent->msg_angles[0], ent->msg_angles[1]);
|
||||
|
||||
if (bits & U_ORIGIN1)
|
||||
ent->msg_origins[0][0] = MSG_ReadCoord ();
|
||||
else
|
||||
ent->msg_origins[0][0] = ent->baseline.origin[0];
|
||||
if (bits & U_ANGLE1)
|
||||
ent->msg_angles[0][0] = MSG_ReadAngle();
|
||||
else
|
||||
ent->msg_angles[0][0] = ent->baseline.angles[0];
|
||||
|
||||
if (bits & U_ORIGIN2)
|
||||
ent->msg_origins[0][1] = MSG_ReadCoord ();
|
||||
else
|
||||
ent->msg_origins[0][1] = ent->baseline.origin[1];
|
||||
if (bits & U_ANGLE2)
|
||||
ent->msg_angles[0][1] = MSG_ReadAngle();
|
||||
else
|
||||
ent->msg_angles[0][1] = ent->baseline.angles[1];
|
||||
|
||||
if (bits & U_ORIGIN3)
|
||||
ent->msg_origins[0][2] = MSG_ReadCoord ();
|
||||
else
|
||||
ent->msg_origins[0][2] = ent->baseline.origin[2];
|
||||
if (bits & U_ANGLE3)
|
||||
ent->msg_angles[0][2] = MSG_ReadAngle();
|
||||
else
|
||||
ent->msg_angles[0][2] = ent->baseline.angles[2];
|
||||
|
||||
if ( bits & U_NOLERP )
|
||||
ent->forcelink = true;
|
||||
|
||||
if ( forcelink )
|
||||
{ // didn't have an update last message
|
||||
VectorCopy (ent->msg_origins[0], ent->msg_origins[1]);
|
||||
VectorCopy (ent->msg_origins[0], ent->origin);
|
||||
VectorCopy (ent->msg_angles[0], ent->msg_angles[1]);
|
||||
VectorCopy (ent->msg_angles[0], ent->angles);
|
||||
ent->forcelink = true;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
CL_ParseBaseline
|
||||
==================
|
||||
*/
|
||||
void CL_ParseBaseline (entity_t *ent)
|
||||
{
|
||||
int i;
|
||||
|
||||
ent->baseline.modelindex = MSG_ReadByte ();
|
||||
ent->baseline.frame = MSG_ReadByte ();
|
||||
ent->baseline.colormap = MSG_ReadByte();
|
||||
ent->baseline.skin = MSG_ReadByte();
|
||||
for (i=0 ; i<3 ; i++)
|
||||
{
|
||||
ent->baseline.origin[i] = MSG_ReadCoord ();
|
||||
ent->baseline.angles[i] = MSG_ReadAngle ();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==================
|
||||
CL_ParseClientdata
|
||||
|
||||
Server information pertaining to this client only
|
||||
==================
|
||||
*/
|
||||
void CL_ParseClientdata (int bits)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
if (bits & SU_VIEWHEIGHT)
|
||||
cl.viewheight = MSG_ReadChar ();
|
||||
else
|
||||
cl.viewheight = DEFAULT_VIEWHEIGHT;
|
||||
|
||||
if (bits & SU_IDEALPITCH)
|
||||
cl.idealpitch = MSG_ReadChar ();
|
||||
else
|
||||
cl.idealpitch = 0;
|
||||
|
||||
VectorCopy (cl.mvelocity[0], cl.mvelocity[1]);
|
||||
for (i=0 ; i<3 ; i++)
|
||||
{
|
||||
if (bits & (SU_PUNCH1<<i) )
|
||||
cl.punchangle[i] = MSG_ReadChar();
|
||||
else
|
||||
cl.punchangle[i] = 0;
|
||||
if (bits & (SU_VELOCITY1<<i) )
|
||||
cl.mvelocity[0][i] = MSG_ReadChar()*16;
|
||||
else
|
||||
cl.mvelocity[0][i] = 0;
|
||||
}
|
||||
|
||||
// [always sent] if (bits & SU_ITEMS)
|
||||
i = MSG_ReadLong ();
|
||||
|
||||
if (cl.items != i)
|
||||
{ // set flash times
|
||||
Sbar_Changed ();
|
||||
for (j=0 ; j<32 ; j++)
|
||||
if ( (i & (1<<j)) && !(cl.items & (1<<j)))
|
||||
cl.item_gettime[j] = cl.time;
|
||||
cl.items = i;
|
||||
}
|
||||
|
||||
cl.onground = (bits & SU_ONGROUND) != 0;
|
||||
cl.inwater = (bits & SU_INWATER) != 0;
|
||||
|
||||
if (bits & SU_WEAPONFRAME)
|
||||
cl.stats[STAT_WEAPONFRAME] = MSG_ReadByte ();
|
||||
else
|
||||
cl.stats[STAT_WEAPONFRAME] = 0;
|
||||
|
||||
if (bits & SU_ARMOR)
|
||||
i = MSG_ReadByte ();
|
||||
else
|
||||
i = 0;
|
||||
if (cl.stats[STAT_ARMOR] != i)
|
||||
{
|
||||
cl.stats[STAT_ARMOR] = i;
|
||||
Sbar_Changed ();
|
||||
}
|
||||
|
||||
if (bits & SU_WEAPON)
|
||||
i = MSG_ReadByte ();
|
||||
else
|
||||
i = 0;
|
||||
if (cl.stats[STAT_WEAPON] != i)
|
||||
{
|
||||
cl.stats[STAT_WEAPON] = i;
|
||||
Sbar_Changed ();
|
||||
}
|
||||
|
||||
i = MSG_ReadShort ();
|
||||
if (cl.stats[STAT_HEALTH] != i)
|
||||
{
|
||||
cl.stats[STAT_HEALTH] = i;
|
||||
Sbar_Changed ();
|
||||
}
|
||||
|
||||
i = MSG_ReadByte ();
|
||||
if (cl.stats[STAT_AMMO] != i)
|
||||
{
|
||||
cl.stats[STAT_AMMO] = i;
|
||||
Sbar_Changed ();
|
||||
}
|
||||
|
||||
for (i=0 ; i<4 ; i++)
|
||||
{
|
||||
j = MSG_ReadByte ();
|
||||
if (cl.stats[STAT_SHELLS+i] != j)
|
||||
{
|
||||
cl.stats[STAT_SHELLS+i] = j;
|
||||
Sbar_Changed ();
|
||||
}
|
||||
}
|
||||
|
||||
i = MSG_ReadByte ();
|
||||
|
||||
if (standard_quake)
|
||||
{
|
||||
if (cl.stats[STAT_ACTIVEWEAPON] != i)
|
||||
{
|
||||
cl.stats[STAT_ACTIVEWEAPON] = i;
|
||||
Sbar_Changed ();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (cl.stats[STAT_ACTIVEWEAPON] != (1<<i))
|
||||
{
|
||||
cl.stats[STAT_ACTIVEWEAPON] = (1<<i);
|
||||
Sbar_Changed ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
=====================
|
||||
CL_NewTranslation
|
||||
=====================
|
||||
*/
|
||||
void CL_NewTranslation (int slot)
|
||||
{
|
||||
int i, j;
|
||||
int top, bottom;
|
||||
byte *dest, *source;
|
||||
|
||||
if (slot > cl.maxclients)
|
||||
Sys_Error ("CL_NewTranslation: slot > cl.maxclients");
|
||||
dest = cl.scores[slot].translations;
|
||||
source = vid.colormap;
|
||||
memcpy (dest, vid.colormap, sizeof(cl.scores[slot].translations));
|
||||
top = cl.scores[slot].colors & 0xf0;
|
||||
bottom = (cl.scores[slot].colors &15)<<4;
|
||||
#ifdef GLQUAKE
|
||||
R_TranslatePlayerSkin (slot);
|
||||
#endif
|
||||
|
||||
for (i=0 ; i<VID_GRADES ; i++, dest += 256, source+=256)
|
||||
{
|
||||
if (top < 128) // the artists made some backwards ranges. sigh.
|
||||
memcpy (dest + TOP_RANGE, source + top, 16);
|
||||
else
|
||||
for (j=0 ; j<16 ; j++)
|
||||
dest[TOP_RANGE+j] = source[top+15-j];
|
||||
|
||||
if (bottom < 128)
|
||||
memcpy (dest + BOTTOM_RANGE, source + bottom, 16);
|
||||
else
|
||||
for (j=0 ; j<16 ; j++)
|
||||
dest[BOTTOM_RANGE+j] = source[bottom+15-j];
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
=====================
|
||||
CL_ParseStatic
|
||||
=====================
|
||||
*/
|
||||
void CL_ParseStatic (void)
|
||||
{
|
||||
entity_t *ent;
|
||||
int i;
|
||||
|
||||
i = cl.num_statics;
|
||||
if (i >= MAX_STATIC_ENTITIES)
|
||||
Host_Error ("Too many static entities");
|
||||
ent = &cl_static_entities[i];
|
||||
cl.num_statics++;
|
||||
CL_ParseBaseline (ent);
|
||||
|
||||
// copy it to the current state
|
||||
ent->model = cl.model_precache[ent->baseline.modelindex];
|
||||
ent->frame = ent->baseline.frame;
|
||||
ent->colormap = vid.colormap;
|
||||
ent->skinnum = ent->baseline.skin;
|
||||
ent->effects = ent->baseline.effects;
|
||||
|
||||
VectorCopy (ent->baseline.origin, ent->origin);
|
||||
VectorCopy (ent->baseline.angles, ent->angles);
|
||||
R_AddEfrags (ent);
|
||||
}
|
||||
|
||||
/*
|
||||
===================
|
||||
CL_ParseStaticSound
|
||||
===================
|
||||
*/
|
||||
void CL_ParseStaticSound (void)
|
||||
{
|
||||
vec3_t org;
|
||||
int sound_num, vol, atten;
|
||||
int i;
|
||||
|
||||
for (i=0 ; i<3 ; i++)
|
||||
org[i] = MSG_ReadCoord ();
|
||||
sound_num = MSG_ReadByte ();
|
||||
vol = MSG_ReadByte ();
|
||||
atten = MSG_ReadByte ();
|
||||
|
||||
S_StaticSound (cl.sound_precache[sound_num], org, vol, atten);
|
||||
}
|
||||
|
||||
|
||||
#define SHOWNET(x) if(cl_shownet.value==2)Con_Printf ("%3i:%s\n", msg_readcount-1, x);
|
||||
|
||||
/*
|
||||
=====================
|
||||
CL_ParseServerMessage
|
||||
=====================
|
||||
*/
|
||||
void CL_ParseServerMessage (void)
|
||||
{
|
||||
int cmd;
|
||||
int i;
|
||||
|
||||
//
|
||||
// if recording demos, copy the message out
|
||||
//
|
||||
if (cl_shownet.value == 1)
|
||||
Con_Printf ("%i ",net_message.cursize);
|
||||
else if (cl_shownet.value == 2)
|
||||
Con_Printf ("------------------\n");
|
||||
|
||||
cl.onground = false; // unless the server says otherwise
|
||||
//
|
||||
// parse the message
|
||||
//
|
||||
MSG_BeginReading ();
|
||||
|
||||
while (1)
|
||||
{
|
||||
if (msg_badread)
|
||||
Host_Error ("CL_ParseServerMessage: Bad server message");
|
||||
|
||||
cmd = MSG_ReadByte ();
|
||||
|
||||
if (cmd == -1)
|
||||
{
|
||||
SHOWNET("END OF MESSAGE");
|
||||
return; // end of message
|
||||
}
|
||||
|
||||
// if the high bit of the command byte is set, it is a fast update
|
||||
if (cmd & 128)
|
||||
{
|
||||
SHOWNET("fast update");
|
||||
CL_ParseUpdate (cmd&127);
|
||||
continue;
|
||||
}
|
||||
|
||||
SHOWNET(svc_strings[cmd]);
|
||||
|
||||
// other commands
|
||||
switch (cmd)
|
||||
{
|
||||
default:
|
||||
Host_Error ("CL_ParseServerMessage: Illegible server message\n");
|
||||
break;
|
||||
|
||||
case svc_nop:
|
||||
// Con_Printf ("svc_nop\n");
|
||||
break;
|
||||
|
||||
case svc_time:
|
||||
cl.mtime[1] = cl.mtime[0];
|
||||
cl.mtime[0] = MSG_ReadFloat ();
|
||||
break;
|
||||
|
||||
case svc_clientdata:
|
||||
i = MSG_ReadShort ();
|
||||
CL_ParseClientdata (i);
|
||||
break;
|
||||
|
||||
case svc_version:
|
||||
i = MSG_ReadLong ();
|
||||
if (i != PROTOCOL_VERSION)
|
||||
Host_Error ("CL_ParseServerMessage: Server is protocol %i instead of %i\n", i, PROTOCOL_VERSION);
|
||||
break;
|
||||
|
||||
case svc_disconnect:
|
||||
Host_EndGame ("Server disconnected\n");
|
||||
|
||||
case svc_print:
|
||||
Con_Printf ("%s", MSG_ReadString ());
|
||||
break;
|
||||
|
||||
case svc_centerprint:
|
||||
SCR_CenterPrint (MSG_ReadString ());
|
||||
break;
|
||||
|
||||
case svc_stufftext:
|
||||
Cbuf_AddText (MSG_ReadString ());
|
||||
break;
|
||||
|
||||
case svc_damage:
|
||||
V_ParseDamage ();
|
||||
break;
|
||||
|
||||
case svc_serverinfo:
|
||||
CL_ParseServerInfo ();
|
||||
vid.recalc_refdef = true; // leave intermission full screen
|
||||
break;
|
||||
|
||||
case svc_setangle:
|
||||
for (i=0 ; i<3 ; i++)
|
||||
cl.viewangles[i] = MSG_ReadAngle ();
|
||||
break;
|
||||
|
||||
case svc_setview:
|
||||
cl.viewentity = MSG_ReadShort ();
|
||||
break;
|
||||
|
||||
case svc_lightstyle:
|
||||
i = MSG_ReadByte ();
|
||||
if (i >= MAX_LIGHTSTYLES)
|
||||
Sys_Error ("svc_lightstyle > MAX_LIGHTSTYLES");
|
||||
Q_strcpy (cl_lightstyle[i].map, MSG_ReadString());
|
||||
cl_lightstyle[i].length = Q_strlen(cl_lightstyle[i].map);
|
||||
break;
|
||||
|
||||
case svc_sound:
|
||||
CL_ParseStartSoundPacket();
|
||||
break;
|
||||
|
||||
case svc_stopsound:
|
||||
i = MSG_ReadShort();
|
||||
S_StopSound(i>>3, i&7);
|
||||
break;
|
||||
|
||||
case svc_updatename:
|
||||
Sbar_Changed ();
|
||||
i = MSG_ReadByte ();
|
||||
if (i >= cl.maxclients)
|
||||
Host_Error ("CL_ParseServerMessage: svc_updatename > MAX_SCOREBOARD");
|
||||
strcpy (cl.scores[i].name, MSG_ReadString ());
|
||||
break;
|
||||
|
||||
case svc_updatefrags:
|
||||
Sbar_Changed ();
|
||||
i = MSG_ReadByte ();
|
||||
if (i >= cl.maxclients)
|
||||
Host_Error ("CL_ParseServerMessage: svc_updatefrags > MAX_SCOREBOARD");
|
||||
cl.scores[i].frags = MSG_ReadShort ();
|
||||
break;
|
||||
|
||||
case svc_updatecolors:
|
||||
Sbar_Changed ();
|
||||
i = MSG_ReadByte ();
|
||||
if (i >= cl.maxclients)
|
||||
Host_Error ("CL_ParseServerMessage: svc_updatecolors > MAX_SCOREBOARD");
|
||||
cl.scores[i].colors = MSG_ReadByte ();
|
||||
CL_NewTranslation (i);
|
||||
break;
|
||||
|
||||
case svc_particle:
|
||||
R_ParseParticleEffect ();
|
||||
break;
|
||||
|
||||
case svc_spawnbaseline:
|
||||
i = MSG_ReadShort ();
|
||||
// must use CL_EntityNum() to force cl.num_entities up
|
||||
CL_ParseBaseline (CL_EntityNum(i));
|
||||
break;
|
||||
case svc_spawnstatic:
|
||||
CL_ParseStatic ();
|
||||
break;
|
||||
case svc_temp_entity:
|
||||
CL_ParseTEnt ();
|
||||
break;
|
||||
|
||||
case svc_setpause:
|
||||
{
|
||||
cl.paused = MSG_ReadByte ();
|
||||
|
||||
if (cl.paused)
|
||||
{
|
||||
CDAudio_Pause ();
|
||||
#ifdef _WIN32
|
||||
VID_HandlePause (true);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
CDAudio_Resume ();
|
||||
#ifdef _WIN32
|
||||
VID_HandlePause (false);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case svc_signonnum:
|
||||
i = MSG_ReadByte ();
|
||||
if (i <= cls.signon)
|
||||
Host_Error ("Received signon %i when at %i", i, cls.signon);
|
||||
cls.signon = i;
|
||||
CL_SignonReply ();
|
||||
break;
|
||||
|
||||
case svc_killedmonster:
|
||||
cl.stats[STAT_MONSTERS]++;
|
||||
break;
|
||||
|
||||
case svc_foundsecret:
|
||||
cl.stats[STAT_SECRETS]++;
|
||||
break;
|
||||
|
||||
case svc_updatestat:
|
||||
i = MSG_ReadByte ();
|
||||
if (i < 0 || i >= MAX_CL_STATS)
|
||||
Sys_Error ("svc_updatestat: %i is invalid", i);
|
||||
cl.stats[i] = MSG_ReadLong ();;
|
||||
break;
|
||||
|
||||
case svc_spawnstaticsound:
|
||||
CL_ParseStaticSound ();
|
||||
break;
|
||||
|
||||
case svc_cdtrack:
|
||||
cl.cdtrack = MSG_ReadByte ();
|
||||
cl.looptrack = MSG_ReadByte ();
|
||||
if ( (cls.demoplayback || cls.demorecording) && (cls.forcetrack != -1) )
|
||||
CDAudio_Play ((byte)cls.forcetrack, true);
|
||||
else
|
||||
CDAudio_Play ((byte)cl.cdtrack, true);
|
||||
break;
|
||||
|
||||
case svc_intermission:
|
||||
cl.intermission = 1;
|
||||
cl.completed_time = cl.time;
|
||||
vid.recalc_refdef = true; // go to full screen
|
||||
break;
|
||||
|
||||
case svc_finale:
|
||||
cl.intermission = 2;
|
||||
cl.completed_time = cl.time;
|
||||
vid.recalc_refdef = true; // go to full screen
|
||||
SCR_CenterPrint (MSG_ReadString ());
|
||||
break;
|
||||
|
||||
case svc_cutscene:
|
||||
cl.intermission = 3;
|
||||
cl.completed_time = cl.time;
|
||||
vid.recalc_refdef = true; // go to full screen
|
||||
SCR_CenterPrint (MSG_ReadString ());
|
||||
break;
|
||||
|
||||
case svc_sellscreen:
|
||||
Cmd_ExecuteString ("help", src_command);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
394
WinQuake/cl_tent.c
Normal file
394
WinQuake/cl_tent.c
Normal file
@@ -0,0 +1,394 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// cl_tent.c -- client side temporary entities
|
||||
|
||||
#include "quakedef.h"
|
||||
|
||||
int num_temp_entities;
|
||||
entity_t cl_temp_entities[MAX_TEMP_ENTITIES];
|
||||
beam_t cl_beams[MAX_BEAMS];
|
||||
|
||||
sfx_t *cl_sfx_wizhit;
|
||||
sfx_t *cl_sfx_knighthit;
|
||||
sfx_t *cl_sfx_tink1;
|
||||
sfx_t *cl_sfx_ric1;
|
||||
sfx_t *cl_sfx_ric2;
|
||||
sfx_t *cl_sfx_ric3;
|
||||
sfx_t *cl_sfx_r_exp3;
|
||||
#ifdef QUAKE2
|
||||
sfx_t *cl_sfx_imp;
|
||||
sfx_t *cl_sfx_rail;
|
||||
#endif
|
||||
|
||||
/*
|
||||
=================
|
||||
CL_ParseTEnt
|
||||
=================
|
||||
*/
|
||||
void CL_InitTEnts (void)
|
||||
{
|
||||
cl_sfx_wizhit = S_PrecacheSound ("wizard/hit.wav");
|
||||
cl_sfx_knighthit = S_PrecacheSound ("hknight/hit.wav");
|
||||
cl_sfx_tink1 = S_PrecacheSound ("weapons/tink1.wav");
|
||||
cl_sfx_ric1 = S_PrecacheSound ("weapons/ric1.wav");
|
||||
cl_sfx_ric2 = S_PrecacheSound ("weapons/ric2.wav");
|
||||
cl_sfx_ric3 = S_PrecacheSound ("weapons/ric3.wav");
|
||||
cl_sfx_r_exp3 = S_PrecacheSound ("weapons/r_exp3.wav");
|
||||
#ifdef QUAKE2
|
||||
cl_sfx_imp = S_PrecacheSound ("shambler/sattck1.wav");
|
||||
cl_sfx_rail = S_PrecacheSound ("weapons/lstart.wav");
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
CL_ParseBeam
|
||||
=================
|
||||
*/
|
||||
void CL_ParseBeam (model_t *m)
|
||||
{
|
||||
int ent;
|
||||
vec3_t start, end;
|
||||
beam_t *b;
|
||||
int i;
|
||||
|
||||
ent = MSG_ReadShort ();
|
||||
|
||||
start[0] = MSG_ReadCoord ();
|
||||
start[1] = MSG_ReadCoord ();
|
||||
start[2] = MSG_ReadCoord ();
|
||||
|
||||
end[0] = MSG_ReadCoord ();
|
||||
end[1] = MSG_ReadCoord ();
|
||||
end[2] = MSG_ReadCoord ();
|
||||
|
||||
// override any beam with the same entity
|
||||
for (i=0, b=cl_beams ; i< MAX_BEAMS ; i++, b++)
|
||||
if (b->entity == ent)
|
||||
{
|
||||
b->entity = ent;
|
||||
b->model = m;
|
||||
b->endtime = cl.time + 0.2;
|
||||
VectorCopy (start, b->start);
|
||||
VectorCopy (end, b->end);
|
||||
return;
|
||||
}
|
||||
|
||||
// find a free beam
|
||||
for (i=0, b=cl_beams ; i< MAX_BEAMS ; i++, b++)
|
||||
{
|
||||
if (!b->model || b->endtime < cl.time)
|
||||
{
|
||||
b->entity = ent;
|
||||
b->model = m;
|
||||
b->endtime = cl.time + 0.2;
|
||||
VectorCopy (start, b->start);
|
||||
VectorCopy (end, b->end);
|
||||
return;
|
||||
}
|
||||
}
|
||||
Con_Printf ("beam list overflow!\n");
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
CL_ParseTEnt
|
||||
=================
|
||||
*/
|
||||
void CL_ParseTEnt (void)
|
||||
{
|
||||
int type;
|
||||
vec3_t pos;
|
||||
#ifdef QUAKE2
|
||||
vec3_t endpos;
|
||||
#endif
|
||||
dlight_t *dl;
|
||||
int rnd;
|
||||
int colorStart, colorLength;
|
||||
|
||||
type = MSG_ReadByte ();
|
||||
switch (type)
|
||||
{
|
||||
case TE_WIZSPIKE: // spike hitting wall
|
||||
pos[0] = MSG_ReadCoord ();
|
||||
pos[1] = MSG_ReadCoord ();
|
||||
pos[2] = MSG_ReadCoord ();
|
||||
R_RunParticleEffect (pos, vec3_origin, 20, 30);
|
||||
S_StartSound (-1, 0, cl_sfx_wizhit, pos, 1, 1);
|
||||
break;
|
||||
|
||||
case TE_KNIGHTSPIKE: // spike hitting wall
|
||||
pos[0] = MSG_ReadCoord ();
|
||||
pos[1] = MSG_ReadCoord ();
|
||||
pos[2] = MSG_ReadCoord ();
|
||||
R_RunParticleEffect (pos, vec3_origin, 226, 20);
|
||||
S_StartSound (-1, 0, cl_sfx_knighthit, pos, 1, 1);
|
||||
break;
|
||||
|
||||
case TE_SPIKE: // spike hitting wall
|
||||
pos[0] = MSG_ReadCoord ();
|
||||
pos[1] = MSG_ReadCoord ();
|
||||
pos[2] = MSG_ReadCoord ();
|
||||
#ifdef GLTEST
|
||||
Test_Spawn (pos);
|
||||
#else
|
||||
R_RunParticleEffect (pos, vec3_origin, 0, 10);
|
||||
#endif
|
||||
if ( rand() % 5 )
|
||||
S_StartSound (-1, 0, cl_sfx_tink1, pos, 1, 1);
|
||||
else
|
||||
{
|
||||
rnd = rand() & 3;
|
||||
if (rnd == 1)
|
||||
S_StartSound (-1, 0, cl_sfx_ric1, pos, 1, 1);
|
||||
else if (rnd == 2)
|
||||
S_StartSound (-1, 0, cl_sfx_ric2, pos, 1, 1);
|
||||
else
|
||||
S_StartSound (-1, 0, cl_sfx_ric3, pos, 1, 1);
|
||||
}
|
||||
break;
|
||||
case TE_SUPERSPIKE: // super spike hitting wall
|
||||
pos[0] = MSG_ReadCoord ();
|
||||
pos[1] = MSG_ReadCoord ();
|
||||
pos[2] = MSG_ReadCoord ();
|
||||
R_RunParticleEffect (pos, vec3_origin, 0, 20);
|
||||
|
||||
if ( rand() % 5 )
|
||||
S_StartSound (-1, 0, cl_sfx_tink1, pos, 1, 1);
|
||||
else
|
||||
{
|
||||
rnd = rand() & 3;
|
||||
if (rnd == 1)
|
||||
S_StartSound (-1, 0, cl_sfx_ric1, pos, 1, 1);
|
||||
else if (rnd == 2)
|
||||
S_StartSound (-1, 0, cl_sfx_ric2, pos, 1, 1);
|
||||
else
|
||||
S_StartSound (-1, 0, cl_sfx_ric3, pos, 1, 1);
|
||||
}
|
||||
break;
|
||||
|
||||
case TE_GUNSHOT: // bullet hitting wall
|
||||
pos[0] = MSG_ReadCoord ();
|
||||
pos[1] = MSG_ReadCoord ();
|
||||
pos[2] = MSG_ReadCoord ();
|
||||
R_RunParticleEffect (pos, vec3_origin, 0, 20);
|
||||
break;
|
||||
|
||||
case TE_EXPLOSION: // rocket explosion
|
||||
pos[0] = MSG_ReadCoord ();
|
||||
pos[1] = MSG_ReadCoord ();
|
||||
pos[2] = MSG_ReadCoord ();
|
||||
R_ParticleExplosion (pos);
|
||||
dl = CL_AllocDlight (0);
|
||||
VectorCopy (pos, dl->origin);
|
||||
dl->radius = 350;
|
||||
dl->die = cl.time + 0.5;
|
||||
dl->decay = 300;
|
||||
S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1);
|
||||
break;
|
||||
|
||||
case TE_TAREXPLOSION: // tarbaby explosion
|
||||
pos[0] = MSG_ReadCoord ();
|
||||
pos[1] = MSG_ReadCoord ();
|
||||
pos[2] = MSG_ReadCoord ();
|
||||
R_BlobExplosion (pos);
|
||||
|
||||
S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1);
|
||||
break;
|
||||
|
||||
case TE_LIGHTNING1: // lightning bolts
|
||||
CL_ParseBeam (Mod_ForName("progs/bolt.mdl", true));
|
||||
break;
|
||||
|
||||
case TE_LIGHTNING2: // lightning bolts
|
||||
CL_ParseBeam (Mod_ForName("progs/bolt2.mdl", true));
|
||||
break;
|
||||
|
||||
case TE_LIGHTNING3: // lightning bolts
|
||||
CL_ParseBeam (Mod_ForName("progs/bolt3.mdl", true));
|
||||
break;
|
||||
|
||||
// PGM 01/21/97
|
||||
case TE_BEAM: // grappling hook beam
|
||||
CL_ParseBeam (Mod_ForName("progs/beam.mdl", true));
|
||||
break;
|
||||
// PGM 01/21/97
|
||||
|
||||
case TE_LAVASPLASH:
|
||||
pos[0] = MSG_ReadCoord ();
|
||||
pos[1] = MSG_ReadCoord ();
|
||||
pos[2] = MSG_ReadCoord ();
|
||||
R_LavaSplash (pos);
|
||||
break;
|
||||
|
||||
case TE_TELEPORT:
|
||||
pos[0] = MSG_ReadCoord ();
|
||||
pos[1] = MSG_ReadCoord ();
|
||||
pos[2] = MSG_ReadCoord ();
|
||||
R_TeleportSplash (pos);
|
||||
break;
|
||||
|
||||
case TE_EXPLOSION2: // color mapped explosion
|
||||
pos[0] = MSG_ReadCoord ();
|
||||
pos[1] = MSG_ReadCoord ();
|
||||
pos[2] = MSG_ReadCoord ();
|
||||
colorStart = MSG_ReadByte ();
|
||||
colorLength = MSG_ReadByte ();
|
||||
R_ParticleExplosion2 (pos, colorStart, colorLength);
|
||||
dl = CL_AllocDlight (0);
|
||||
VectorCopy (pos, dl->origin);
|
||||
dl->radius = 350;
|
||||
dl->die = cl.time + 0.5;
|
||||
dl->decay = 300;
|
||||
S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1);
|
||||
break;
|
||||
|
||||
#ifdef QUAKE2
|
||||
case TE_IMPLOSION:
|
||||
pos[0] = MSG_ReadCoord ();
|
||||
pos[1] = MSG_ReadCoord ();
|
||||
pos[2] = MSG_ReadCoord ();
|
||||
S_StartSound (-1, 0, cl_sfx_imp, pos, 1, 1);
|
||||
break;
|
||||
|
||||
case TE_RAILTRAIL:
|
||||
pos[0] = MSG_ReadCoord ();
|
||||
pos[1] = MSG_ReadCoord ();
|
||||
pos[2] = MSG_ReadCoord ();
|
||||
endpos[0] = MSG_ReadCoord ();
|
||||
endpos[1] = MSG_ReadCoord ();
|
||||
endpos[2] = MSG_ReadCoord ();
|
||||
S_StartSound (-1, 0, cl_sfx_rail, pos, 1, 1);
|
||||
S_StartSound (-1, 1, cl_sfx_r_exp3, endpos, 1, 1);
|
||||
R_RocketTrail (pos, endpos, 0+128);
|
||||
R_ParticleExplosion (endpos);
|
||||
dl = CL_AllocDlight (-1);
|
||||
VectorCopy (endpos, dl->origin);
|
||||
dl->radius = 350;
|
||||
dl->die = cl.time + 0.5;
|
||||
dl->decay = 300;
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
Sys_Error ("CL_ParseTEnt: bad type");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
=================
|
||||
CL_NewTempEntity
|
||||
=================
|
||||
*/
|
||||
entity_t *CL_NewTempEntity (void)
|
||||
{
|
||||
entity_t *ent;
|
||||
|
||||
if (cl_numvisedicts == MAX_VISEDICTS)
|
||||
return NULL;
|
||||
if (num_temp_entities == MAX_TEMP_ENTITIES)
|
||||
return NULL;
|
||||
ent = &cl_temp_entities[num_temp_entities];
|
||||
memset (ent, 0, sizeof(*ent));
|
||||
num_temp_entities++;
|
||||
cl_visedicts[cl_numvisedicts] = ent;
|
||||
cl_numvisedicts++;
|
||||
|
||||
ent->colormap = vid.colormap;
|
||||
return ent;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
=================
|
||||
CL_UpdateTEnts
|
||||
=================
|
||||
*/
|
||||
void CL_UpdateTEnts (void)
|
||||
{
|
||||
int i;
|
||||
beam_t *b;
|
||||
vec3_t dist, org;
|
||||
float d;
|
||||
entity_t *ent;
|
||||
float yaw, pitch;
|
||||
float forward;
|
||||
|
||||
num_temp_entities = 0;
|
||||
|
||||
// update lightning
|
||||
for (i=0, b=cl_beams ; i< MAX_BEAMS ; i++, b++)
|
||||
{
|
||||
if (!b->model || b->endtime < cl.time)
|
||||
continue;
|
||||
|
||||
// if coming from the player, update the start position
|
||||
if (b->entity == cl.viewentity)
|
||||
{
|
||||
VectorCopy (cl_entities[cl.viewentity].origin, b->start);
|
||||
}
|
||||
|
||||
// calculate pitch and yaw
|
||||
VectorSubtract (b->end, b->start, dist);
|
||||
|
||||
if (dist[1] == 0 && dist[0] == 0)
|
||||
{
|
||||
yaw = 0;
|
||||
if (dist[2] > 0)
|
||||
pitch = 90;
|
||||
else
|
||||
pitch = 270;
|
||||
}
|
||||
else
|
||||
{
|
||||
yaw = (int) (atan2(dist[1], dist[0]) * 180 / M_PI);
|
||||
if (yaw < 0)
|
||||
yaw += 360;
|
||||
|
||||
forward = sqrt (dist[0]*dist[0] + dist[1]*dist[1]);
|
||||
pitch = (int) (atan2(dist[2], forward) * 180 / M_PI);
|
||||
if (pitch < 0)
|
||||
pitch += 360;
|
||||
}
|
||||
|
||||
// add new entities for the lightning
|
||||
VectorCopy (b->start, org);
|
||||
d = VectorNormalize(dist);
|
||||
while (d > 0)
|
||||
{
|
||||
ent = CL_NewTempEntity ();
|
||||
if (!ent)
|
||||
return;
|
||||
VectorCopy (org, ent->origin);
|
||||
ent->model = b->model;
|
||||
ent->angles[0] = pitch;
|
||||
ent->angles[1] = yaw;
|
||||
ent->angles[2] = rand()%360;
|
||||
|
||||
for (i=0 ; i<3 ; i++)
|
||||
org[i] += dist[i]*30;
|
||||
d -= 30;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
18
WinQuake/clean.bat
Normal file
18
WinQuake/clean.bat
Normal file
@@ -0,0 +1,18 @@
|
||||
rmdir /s /q debug
|
||||
rmdir /s /q release
|
||||
rmdir /s /q debug_gl
|
||||
rmdir /s /q release_gl
|
||||
|
||||
rmdir /s /q gas2masm\debug
|
||||
rmdir /s /q gas2masm\release
|
||||
|
||||
del gas2masm\gas2masm.opt
|
||||
del gas2masm\gas2masm.plg
|
||||
del gas2masm\gas2masm.ncb
|
||||
del gas2masm\gas2masm.stt
|
||||
|
||||
del WinQuake.opt
|
||||
del WinQuake.plg
|
||||
del WinQuake.ncb
|
||||
del WinQuake.stt
|
||||
|
||||
375
WinQuake/client.h
Normal file
375
WinQuake/client.h
Normal file
@@ -0,0 +1,375 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// client.h
|
||||
|
||||
typedef struct
|
||||
{
|
||||
vec3_t viewangles;
|
||||
|
||||
// intended velocities
|
||||
float forwardmove;
|
||||
float sidemove;
|
||||
float upmove;
|
||||
#ifdef QUAKE2
|
||||
byte lightlevel;
|
||||
#endif
|
||||
} usercmd_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int length;
|
||||
char map[MAX_STYLESTRING];
|
||||
} lightstyle_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char name[MAX_SCOREBOARDNAME];
|
||||
float entertime;
|
||||
int frags;
|
||||
int colors; // two 4 bit fields
|
||||
byte translations[VID_GRADES*256];
|
||||
} scoreboard_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int destcolor[3];
|
||||
int percent; // 0-256
|
||||
} cshift_t;
|
||||
|
||||
#define CSHIFT_CONTENTS 0
|
||||
#define CSHIFT_DAMAGE 1
|
||||
#define CSHIFT_BONUS 2
|
||||
#define CSHIFT_POWERUP 3
|
||||
#define NUM_CSHIFTS 4
|
||||
|
||||
#define NAME_LENGTH 64
|
||||
|
||||
|
||||
//
|
||||
// client_state_t should hold all pieces of the client state
|
||||
//
|
||||
|
||||
#define SIGNONS 4 // signon messages to receive before connected
|
||||
|
||||
#define MAX_DLIGHTS 32
|
||||
typedef struct
|
||||
{
|
||||
vec3_t origin;
|
||||
float radius;
|
||||
float die; // stop lighting after this time
|
||||
float decay; // drop this each second
|
||||
float minlight; // don't add when contributing less
|
||||
int key;
|
||||
#ifdef QUAKE2
|
||||
qboolean dark; // subtracts light instead of adding
|
||||
#endif
|
||||
} dlight_t;
|
||||
|
||||
|
||||
#define MAX_BEAMS 24
|
||||
typedef struct
|
||||
{
|
||||
int entity;
|
||||
struct model_s *model;
|
||||
float endtime;
|
||||
vec3_t start, end;
|
||||
} beam_t;
|
||||
|
||||
#define MAX_EFRAGS 640
|
||||
|
||||
#define MAX_MAPSTRING 2048
|
||||
#define MAX_DEMOS 8
|
||||
#define MAX_DEMONAME 16
|
||||
|
||||
typedef enum {
|
||||
ca_dedicated, // a dedicated server with no ability to start a client
|
||||
ca_disconnected, // full screen console with no connection
|
||||
ca_connected // valid netcon, talking to a server
|
||||
} cactive_t;
|
||||
|
||||
//
|
||||
// the client_static_t structure is persistant through an arbitrary number
|
||||
// of server connections
|
||||
//
|
||||
typedef struct
|
||||
{
|
||||
cactive_t state;
|
||||
|
||||
// personalization data sent to server
|
||||
char mapstring[MAX_QPATH];
|
||||
char spawnparms[MAX_MAPSTRING]; // to restart a level
|
||||
|
||||
// demo loop control
|
||||
int demonum; // -1 = don't play demos
|
||||
char demos[MAX_DEMOS][MAX_DEMONAME]; // when not playing
|
||||
|
||||
// demo recording info must be here, because record is started before
|
||||
// entering a map (and clearing client_state_t)
|
||||
qboolean demorecording;
|
||||
qboolean demoplayback;
|
||||
qboolean timedemo;
|
||||
int forcetrack; // -1 = use normal cd track
|
||||
FILE *demofile;
|
||||
int td_lastframe; // to meter out one message a frame
|
||||
int td_startframe; // host_framecount at start
|
||||
float td_starttime; // realtime at second frame of timedemo
|
||||
|
||||
|
||||
// connection information
|
||||
int signon; // 0 to SIGNONS
|
||||
struct qsocket_s *netcon;
|
||||
sizebuf_t message; // writing buffer to send to server
|
||||
|
||||
} client_static_t;
|
||||
|
||||
extern client_static_t cls;
|
||||
|
||||
//
|
||||
// the client_state_t structure is wiped completely at every
|
||||
// server signon
|
||||
//
|
||||
typedef struct
|
||||
{
|
||||
int movemessages; // since connecting to this server
|
||||
// throw out the first couple, so the player
|
||||
// doesn't accidentally do something the
|
||||
// first frame
|
||||
usercmd_t cmd; // last command sent to the server
|
||||
|
||||
// information for local display
|
||||
int stats[MAX_CL_STATS]; // health, etc
|
||||
int items; // inventory bit flags
|
||||
float item_gettime[32]; // cl.time of aquiring item, for blinking
|
||||
float faceanimtime; // use anim frame if cl.time < this
|
||||
|
||||
cshift_t cshifts[NUM_CSHIFTS]; // color shifts for damage, powerups
|
||||
cshift_t prev_cshifts[NUM_CSHIFTS]; // and content types
|
||||
|
||||
// the client maintains its own idea of view angles, which are
|
||||
// sent to the server each frame. The server sets punchangle when
|
||||
// the view is temporarliy offset, and an angle reset commands at the start
|
||||
// of each level and after teleporting.
|
||||
vec3_t mviewangles[2]; // during demo playback viewangles is lerped
|
||||
// between these
|
||||
vec3_t viewangles;
|
||||
|
||||
vec3_t mvelocity[2]; // update by server, used for lean+bob
|
||||
// (0 is newest)
|
||||
vec3_t velocity; // lerped between mvelocity[0] and [1]
|
||||
|
||||
vec3_t punchangle; // temporary offset
|
||||
|
||||
// pitch drifting vars
|
||||
float idealpitch;
|
||||
float pitchvel;
|
||||
qboolean nodrift;
|
||||
float driftmove;
|
||||
double laststop;
|
||||
|
||||
float viewheight;
|
||||
float crouch; // local amount for smoothing stepups
|
||||
|
||||
qboolean paused; // send over by server
|
||||
qboolean onground;
|
||||
qboolean inwater;
|
||||
|
||||
int intermission; // don't change view angle, full screen, etc
|
||||
int completed_time; // latched at intermission start
|
||||
|
||||
double mtime[2]; // the timestamp of last two messages
|
||||
double time; // clients view of time, should be between
|
||||
// servertime and oldservertime to generate
|
||||
// a lerp point for other data
|
||||
double oldtime; // previous cl.time, time-oldtime is used
|
||||
// to decay light values and smooth step ups
|
||||
|
||||
|
||||
float last_received_message; // (realtime) for net trouble icon
|
||||
|
||||
//
|
||||
// information that is static for the entire time connected to a server
|
||||
//
|
||||
struct model_s *model_precache[MAX_MODELS];
|
||||
struct sfx_s *sound_precache[MAX_SOUNDS];
|
||||
|
||||
char levelname[40]; // for display on solo scoreboard
|
||||
int viewentity; // cl_entitites[cl.viewentity] = player
|
||||
int maxclients;
|
||||
int gametype;
|
||||
|
||||
// refresh related state
|
||||
struct model_s *worldmodel; // cl_entitites[0].model
|
||||
struct efrag_s *free_efrags;
|
||||
int num_entities; // held in cl_entities array
|
||||
int num_statics; // held in cl_staticentities array
|
||||
entity_t viewent; // the gun model
|
||||
|
||||
int cdtrack, looptrack; // cd audio
|
||||
|
||||
// frag scoreboard
|
||||
scoreboard_t *scores; // [cl.maxclients]
|
||||
|
||||
#ifdef QUAKE2
|
||||
// light level at player's position including dlights
|
||||
// this is sent back to the server each frame
|
||||
// architectually ugly but it works
|
||||
int light_level;
|
||||
#endif
|
||||
} client_state_t;
|
||||
|
||||
|
||||
//
|
||||
// cvars
|
||||
//
|
||||
extern cvar_t cl_name;
|
||||
extern cvar_t cl_color;
|
||||
|
||||
extern cvar_t cl_upspeed;
|
||||
extern cvar_t cl_forwardspeed;
|
||||
extern cvar_t cl_backspeed;
|
||||
extern cvar_t cl_sidespeed;
|
||||
|
||||
extern cvar_t cl_movespeedkey;
|
||||
|
||||
extern cvar_t cl_yawspeed;
|
||||
extern cvar_t cl_pitchspeed;
|
||||
|
||||
extern cvar_t cl_anglespeedkey;
|
||||
|
||||
extern cvar_t cl_autofire;
|
||||
|
||||
extern cvar_t cl_shownet;
|
||||
extern cvar_t cl_nolerp;
|
||||
|
||||
extern cvar_t cl_pitchdriftspeed;
|
||||
extern cvar_t lookspring;
|
||||
extern cvar_t lookstrafe;
|
||||
extern cvar_t sensitivity;
|
||||
|
||||
extern cvar_t m_pitch;
|
||||
extern cvar_t m_yaw;
|
||||
extern cvar_t m_forward;
|
||||
extern cvar_t m_side;
|
||||
|
||||
|
||||
#define MAX_TEMP_ENTITIES 64 // lightning bolts, etc
|
||||
#define MAX_STATIC_ENTITIES 128 // torches, etc
|
||||
|
||||
extern client_state_t cl;
|
||||
|
||||
// FIXME, allocate dynamically
|
||||
extern efrag_t cl_efrags[MAX_EFRAGS];
|
||||
extern entity_t cl_entities[MAX_EDICTS];
|
||||
extern entity_t cl_static_entities[MAX_STATIC_ENTITIES];
|
||||
extern lightstyle_t cl_lightstyle[MAX_LIGHTSTYLES];
|
||||
extern dlight_t cl_dlights[MAX_DLIGHTS];
|
||||
extern entity_t cl_temp_entities[MAX_TEMP_ENTITIES];
|
||||
extern beam_t cl_beams[MAX_BEAMS];
|
||||
|
||||
//=============================================================================
|
||||
|
||||
//
|
||||
// cl_main
|
||||
//
|
||||
dlight_t *CL_AllocDlight (int key);
|
||||
void CL_DecayLights (void);
|
||||
|
||||
void CL_Init (void);
|
||||
|
||||
void CL_EstablishConnection (char *host);
|
||||
void CL_Signon1 (void);
|
||||
void CL_Signon2 (void);
|
||||
void CL_Signon3 (void);
|
||||
void CL_Signon4 (void);
|
||||
|
||||
void CL_Disconnect (void);
|
||||
void CL_Disconnect_f (void);
|
||||
void CL_NextDemo (void);
|
||||
|
||||
#define MAX_VISEDICTS 256
|
||||
extern int cl_numvisedicts;
|
||||
extern entity_t *cl_visedicts[MAX_VISEDICTS];
|
||||
|
||||
//
|
||||
// cl_input
|
||||
//
|
||||
typedef struct
|
||||
{
|
||||
int down[2]; // key nums holding it down
|
||||
int state; // low bit is down state
|
||||
} kbutton_t;
|
||||
|
||||
extern kbutton_t in_mlook, in_klook;
|
||||
extern kbutton_t in_strafe;
|
||||
extern kbutton_t in_speed;
|
||||
|
||||
void CL_InitInput (void);
|
||||
void CL_SendCmd (void);
|
||||
void CL_SendMove (usercmd_t *cmd);
|
||||
|
||||
void CL_ParseTEnt (void);
|
||||
void CL_UpdateTEnts (void);
|
||||
|
||||
void CL_ClearState (void);
|
||||
|
||||
|
||||
int CL_ReadFromServer (void);
|
||||
void CL_WriteToServer (usercmd_t *cmd);
|
||||
void CL_BaseMove (usercmd_t *cmd);
|
||||
|
||||
|
||||
float CL_KeyState (kbutton_t *key);
|
||||
char *Key_KeynumToString (int keynum);
|
||||
|
||||
//
|
||||
// cl_demo.c
|
||||
//
|
||||
void CL_StopPlayback (void);
|
||||
int CL_GetMessage (void);
|
||||
|
||||
void CL_Stop_f (void);
|
||||
void CL_Record_f (void);
|
||||
void CL_PlayDemo_f (void);
|
||||
void CL_TimeDemo_f (void);
|
||||
|
||||
//
|
||||
// cl_parse.c
|
||||
//
|
||||
void CL_ParseServerMessage (void);
|
||||
void CL_NewTranslation (int slot);
|
||||
|
||||
//
|
||||
// view
|
||||
//
|
||||
void V_StartPitchDrift (void);
|
||||
void V_StopPitchDrift (void);
|
||||
|
||||
void V_RenderView (void);
|
||||
void V_UpdatePalette (void);
|
||||
void V_Register (void);
|
||||
void V_ParseDamage (void);
|
||||
void V_SetContentsColor (int contents);
|
||||
|
||||
|
||||
//
|
||||
// cl_tent
|
||||
//
|
||||
void CL_InitTEnts (void);
|
||||
void CL_SignonReply (void);
|
||||
705
WinQuake/cmd.c
Normal file
705
WinQuake/cmd.c
Normal file
@@ -0,0 +1,705 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// cmd.c -- Quake script command processing module
|
||||
|
||||
#include "quakedef.h"
|
||||
|
||||
void Cmd_ForwardToServer (void);
|
||||
|
||||
#define MAX_ALIAS_NAME 32
|
||||
|
||||
typedef struct cmdalias_s
|
||||
{
|
||||
struct cmdalias_s *next;
|
||||
char name[MAX_ALIAS_NAME];
|
||||
char *value;
|
||||
} cmdalias_t;
|
||||
|
||||
cmdalias_t *cmd_alias;
|
||||
|
||||
int trashtest;
|
||||
int *trashspot;
|
||||
|
||||
qboolean cmd_wait;
|
||||
|
||||
//=============================================================================
|
||||
|
||||
/*
|
||||
============
|
||||
Cmd_Wait_f
|
||||
|
||||
Causes execution of the remainder of the command buffer to be delayed until
|
||||
next frame. This allows commands like:
|
||||
bind g "impulse 5 ; +attack ; wait ; -attack ; impulse 2"
|
||||
============
|
||||
*/
|
||||
void Cmd_Wait_f (void)
|
||||
{
|
||||
cmd_wait = true;
|
||||
}
|
||||
|
||||
/*
|
||||
=============================================================================
|
||||
|
||||
COMMAND BUFFER
|
||||
|
||||
=============================================================================
|
||||
*/
|
||||
|
||||
sizebuf_t cmd_text;
|
||||
|
||||
/*
|
||||
============
|
||||
Cbuf_Init
|
||||
============
|
||||
*/
|
||||
void Cbuf_Init (void)
|
||||
{
|
||||
SZ_Alloc (&cmd_text, 8192); // space for commands and script files
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
============
|
||||
Cbuf_AddText
|
||||
|
||||
Adds command text at the end of the buffer
|
||||
============
|
||||
*/
|
||||
void Cbuf_AddText (char *text)
|
||||
{
|
||||
int l;
|
||||
|
||||
l = Q_strlen (text);
|
||||
|
||||
if (cmd_text.cursize + l >= cmd_text.maxsize)
|
||||
{
|
||||
Con_Printf ("Cbuf_AddText: overflow\n");
|
||||
return;
|
||||
}
|
||||
|
||||
SZ_Write (&cmd_text, text, Q_strlen (text));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
============
|
||||
Cbuf_InsertText
|
||||
|
||||
Adds command text immediately after the current command
|
||||
Adds a \n to the text
|
||||
FIXME: actually change the command buffer to do less copying
|
||||
============
|
||||
*/
|
||||
void Cbuf_InsertText (char *text)
|
||||
{
|
||||
char *temp;
|
||||
int templen;
|
||||
|
||||
// copy off any commands still remaining in the exec buffer
|
||||
templen = cmd_text.cursize;
|
||||
if (templen)
|
||||
{
|
||||
temp = Z_Malloc (templen);
|
||||
Q_memcpy (temp, cmd_text.data, templen);
|
||||
SZ_Clear (&cmd_text);
|
||||
}
|
||||
else
|
||||
temp = NULL; // shut up compiler
|
||||
|
||||
// add the entire text of the file
|
||||
Cbuf_AddText (text);
|
||||
|
||||
// add the copied off data
|
||||
if (templen)
|
||||
{
|
||||
SZ_Write (&cmd_text, temp, templen);
|
||||
Z_Free (temp);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
Cbuf_Execute
|
||||
============
|
||||
*/
|
||||
void Cbuf_Execute (void)
|
||||
{
|
||||
int i;
|
||||
char *text;
|
||||
char line[1024];
|
||||
int quotes;
|
||||
|
||||
while (cmd_text.cursize)
|
||||
{
|
||||
// find a \n or ; line break
|
||||
text = (char *)cmd_text.data;
|
||||
|
||||
quotes = 0;
|
||||
for (i=0 ; i< cmd_text.cursize ; i++)
|
||||
{
|
||||
if (text[i] == '"')
|
||||
quotes++;
|
||||
if ( !(quotes&1) && text[i] == ';')
|
||||
break; // don't break if inside a quoted string
|
||||
if (text[i] == '\n')
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
memcpy (line, text, i);
|
||||
line[i] = 0;
|
||||
|
||||
// delete the text from the command buffer and move remaining commands down
|
||||
// this is necessary because commands (exec, alias) can insert data at the
|
||||
// beginning of the text buffer
|
||||
|
||||
if (i == cmd_text.cursize)
|
||||
cmd_text.cursize = 0;
|
||||
else
|
||||
{
|
||||
i++;
|
||||
cmd_text.cursize -= i;
|
||||
Q_memcpy (text, text+i, cmd_text.cursize);
|
||||
}
|
||||
|
||||
// execute the command line
|
||||
Cmd_ExecuteString (line, src_command);
|
||||
|
||||
if (cmd_wait)
|
||||
{ // skip out while text still remains in buffer, leaving it
|
||||
// for next frame
|
||||
cmd_wait = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
SCRIPT COMMANDS
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
/*
|
||||
===============
|
||||
Cmd_StuffCmds_f
|
||||
|
||||
Adds command line parameters as script statements
|
||||
Commands lead with a +, and continue until a - or another +
|
||||
quake +prog jctest.qp +cmd amlev1
|
||||
quake -nosound +cmd amlev1
|
||||
===============
|
||||
*/
|
||||
void Cmd_StuffCmds_f (void)
|
||||
{
|
||||
int i, j;
|
||||
int s;
|
||||
char *text, *build, c;
|
||||
|
||||
if (Cmd_Argc () != 1)
|
||||
{
|
||||
Con_Printf ("stuffcmds : execute command line parameters\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// build the combined string to parse from
|
||||
s = 0;
|
||||
for (i=1 ; i<com_argc ; i++)
|
||||
{
|
||||
if (!com_argv[i])
|
||||
continue; // NEXTSTEP nulls out -NXHost
|
||||
s += Q_strlen (com_argv[i]) + 1;
|
||||
}
|
||||
if (!s)
|
||||
return;
|
||||
|
||||
text = Z_Malloc (s+1);
|
||||
text[0] = 0;
|
||||
for (i=1 ; i<com_argc ; i++)
|
||||
{
|
||||
if (!com_argv[i])
|
||||
continue; // NEXTSTEP nulls out -NXHost
|
||||
Q_strcat (text,com_argv[i]);
|
||||
if (i != com_argc-1)
|
||||
Q_strcat (text, " ");
|
||||
}
|
||||
|
||||
// pull out the commands
|
||||
build = Z_Malloc (s+1);
|
||||
build[0] = 0;
|
||||
|
||||
for (i=0 ; i<s-1 ; i++)
|
||||
{
|
||||
if (text[i] == '+')
|
||||
{
|
||||
i++;
|
||||
|
||||
for (j=i ; (text[j] != '+') && (text[j] != '-') && (text[j] != 0) ; j++)
|
||||
;
|
||||
|
||||
c = text[j];
|
||||
text[j] = 0;
|
||||
|
||||
Q_strcat (build, text+i);
|
||||
Q_strcat (build, "\n");
|
||||
text[j] = c;
|
||||
i = j-1;
|
||||
}
|
||||
}
|
||||
|
||||
if (build[0])
|
||||
Cbuf_InsertText (build);
|
||||
|
||||
Z_Free (text);
|
||||
Z_Free (build);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
===============
|
||||
Cmd_Exec_f
|
||||
===============
|
||||
*/
|
||||
void Cmd_Exec_f (void)
|
||||
{
|
||||
char *f;
|
||||
int mark;
|
||||
|
||||
if (Cmd_Argc () != 2)
|
||||
{
|
||||
Con_Printf ("exec <filename> : execute a script file\n");
|
||||
return;
|
||||
}
|
||||
|
||||
mark = Hunk_LowMark ();
|
||||
f = (char *)COM_LoadHunkFile (Cmd_Argv(1));
|
||||
if (!f)
|
||||
{
|
||||
Con_Printf ("couldn't exec %s\n",Cmd_Argv(1));
|
||||
return;
|
||||
}
|
||||
Con_Printf ("execing %s\n",Cmd_Argv(1));
|
||||
|
||||
Cbuf_InsertText (f);
|
||||
Hunk_FreeToLowMark (mark);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
===============
|
||||
Cmd_Echo_f
|
||||
|
||||
Just prints the rest of the line to the console
|
||||
===============
|
||||
*/
|
||||
void Cmd_Echo_f (void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=1 ; i<Cmd_Argc() ; i++)
|
||||
Con_Printf ("%s ",Cmd_Argv(i));
|
||||
Con_Printf ("\n");
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
Cmd_Alias_f
|
||||
|
||||
Creates a new command that executes a command string (possibly ; seperated)
|
||||
===============
|
||||
*/
|
||||
|
||||
char *CopyString (char *in)
|
||||
{
|
||||
char *out;
|
||||
|
||||
out = Z_Malloc (strlen(in)+1);
|
||||
strcpy (out, in);
|
||||
return out;
|
||||
}
|
||||
|
||||
void Cmd_Alias_f (void)
|
||||
{
|
||||
cmdalias_t *a;
|
||||
char cmd[1024];
|
||||
int i, c;
|
||||
char *s;
|
||||
|
||||
if (Cmd_Argc() == 1)
|
||||
{
|
||||
Con_Printf ("Current alias commands:\n");
|
||||
for (a = cmd_alias ; a ; a=a->next)
|
||||
Con_Printf ("%s : %s\n", a->name, a->value);
|
||||
return;
|
||||
}
|
||||
|
||||
s = Cmd_Argv(1);
|
||||
if (strlen(s) >= MAX_ALIAS_NAME)
|
||||
{
|
||||
Con_Printf ("Alias name is too long\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// if the alias allready exists, reuse it
|
||||
for (a = cmd_alias ; a ; a=a->next)
|
||||
{
|
||||
if (!strcmp(s, a->name))
|
||||
{
|
||||
Z_Free (a->value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!a)
|
||||
{
|
||||
a = Z_Malloc (sizeof(cmdalias_t));
|
||||
a->next = cmd_alias;
|
||||
cmd_alias = a;
|
||||
}
|
||||
strcpy (a->name, s);
|
||||
|
||||
// copy the rest of the command line
|
||||
cmd[0] = 0; // start out with a null string
|
||||
c = Cmd_Argc();
|
||||
for (i=2 ; i< c ; i++)
|
||||
{
|
||||
strcat (cmd, Cmd_Argv(i));
|
||||
if (i != c)
|
||||
strcat (cmd, " ");
|
||||
}
|
||||
strcat (cmd, "\n");
|
||||
|
||||
a->value = CopyString (cmd);
|
||||
}
|
||||
|
||||
/*
|
||||
=============================================================================
|
||||
|
||||
COMMAND EXECUTION
|
||||
|
||||
=============================================================================
|
||||
*/
|
||||
|
||||
typedef struct cmd_function_s
|
||||
{
|
||||
struct cmd_function_s *next;
|
||||
char *name;
|
||||
xcommand_t function;
|
||||
} cmd_function_t;
|
||||
|
||||
|
||||
#define MAX_ARGS 80
|
||||
|
||||
static int cmd_argc;
|
||||
static char *cmd_argv[MAX_ARGS];
|
||||
static char *cmd_null_string = "";
|
||||
static char *cmd_args = NULL;
|
||||
|
||||
cmd_source_t cmd_source;
|
||||
|
||||
|
||||
static cmd_function_t *cmd_functions; // possible commands to execute
|
||||
|
||||
/*
|
||||
============
|
||||
Cmd_Init
|
||||
============
|
||||
*/
|
||||
void Cmd_Init (void)
|
||||
{
|
||||
//
|
||||
// register our commands
|
||||
//
|
||||
Cmd_AddCommand ("stuffcmds",Cmd_StuffCmds_f);
|
||||
Cmd_AddCommand ("exec",Cmd_Exec_f);
|
||||
Cmd_AddCommand ("echo",Cmd_Echo_f);
|
||||
Cmd_AddCommand ("alias",Cmd_Alias_f);
|
||||
Cmd_AddCommand ("cmd", Cmd_ForwardToServer);
|
||||
Cmd_AddCommand ("wait", Cmd_Wait_f);
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
Cmd_Argc
|
||||
============
|
||||
*/
|
||||
int Cmd_Argc (void)
|
||||
{
|
||||
return cmd_argc;
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
Cmd_Argv
|
||||
============
|
||||
*/
|
||||
char *Cmd_Argv (int arg)
|
||||
{
|
||||
if ( (unsigned)arg >= cmd_argc )
|
||||
return cmd_null_string;
|
||||
return cmd_argv[arg];
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
Cmd_Args
|
||||
============
|
||||
*/
|
||||
char *Cmd_Args (void)
|
||||
{
|
||||
return cmd_args;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
============
|
||||
Cmd_TokenizeString
|
||||
|
||||
Parses the given string into command line tokens.
|
||||
============
|
||||
*/
|
||||
void Cmd_TokenizeString (char *text)
|
||||
{
|
||||
int i;
|
||||
|
||||
// clear the args from the last string
|
||||
for (i=0 ; i<cmd_argc ; i++)
|
||||
Z_Free (cmd_argv[i]);
|
||||
|
||||
cmd_argc = 0;
|
||||
cmd_args = NULL;
|
||||
|
||||
while (1)
|
||||
{
|
||||
// skip whitespace up to a /n
|
||||
while (*text && *text <= ' ' && *text != '\n')
|
||||
{
|
||||
text++;
|
||||
}
|
||||
|
||||
if (*text == '\n')
|
||||
{ // a newline seperates commands in the buffer
|
||||
text++;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!*text)
|
||||
return;
|
||||
|
||||
if (cmd_argc == 1)
|
||||
cmd_args = text;
|
||||
|
||||
text = COM_Parse (text);
|
||||
if (!text)
|
||||
return;
|
||||
|
||||
if (cmd_argc < MAX_ARGS)
|
||||
{
|
||||
cmd_argv[cmd_argc] = Z_Malloc (Q_strlen(com_token)+1);
|
||||
Q_strcpy (cmd_argv[cmd_argc], com_token);
|
||||
cmd_argc++;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
============
|
||||
Cmd_AddCommand
|
||||
============
|
||||
*/
|
||||
void Cmd_AddCommand (char *cmd_name, xcommand_t function)
|
||||
{
|
||||
cmd_function_t *cmd;
|
||||
|
||||
if (host_initialized) // because hunk allocation would get stomped
|
||||
Sys_Error ("Cmd_AddCommand after host_initialized");
|
||||
|
||||
// fail if the command is a variable name
|
||||
if (Cvar_VariableString(cmd_name)[0])
|
||||
{
|
||||
Con_Printf ("Cmd_AddCommand: %s already defined as a var\n", cmd_name);
|
||||
return;
|
||||
}
|
||||
|
||||
// fail if the command already exists
|
||||
for (cmd=cmd_functions ; cmd ; cmd=cmd->next)
|
||||
{
|
||||
if (!Q_strcmp (cmd_name, cmd->name))
|
||||
{
|
||||
Con_Printf ("Cmd_AddCommand: %s already defined\n", cmd_name);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
cmd = Hunk_Alloc (sizeof(cmd_function_t));
|
||||
cmd->name = cmd_name;
|
||||
cmd->function = function;
|
||||
cmd->next = cmd_functions;
|
||||
cmd_functions = cmd;
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
Cmd_Exists
|
||||
============
|
||||
*/
|
||||
qboolean Cmd_Exists (char *cmd_name)
|
||||
{
|
||||
cmd_function_t *cmd;
|
||||
|
||||
for (cmd=cmd_functions ; cmd ; cmd=cmd->next)
|
||||
{
|
||||
if (!Q_strcmp (cmd_name,cmd->name))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
============
|
||||
Cmd_CompleteCommand
|
||||
============
|
||||
*/
|
||||
char *Cmd_CompleteCommand (char *partial)
|
||||
{
|
||||
cmd_function_t *cmd;
|
||||
int len;
|
||||
|
||||
len = Q_strlen(partial);
|
||||
|
||||
if (!len)
|
||||
return NULL;
|
||||
|
||||
// check functions
|
||||
for (cmd=cmd_functions ; cmd ; cmd=cmd->next)
|
||||
if (!Q_strncmp (partial,cmd->name, len))
|
||||
return cmd->name;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
Cmd_ExecuteString
|
||||
|
||||
A complete command line has been parsed, so try to execute it
|
||||
FIXME: lookupnoadd the token to speed search?
|
||||
============
|
||||
*/
|
||||
void Cmd_ExecuteString (char *text, cmd_source_t src)
|
||||
{
|
||||
cmd_function_t *cmd;
|
||||
cmdalias_t *a;
|
||||
|
||||
cmd_source = src;
|
||||
Cmd_TokenizeString (text);
|
||||
|
||||
// execute the command line
|
||||
if (!Cmd_Argc())
|
||||
return; // no tokens
|
||||
|
||||
// check functions
|
||||
for (cmd=cmd_functions ; cmd ; cmd=cmd->next)
|
||||
{
|
||||
if (!Q_strcasecmp (cmd_argv[0],cmd->name))
|
||||
{
|
||||
cmd->function ();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// check alias
|
||||
for (a=cmd_alias ; a ; a=a->next)
|
||||
{
|
||||
if (!Q_strcasecmp (cmd_argv[0], a->name))
|
||||
{
|
||||
Cbuf_InsertText (a->value);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// check cvars
|
||||
if (!Cvar_Command ())
|
||||
Con_Printf ("Unknown command \"%s\"\n", Cmd_Argv(0));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
===================
|
||||
Cmd_ForwardToServer
|
||||
|
||||
Sends the entire command line over to the server
|
||||
===================
|
||||
*/
|
||||
void Cmd_ForwardToServer (void)
|
||||
{
|
||||
if (cls.state != ca_connected)
|
||||
{
|
||||
Con_Printf ("Can't \"%s\", not connected\n", Cmd_Argv(0));
|
||||
return;
|
||||
}
|
||||
|
||||
if (cls.demoplayback)
|
||||
return; // not really connected
|
||||
|
||||
MSG_WriteByte (&cls.message, clc_stringcmd);
|
||||
if (Q_strcasecmp(Cmd_Argv(0), "cmd") != 0)
|
||||
{
|
||||
SZ_Print (&cls.message, Cmd_Argv(0));
|
||||
SZ_Print (&cls.message, " ");
|
||||
}
|
||||
if (Cmd_Argc() > 1)
|
||||
SZ_Print (&cls.message, Cmd_Args());
|
||||
else
|
||||
SZ_Print (&cls.message, "\n");
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
Cmd_CheckParm
|
||||
|
||||
Returns the position (1 to argc-1) in the command's argument list
|
||||
where the given parameter apears, or 0 if not present
|
||||
================
|
||||
*/
|
||||
|
||||
int Cmd_CheckParm (char *parm)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!parm)
|
||||
Sys_Error ("Cmd_CheckParm: NULL");
|
||||
|
||||
for (i = 1; i < Cmd_Argc (); i++)
|
||||
if (! Q_strcasecmp (parm, Cmd_Argv (i)))
|
||||
return i;
|
||||
|
||||
return 0;
|
||||
}
|
||||
121
WinQuake/cmd.h
Normal file
121
WinQuake/cmd.h
Normal file
@@ -0,0 +1,121 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
|
||||
// cmd.h -- Command buffer and command execution
|
||||
|
||||
//===========================================================================
|
||||
|
||||
/*
|
||||
|
||||
Any number of commands can be added in a frame, from several different sources.
|
||||
Most commands come from either keybindings or console line input, but remote
|
||||
servers can also send across commands and entire text files can be execed.
|
||||
|
||||
The + command line options are also added to the command buffer.
|
||||
|
||||
The game starts with a Cbuf_AddText ("exec quake.rc\n"); Cbuf_Execute ();
|
||||
|
||||
*/
|
||||
|
||||
|
||||
void Cbuf_Init (void);
|
||||
// allocates an initial text buffer that will grow as needed
|
||||
|
||||
void Cbuf_AddText (char *text);
|
||||
// as new commands are generated from the console or keybindings,
|
||||
// the text is added to the end of the command buffer.
|
||||
|
||||
void Cbuf_InsertText (char *text);
|
||||
// when a command wants to issue other commands immediately, the text is
|
||||
// inserted at the beginning of the buffer, before any remaining unexecuted
|
||||
// commands.
|
||||
|
||||
void Cbuf_Execute (void);
|
||||
// Pulls off \n terminated lines of text from the command buffer and sends
|
||||
// them through Cmd_ExecuteString. Stops when the buffer is empty.
|
||||
// Normally called once per frame, but may be explicitly invoked.
|
||||
// Do not call inside a command function!
|
||||
|
||||
//===========================================================================
|
||||
|
||||
/*
|
||||
|
||||
Command execution takes a null terminated string, breaks it into tokens,
|
||||
then searches for a command or variable that matches the first token.
|
||||
|
||||
Commands can come from three sources, but the handler functions may choose
|
||||
to dissallow the action or forward it to a remote server if the source is
|
||||
not apropriate.
|
||||
|
||||
*/
|
||||
|
||||
typedef void (*xcommand_t) (void);
|
||||
|
||||
typedef enum
|
||||
{
|
||||
src_client, // came in over a net connection as a clc_stringcmd
|
||||
// host_client will be valid during this state.
|
||||
src_command // from the command buffer
|
||||
} cmd_source_t;
|
||||
|
||||
extern cmd_source_t cmd_source;
|
||||
|
||||
void Cmd_Init (void);
|
||||
|
||||
void Cmd_AddCommand (char *cmd_name, xcommand_t function);
|
||||
// called by the init functions of other parts of the program to
|
||||
// register commands and functions to call for them.
|
||||
// The cmd_name is referenced later, so it should not be in temp memory
|
||||
|
||||
qboolean Cmd_Exists (char *cmd_name);
|
||||
// used by the cvar code to check for cvar / command name overlap
|
||||
|
||||
char *Cmd_CompleteCommand (char *partial);
|
||||
// attempts to match a partial command for automatic command line completion
|
||||
// returns NULL if nothing fits
|
||||
|
||||
int Cmd_Argc (void);
|
||||
char *Cmd_Argv (int arg);
|
||||
char *Cmd_Args (void);
|
||||
// The functions that execute commands get their parameters with these
|
||||
// functions. Cmd_Argv () will return an empty string, not a NULL
|
||||
// if arg > argc, so string operations are allways safe.
|
||||
|
||||
int Cmd_CheckParm (char *parm);
|
||||
// Returns the position (1 to argc-1) in the command's argument list
|
||||
// where the given parameter apears, or 0 if not present
|
||||
|
||||
void Cmd_TokenizeString (char *text);
|
||||
// Takes a null terminated string. Does not need to be /n terminated.
|
||||
// breaks the string up into arg tokens.
|
||||
|
||||
void Cmd_ExecuteString (char *text, cmd_source_t src);
|
||||
// Parses a single line of text into arguments and tries to execute it.
|
||||
// The text can come from the command buffer, a remote client, or stdin.
|
||||
|
||||
void Cmd_ForwardToServer (void);
|
||||
// adds the current command line as a clc_stringcmd to the client message.
|
||||
// things like godmode, noclip, etc, are commands directed to the server,
|
||||
// so when they are typed in at the console, they will need to be forwarded.
|
||||
|
||||
void Cmd_Print (char *text);
|
||||
// used by command functions to send output to either the graphics console or
|
||||
// passed as a print message to the client
|
||||
|
||||
1827
WinQuake/common.c
Normal file
1827
WinQuake/common.c
Normal file
File diff suppressed because it is too large
Load Diff
183
WinQuake/common.h
Normal file
183
WinQuake/common.h
Normal file
@@ -0,0 +1,183 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// comndef.h -- general definitions
|
||||
|
||||
#if !defined BYTE_DEFINED
|
||||
typedef unsigned char byte;
|
||||
#define BYTE_DEFINED 1
|
||||
#endif
|
||||
|
||||
#undef true
|
||||
#undef false
|
||||
|
||||
typedef enum {false, true} qboolean;
|
||||
|
||||
//============================================================================
|
||||
|
||||
typedef struct sizebuf_s
|
||||
{
|
||||
qboolean allowoverflow; // if false, do a Sys_Error
|
||||
qboolean overflowed; // set to true if the buffer size failed
|
||||
byte *data;
|
||||
int maxsize;
|
||||
int cursize;
|
||||
} sizebuf_t;
|
||||
|
||||
void SZ_Alloc (sizebuf_t *buf, int startsize);
|
||||
void SZ_Free (sizebuf_t *buf);
|
||||
void SZ_Clear (sizebuf_t *buf);
|
||||
void *SZ_GetSpace (sizebuf_t *buf, int length);
|
||||
void SZ_Write (sizebuf_t *buf, void *data, int length);
|
||||
void SZ_Print (sizebuf_t *buf, char *data); // strcats onto the sizebuf
|
||||
|
||||
//============================================================================
|
||||
|
||||
typedef struct link_s
|
||||
{
|
||||
struct link_s *prev, *next;
|
||||
} link_t;
|
||||
|
||||
|
||||
void ClearLink (link_t *l);
|
||||
void RemoveLink (link_t *l);
|
||||
void InsertLinkBefore (link_t *l, link_t *before);
|
||||
void InsertLinkAfter (link_t *l, link_t *after);
|
||||
|
||||
// (type *)STRUCT_FROM_LINK(link_t *link, type, member)
|
||||
// ent = STRUCT_FROM_LINK(link,entity_t,order)
|
||||
// FIXME: remove this mess!
|
||||
#define STRUCT_FROM_LINK(l,t,m) ((t *)((byte *)l - (int)&(((t *)0)->m)))
|
||||
|
||||
//============================================================================
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL ((void *)0)
|
||||
#endif
|
||||
|
||||
#define Q_MAXCHAR ((char)0x7f)
|
||||
#define Q_MAXSHORT ((short)0x7fff)
|
||||
#define Q_MAXINT ((int)0x7fffffff)
|
||||
#define Q_MAXLONG ((int)0x7fffffff)
|
||||
#define Q_MAXFLOAT ((int)0x7fffffff)
|
||||
|
||||
#define Q_MINCHAR ((char)0x80)
|
||||
#define Q_MINSHORT ((short)0x8000)
|
||||
#define Q_MININT ((int)0x80000000)
|
||||
#define Q_MINLONG ((int)0x80000000)
|
||||
#define Q_MINFLOAT ((int)0x7fffffff)
|
||||
|
||||
//============================================================================
|
||||
|
||||
extern qboolean bigendien;
|
||||
|
||||
extern short (*BigShort) (short l);
|
||||
extern short (*LittleShort) (short l);
|
||||
extern int (*BigLong) (int l);
|
||||
extern int (*LittleLong) (int l);
|
||||
extern float (*BigFloat) (float l);
|
||||
extern float (*LittleFloat) (float l);
|
||||
|
||||
//============================================================================
|
||||
|
||||
void MSG_WriteChar (sizebuf_t *sb, int c);
|
||||
void MSG_WriteByte (sizebuf_t *sb, int c);
|
||||
void MSG_WriteShort (sizebuf_t *sb, int c);
|
||||
void MSG_WriteLong (sizebuf_t *sb, int c);
|
||||
void MSG_WriteFloat (sizebuf_t *sb, float f);
|
||||
void MSG_WriteString (sizebuf_t *sb, char *s);
|
||||
void MSG_WriteCoord (sizebuf_t *sb, float f);
|
||||
void MSG_WriteAngle (sizebuf_t *sb, float f);
|
||||
|
||||
extern int msg_readcount;
|
||||
extern qboolean msg_badread; // set if a read goes beyond end of message
|
||||
|
||||
void MSG_BeginReading (void);
|
||||
int MSG_ReadChar (void);
|
||||
int MSG_ReadByte (void);
|
||||
int MSG_ReadShort (void);
|
||||
int MSG_ReadLong (void);
|
||||
float MSG_ReadFloat (void);
|
||||
char *MSG_ReadString (void);
|
||||
|
||||
float MSG_ReadCoord (void);
|
||||
float MSG_ReadAngle (void);
|
||||
|
||||
//============================================================================
|
||||
|
||||
void Q_memset (void *dest, int fill, int count);
|
||||
void Q_memcpy (void *dest, void *src, int count);
|
||||
int Q_memcmp (void *m1, void *m2, int count);
|
||||
void Q_strcpy (char *dest, char *src);
|
||||
void Q_strncpy (char *dest, char *src, int count);
|
||||
int Q_strlen (char *str);
|
||||
char *Q_strrchr (char *s, char c);
|
||||
void Q_strcat (char *dest, char *src);
|
||||
int Q_strcmp (char *s1, char *s2);
|
||||
int Q_strncmp (char *s1, char *s2, int count);
|
||||
int Q_strcasecmp (char *s1, char *s2);
|
||||
int Q_strncasecmp (char *s1, char *s2, int n);
|
||||
int Q_atoi (char *str);
|
||||
float Q_atof (char *str);
|
||||
|
||||
//============================================================================
|
||||
|
||||
extern char com_token[1024];
|
||||
extern qboolean com_eof;
|
||||
|
||||
char *COM_Parse (char *data);
|
||||
|
||||
|
||||
extern int com_argc;
|
||||
extern char **com_argv;
|
||||
|
||||
int COM_CheckParm (char *parm);
|
||||
void COM_Init (char *path);
|
||||
void COM_InitArgv (int argc, char **argv);
|
||||
|
||||
char *COM_SkipPath (char *pathname);
|
||||
void COM_StripExtension (char *in, char *out);
|
||||
void COM_FileBase (char *in, char *out);
|
||||
void COM_DefaultExtension (char *path, char *extension);
|
||||
|
||||
char *va(char *format, ...);
|
||||
// does a varargs printf into a temp buffer
|
||||
|
||||
|
||||
//============================================================================
|
||||
|
||||
extern int com_filesize;
|
||||
struct cache_user_s;
|
||||
|
||||
extern char com_gamedir[MAX_OSPATH];
|
||||
|
||||
void COM_WriteFile (char *filename, void *data, int len);
|
||||
int COM_OpenFile (char *filename, int *hndl);
|
||||
int COM_FOpenFile (char *filename, FILE **file);
|
||||
void COM_CloseFile (int h);
|
||||
|
||||
byte *COM_LoadStackFile (char *path, void *buffer, int bufsize);
|
||||
byte *COM_LoadTempFile (char *path);
|
||||
byte *COM_LoadHunkFile (char *path);
|
||||
void COM_LoadCacheFile (char *path, struct cache_user_s *cu);
|
||||
|
||||
|
||||
extern struct cvar_s registered;
|
||||
|
||||
extern qboolean standard_quake, rogue, hipnotic;
|
||||
365
WinQuake/conproc.c
Normal file
365
WinQuake/conproc.c
Normal file
@@ -0,0 +1,365 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// conproc.c
|
||||
|
||||
#include <windows.h>
|
||||
#include "conproc.h"
|
||||
#include "quakedef.h"
|
||||
|
||||
HANDLE heventDone;
|
||||
HANDLE hfileBuffer;
|
||||
HANDLE heventChildSend;
|
||||
HANDLE heventParentSend;
|
||||
HANDLE hStdout;
|
||||
HANDLE hStdin;
|
||||
|
||||
DWORD RequestProc (DWORD dwNichts);
|
||||
LPVOID GetMappedBuffer (HANDLE hfileBuffer);
|
||||
void ReleaseMappedBuffer (LPVOID pBuffer);
|
||||
BOOL GetScreenBufferLines (int *piLines);
|
||||
BOOL SetScreenBufferLines (int iLines);
|
||||
BOOL ReadText (LPTSTR pszText, int iBeginLine, int iEndLine);
|
||||
BOOL WriteText (LPCTSTR szText);
|
||||
int CharToCode (char c);
|
||||
BOOL SetConsoleCXCY(HANDLE hStdout, int cx, int cy);
|
||||
|
||||
|
||||
void InitConProc (HANDLE hFile, HANDLE heventParent, HANDLE heventChild)
|
||||
{
|
||||
DWORD dwID;
|
||||
CONSOLE_SCREEN_BUFFER_INFO info;
|
||||
int wheight, wwidth;
|
||||
|
||||
// ignore if we don't have all the events.
|
||||
if (!hFile || !heventParent || !heventChild)
|
||||
return;
|
||||
|
||||
hfileBuffer = hFile;
|
||||
heventParentSend = heventParent;
|
||||
heventChildSend = heventChild;
|
||||
|
||||
// so we'll know when to go away.
|
||||
heventDone = CreateEvent (NULL, FALSE, FALSE, NULL);
|
||||
|
||||
if (!heventDone)
|
||||
{
|
||||
Con_SafePrintf ("Couldn't create heventDone\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!CreateThread (NULL,
|
||||
0,
|
||||
(LPTHREAD_START_ROUTINE) RequestProc,
|
||||
0,
|
||||
0,
|
||||
&dwID))
|
||||
{
|
||||
CloseHandle (heventDone);
|
||||
Con_SafePrintf ("Couldn't create QHOST thread\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// save off the input/output handles.
|
||||
hStdout = GetStdHandle (STD_OUTPUT_HANDLE);
|
||||
hStdin = GetStdHandle (STD_INPUT_HANDLE);
|
||||
|
||||
// force 80 character width, at least 25 character height
|
||||
SetConsoleCXCY (hStdout, 80, 25);
|
||||
}
|
||||
|
||||
|
||||
void DeinitConProc (void)
|
||||
{
|
||||
if (heventDone)
|
||||
SetEvent (heventDone);
|
||||
}
|
||||
|
||||
|
||||
DWORD RequestProc (DWORD dwNichts)
|
||||
{
|
||||
int *pBuffer;
|
||||
DWORD dwRet;
|
||||
HANDLE heventWait[2];
|
||||
int iBeginLine, iEndLine;
|
||||
|
||||
heventWait[0] = heventParentSend;
|
||||
heventWait[1] = heventDone;
|
||||
|
||||
while (1)
|
||||
{
|
||||
dwRet = WaitForMultipleObjects (2, heventWait, FALSE, INFINITE);
|
||||
|
||||
// heventDone fired, so we're exiting.
|
||||
if (dwRet == WAIT_OBJECT_0 + 1)
|
||||
break;
|
||||
|
||||
pBuffer = (int *) GetMappedBuffer (hfileBuffer);
|
||||
|
||||
// hfileBuffer is invalid. Just leave.
|
||||
if (!pBuffer)
|
||||
{
|
||||
Con_SafePrintf ("Invalid hfileBuffer\n");
|
||||
break;
|
||||
}
|
||||
|
||||
switch (pBuffer[0])
|
||||
{
|
||||
case CCOM_WRITE_TEXT:
|
||||
// Param1 : Text
|
||||
pBuffer[0] = WriteText ((LPCTSTR) (pBuffer + 1));
|
||||
break;
|
||||
|
||||
case CCOM_GET_TEXT:
|
||||
// Param1 : Begin line
|
||||
// Param2 : End line
|
||||
iBeginLine = pBuffer[1];
|
||||
iEndLine = pBuffer[2];
|
||||
pBuffer[0] = ReadText ((LPTSTR) (pBuffer + 1), iBeginLine,
|
||||
iEndLine);
|
||||
break;
|
||||
|
||||
case CCOM_GET_SCR_LINES:
|
||||
// No params
|
||||
pBuffer[0] = GetScreenBufferLines (&pBuffer[1]);
|
||||
break;
|
||||
|
||||
case CCOM_SET_SCR_LINES:
|
||||
// Param1 : Number of lines
|
||||
pBuffer[0] = SetScreenBufferLines (pBuffer[1]);
|
||||
break;
|
||||
}
|
||||
|
||||
ReleaseMappedBuffer (pBuffer);
|
||||
SetEvent (heventChildSend);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
LPVOID GetMappedBuffer (HANDLE hfileBuffer)
|
||||
{
|
||||
LPVOID pBuffer;
|
||||
|
||||
pBuffer = MapViewOfFile (hfileBuffer,
|
||||
FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
|
||||
|
||||
return pBuffer;
|
||||
}
|
||||
|
||||
|
||||
void ReleaseMappedBuffer (LPVOID pBuffer)
|
||||
{
|
||||
UnmapViewOfFile (pBuffer);
|
||||
}
|
||||
|
||||
|
||||
BOOL GetScreenBufferLines (int *piLines)
|
||||
{
|
||||
CONSOLE_SCREEN_BUFFER_INFO info;
|
||||
BOOL bRet;
|
||||
|
||||
bRet = GetConsoleScreenBufferInfo (hStdout, &info);
|
||||
|
||||
if (bRet)
|
||||
*piLines = info.dwSize.Y;
|
||||
|
||||
return bRet;
|
||||
}
|
||||
|
||||
|
||||
BOOL SetScreenBufferLines (int iLines)
|
||||
{
|
||||
|
||||
return SetConsoleCXCY (hStdout, 80, iLines);
|
||||
}
|
||||
|
||||
|
||||
BOOL ReadText (LPTSTR pszText, int iBeginLine, int iEndLine)
|
||||
{
|
||||
COORD coord;
|
||||
DWORD dwRead;
|
||||
BOOL bRet;
|
||||
|
||||
coord.X = 0;
|
||||
coord.Y = iBeginLine;
|
||||
|
||||
bRet = ReadConsoleOutputCharacter(
|
||||
hStdout,
|
||||
pszText,
|
||||
80 * (iEndLine - iBeginLine + 1),
|
||||
coord,
|
||||
&dwRead);
|
||||
|
||||
// Make sure it's null terminated.
|
||||
if (bRet)
|
||||
pszText[dwRead] = '\0';
|
||||
|
||||
return bRet;
|
||||
}
|
||||
|
||||
|
||||
BOOL WriteText (LPCTSTR szText)
|
||||
{
|
||||
DWORD dwWritten;
|
||||
INPUT_RECORD rec;
|
||||
char upper, *sz;
|
||||
|
||||
sz = (LPTSTR) szText;
|
||||
|
||||
while (*sz)
|
||||
{
|
||||
// 13 is the code for a carriage return (\n) instead of 10.
|
||||
if (*sz == 10)
|
||||
*sz = 13;
|
||||
|
||||
upper = toupper(*sz);
|
||||
|
||||
rec.EventType = KEY_EVENT;
|
||||
rec.Event.KeyEvent.bKeyDown = TRUE;
|
||||
rec.Event.KeyEvent.wRepeatCount = 1;
|
||||
rec.Event.KeyEvent.wVirtualKeyCode = upper;
|
||||
rec.Event.KeyEvent.wVirtualScanCode = CharToCode (*sz);
|
||||
rec.Event.KeyEvent.uChar.AsciiChar = *sz;
|
||||
rec.Event.KeyEvent.uChar.UnicodeChar = *sz;
|
||||
rec.Event.KeyEvent.dwControlKeyState = isupper(*sz) ? 0x80 : 0x0;
|
||||
|
||||
WriteConsoleInput(
|
||||
hStdin,
|
||||
&rec,
|
||||
1,
|
||||
&dwWritten);
|
||||
|
||||
rec.Event.KeyEvent.bKeyDown = FALSE;
|
||||
|
||||
WriteConsoleInput(
|
||||
hStdin,
|
||||
&rec,
|
||||
1,
|
||||
&dwWritten);
|
||||
|
||||
sz++;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
int CharToCode (char c)
|
||||
{
|
||||
char upper;
|
||||
|
||||
upper = toupper(c);
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case 13:
|
||||
return 28;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (isalpha(c))
|
||||
return (30 + upper - 65);
|
||||
|
||||
if (isdigit(c))
|
||||
return (1 + upper - 47);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
BOOL SetConsoleCXCY(HANDLE hStdout, int cx, int cy)
|
||||
{
|
||||
CONSOLE_SCREEN_BUFFER_INFO info;
|
||||
COORD coordMax;
|
||||
|
||||
coordMax = GetLargestConsoleWindowSize(hStdout);
|
||||
|
||||
if (cy > coordMax.Y)
|
||||
cy = coordMax.Y;
|
||||
|
||||
if (cx > coordMax.X)
|
||||
cx = coordMax.X;
|
||||
|
||||
if (!GetConsoleScreenBufferInfo(hStdout, &info))
|
||||
return FALSE;
|
||||
|
||||
// height
|
||||
info.srWindow.Left = 0;
|
||||
info.srWindow.Right = info.dwSize.X - 1;
|
||||
info.srWindow.Top = 0;
|
||||
info.srWindow.Bottom = cy - 1;
|
||||
|
||||
if (cy < info.dwSize.Y)
|
||||
{
|
||||
if (!SetConsoleWindowInfo(hStdout, TRUE, &info.srWindow))
|
||||
return FALSE;
|
||||
|
||||
info.dwSize.Y = cy;
|
||||
|
||||
if (!SetConsoleScreenBufferSize(hStdout, info.dwSize))
|
||||
return FALSE;
|
||||
}
|
||||
else if (cy > info.dwSize.Y)
|
||||
{
|
||||
info.dwSize.Y = cy;
|
||||
|
||||
if (!SetConsoleScreenBufferSize(hStdout, info.dwSize))
|
||||
return FALSE;
|
||||
|
||||
if (!SetConsoleWindowInfo(hStdout, TRUE, &info.srWindow))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!GetConsoleScreenBufferInfo(hStdout, &info))
|
||||
return FALSE;
|
||||
|
||||
// width
|
||||
info.srWindow.Left = 0;
|
||||
info.srWindow.Right = cx - 1;
|
||||
info.srWindow.Top = 0;
|
||||
info.srWindow.Bottom = info.dwSize.Y - 1;
|
||||
|
||||
if (cx < info.dwSize.X)
|
||||
{
|
||||
if (!SetConsoleWindowInfo(hStdout, TRUE, &info.srWindow))
|
||||
return FALSE;
|
||||
|
||||
info.dwSize.X = cx;
|
||||
|
||||
if (!SetConsoleScreenBufferSize(hStdout, info.dwSize))
|
||||
return FALSE;
|
||||
}
|
||||
else if (cx > info.dwSize.X)
|
||||
{
|
||||
info.dwSize.X = cx;
|
||||
|
||||
if (!SetConsoleScreenBufferSize(hStdout, info.dwSize))
|
||||
return FALSE;
|
||||
|
||||
if (!SetConsoleWindowInfo(hStdout, TRUE, &info.srWindow))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
37
WinQuake/conproc.h
Normal file
37
WinQuake/conproc.h
Normal file
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// conproc.h
|
||||
|
||||
#define CCOM_WRITE_TEXT 0x2
|
||||
// Param1 : Text
|
||||
|
||||
#define CCOM_GET_TEXT 0x3
|
||||
// Param1 : Begin line
|
||||
// Param2 : End line
|
||||
|
||||
#define CCOM_GET_SCR_LINES 0x4
|
||||
// No params
|
||||
|
||||
#define CCOM_SET_SCR_LINES 0x5
|
||||
// Param1 : Number of lines
|
||||
|
||||
void InitConProc (HANDLE hFile, HANDLE heventParent, HANDLE heventChild);
|
||||
void DeinitConProc (void);
|
||||
|
||||
649
WinQuake/console.c
Normal file
649
WinQuake/console.c
Normal file
@@ -0,0 +1,649 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// console.c
|
||||
|
||||
#ifdef NeXT
|
||||
#include <libc.h>
|
||||
#endif
|
||||
#ifndef _MSC_VER
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <fcntl.h>
|
||||
#include "quakedef.h"
|
||||
|
||||
int con_linewidth;
|
||||
|
||||
float con_cursorspeed = 4;
|
||||
|
||||
#define CON_TEXTSIZE 16384
|
||||
|
||||
qboolean con_forcedup; // because no entities to refresh
|
||||
|
||||
int con_totallines; // total lines in console scrollback
|
||||
int con_backscroll; // lines up from bottom to display
|
||||
int con_current; // where next message will be printed
|
||||
int con_x; // offset in current line for next print
|
||||
char *con_text=0;
|
||||
|
||||
cvar_t con_notifytime = {"con_notifytime","3"}; //seconds
|
||||
|
||||
#define NUM_CON_TIMES 4
|
||||
float con_times[NUM_CON_TIMES]; // realtime time the line was generated
|
||||
// for transparent notify lines
|
||||
|
||||
int con_vislines;
|
||||
|
||||
qboolean con_debuglog;
|
||||
|
||||
#define MAXCMDLINE 256
|
||||
extern char key_lines[32][MAXCMDLINE];
|
||||
extern int edit_line;
|
||||
extern int key_linepos;
|
||||
|
||||
|
||||
qboolean con_initialized;
|
||||
|
||||
int con_notifylines; // scan lines to clear for notify lines
|
||||
|
||||
extern void M_Menu_Main_f (void);
|
||||
|
||||
/*
|
||||
================
|
||||
Con_ToggleConsole_f
|
||||
================
|
||||
*/
|
||||
void Con_ToggleConsole_f (void)
|
||||
{
|
||||
if (key_dest == key_console)
|
||||
{
|
||||
if (cls.state == ca_connected)
|
||||
{
|
||||
key_dest = key_game;
|
||||
key_lines[edit_line][1] = 0; // clear any typing
|
||||
key_linepos = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
M_Menu_Main_f ();
|
||||
}
|
||||
}
|
||||
else
|
||||
key_dest = key_console;
|
||||
|
||||
SCR_EndLoadingPlaque ();
|
||||
memset (con_times, 0, sizeof(con_times));
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
Con_Clear_f
|
||||
================
|
||||
*/
|
||||
void Con_Clear_f (void)
|
||||
{
|
||||
if (con_text)
|
||||
Q_memset (con_text, ' ', CON_TEXTSIZE);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
Con_ClearNotify
|
||||
================
|
||||
*/
|
||||
void Con_ClearNotify (void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0 ; i<NUM_CON_TIMES ; i++)
|
||||
con_times[i] = 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
Con_MessageMode_f
|
||||
================
|
||||
*/
|
||||
extern qboolean team_message;
|
||||
|
||||
void Con_MessageMode_f (void)
|
||||
{
|
||||
key_dest = key_message;
|
||||
team_message = false;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
Con_MessageMode2_f
|
||||
================
|
||||
*/
|
||||
void Con_MessageMode2_f (void)
|
||||
{
|
||||
key_dest = key_message;
|
||||
team_message = true;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
Con_CheckResize
|
||||
|
||||
If the line width has changed, reformat the buffer.
|
||||
================
|
||||
*/
|
||||
void Con_CheckResize (void)
|
||||
{
|
||||
int i, j, width, oldwidth, oldtotallines, numlines, numchars;
|
||||
char tbuf[CON_TEXTSIZE];
|
||||
|
||||
width = (vid.width >> 3) - 2;
|
||||
|
||||
if (width == con_linewidth)
|
||||
return;
|
||||
|
||||
if (width < 1) // video hasn't been initialized yet
|
||||
{
|
||||
width = 38;
|
||||
con_linewidth = width;
|
||||
con_totallines = CON_TEXTSIZE / con_linewidth;
|
||||
Q_memset (con_text, ' ', CON_TEXTSIZE);
|
||||
}
|
||||
else
|
||||
{
|
||||
oldwidth = con_linewidth;
|
||||
con_linewidth = width;
|
||||
oldtotallines = con_totallines;
|
||||
con_totallines = CON_TEXTSIZE / con_linewidth;
|
||||
numlines = oldtotallines;
|
||||
|
||||
if (con_totallines < numlines)
|
||||
numlines = con_totallines;
|
||||
|
||||
numchars = oldwidth;
|
||||
|
||||
if (con_linewidth < numchars)
|
||||
numchars = con_linewidth;
|
||||
|
||||
Q_memcpy (tbuf, con_text, CON_TEXTSIZE);
|
||||
Q_memset (con_text, ' ', CON_TEXTSIZE);
|
||||
|
||||
for (i=0 ; i<numlines ; i++)
|
||||
{
|
||||
for (j=0 ; j<numchars ; j++)
|
||||
{
|
||||
con_text[(con_totallines - 1 - i) * con_linewidth + j] =
|
||||
tbuf[((con_current - i + oldtotallines) %
|
||||
oldtotallines) * oldwidth + j];
|
||||
}
|
||||
}
|
||||
|
||||
Con_ClearNotify ();
|
||||
}
|
||||
|
||||
con_backscroll = 0;
|
||||
con_current = con_totallines - 1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
Con_Init
|
||||
================
|
||||
*/
|
||||
void Con_Init (void)
|
||||
{
|
||||
#define MAXGAMEDIRLEN 1000
|
||||
char temp[MAXGAMEDIRLEN+1];
|
||||
char *t2 = "/qconsole.log";
|
||||
|
||||
con_debuglog = COM_CheckParm("-condebug");
|
||||
|
||||
if (con_debuglog)
|
||||
{
|
||||
if (strlen (com_gamedir) < (MAXGAMEDIRLEN - strlen (t2)))
|
||||
{
|
||||
sprintf (temp, "%s%s", com_gamedir, t2);
|
||||
unlink (temp);
|
||||
}
|
||||
}
|
||||
|
||||
con_text = Hunk_AllocName (CON_TEXTSIZE, "context");
|
||||
Q_memset (con_text, ' ', CON_TEXTSIZE);
|
||||
con_linewidth = -1;
|
||||
Con_CheckResize ();
|
||||
|
||||
Con_Printf ("Console initialized.\n");
|
||||
|
||||
//
|
||||
// register our commands
|
||||
//
|
||||
Cvar_RegisterVariable (&con_notifytime);
|
||||
|
||||
Cmd_AddCommand ("toggleconsole", Con_ToggleConsole_f);
|
||||
Cmd_AddCommand ("messagemode", Con_MessageMode_f);
|
||||
Cmd_AddCommand ("messagemode2", Con_MessageMode2_f);
|
||||
Cmd_AddCommand ("clear", Con_Clear_f);
|
||||
con_initialized = true;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
===============
|
||||
Con_Linefeed
|
||||
===============
|
||||
*/
|
||||
void Con_Linefeed (void)
|
||||
{
|
||||
con_x = 0;
|
||||
con_current++;
|
||||
Q_memset (&con_text[(con_current%con_totallines)*con_linewidth]
|
||||
, ' ', con_linewidth);
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
Con_Print
|
||||
|
||||
Handles cursor positioning, line wrapping, etc
|
||||
All console printing must go through this in order to be logged to disk
|
||||
If no console is visible, the notify window will pop up.
|
||||
================
|
||||
*/
|
||||
void Con_Print (char *txt)
|
||||
{
|
||||
int y;
|
||||
int c, l;
|
||||
static int cr;
|
||||
int mask;
|
||||
|
||||
con_backscroll = 0;
|
||||
|
||||
if (txt[0] == 1)
|
||||
{
|
||||
mask = 128; // go to colored text
|
||||
S_LocalSound ("misc/talk.wav");
|
||||
// play talk wav
|
||||
txt++;
|
||||
}
|
||||
else if (txt[0] == 2)
|
||||
{
|
||||
mask = 128; // go to colored text
|
||||
txt++;
|
||||
}
|
||||
else
|
||||
mask = 0;
|
||||
|
||||
|
||||
while ( (c = *txt) )
|
||||
{
|
||||
// count word length
|
||||
for (l=0 ; l< con_linewidth ; l++)
|
||||
if ( txt[l] <= ' ')
|
||||
break;
|
||||
|
||||
// word wrap
|
||||
if (l != con_linewidth && (con_x + l > con_linewidth) )
|
||||
con_x = 0;
|
||||
|
||||
txt++;
|
||||
|
||||
if (cr)
|
||||
{
|
||||
con_current--;
|
||||
cr = false;
|
||||
}
|
||||
|
||||
|
||||
if (!con_x)
|
||||
{
|
||||
Con_Linefeed ();
|
||||
// mark time for transparent overlay
|
||||
if (con_current >= 0)
|
||||
con_times[con_current % NUM_CON_TIMES] = realtime;
|
||||
}
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case '\n':
|
||||
con_x = 0;
|
||||
break;
|
||||
|
||||
case '\r':
|
||||
con_x = 0;
|
||||
cr = 1;
|
||||
break;
|
||||
|
||||
default: // display character and advance
|
||||
y = con_current % con_totallines;
|
||||
con_text[y*con_linewidth+con_x] = c | mask;
|
||||
con_x++;
|
||||
if (con_x >= con_linewidth)
|
||||
con_x = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
Con_DebugLog
|
||||
================
|
||||
*/
|
||||
void Con_DebugLog(char *file, char *fmt, ...)
|
||||
{
|
||||
va_list argptr;
|
||||
static char data[1024];
|
||||
int fd;
|
||||
|
||||
va_start(argptr, fmt);
|
||||
vsprintf(data, fmt, argptr);
|
||||
va_end(argptr);
|
||||
fd = open(file, O_WRONLY | O_CREAT | O_APPEND, 0666);
|
||||
write(fd, data, strlen(data));
|
||||
close(fd);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
Con_Printf
|
||||
|
||||
Handles cursor positioning, line wrapping, etc
|
||||
================
|
||||
*/
|
||||
#define MAXPRINTMSG 4096
|
||||
// FIXME: make a buffer size safe vsprintf?
|
||||
void Con_Printf (char *fmt, ...)
|
||||
{
|
||||
va_list argptr;
|
||||
char msg[MAXPRINTMSG];
|
||||
static qboolean inupdate;
|
||||
|
||||
va_start (argptr,fmt);
|
||||
vsprintf (msg,fmt,argptr);
|
||||
va_end (argptr);
|
||||
|
||||
// also echo to debugging console
|
||||
Sys_Printf ("%s", msg); // also echo to debugging console
|
||||
|
||||
// log all messages to file
|
||||
if (con_debuglog)
|
||||
Con_DebugLog(va("%s/qconsole.log",com_gamedir), "%s", msg);
|
||||
|
||||
if (!con_initialized)
|
||||
return;
|
||||
|
||||
if (cls.state == ca_dedicated)
|
||||
return; // no graphics mode
|
||||
|
||||
// write it to the scrollable buffer
|
||||
Con_Print (msg);
|
||||
|
||||
// update the screen if the console is displayed
|
||||
if (cls.signon != SIGNONS && !scr_disabled_for_loading )
|
||||
{
|
||||
// protect against infinite loop if something in SCR_UpdateScreen calls
|
||||
// Con_Printd
|
||||
if (!inupdate)
|
||||
{
|
||||
inupdate = true;
|
||||
SCR_UpdateScreen ();
|
||||
inupdate = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
Con_DPrintf
|
||||
|
||||
A Con_Printf that only shows up if the "developer" cvar is set
|
||||
================
|
||||
*/
|
||||
void Con_DPrintf (char *fmt, ...)
|
||||
{
|
||||
va_list argptr;
|
||||
char msg[MAXPRINTMSG];
|
||||
|
||||
if (!developer.value)
|
||||
return; // don't confuse non-developers with techie stuff...
|
||||
|
||||
va_start (argptr,fmt);
|
||||
vsprintf (msg,fmt,argptr);
|
||||
va_end (argptr);
|
||||
|
||||
Con_Printf ("%s", msg);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==================
|
||||
Con_SafePrintf
|
||||
|
||||
Okay to call even when the screen can't be updated
|
||||
==================
|
||||
*/
|
||||
void Con_SafePrintf (char *fmt, ...)
|
||||
{
|
||||
va_list argptr;
|
||||
char msg[1024];
|
||||
int temp;
|
||||
|
||||
va_start (argptr,fmt);
|
||||
vsprintf (msg,fmt,argptr);
|
||||
va_end (argptr);
|
||||
|
||||
temp = scr_disabled_for_loading;
|
||||
scr_disabled_for_loading = true;
|
||||
Con_Printf ("%s", msg);
|
||||
scr_disabled_for_loading = temp;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
DRAWING
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
Con_DrawInput
|
||||
|
||||
The input line scrolls horizontally if typing goes beyond the right edge
|
||||
================
|
||||
*/
|
||||
void Con_DrawInput (void)
|
||||
{
|
||||
int y;
|
||||
int i;
|
||||
char *text;
|
||||
|
||||
if (key_dest != key_console && !con_forcedup)
|
||||
return; // don't draw anything
|
||||
|
||||
text = key_lines[edit_line];
|
||||
|
||||
// add the cursor frame
|
||||
text[key_linepos] = 10+((int)(realtime*con_cursorspeed)&1);
|
||||
|
||||
// fill out remainder with spaces
|
||||
for (i=key_linepos+1 ; i< con_linewidth ; i++)
|
||||
text[i] = ' ';
|
||||
|
||||
// prestep if horizontally scrolling
|
||||
if (key_linepos >= con_linewidth)
|
||||
text += 1 + key_linepos - con_linewidth;
|
||||
|
||||
// draw it
|
||||
y = con_vislines-16;
|
||||
|
||||
for (i=0 ; i<con_linewidth ; i++)
|
||||
Draw_Character ( (i+1)<<3, con_vislines - 16, text[i]);
|
||||
|
||||
// remove cursor
|
||||
key_lines[edit_line][key_linepos] = 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
Con_DrawNotify
|
||||
|
||||
Draws the last few lines of output transparently over the game top
|
||||
================
|
||||
*/
|
||||
void Con_DrawNotify (void)
|
||||
{
|
||||
int x, v;
|
||||
char *text;
|
||||
int i;
|
||||
float time;
|
||||
extern char chat_buffer[];
|
||||
|
||||
v = 0;
|
||||
for (i= con_current-NUM_CON_TIMES+1 ; i<=con_current ; i++)
|
||||
{
|
||||
if (i < 0)
|
||||
continue;
|
||||
time = con_times[i % NUM_CON_TIMES];
|
||||
if (time == 0)
|
||||
continue;
|
||||
time = realtime - time;
|
||||
if (time > con_notifytime.value)
|
||||
continue;
|
||||
text = con_text + (i % con_totallines)*con_linewidth;
|
||||
|
||||
clearnotify = 0;
|
||||
scr_copytop = 1;
|
||||
|
||||
for (x = 0 ; x < con_linewidth ; x++)
|
||||
Draw_Character ( (x+1)<<3, v, text[x]);
|
||||
|
||||
v += 8;
|
||||
}
|
||||
|
||||
|
||||
if (key_dest == key_message)
|
||||
{
|
||||
clearnotify = 0;
|
||||
scr_copytop = 1;
|
||||
|
||||
x = 0;
|
||||
|
||||
Draw_String (8, v, "say:");
|
||||
while(chat_buffer[x])
|
||||
{
|
||||
Draw_Character ( (x+5)<<3, v, chat_buffer[x]);
|
||||
x++;
|
||||
}
|
||||
Draw_Character ( (x+5)<<3, v, 10+((int)(realtime*con_cursorspeed)&1));
|
||||
v += 8;
|
||||
}
|
||||
|
||||
if (v > con_notifylines)
|
||||
con_notifylines = v;
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
Con_DrawConsole
|
||||
|
||||
Draws the console with the solid background
|
||||
The typing input line at the bottom should only be drawn if typing is allowed
|
||||
================
|
||||
*/
|
||||
void Con_DrawConsole (int lines, qboolean drawinput)
|
||||
{
|
||||
int i, x, y;
|
||||
int rows;
|
||||
char *text;
|
||||
int j;
|
||||
|
||||
if (lines <= 0)
|
||||
return;
|
||||
|
||||
// draw the background
|
||||
Draw_ConsoleBackground (lines);
|
||||
|
||||
// draw the text
|
||||
con_vislines = lines;
|
||||
|
||||
rows = (lines-16)>>3; // rows of text to draw
|
||||
y = lines - 16 - (rows<<3); // may start slightly negative
|
||||
|
||||
for (i= con_current - rows + 1 ; i<=con_current ; i++, y+=8 )
|
||||
{
|
||||
j = i - con_backscroll;
|
||||
if (j<0)
|
||||
j = 0;
|
||||
text = con_text + (j % con_totallines)*con_linewidth;
|
||||
|
||||
for (x=0 ; x<con_linewidth ; x++)
|
||||
Draw_Character ( (x+1)<<3, y, text[x]);
|
||||
}
|
||||
|
||||
// draw the input prompt, user text, and cursor if desired
|
||||
if (drawinput)
|
||||
Con_DrawInput ();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==================
|
||||
Con_NotifyBox
|
||||
==================
|
||||
*/
|
||||
void Con_NotifyBox (char *text)
|
||||
{
|
||||
double t1, t2;
|
||||
|
||||
// during startup for sound / cd warnings
|
||||
Con_Printf("\n\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n");
|
||||
|
||||
Con_Printf (text);
|
||||
|
||||
Con_Printf ("Press a key.\n");
|
||||
Con_Printf("\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n");
|
||||
|
||||
key_count = -2; // wait for a key down and up
|
||||
key_dest = key_console;
|
||||
|
||||
do
|
||||
{
|
||||
t1 = Sys_FloatTime ();
|
||||
SCR_UpdateScreen ();
|
||||
Sys_SendKeyEvents ();
|
||||
t2 = Sys_FloatTime ();
|
||||
realtime += t2-t1; // make the cursor blink
|
||||
} while (key_count < 0);
|
||||
|
||||
Con_Printf ("\n");
|
||||
key_dest = key_game;
|
||||
realtime = 0; // put the cursor back to invisible
|
||||
}
|
||||
|
||||
46
WinQuake/console.h
Normal file
46
WinQuake/console.h
Normal file
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
|
||||
//
|
||||
// console
|
||||
//
|
||||
extern int con_totallines;
|
||||
extern int con_backscroll;
|
||||
extern qboolean con_forcedup; // because no entities to refresh
|
||||
extern qboolean con_initialized;
|
||||
extern byte *con_chars;
|
||||
extern int con_notifylines; // scan lines to clear for notify lines
|
||||
|
||||
void Con_DrawCharacter (int cx, int line, int num);
|
||||
|
||||
void Con_CheckResize (void);
|
||||
void Con_Init (void);
|
||||
void Con_DrawConsole (int lines, qboolean drawinput);
|
||||
void Con_Print (char *txt);
|
||||
void Con_Printf (char *fmt, ...);
|
||||
void Con_DPrintf (char *fmt, ...);
|
||||
void Con_SafePrintf (char *fmt, ...);
|
||||
void Con_Clear_f (void);
|
||||
void Con_DrawNotify (void);
|
||||
void Con_ClearNotify (void);
|
||||
void Con_ToggleConsole_f (void);
|
||||
|
||||
void Con_NotifyBox (char *text); // during startup for sound / cd warnings
|
||||
|
||||
81
WinQuake/crc.c
Normal file
81
WinQuake/crc.c
Normal file
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
/* crc.c */
|
||||
|
||||
#include "quakedef.h"
|
||||
#include "crc.h"
|
||||
|
||||
// this is a 16 bit, non-reflected CRC using the polynomial 0x1021
|
||||
// and the initial and final xor values shown below... in other words, the
|
||||
// CCITT standard CRC used by XMODEM
|
||||
|
||||
#define CRC_INIT_VALUE 0xffff
|
||||
#define CRC_XOR_VALUE 0x0000
|
||||
|
||||
static unsigned short crctable[256] =
|
||||
{
|
||||
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
|
||||
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
|
||||
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
|
||||
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
|
||||
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
|
||||
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
|
||||
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
|
||||
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
|
||||
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
|
||||
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
|
||||
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
|
||||
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
|
||||
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
|
||||
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
|
||||
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
|
||||
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
|
||||
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
|
||||
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
|
||||
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
|
||||
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
|
||||
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
|
||||
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
|
||||
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
|
||||
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
|
||||
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
|
||||
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
|
||||
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
|
||||
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
|
||||
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
|
||||
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
|
||||
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
|
||||
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
|
||||
};
|
||||
|
||||
void CRC_Init(unsigned short *crcvalue)
|
||||
{
|
||||
*crcvalue = CRC_INIT_VALUE;
|
||||
}
|
||||
|
||||
void CRC_ProcessByte(unsigned short *crcvalue, byte data)
|
||||
{
|
||||
*crcvalue = (*crcvalue << 8) ^ crctable[(*crcvalue >> 8) ^ data];
|
||||
}
|
||||
|
||||
unsigned short CRC_Value(unsigned short crcvalue)
|
||||
{
|
||||
return crcvalue ^ CRC_XOR_VALUE;
|
||||
}
|
||||
24
WinQuake/crc.h
Normal file
24
WinQuake/crc.h
Normal file
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
/* crc.h */
|
||||
|
||||
void CRC_Init(unsigned short *crcvalue);
|
||||
void CRC_ProcessByte(unsigned short *crcvalue, byte data);
|
||||
unsigned short CRC_Value(unsigned short crcvalue);
|
||||
224
WinQuake/cvar.c
Normal file
224
WinQuake/cvar.c
Normal file
@@ -0,0 +1,224 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// cvar.c -- dynamic variable tracking
|
||||
|
||||
#include "quakedef.h"
|
||||
|
||||
cvar_t *cvar_vars;
|
||||
char *cvar_null_string = "";
|
||||
|
||||
/*
|
||||
============
|
||||
Cvar_FindVar
|
||||
============
|
||||
*/
|
||||
cvar_t *Cvar_FindVar (char *var_name)
|
||||
{
|
||||
cvar_t *var;
|
||||
|
||||
for (var=cvar_vars ; var ; var=var->next)
|
||||
if (!Q_strcmp (var_name, var->name))
|
||||
return var;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
Cvar_VariableValue
|
||||
============
|
||||
*/
|
||||
float Cvar_VariableValue (char *var_name)
|
||||
{
|
||||
cvar_t *var;
|
||||
|
||||
var = Cvar_FindVar (var_name);
|
||||
if (!var)
|
||||
return 0;
|
||||
return Q_atof (var->string);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
============
|
||||
Cvar_VariableString
|
||||
============
|
||||
*/
|
||||
char *Cvar_VariableString (char *var_name)
|
||||
{
|
||||
cvar_t *var;
|
||||
|
||||
var = Cvar_FindVar (var_name);
|
||||
if (!var)
|
||||
return cvar_null_string;
|
||||
return var->string;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
============
|
||||
Cvar_CompleteVariable
|
||||
============
|
||||
*/
|
||||
char *Cvar_CompleteVariable (char *partial)
|
||||
{
|
||||
cvar_t *cvar;
|
||||
int len;
|
||||
|
||||
len = Q_strlen(partial);
|
||||
|
||||
if (!len)
|
||||
return NULL;
|
||||
|
||||
// check functions
|
||||
for (cvar=cvar_vars ; cvar ; cvar=cvar->next)
|
||||
if (!Q_strncmp (partial,cvar->name, len))
|
||||
return cvar->name;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
============
|
||||
Cvar_Set
|
||||
============
|
||||
*/
|
||||
void Cvar_Set (char *var_name, char *value)
|
||||
{
|
||||
cvar_t *var;
|
||||
qboolean changed;
|
||||
|
||||
var = Cvar_FindVar (var_name);
|
||||
if (!var)
|
||||
{ // there is an error in C code if this happens
|
||||
Con_Printf ("Cvar_Set: variable %s not found\n", var_name);
|
||||
return;
|
||||
}
|
||||
|
||||
changed = Q_strcmp(var->string, value);
|
||||
|
||||
Z_Free (var->string); // free the old value string
|
||||
|
||||
var->string = Z_Malloc (Q_strlen(value)+1);
|
||||
Q_strcpy (var->string, value);
|
||||
var->value = Q_atof (var->string);
|
||||
if (var->server && changed)
|
||||
{
|
||||
if (sv.active)
|
||||
SV_BroadcastPrintf ("\"%s\" changed to \"%s\"\n", var->name, var->string);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
Cvar_SetValue
|
||||
============
|
||||
*/
|
||||
void Cvar_SetValue (char *var_name, float value)
|
||||
{
|
||||
char val[32];
|
||||
|
||||
sprintf (val, "%f",value);
|
||||
Cvar_Set (var_name, val);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
============
|
||||
Cvar_RegisterVariable
|
||||
|
||||
Adds a freestanding variable to the variable list.
|
||||
============
|
||||
*/
|
||||
void Cvar_RegisterVariable (cvar_t *variable)
|
||||
{
|
||||
char *oldstr;
|
||||
|
||||
// first check to see if it has allready been defined
|
||||
if (Cvar_FindVar (variable->name))
|
||||
{
|
||||
Con_Printf ("Can't register variable %s, allready defined\n", variable->name);
|
||||
return;
|
||||
}
|
||||
|
||||
// check for overlap with a command
|
||||
if (Cmd_Exists (variable->name))
|
||||
{
|
||||
Con_Printf ("Cvar_RegisterVariable: %s is a command\n", variable->name);
|
||||
return;
|
||||
}
|
||||
|
||||
// copy the value off, because future sets will Z_Free it
|
||||
oldstr = variable->string;
|
||||
variable->string = Z_Malloc (Q_strlen(variable->string)+1);
|
||||
Q_strcpy (variable->string, oldstr);
|
||||
variable->value = Q_atof (variable->string);
|
||||
|
||||
// link the variable in
|
||||
variable->next = cvar_vars;
|
||||
cvar_vars = variable;
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
Cvar_Command
|
||||
|
||||
Handles variable inspection and changing from the console
|
||||
============
|
||||
*/
|
||||
qboolean Cvar_Command (void)
|
||||
{
|
||||
cvar_t *v;
|
||||
|
||||
// check variables
|
||||
v = Cvar_FindVar (Cmd_Argv(0));
|
||||
if (!v)
|
||||
return false;
|
||||
|
||||
// perform a variable print or set
|
||||
if (Cmd_Argc() == 1)
|
||||
{
|
||||
Con_Printf ("\"%s\" is \"%s\"\n", v->name, v->string);
|
||||
return true;
|
||||
}
|
||||
|
||||
Cvar_Set (v->name, Cmd_Argv(1));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
============
|
||||
Cvar_WriteVariables
|
||||
|
||||
Writes lines containing "set variable value" for all variables
|
||||
with the archive flag set to true.
|
||||
============
|
||||
*/
|
||||
void Cvar_WriteVariables (FILE *f)
|
||||
{
|
||||
cvar_t *var;
|
||||
|
||||
for (var = cvar_vars ; var ; var = var->next)
|
||||
if (var->archive)
|
||||
fprintf (f, "%s \"%s\"\n", var->name, var->string);
|
||||
}
|
||||
|
||||
97
WinQuake/cvar.h
Normal file
97
WinQuake/cvar.h
Normal file
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// cvar.h
|
||||
|
||||
/*
|
||||
|
||||
cvar_t variables are used to hold scalar or string variables that can be changed or displayed at the console or prog code as well as accessed directly
|
||||
in C code.
|
||||
|
||||
it is sufficient to initialize a cvar_t with just the first two fields, or
|
||||
you can add a ,true flag for variables that you want saved to the configuration
|
||||
file when the game is quit:
|
||||
|
||||
cvar_t r_draworder = {"r_draworder","1"};
|
||||
cvar_t scr_screensize = {"screensize","1",true};
|
||||
|
||||
Cvars must be registered before use, or they will have a 0 value instead of the float interpretation of the string. Generally, all cvar_t declarations should be registered in the apropriate init function before any console commands are executed:
|
||||
Cvar_RegisterVariable (&host_framerate);
|
||||
|
||||
|
||||
C code usually just references a cvar in place:
|
||||
if ( r_draworder.value )
|
||||
|
||||
It could optionally ask for the value to be looked up for a string name:
|
||||
if (Cvar_VariableValue ("r_draworder"))
|
||||
|
||||
Interpreted prog code can access cvars with the cvar(name) or
|
||||
cvar_set (name, value) internal functions:
|
||||
teamplay = cvar("teamplay");
|
||||
cvar_set ("registered", "1");
|
||||
|
||||
The user can access cvars from the console in two ways:
|
||||
r_draworder prints the current value
|
||||
r_draworder 0 sets the current value to 0
|
||||
Cvars are restricted from having the same names as commands to keep this
|
||||
interface from being ambiguous.
|
||||
*/
|
||||
|
||||
typedef struct cvar_s
|
||||
{
|
||||
char *name;
|
||||
char *string;
|
||||
qboolean archive; // set to true to cause it to be saved to vars.rc
|
||||
qboolean server; // notifies players when changed
|
||||
float value;
|
||||
struct cvar_s *next;
|
||||
} cvar_t;
|
||||
|
||||
void Cvar_RegisterVariable (cvar_t *variable);
|
||||
// registers a cvar that allready has the name, string, and optionally the
|
||||
// archive elements set.
|
||||
|
||||
void Cvar_Set (char *var_name, char *value);
|
||||
// equivelant to "<name> <variable>" typed at the console
|
||||
|
||||
void Cvar_SetValue (char *var_name, float value);
|
||||
// expands value to a string and calls Cvar_Set
|
||||
|
||||
float Cvar_VariableValue (char *var_name);
|
||||
// returns 0 if not defined or non numeric
|
||||
|
||||
char *Cvar_VariableString (char *var_name);
|
||||
// returns an empty string if not defined
|
||||
|
||||
char *Cvar_CompleteVariable (char *partial);
|
||||
// attempts to match a partial variable name for command line completion
|
||||
// returns NULL if nothing fits
|
||||
|
||||
qboolean Cvar_Command (void);
|
||||
// called by Cmd_ExecuteString when Cmd_Argv(0) doesn't match a known
|
||||
// command. Returns true if the command was a variable reference that
|
||||
// was handled. (print or change)
|
||||
|
||||
void Cvar_WriteVariables (FILE *f);
|
||||
// Writes lines containing "set variable value" for all variables
|
||||
// with the archive flag set to true.
|
||||
|
||||
cvar_t *Cvar_FindVar (char *var_name);
|
||||
|
||||
extern cvar_t *cvar_vars;
|
||||
BIN
WinQuake/cwsdpmi.exe
Normal file
BIN
WinQuake/cwsdpmi.exe
Normal file
Binary file not shown.
149
WinQuake/d_copy.s
Normal file
149
WinQuake/d_copy.s
Normal file
@@ -0,0 +1,149 @@
|
||||
//
|
||||
// d_copy.s
|
||||
// x86 assembly-language screen copying code.
|
||||
//
|
||||
|
||||
#include "asm_i386.h"
|
||||
#include "quakeasm.h"
|
||||
#include "asm_draw.h"
|
||||
|
||||
.data
|
||||
|
||||
LCopyWidth: .long 0
|
||||
LBlockSrcStep: .long 0
|
||||
LBlockDestStep: .long 0
|
||||
LSrcDelta: .long 0
|
||||
LDestDelta: .long 0
|
||||
|
||||
#define bufptr 4+16
|
||||
|
||||
// copies 16 rows per plane at a pop; idea is that 16*512 = 8k, and since
|
||||
// no Mode X mode is wider than 360, all the data should fit in the cache for
|
||||
// the passes for the next 3 planes
|
||||
|
||||
.text
|
||||
|
||||
.globl C(VGA_UpdatePlanarScreen)
|
||||
C(VGA_UpdatePlanarScreen):
|
||||
pushl %ebp // preserve caller's stack frame
|
||||
pushl %edi
|
||||
pushl %esi // preserve register variables
|
||||
pushl %ebx
|
||||
|
||||
movl C(VGA_bufferrowbytes),%eax
|
||||
shll $1,%eax
|
||||
movl %eax,LBlockSrcStep
|
||||
movl C(VGA_rowbytes),%eax
|
||||
shll $1,%eax
|
||||
movl %eax,LBlockDestStep
|
||||
|
||||
movl $0x3C4,%edx
|
||||
movb $2,%al
|
||||
outb %al,%dx // point the SC to the Map Mask
|
||||
incl %edx
|
||||
|
||||
movl bufptr(%esp),%esi
|
||||
movl C(VGA_pagebase),%edi
|
||||
movl C(VGA_height),%ebp
|
||||
shrl $1,%ebp
|
||||
|
||||
movl C(VGA_width),%ecx
|
||||
movl C(VGA_bufferrowbytes),%eax
|
||||
subl %ecx,%eax
|
||||
movl %eax,LSrcDelta
|
||||
movl C(VGA_rowbytes),%eax
|
||||
shll $2,%eax
|
||||
subl %ecx,%eax
|
||||
movl %eax,LDestDelta
|
||||
shrl $4,%ecx
|
||||
movl %ecx,LCopyWidth
|
||||
|
||||
LRowLoop:
|
||||
movb $1,%al
|
||||
|
||||
LPlaneLoop:
|
||||
outb %al,%dx
|
||||
movb $2,%ah
|
||||
|
||||
pushl %esi
|
||||
pushl %edi
|
||||
LRowSetLoop:
|
||||
movl LCopyWidth,%ecx
|
||||
LColumnLoop:
|
||||
movb 12(%esi),%bh
|
||||
movb 8(%esi),%bl
|
||||
shll $16,%ebx
|
||||
movb 4(%esi),%bh
|
||||
movb (%esi),%bl
|
||||
movl %ebx,(%edi)
|
||||
addl $16,%esi
|
||||
addl $4,%edi
|
||||
decl %ecx
|
||||
jnz LColumnLoop
|
||||
|
||||
addl LDestDelta,%edi
|
||||
addl LSrcDelta,%esi
|
||||
decb %ah
|
||||
jnz LRowSetLoop
|
||||
|
||||
popl %edi
|
||||
popl %esi
|
||||
incl %esi
|
||||
|
||||
shlb $1,%al
|
||||
cmpb $16,%al
|
||||
jnz LPlaneLoop
|
||||
|
||||
subl $4,%esi
|
||||
addl LBlockSrcStep,%esi
|
||||
addl LBlockDestStep,%edi
|
||||
decl %ebp
|
||||
jnz LRowLoop
|
||||
|
||||
popl %ebx // restore register variables
|
||||
popl %esi
|
||||
popl %edi
|
||||
popl %ebp // restore the caller's stack frame
|
||||
|
||||
ret
|
||||
|
||||
|
||||
#define srcptr 4+16
|
||||
#define destptr 8+16
|
||||
#define width 12+16
|
||||
#define height 16+16
|
||||
#define srcrowbytes 20+16
|
||||
#define destrowbytes 24+16
|
||||
|
||||
.globl C(VGA_UpdateLinearScreen)
|
||||
C(VGA_UpdateLinearScreen):
|
||||
pushl %ebp // preserve caller's stack frame
|
||||
pushl %edi
|
||||
pushl %esi // preserve register variables
|
||||
pushl %ebx
|
||||
|
||||
cld
|
||||
movl srcptr(%esp),%esi
|
||||
movl destptr(%esp),%edi
|
||||
movl width(%esp),%ebx
|
||||
movl srcrowbytes(%esp),%eax
|
||||
subl %ebx,%eax
|
||||
movl destrowbytes(%esp),%edx
|
||||
subl %ebx,%edx
|
||||
shrl $2,%ebx
|
||||
movl height(%esp),%ebp
|
||||
LLRowLoop:
|
||||
movl %ebx,%ecx
|
||||
rep/movsl (%esi),(%edi)
|
||||
addl %eax,%esi
|
||||
addl %edx,%edi
|
||||
decl %ebp
|
||||
jnz LLRowLoop
|
||||
|
||||
popl %ebx // restore register variables
|
||||
popl %esi
|
||||
popl %edi
|
||||
popl %ebp // restore the caller's stack frame
|
||||
|
||||
ret
|
||||
|
||||
1037
WinQuake/d_draw.s
Normal file
1037
WinQuake/d_draw.s
Normal file
File diff suppressed because it is too large
Load Diff
974
WinQuake/d_draw16.s
Normal file
974
WinQuake/d_draw16.s
Normal file
@@ -0,0 +1,974 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
//
|
||||
// d_draw16.s
|
||||
// x86 assembly-language horizontal 8-bpp span-drawing code, with 16-pixel
|
||||
// subdivision.
|
||||
//
|
||||
|
||||
#include "asm_i386.h"
|
||||
#include "quakeasm.h"
|
||||
#include "asm_draw.h"
|
||||
#include "d_ifacea.h"
|
||||
|
||||
#if id386
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// 8-bpp horizontal span drawing code for polygons, with no transparency and
|
||||
// 16-pixel subdivision.
|
||||
//
|
||||
// Assumes there is at least one span in pspans, and that every span
|
||||
// contains at least one pixel
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
.data
|
||||
|
||||
.text
|
||||
|
||||
// out-of-line, rarely-needed clamping code
|
||||
|
||||
LClampHigh0:
|
||||
movl C(bbextents),%esi
|
||||
jmp LClampReentry0
|
||||
LClampHighOrLow0:
|
||||
jg LClampHigh0
|
||||
xorl %esi,%esi
|
||||
jmp LClampReentry0
|
||||
|
||||
LClampHigh1:
|
||||
movl C(bbextentt),%edx
|
||||
jmp LClampReentry1
|
||||
LClampHighOrLow1:
|
||||
jg LClampHigh1
|
||||
xorl %edx,%edx
|
||||
jmp LClampReentry1
|
||||
|
||||
LClampLow2:
|
||||
movl $4096,%ebp
|
||||
jmp LClampReentry2
|
||||
LClampHigh2:
|
||||
movl C(bbextents),%ebp
|
||||
jmp LClampReentry2
|
||||
|
||||
LClampLow3:
|
||||
movl $4096,%ecx
|
||||
jmp LClampReentry3
|
||||
LClampHigh3:
|
||||
movl C(bbextentt),%ecx
|
||||
jmp LClampReentry3
|
||||
|
||||
LClampLow4:
|
||||
movl $4096,%eax
|
||||
jmp LClampReentry4
|
||||
LClampHigh4:
|
||||
movl C(bbextents),%eax
|
||||
jmp LClampReentry4
|
||||
|
||||
LClampLow5:
|
||||
movl $4096,%ebx
|
||||
jmp LClampReentry5
|
||||
LClampHigh5:
|
||||
movl C(bbextentt),%ebx
|
||||
jmp LClampReentry5
|
||||
|
||||
|
||||
#define pspans 4+16
|
||||
|
||||
.align 4
|
||||
.globl C(D_DrawSpans16)
|
||||
C(D_DrawSpans16):
|
||||
pushl %ebp // preserve caller's stack frame
|
||||
pushl %edi
|
||||
pushl %esi // preserve register variables
|
||||
pushl %ebx
|
||||
|
||||
//
|
||||
// set up scaled-by-16 steps, for 16-long segments; also set up cacheblock
|
||||
// and span list pointers
|
||||
//
|
||||
// TODO: any overlap from rearranging?
|
||||
flds C(d_sdivzstepu)
|
||||
fmuls fp_16
|
||||
movl C(cacheblock),%edx
|
||||
flds C(d_tdivzstepu)
|
||||
fmuls fp_16
|
||||
movl pspans(%esp),%ebx // point to the first span descriptor
|
||||
flds C(d_zistepu)
|
||||
fmuls fp_16
|
||||
movl %edx,pbase // pbase = cacheblock
|
||||
fstps zi16stepu
|
||||
fstps tdivz16stepu
|
||||
fstps sdivz16stepu
|
||||
|
||||
LSpanLoop:
|
||||
//
|
||||
// set up the initial s/z, t/z, and 1/z on the FP stack, and generate the
|
||||
// initial s and t values
|
||||
//
|
||||
// FIXME: pipeline FILD?
|
||||
fildl espan_t_v(%ebx)
|
||||
fildl espan_t_u(%ebx)
|
||||
|
||||
fld %st(1) // dv | du | dv
|
||||
fmuls C(d_sdivzstepv) // dv*d_sdivzstepv | du | dv
|
||||
fld %st(1) // du | dv*d_sdivzstepv | du | dv
|
||||
fmuls C(d_sdivzstepu) // du*d_sdivzstepu | dv*d_sdivzstepv | du | dv
|
||||
fld %st(2) // du | du*d_sdivzstepu | dv*d_sdivzstepv | du | dv
|
||||
fmuls C(d_tdivzstepu) // du*d_tdivzstepu | du*d_sdivzstepu |
|
||||
// dv*d_sdivzstepv | du | dv
|
||||
fxch %st(1) // du*d_sdivzstepu | du*d_tdivzstepu |
|
||||
// dv*d_sdivzstepv | du | dv
|
||||
faddp %st(0),%st(2) // du*d_tdivzstepu |
|
||||
// du*d_sdivzstepu + dv*d_sdivzstepv | du | dv
|
||||
fxch %st(1) // du*d_sdivzstepu + dv*d_sdivzstepv |
|
||||
// du*d_tdivzstepu | du | dv
|
||||
fld %st(3) // dv | du*d_sdivzstepu + dv*d_sdivzstepv |
|
||||
// du*d_tdivzstepu | du | dv
|
||||
fmuls C(d_tdivzstepv) // dv*d_tdivzstepv |
|
||||
// du*d_sdivzstepu + dv*d_sdivzstepv |
|
||||
// du*d_tdivzstepu | du | dv
|
||||
fxch %st(1) // du*d_sdivzstepu + dv*d_sdivzstepv |
|
||||
// dv*d_tdivzstepv | du*d_tdivzstepu | du | dv
|
||||
fadds C(d_sdivzorigin) // sdivz = d_sdivzorigin + dv*d_sdivzstepv +
|
||||
// du*d_sdivzstepu; stays in %st(2) at end
|
||||
fxch %st(4) // dv | dv*d_tdivzstepv | du*d_tdivzstepu | du |
|
||||
// s/z
|
||||
fmuls C(d_zistepv) // dv*d_zistepv | dv*d_tdivzstepv |
|
||||
// du*d_tdivzstepu | du | s/z
|
||||
fxch %st(1) // dv*d_tdivzstepv | dv*d_zistepv |
|
||||
// du*d_tdivzstepu | du | s/z
|
||||
faddp %st(0),%st(2) // dv*d_zistepv |
|
||||
// dv*d_tdivzstepv + du*d_tdivzstepu | du | s/z
|
||||
fxch %st(2) // du | dv*d_tdivzstepv + du*d_tdivzstepu |
|
||||
// dv*d_zistepv | s/z
|
||||
fmuls C(d_zistepu) // du*d_zistepu |
|
||||
// dv*d_tdivzstepv + du*d_tdivzstepu |
|
||||
// dv*d_zistepv | s/z
|
||||
fxch %st(1) // dv*d_tdivzstepv + du*d_tdivzstepu |
|
||||
// du*d_zistepu | dv*d_zistepv | s/z
|
||||
fadds C(d_tdivzorigin) // tdivz = d_tdivzorigin + dv*d_tdivzstepv +
|
||||
// du*d_tdivzstepu; stays in %st(1) at end
|
||||
fxch %st(2) // dv*d_zistepv | du*d_zistepu | t/z | s/z
|
||||
faddp %st(0),%st(1) // dv*d_zistepv + du*d_zistepu | t/z | s/z
|
||||
|
||||
flds fp_64k // fp_64k | dv*d_zistepv + du*d_zistepu | t/z | s/z
|
||||
fxch %st(1) // dv*d_zistepv + du*d_zistepu | fp_64k | t/z | s/z
|
||||
fadds C(d_ziorigin) // zi = d_ziorigin + dv*d_zistepv +
|
||||
// du*d_zistepu; stays in %st(0) at end
|
||||
// 1/z | fp_64k | t/z | s/z
|
||||
//
|
||||
// calculate and clamp s & t
|
||||
//
|
||||
fdivr %st(0),%st(1) // 1/z | z*64k | t/z | s/z
|
||||
|
||||
//
|
||||
// point %edi to the first pixel in the span
|
||||
//
|
||||
movl C(d_viewbuffer),%ecx
|
||||
movl espan_t_v(%ebx),%eax
|
||||
movl %ebx,pspantemp // preserve spans pointer
|
||||
|
||||
movl C(tadjust),%edx
|
||||
movl C(sadjust),%esi
|
||||
movl C(d_scantable)(,%eax,4),%edi // v * screenwidth
|
||||
addl %ecx,%edi
|
||||
movl espan_t_u(%ebx),%ecx
|
||||
addl %ecx,%edi // pdest = &pdestspan[scans->u];
|
||||
movl espan_t_count(%ebx),%ecx
|
||||
|
||||
//
|
||||
// now start the FDIV for the end of the span
|
||||
//
|
||||
cmpl $16,%ecx
|
||||
ja LSetupNotLast1
|
||||
|
||||
decl %ecx
|
||||
jz LCleanup1 // if only one pixel, no need to start an FDIV
|
||||
movl %ecx,spancountminus1
|
||||
|
||||
// finish up the s and t calcs
|
||||
fxch %st(1) // z*64k | 1/z | t/z | s/z
|
||||
|
||||
fld %st(0) // z*64k | z*64k | 1/z | t/z | s/z
|
||||
fmul %st(4),%st(0) // s | z*64k | 1/z | t/z | s/z
|
||||
fxch %st(1) // z*64k | s | 1/z | t/z | s/z
|
||||
fmul %st(3),%st(0) // t | s | 1/z | t/z | s/z
|
||||
fxch %st(1) // s | t | 1/z | t/z | s/z
|
||||
fistpl s // 1/z | t | t/z | s/z
|
||||
fistpl t // 1/z | t/z | s/z
|
||||
|
||||
fildl spancountminus1
|
||||
|
||||
flds C(d_tdivzstepu) // C(d_tdivzstepu) | spancountminus1
|
||||
flds C(d_zistepu) // C(d_zistepu) | C(d_tdivzstepu) | spancountminus1
|
||||
fmul %st(2),%st(0) // C(d_zistepu)*scm1 | C(d_tdivzstepu) | scm1
|
||||
fxch %st(1) // C(d_tdivzstepu) | C(d_zistepu)*scm1 | scm1
|
||||
fmul %st(2),%st(0) // C(d_tdivzstepu)*scm1 | C(d_zistepu)*scm1 | scm1
|
||||
fxch %st(2) // scm1 | C(d_zistepu)*scm1 | C(d_tdivzstepu)*scm1
|
||||
fmuls C(d_sdivzstepu) // C(d_sdivzstepu)*scm1 | C(d_zistepu)*scm1 |
|
||||
// C(d_tdivzstepu)*scm1
|
||||
fxch %st(1) // C(d_zistepu)*scm1 | C(d_sdivzstepu)*scm1 |
|
||||
// C(d_tdivzstepu)*scm1
|
||||
faddp %st(0),%st(3) // C(d_sdivzstepu)*scm1 | C(d_tdivzstepu)*scm1
|
||||
fxch %st(1) // C(d_tdivzstepu)*scm1 | C(d_sdivzstepu)*scm1
|
||||
faddp %st(0),%st(3) // C(d_sdivzstepu)*scm1
|
||||
faddp %st(0),%st(3)
|
||||
|
||||
flds fp_64k
|
||||
fdiv %st(1),%st(0) // this is what we've gone to all this trouble to
|
||||
// overlap
|
||||
jmp LFDIVInFlight1
|
||||
|
||||
LCleanup1:
|
||||
// finish up the s and t calcs
|
||||
fxch %st(1) // z*64k | 1/z | t/z | s/z
|
||||
|
||||
fld %st(0) // z*64k | z*64k | 1/z | t/z | s/z
|
||||
fmul %st(4),%st(0) // s | z*64k | 1/z | t/z | s/z
|
||||
fxch %st(1) // z*64k | s | 1/z | t/z | s/z
|
||||
fmul %st(3),%st(0) // t | s | 1/z | t/z | s/z
|
||||
fxch %st(1) // s | t | 1/z | t/z | s/z
|
||||
fistpl s // 1/z | t | t/z | s/z
|
||||
fistpl t // 1/z | t/z | s/z
|
||||
jmp LFDIVInFlight1
|
||||
|
||||
.align 4
|
||||
LSetupNotLast1:
|
||||
// finish up the s and t calcs
|
||||
fxch %st(1) // z*64k | 1/z | t/z | s/z
|
||||
|
||||
fld %st(0) // z*64k | z*64k | 1/z | t/z | s/z
|
||||
fmul %st(4),%st(0) // s | z*64k | 1/z | t/z | s/z
|
||||
fxch %st(1) // z*64k | s | 1/z | t/z | s/z
|
||||
fmul %st(3),%st(0) // t | s | 1/z | t/z | s/z
|
||||
fxch %st(1) // s | t | 1/z | t/z | s/z
|
||||
fistpl s // 1/z | t | t/z | s/z
|
||||
fistpl t // 1/z | t/z | s/z
|
||||
|
||||
fadds zi16stepu
|
||||
fxch %st(2)
|
||||
fadds sdivz16stepu
|
||||
fxch %st(2)
|
||||
flds tdivz16stepu
|
||||
faddp %st(0),%st(2)
|
||||
flds fp_64k
|
||||
fdiv %st(1),%st(0) // z = 1/1/z
|
||||
// this is what we've gone to all this trouble to
|
||||
// overlap
|
||||
LFDIVInFlight1:
|
||||
|
||||
addl s,%esi
|
||||
addl t,%edx
|
||||
movl C(bbextents),%ebx
|
||||
movl C(bbextentt),%ebp
|
||||
cmpl %ebx,%esi
|
||||
ja LClampHighOrLow0
|
||||
LClampReentry0:
|
||||
movl %esi,s
|
||||
movl pbase,%ebx
|
||||
shll $16,%esi
|
||||
cmpl %ebp,%edx
|
||||
movl %esi,sfracf
|
||||
ja LClampHighOrLow1
|
||||
LClampReentry1:
|
||||
movl %edx,t
|
||||
movl s,%esi // sfrac = scans->sfrac;
|
||||
shll $16,%edx
|
||||
movl t,%eax // tfrac = scans->tfrac;
|
||||
sarl $16,%esi
|
||||
movl %edx,tfracf
|
||||
|
||||
//
|
||||
// calculate the texture starting address
|
||||
//
|
||||
sarl $16,%eax
|
||||
movl C(cachewidth),%edx
|
||||
imull %edx,%eax // (tfrac >> 16) * cachewidth
|
||||
addl %ebx,%esi
|
||||
addl %eax,%esi // psource = pbase + (sfrac >> 16) +
|
||||
// ((tfrac >> 16) * cachewidth);
|
||||
//
|
||||
// determine whether last span or not
|
||||
//
|
||||
cmpl $16,%ecx
|
||||
jna LLastSegment
|
||||
|
||||
//
|
||||
// not the last segment; do full 16-wide segment
|
||||
//
|
||||
LNotLastSegment:
|
||||
|
||||
//
|
||||
// advance s/z, t/z, and 1/z, and calculate s & t at end of span and steps to
|
||||
// get there
|
||||
//
|
||||
|
||||
// pick up after the FDIV that was left in flight previously
|
||||
|
||||
fld %st(0) // duplicate it
|
||||
fmul %st(4),%st(0) // s = s/z * z
|
||||
fxch %st(1)
|
||||
fmul %st(3),%st(0) // t = t/z * z
|
||||
fxch %st(1)
|
||||
fistpl snext
|
||||
fistpl tnext
|
||||
movl snext,%eax
|
||||
movl tnext,%edx
|
||||
|
||||
movb (%esi),%bl // get first source texel
|
||||
subl $16,%ecx // count off this segments' pixels
|
||||
movl C(sadjust),%ebp
|
||||
movl %ecx,counttemp // remember count of remaining pixels
|
||||
|
||||
movl C(tadjust),%ecx
|
||||
movb %bl,(%edi) // store first dest pixel
|
||||
|
||||
addl %eax,%ebp
|
||||
addl %edx,%ecx
|
||||
|
||||
movl C(bbextents),%eax
|
||||
movl C(bbextentt),%edx
|
||||
|
||||
cmpl $4096,%ebp
|
||||
jl LClampLow2
|
||||
cmpl %eax,%ebp
|
||||
ja LClampHigh2
|
||||
LClampReentry2:
|
||||
|
||||
cmpl $4096,%ecx
|
||||
jl LClampLow3
|
||||
cmpl %edx,%ecx
|
||||
ja LClampHigh3
|
||||
LClampReentry3:
|
||||
|
||||
movl %ebp,snext
|
||||
movl %ecx,tnext
|
||||
|
||||
subl s,%ebp
|
||||
subl t,%ecx
|
||||
|
||||
//
|
||||
// set up advancetable
|
||||
//
|
||||
movl %ecx,%eax
|
||||
movl %ebp,%edx
|
||||
sarl $20,%eax // tstep >>= 16;
|
||||
jz LZero
|
||||
sarl $20,%edx // sstep >>= 16;
|
||||
movl C(cachewidth),%ebx
|
||||
imull %ebx,%eax
|
||||
jmp LSetUp1
|
||||
|
||||
LZero:
|
||||
sarl $20,%edx // sstep >>= 16;
|
||||
movl C(cachewidth),%ebx
|
||||
|
||||
LSetUp1:
|
||||
|
||||
addl %edx,%eax // add in sstep
|
||||
// (tstep >> 16) * cachewidth + (sstep >> 16);
|
||||
movl tfracf,%edx
|
||||
movl %eax,advancetable+4 // advance base in t
|
||||
addl %ebx,%eax // ((tstep >> 16) + 1) * cachewidth +
|
||||
// (sstep >> 16);
|
||||
shll $12,%ebp // left-justify sstep fractional part
|
||||
movl sfracf,%ebx
|
||||
shll $12,%ecx // left-justify tstep fractional part
|
||||
movl %eax,advancetable // advance extra in t
|
||||
|
||||
movl %ecx,tstep
|
||||
addl %ecx,%edx // advance tfrac fractional part by tstep frac
|
||||
|
||||
sbbl %ecx,%ecx // turn tstep carry into -1 (0 if none)
|
||||
addl %ebp,%ebx // advance sfrac fractional part by sstep frac
|
||||
adcl advancetable+4(,%ecx,4),%esi // point to next source texel
|
||||
|
||||
addl tstep,%edx
|
||||
sbbl %ecx,%ecx
|
||||
movb (%esi),%al
|
||||
addl %ebp,%ebx
|
||||
movb %al,1(%edi)
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
|
||||
addl tstep,%edx
|
||||
sbbl %ecx,%ecx
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
|
||||
addl tstep,%edx
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,2(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
|
||||
addl tstep,%edx
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,3(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
|
||||
addl tstep,%edx
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,4(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
|
||||
addl tstep,%edx
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,5(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
|
||||
addl tstep,%edx
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,6(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
|
||||
addl tstep,%edx
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,7(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
|
||||
|
||||
//
|
||||
// start FDIV for end of next segment in flight, so it can overlap
|
||||
//
|
||||
movl counttemp,%ecx
|
||||
cmpl $16,%ecx // more than one segment after this?
|
||||
ja LSetupNotLast2 // yes
|
||||
|
||||
decl %ecx
|
||||
jz LFDIVInFlight2 // if only one pixel, no need to start an FDIV
|
||||
movl %ecx,spancountminus1
|
||||
fildl spancountminus1
|
||||
|
||||
flds C(d_zistepu) // C(d_zistepu) | spancountminus1
|
||||
fmul %st(1),%st(0) // C(d_zistepu)*scm1 | scm1
|
||||
flds C(d_tdivzstepu) // C(d_tdivzstepu) | C(d_zistepu)*scm1 | scm1
|
||||
fmul %st(2),%st(0) // C(d_tdivzstepu)*scm1 | C(d_zistepu)*scm1 | scm1
|
||||
fxch %st(1) // C(d_zistepu)*scm1 | C(d_tdivzstepu)*scm1 | scm1
|
||||
faddp %st(0),%st(3) // C(d_tdivzstepu)*scm1 | scm1
|
||||
fxch %st(1) // scm1 | C(d_tdivzstepu)*scm1
|
||||
fmuls C(d_sdivzstepu) // C(d_sdivzstepu)*scm1 | C(d_tdivzstepu)*scm1
|
||||
fxch %st(1) // C(d_tdivzstepu)*scm1 | C(d_sdivzstepu)*scm1
|
||||
faddp %st(0),%st(3) // C(d_sdivzstepu)*scm1
|
||||
flds fp_64k // 64k | C(d_sdivzstepu)*scm1
|
||||
fxch %st(1) // C(d_sdivzstepu)*scm1 | 64k
|
||||
faddp %st(0),%st(4) // 64k
|
||||
|
||||
fdiv %st(1),%st(0) // this is what we've gone to all this trouble to
|
||||
// overlap
|
||||
jmp LFDIVInFlight2
|
||||
|
||||
.align 4
|
||||
LSetupNotLast2:
|
||||
fadds zi16stepu
|
||||
fxch %st(2)
|
||||
fadds sdivz16stepu
|
||||
fxch %st(2)
|
||||
flds tdivz16stepu
|
||||
faddp %st(0),%st(2)
|
||||
flds fp_64k
|
||||
fdiv %st(1),%st(0) // z = 1/1/z
|
||||
// this is what we've gone to all this trouble to
|
||||
// overlap
|
||||
LFDIVInFlight2:
|
||||
movl %ecx,counttemp
|
||||
|
||||
addl tstep,%edx
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,8(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
|
||||
addl tstep,%edx
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,9(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
|
||||
addl tstep,%edx
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,10(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
|
||||
addl tstep,%edx
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,11(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
|
||||
addl tstep,%edx
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,12(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
|
||||
addl tstep,%edx
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,13(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
|
||||
addl tstep,%edx
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,14(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
|
||||
addl $16,%edi
|
||||
movl %edx,tfracf
|
||||
movl snext,%edx
|
||||
movl %ebx,sfracf
|
||||
movl tnext,%ebx
|
||||
movl %edx,s
|
||||
movl %ebx,t
|
||||
|
||||
movl counttemp,%ecx // retrieve count
|
||||
|
||||
//
|
||||
// determine whether last span or not
|
||||
//
|
||||
cmpl $16,%ecx // are there multiple segments remaining?
|
||||
movb %al,-1(%edi)
|
||||
ja LNotLastSegment // yes
|
||||
|
||||
//
|
||||
// last segment of scan
|
||||
//
|
||||
LLastSegment:
|
||||
|
||||
//
|
||||
// advance s/z, t/z, and 1/z, and calculate s & t at end of span and steps to
|
||||
// get there. The number of pixels left is variable, and we want to land on the
|
||||
// last pixel, not step one past it, so we can't run into arithmetic problems
|
||||
//
|
||||
testl %ecx,%ecx
|
||||
jz LNoSteps // just draw the last pixel and we're done
|
||||
|
||||
// pick up after the FDIV that was left in flight previously
|
||||
|
||||
|
||||
fld %st(0) // duplicate it
|
||||
fmul %st(4),%st(0) // s = s/z * z
|
||||
fxch %st(1)
|
||||
fmul %st(3),%st(0) // t = t/z * z
|
||||
fxch %st(1)
|
||||
fistpl snext
|
||||
fistpl tnext
|
||||
|
||||
movb (%esi),%al // load first texel in segment
|
||||
movl C(tadjust),%ebx
|
||||
movb %al,(%edi) // store first pixel in segment
|
||||
movl C(sadjust),%eax
|
||||
|
||||
addl snext,%eax
|
||||
addl tnext,%ebx
|
||||
|
||||
movl C(bbextents),%ebp
|
||||
movl C(bbextentt),%edx
|
||||
|
||||
cmpl $4096,%eax
|
||||
jl LClampLow4
|
||||
cmpl %ebp,%eax
|
||||
ja LClampHigh4
|
||||
LClampReentry4:
|
||||
movl %eax,snext
|
||||
|
||||
cmpl $4096,%ebx
|
||||
jl LClampLow5
|
||||
cmpl %edx,%ebx
|
||||
ja LClampHigh5
|
||||
LClampReentry5:
|
||||
|
||||
cmpl $1,%ecx // don't bother
|
||||
je LOnlyOneStep // if two pixels in segment, there's only one step,
|
||||
// of the segment length
|
||||
subl s,%eax
|
||||
subl t,%ebx
|
||||
|
||||
addl %eax,%eax // convert to 15.17 format so multiply by 1.31
|
||||
addl %ebx,%ebx // reciprocal yields 16.48
|
||||
|
||||
imull reciprocal_table_16-8(,%ecx,4) // sstep = (snext - s) /
|
||||
// (spancount-1)
|
||||
movl %edx,%ebp
|
||||
|
||||
movl %ebx,%eax
|
||||
imull reciprocal_table_16-8(,%ecx,4) // tstep = (tnext - t) /
|
||||
// (spancount-1)
|
||||
LSetEntryvec:
|
||||
//
|
||||
// set up advancetable
|
||||
//
|
||||
movl entryvec_table_16(,%ecx,4),%ebx
|
||||
movl %edx,%eax
|
||||
movl %ebx,jumptemp // entry point into code for RET later
|
||||
movl %ebp,%ecx
|
||||
sarl $16,%edx // tstep >>= 16;
|
||||
movl C(cachewidth),%ebx
|
||||
sarl $16,%ecx // sstep >>= 16;
|
||||
imull %ebx,%edx
|
||||
|
||||
addl %ecx,%edx // add in sstep
|
||||
// (tstep >> 16) * cachewidth + (sstep >> 16);
|
||||
movl tfracf,%ecx
|
||||
movl %edx,advancetable+4 // advance base in t
|
||||
addl %ebx,%edx // ((tstep >> 16) + 1) * cachewidth +
|
||||
// (sstep >> 16);
|
||||
shll $16,%ebp // left-justify sstep fractional part
|
||||
movl sfracf,%ebx
|
||||
shll $16,%eax // left-justify tstep fractional part
|
||||
movl %edx,advancetable // advance extra in t
|
||||
|
||||
movl %eax,tstep
|
||||
movl %ecx,%edx
|
||||
addl %eax,%edx
|
||||
sbbl %ecx,%ecx
|
||||
addl %ebp,%ebx
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
|
||||
jmp *jumptemp // jump to the number-of-pixels handler
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
LNoSteps:
|
||||
movb (%esi),%al // load first texel in segment
|
||||
subl $15,%edi // adjust for hardwired offset
|
||||
jmp LEndSpan
|
||||
|
||||
|
||||
LOnlyOneStep:
|
||||
subl s,%eax
|
||||
subl t,%ebx
|
||||
movl %eax,%ebp
|
||||
movl %ebx,%edx
|
||||
jmp LSetEntryvec
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
.globl Entry2_16, Entry3_16, Entry4_16, Entry5_16
|
||||
.globl Entry6_16, Entry7_16, Entry8_16, Entry9_16
|
||||
.globl Entry10_16, Entry11_16, Entry12_16, Entry13_16
|
||||
.globl Entry14_16, Entry15_16, Entry16_16
|
||||
|
||||
Entry2_16:
|
||||
subl $14,%edi // adjust for hardwired offsets
|
||||
movb (%esi),%al
|
||||
jmp LEntry2_16
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
Entry3_16:
|
||||
subl $13,%edi // adjust for hardwired offsets
|
||||
addl %eax,%edx
|
||||
movb (%esi),%al
|
||||
sbbl %ecx,%ecx
|
||||
addl %ebp,%ebx
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
jmp LEntry3_16
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
Entry4_16:
|
||||
subl $12,%edi // adjust for hardwired offsets
|
||||
addl %eax,%edx
|
||||
movb (%esi),%al
|
||||
sbbl %ecx,%ecx
|
||||
addl %ebp,%ebx
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
jmp LEntry4_16
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
Entry5_16:
|
||||
subl $11,%edi // adjust for hardwired offsets
|
||||
addl %eax,%edx
|
||||
movb (%esi),%al
|
||||
sbbl %ecx,%ecx
|
||||
addl %ebp,%ebx
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
jmp LEntry5_16
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
Entry6_16:
|
||||
subl $10,%edi // adjust for hardwired offsets
|
||||
addl %eax,%edx
|
||||
movb (%esi),%al
|
||||
sbbl %ecx,%ecx
|
||||
addl %ebp,%ebx
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
jmp LEntry6_16
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
Entry7_16:
|
||||
subl $9,%edi // adjust for hardwired offsets
|
||||
addl %eax,%edx
|
||||
movb (%esi),%al
|
||||
sbbl %ecx,%ecx
|
||||
addl %ebp,%ebx
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
jmp LEntry7_16
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
Entry8_16:
|
||||
subl $8,%edi // adjust for hardwired offsets
|
||||
addl %eax,%edx
|
||||
movb (%esi),%al
|
||||
sbbl %ecx,%ecx
|
||||
addl %ebp,%ebx
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
jmp LEntry8_16
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
Entry9_16:
|
||||
subl $7,%edi // adjust for hardwired offsets
|
||||
addl %eax,%edx
|
||||
movb (%esi),%al
|
||||
sbbl %ecx,%ecx
|
||||
addl %ebp,%ebx
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
jmp LEntry9_16
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
Entry10_16:
|
||||
subl $6,%edi // adjust for hardwired offsets
|
||||
addl %eax,%edx
|
||||
movb (%esi),%al
|
||||
sbbl %ecx,%ecx
|
||||
addl %ebp,%ebx
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
jmp LEntry10_16
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
Entry11_16:
|
||||
subl $5,%edi // adjust for hardwired offsets
|
||||
addl %eax,%edx
|
||||
movb (%esi),%al
|
||||
sbbl %ecx,%ecx
|
||||
addl %ebp,%ebx
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
jmp LEntry11_16
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
Entry12_16:
|
||||
subl $4,%edi // adjust for hardwired offsets
|
||||
addl %eax,%edx
|
||||
movb (%esi),%al
|
||||
sbbl %ecx,%ecx
|
||||
addl %ebp,%ebx
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
jmp LEntry12_16
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
Entry13_16:
|
||||
subl $3,%edi // adjust for hardwired offsets
|
||||
addl %eax,%edx
|
||||
movb (%esi),%al
|
||||
sbbl %ecx,%ecx
|
||||
addl %ebp,%ebx
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
jmp LEntry13_16
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
Entry14_16:
|
||||
subl $2,%edi // adjust for hardwired offsets
|
||||
addl %eax,%edx
|
||||
movb (%esi),%al
|
||||
sbbl %ecx,%ecx
|
||||
addl %ebp,%ebx
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
jmp LEntry14_16
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
Entry15_16:
|
||||
decl %edi // adjust for hardwired offsets
|
||||
addl %eax,%edx
|
||||
movb (%esi),%al
|
||||
sbbl %ecx,%ecx
|
||||
addl %ebp,%ebx
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
jmp LEntry15_16
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
Entry16_16:
|
||||
addl %eax,%edx
|
||||
movb (%esi),%al
|
||||
sbbl %ecx,%ecx
|
||||
addl %ebp,%ebx
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
|
||||
addl tstep,%edx
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,1(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
LEntry15_16:
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,2(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
LEntry14_16:
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,3(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
LEntry13_16:
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,4(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
LEntry12_16:
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,5(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
LEntry11_16:
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,6(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
LEntry10_16:
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,7(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
LEntry9_16:
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,8(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
LEntry8_16:
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,9(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
LEntry7_16:
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,10(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
LEntry6_16:
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,11(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
LEntry5_16:
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,12(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
addl tstep,%edx
|
||||
LEntry4_16:
|
||||
sbbl %ecx,%ecx
|
||||
movb %al,13(%edi)
|
||||
addl %ebp,%ebx
|
||||
movb (%esi),%al
|
||||
adcl advancetable+4(,%ecx,4),%esi
|
||||
LEntry3_16:
|
||||
movb %al,14(%edi)
|
||||
movb (%esi),%al
|
||||
LEntry2_16:
|
||||
|
||||
LEndSpan:
|
||||
|
||||
//
|
||||
// clear s/z, t/z, 1/z from FP stack
|
||||
//
|
||||
fstp %st(0)
|
||||
fstp %st(0)
|
||||
fstp %st(0)
|
||||
|
||||
movl pspantemp,%ebx // restore spans pointer
|
||||
movl espan_t_pnext(%ebx),%ebx // point to next span
|
||||
testl %ebx,%ebx // any more spans?
|
||||
movb %al,15(%edi)
|
||||
jnz LSpanLoop // more spans
|
||||
|
||||
popl %ebx // restore register variables
|
||||
popl %esi
|
||||
popl %edi
|
||||
popl %ebp // restore the caller's stack frame
|
||||
ret
|
||||
|
||||
#endif // id386
|
||||
331
WinQuake/d_edge.c
Normal file
331
WinQuake/d_edge.c
Normal file
@@ -0,0 +1,331 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// d_edge.c
|
||||
|
||||
#include "quakedef.h"
|
||||
#include "d_local.h"
|
||||
|
||||
static int miplevel;
|
||||
|
||||
float scale_for_mip;
|
||||
int screenwidth;
|
||||
int ubasestep, errorterm, erroradjustup, erroradjustdown;
|
||||
int vstartscan;
|
||||
|
||||
// FIXME: should go away
|
||||
extern void R_RotateBmodel (void);
|
||||
extern void R_TransformFrustum (void);
|
||||
|
||||
vec3_t transformed_modelorg;
|
||||
|
||||
/*
|
||||
==============
|
||||
D_DrawPoly
|
||||
|
||||
==============
|
||||
*/
|
||||
void D_DrawPoly (void)
|
||||
{
|
||||
// this driver takes spans, not polygons
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
=============
|
||||
D_MipLevelForScale
|
||||
=============
|
||||
*/
|
||||
int D_MipLevelForScale (float scale)
|
||||
{
|
||||
int lmiplevel;
|
||||
|
||||
if (scale >= d_scalemip[0] )
|
||||
lmiplevel = 0;
|
||||
else if (scale >= d_scalemip[1] )
|
||||
lmiplevel = 1;
|
||||
else if (scale >= d_scalemip[2] )
|
||||
lmiplevel = 2;
|
||||
else
|
||||
lmiplevel = 3;
|
||||
|
||||
if (lmiplevel < d_minmip)
|
||||
lmiplevel = d_minmip;
|
||||
|
||||
return lmiplevel;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==============
|
||||
D_DrawSolidSurface
|
||||
==============
|
||||
*/
|
||||
|
||||
// FIXME: clean this up
|
||||
|
||||
void D_DrawSolidSurface (surf_t *surf, int color)
|
||||
{
|
||||
espan_t *span;
|
||||
byte *pdest;
|
||||
int u, u2, pix;
|
||||
|
||||
pix = (color<<24) | (color<<16) | (color<<8) | color;
|
||||
for (span=surf->spans ; span ; span=span->pnext)
|
||||
{
|
||||
pdest = (byte *)d_viewbuffer + screenwidth*span->v;
|
||||
u = span->u;
|
||||
u2 = span->u + span->count - 1;
|
||||
((byte *)pdest)[u] = pix;
|
||||
|
||||
if (u2 - u < 8)
|
||||
{
|
||||
for (u++ ; u <= u2 ; u++)
|
||||
((byte *)pdest)[u] = pix;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (u++ ; u & 3 ; u++)
|
||||
((byte *)pdest)[u] = pix;
|
||||
|
||||
u2 -= 4;
|
||||
for ( ; u <= u2 ; u+=4)
|
||||
*(int *)((byte *)pdest + u) = pix;
|
||||
u2 += 4;
|
||||
for ( ; u <= u2 ; u++)
|
||||
((byte *)pdest)[u] = pix;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==============
|
||||
D_CalcGradients
|
||||
==============
|
||||
*/
|
||||
void D_CalcGradients (msurface_t *pface)
|
||||
{
|
||||
mplane_t *pplane;
|
||||
float mipscale;
|
||||
vec3_t p_temp1;
|
||||
vec3_t p_saxis, p_taxis;
|
||||
float t;
|
||||
|
||||
pplane = pface->plane;
|
||||
|
||||
mipscale = 1.0 / (float)(1 << miplevel);
|
||||
|
||||
TransformVector (pface->texinfo->vecs[0], p_saxis);
|
||||
TransformVector (pface->texinfo->vecs[1], p_taxis);
|
||||
|
||||
t = xscaleinv * mipscale;
|
||||
d_sdivzstepu = p_saxis[0] * t;
|
||||
d_tdivzstepu = p_taxis[0] * t;
|
||||
|
||||
t = yscaleinv * mipscale;
|
||||
d_sdivzstepv = -p_saxis[1] * t;
|
||||
d_tdivzstepv = -p_taxis[1] * t;
|
||||
|
||||
d_sdivzorigin = p_saxis[2] * mipscale - xcenter * d_sdivzstepu -
|
||||
ycenter * d_sdivzstepv;
|
||||
d_tdivzorigin = p_taxis[2] * mipscale - xcenter * d_tdivzstepu -
|
||||
ycenter * d_tdivzstepv;
|
||||
|
||||
VectorScale (transformed_modelorg, mipscale, p_temp1);
|
||||
|
||||
t = 0x10000*mipscale;
|
||||
sadjust = ((fixed16_t)(DotProduct (p_temp1, p_saxis) * 0x10000 + 0.5)) -
|
||||
((pface->texturemins[0] << 16) >> miplevel)
|
||||
+ pface->texinfo->vecs[0][3]*t;
|
||||
tadjust = ((fixed16_t)(DotProduct (p_temp1, p_taxis) * 0x10000 + 0.5)) -
|
||||
((pface->texturemins[1] << 16) >> miplevel)
|
||||
+ pface->texinfo->vecs[1][3]*t;
|
||||
|
||||
//
|
||||
// -1 (-epsilon) so we never wander off the edge of the texture
|
||||
//
|
||||
bbextents = ((pface->extents[0] << 16) >> miplevel) - 1;
|
||||
bbextentt = ((pface->extents[1] << 16) >> miplevel) - 1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==============
|
||||
D_DrawSurfaces
|
||||
==============
|
||||
*/
|
||||
void D_DrawSurfaces (void)
|
||||
{
|
||||
surf_t *s;
|
||||
msurface_t *pface;
|
||||
surfcache_t *pcurrentcache;
|
||||
vec3_t world_transformed_modelorg;
|
||||
vec3_t local_modelorg;
|
||||
|
||||
currententity = &cl_entities[0];
|
||||
TransformVector (modelorg, transformed_modelorg);
|
||||
VectorCopy (transformed_modelorg, world_transformed_modelorg);
|
||||
|
||||
// TODO: could preset a lot of this at mode set time
|
||||
if (r_drawflat.value)
|
||||
{
|
||||
for (s = &surfaces[1] ; s<surface_p ; s++)
|
||||
{
|
||||
if (!s->spans)
|
||||
continue;
|
||||
|
||||
d_zistepu = s->d_zistepu;
|
||||
d_zistepv = s->d_zistepv;
|
||||
d_ziorigin = s->d_ziorigin;
|
||||
|
||||
D_DrawSolidSurface (s, (int)s->data & 0xFF);
|
||||
D_DrawZSpans (s->spans);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (s = &surfaces[1] ; s<surface_p ; s++)
|
||||
{
|
||||
if (!s->spans)
|
||||
continue;
|
||||
|
||||
r_drawnpolycount++;
|
||||
|
||||
d_zistepu = s->d_zistepu;
|
||||
d_zistepv = s->d_zistepv;
|
||||
d_ziorigin = s->d_ziorigin;
|
||||
|
||||
if (s->flags & SURF_DRAWSKY)
|
||||
{
|
||||
if (!r_skymade)
|
||||
{
|
||||
R_MakeSky ();
|
||||
}
|
||||
|
||||
D_DrawSkyScans8 (s->spans);
|
||||
D_DrawZSpans (s->spans);
|
||||
}
|
||||
else if (s->flags & SURF_DRAWBACKGROUND)
|
||||
{
|
||||
// set up a gradient for the background surface that places it
|
||||
// effectively at infinity distance from the viewpoint
|
||||
d_zistepu = 0;
|
||||
d_zistepv = 0;
|
||||
d_ziorigin = -0.9;
|
||||
|
||||
D_DrawSolidSurface (s, (int)r_clearcolor.value & 0xFF);
|
||||
D_DrawZSpans (s->spans);
|
||||
}
|
||||
else if (s->flags & SURF_DRAWTURB)
|
||||
{
|
||||
pface = s->data;
|
||||
miplevel = 0;
|
||||
cacheblock = (pixel_t *)
|
||||
((byte *)pface->texinfo->texture +
|
||||
pface->texinfo->texture->offsets[0]);
|
||||
cachewidth = 64;
|
||||
|
||||
if (s->insubmodel)
|
||||
{
|
||||
// FIXME: we don't want to do all this for every polygon!
|
||||
// TODO: store once at start of frame
|
||||
currententity = s->entity; //FIXME: make this passed in to
|
||||
// R_RotateBmodel ()
|
||||
VectorSubtract (r_origin, currententity->origin,
|
||||
local_modelorg);
|
||||
TransformVector (local_modelorg, transformed_modelorg);
|
||||
|
||||
R_RotateBmodel (); // FIXME: don't mess with the frustum,
|
||||
// make entity passed in
|
||||
}
|
||||
|
||||
D_CalcGradients (pface);
|
||||
Turbulent8 (s->spans);
|
||||
D_DrawZSpans (s->spans);
|
||||
|
||||
if (s->insubmodel)
|
||||
{
|
||||
//
|
||||
// restore the old drawing state
|
||||
// FIXME: we don't want to do this every time!
|
||||
// TODO: speed up
|
||||
//
|
||||
currententity = &cl_entities[0];
|
||||
VectorCopy (world_transformed_modelorg,
|
||||
transformed_modelorg);
|
||||
VectorCopy (base_vpn, vpn);
|
||||
VectorCopy (base_vup, vup);
|
||||
VectorCopy (base_vright, vright);
|
||||
VectorCopy (base_modelorg, modelorg);
|
||||
R_TransformFrustum ();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (s->insubmodel)
|
||||
{
|
||||
// FIXME: we don't want to do all this for every polygon!
|
||||
// TODO: store once at start of frame
|
||||
currententity = s->entity; //FIXME: make this passed in to
|
||||
// R_RotateBmodel ()
|
||||
VectorSubtract (r_origin, currententity->origin, local_modelorg);
|
||||
TransformVector (local_modelorg, transformed_modelorg);
|
||||
|
||||
R_RotateBmodel (); // FIXME: don't mess with the frustum,
|
||||
// make entity passed in
|
||||
}
|
||||
|
||||
pface = s->data;
|
||||
miplevel = D_MipLevelForScale (s->nearzi * scale_for_mip
|
||||
* pface->texinfo->mipadjust);
|
||||
|
||||
// FIXME: make this passed in to D_CacheSurface
|
||||
pcurrentcache = D_CacheSurface (pface, miplevel);
|
||||
|
||||
cacheblock = (pixel_t *)pcurrentcache->data;
|
||||
cachewidth = pcurrentcache->width;
|
||||
|
||||
D_CalcGradients (pface);
|
||||
|
||||
(*d_drawspans) (s->spans);
|
||||
|
||||
D_DrawZSpans (s->spans);
|
||||
|
||||
if (s->insubmodel)
|
||||
{
|
||||
//
|
||||
// restore the old drawing state
|
||||
// FIXME: we don't want to do this every time!
|
||||
// TODO: speed up
|
||||
//
|
||||
currententity = &cl_entities[0];
|
||||
VectorCopy (world_transformed_modelorg,
|
||||
transformed_modelorg);
|
||||
VectorCopy (base_vpn, vpn);
|
||||
VectorCopy (base_vup, vup);
|
||||
VectorCopy (base_vright, vright);
|
||||
VectorCopy (base_modelorg, modelorg);
|
||||
R_TransformFrustum ();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
88
WinQuake/d_fill.c
Normal file
88
WinQuake/d_fill.c
Normal file
@@ -0,0 +1,88 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// d_clear: clears a specified rectangle to the specified color
|
||||
|
||||
#include "quakedef.h"
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
D_FillRect
|
||||
================
|
||||
*/
|
||||
void D_FillRect (vrect_t *rect, int color)
|
||||
{
|
||||
int rx, ry, rwidth, rheight;
|
||||
unsigned char *dest;
|
||||
unsigned *ldest;
|
||||
|
||||
rx = rect->x;
|
||||
ry = rect->y;
|
||||
rwidth = rect->width;
|
||||
rheight = rect->height;
|
||||
|
||||
if (rx < 0)
|
||||
{
|
||||
rwidth += rx;
|
||||
rx = 0;
|
||||
}
|
||||
if (ry < 0)
|
||||
{
|
||||
rheight += ry;
|
||||
ry = 0;
|
||||
}
|
||||
if (rx+rwidth > vid.width)
|
||||
rwidth = vid.width - rx;
|
||||
if (ry+rheight > vid.height)
|
||||
rheight = vid.height - rx;
|
||||
|
||||
if (rwidth < 1 || rheight < 1)
|
||||
return;
|
||||
|
||||
dest = ((byte *)vid.buffer + ry*vid.rowbytes + rx);
|
||||
|
||||
if (((rwidth & 0x03) == 0) && (((long)dest & 0x03) == 0))
|
||||
{
|
||||
// faster aligned dword clear
|
||||
ldest = (unsigned *)dest;
|
||||
color += color << 16;
|
||||
|
||||
rwidth >>= 2;
|
||||
color += color << 8;
|
||||
|
||||
for (ry=0 ; ry<rheight ; ry++)
|
||||
{
|
||||
for (rx=0 ; rx<rwidth ; rx++)
|
||||
ldest[rx] = color;
|
||||
ldest = (unsigned *)((byte*)ldest + vid.rowbytes);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// slower byte-by-byte clear for unaligned cases
|
||||
for (ry=0 ; ry<rheight ; ry++)
|
||||
{
|
||||
for (rx=0 ; rx<rwidth ; rx++)
|
||||
dest[rx] = color;
|
||||
dest += vid.rowbytes;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
229
WinQuake/d_iface.h
Normal file
229
WinQuake/d_iface.h
Normal file
@@ -0,0 +1,229 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// d_iface.h: interface header file for rasterization driver modules
|
||||
|
||||
#define WARP_WIDTH 320
|
||||
#define WARP_HEIGHT 200
|
||||
|
||||
#define MAX_LBM_HEIGHT 480
|
||||
|
||||
typedef struct
|
||||
{
|
||||
float u, v;
|
||||
float s, t;
|
||||
float zi;
|
||||
} emitpoint_t;
|
||||
|
||||
typedef enum {
|
||||
pt_static, pt_grav, pt_slowgrav, pt_fire, pt_explode, pt_explode2, pt_blob, pt_blob2
|
||||
} ptype_t;
|
||||
|
||||
// !!! if this is changed, it must be changed in d_ifacea.h too !!!
|
||||
typedef struct particle_s
|
||||
{
|
||||
// driver-usable fields
|
||||
vec3_t org;
|
||||
float color;
|
||||
// drivers never touch the following fields
|
||||
struct particle_s *next;
|
||||
vec3_t vel;
|
||||
float ramp;
|
||||
float die;
|
||||
ptype_t type;
|
||||
} particle_t;
|
||||
|
||||
#define PARTICLE_Z_CLIP 8.0
|
||||
|
||||
typedef struct polyvert_s {
|
||||
float u, v, zi, s, t;
|
||||
} polyvert_t;
|
||||
|
||||
typedef struct polydesc_s {
|
||||
int numverts;
|
||||
float nearzi;
|
||||
msurface_t *pcurrentface;
|
||||
polyvert_t *pverts;
|
||||
} polydesc_t;
|
||||
|
||||
// !!! if this is changed, it must be changed in d_ifacea.h too !!!
|
||||
typedef struct finalvert_s {
|
||||
int v[6]; // u, v, s, t, l, 1/z
|
||||
int flags;
|
||||
float reserved;
|
||||
} finalvert_t;
|
||||
|
||||
// !!! if this is changed, it must be changed in d_ifacea.h too !!!
|
||||
typedef struct
|
||||
{
|
||||
void *pskin;
|
||||
maliasskindesc_t *pskindesc;
|
||||
int skinwidth;
|
||||
int skinheight;
|
||||
mtriangle_t *ptriangles;
|
||||
finalvert_t *pfinalverts;
|
||||
int numtriangles;
|
||||
int drawtype;
|
||||
int seamfixupX16;
|
||||
} affinetridesc_t;
|
||||
|
||||
// !!! if this is changed, it must be changed in d_ifacea.h too !!!
|
||||
typedef struct {
|
||||
float u, v, zi, color;
|
||||
} screenpart_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int nump;
|
||||
emitpoint_t *pverts; // there's room for an extra element at [nump],
|
||||
// if the driver wants to duplicate element [0] at
|
||||
// element [nump] to avoid dealing with wrapping
|
||||
mspriteframe_t *pspriteframe;
|
||||
vec3_t vup, vright, vpn; // in worldspace
|
||||
float nearzi;
|
||||
} spritedesc_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int u, v;
|
||||
float zi;
|
||||
int color;
|
||||
} zpointdesc_t;
|
||||
|
||||
extern cvar_t r_drawflat;
|
||||
extern int d_spanpixcount;
|
||||
extern int r_framecount; // sequence # of current frame since Quake
|
||||
// started
|
||||
extern qboolean r_drawpolys; // 1 if driver wants clipped polygons
|
||||
// rather than a span list
|
||||
extern qboolean r_drawculledpolys; // 1 if driver wants clipped polygons that
|
||||
// have been culled by the edge list
|
||||
extern qboolean r_worldpolysbacktofront; // 1 if driver wants polygons
|
||||
// delivered back to front rather
|
||||
// than front to back
|
||||
extern qboolean r_recursiveaffinetriangles; // true if a driver wants to use
|
||||
// recursive triangular subdivison
|
||||
// and vertex drawing via
|
||||
// D_PolysetDrawFinalVerts() past
|
||||
// a certain distance (normally
|
||||
// only used by the software
|
||||
// driver)
|
||||
extern float r_aliasuvscale; // scale-up factor for screen u and v
|
||||
// on Alias vertices passed to driver
|
||||
extern int r_pixbytes;
|
||||
extern qboolean r_dowarp;
|
||||
|
||||
extern affinetridesc_t r_affinetridesc;
|
||||
extern spritedesc_t r_spritedesc;
|
||||
extern zpointdesc_t r_zpointdesc;
|
||||
extern polydesc_t r_polydesc;
|
||||
|
||||
extern int d_con_indirect; // if 0, Quake will draw console directly
|
||||
// to vid.buffer; if 1, Quake will
|
||||
// draw console via D_DrawRect. Must be
|
||||
// defined by driver
|
||||
|
||||
extern vec3_t r_pright, r_pup, r_ppn;
|
||||
|
||||
|
||||
void D_Aff8Patch (void *pcolormap);
|
||||
void D_BeginDirectRect (int x, int y, byte *pbitmap, int width, int height);
|
||||
void D_DisableBackBufferAccess (void);
|
||||
void D_EndDirectRect (int x, int y, int width, int height);
|
||||
void D_PolysetDraw (void);
|
||||
void D_PolysetDrawFinalVerts (finalvert_t *fv, int numverts);
|
||||
void D_DrawParticle (particle_t *pparticle);
|
||||
void D_DrawPoly (void);
|
||||
void D_DrawSprite (void);
|
||||
void D_DrawSurfaces (void);
|
||||
void D_DrawZPoint (void);
|
||||
void D_EnableBackBufferAccess (void);
|
||||
void D_EndParticles (void);
|
||||
void D_Init (void);
|
||||
void D_ViewChanged (void);
|
||||
void D_SetupFrame (void);
|
||||
void D_StartParticles (void);
|
||||
void D_TurnZOn (void);
|
||||
void D_WarpScreen (void);
|
||||
|
||||
void D_FillRect (vrect_t *vrect, int color);
|
||||
void D_DrawRect (void);
|
||||
void D_UpdateRects (vrect_t *prect);
|
||||
|
||||
// currently for internal use only, and should be a do-nothing function in
|
||||
// hardware drivers
|
||||
// FIXME: this should go away
|
||||
void D_PolysetUpdateTables (void);
|
||||
|
||||
// these are currently for internal use only, and should not be used by drivers
|
||||
extern int r_skydirect;
|
||||
extern byte *r_skysource;
|
||||
|
||||
// transparency types for D_DrawRect ()
|
||||
#define DR_SOLID 0
|
||||
#define DR_TRANSPARENT 1
|
||||
|
||||
// !!! must be kept the same as in quakeasm.h !!!
|
||||
#define TRANSPARENT_COLOR 0xFF
|
||||
|
||||
extern void *acolormap; // FIXME: should go away
|
||||
|
||||
//=======================================================================//
|
||||
|
||||
// callbacks to Quake
|
||||
|
||||
typedef struct
|
||||
{
|
||||
pixel_t *surfdat; // destination for generated surface
|
||||
int rowbytes; // destination logical width in bytes
|
||||
msurface_t *surf; // description for surface to generate
|
||||
fixed8_t lightadj[MAXLIGHTMAPS];
|
||||
// adjust for lightmap levels for dynamic lighting
|
||||
texture_t *texture; // corrected for animating textures
|
||||
int surfmip; // mipmapped ratio of surface texels / world pixels
|
||||
int surfwidth; // in mipmapped texels
|
||||
int surfheight; // in mipmapped texels
|
||||
} drawsurf_t;
|
||||
|
||||
extern drawsurf_t r_drawsurf;
|
||||
|
||||
void R_DrawSurface (void);
|
||||
void R_GenTile (msurface_t *psurf, void *pdest);
|
||||
|
||||
|
||||
// !!! if this is changed, it must be changed in d_ifacea.h too !!!
|
||||
#define TURB_TEX_SIZE 64 // base turbulent texture size
|
||||
|
||||
// !!! if this is changed, it must be changed in d_ifacea.h too !!!
|
||||
#define CYCLE 128 // turbulent cycle size
|
||||
|
||||
#define TILE_SIZE 128 // size of textures generated by R_GenTiledSurf
|
||||
|
||||
#define SKYSHIFT 7
|
||||
#define SKYSIZE (1 << SKYSHIFT)
|
||||
#define SKYMASK (SKYSIZE - 1)
|
||||
|
||||
extern float skyspeed, skyspeed2;
|
||||
extern float skytime;
|
||||
|
||||
extern int c_surf;
|
||||
extern vrect_t scr_vrect;
|
||||
|
||||
extern byte *r_warpbuffer;
|
||||
|
||||
98
WinQuake/d_ifacea.h
Normal file
98
WinQuake/d_ifacea.h
Normal file
@@ -0,0 +1,98 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
//
|
||||
// d_ifacea.h
|
||||
//
|
||||
// Include file for asm driver interface.
|
||||
//
|
||||
|
||||
//
|
||||
// !!! note that this file must match the corresponding C structures in
|
||||
// d_iface.h at all times !!!
|
||||
//
|
||||
|
||||
// !!! if this is changed, it must be changed in r_shared.h too !!!
|
||||
#define ALIAS_ONSEAM 0x0020
|
||||
|
||||
// !!! if this is changed, it must be changed in d_iface.h too !!!
|
||||
#define TURB_TEX_SIZE 64 // base turbulent texture size
|
||||
|
||||
// !!! if this is changed, it must be changed in d_iface.h too !!!
|
||||
#define CYCLE 128
|
||||
|
||||
// !!! if this is changed, it must be changed in r_shared.h too !!!
|
||||
#define MAXHEIGHT 1024
|
||||
|
||||
// !!! if this is changed, it must be changed in quakedef.h too !!!
|
||||
#define CACHE_SIZE 32 // used to align key data structures
|
||||
|
||||
// particle_t structure
|
||||
// !!! if this is changed, it must be changed in d_iface.h too !!!
|
||||
// driver-usable fields
|
||||
#define pt_org 0
|
||||
#define pt_color 12
|
||||
// drivers never touch the following fields
|
||||
#define pt_next 16
|
||||
#define pt_vel 20
|
||||
#define pt_ramp 32
|
||||
#define pt_die 36
|
||||
#define pt_type 40
|
||||
#define pt_size 44
|
||||
|
||||
#define PARTICLE_Z_CLIP 8.0
|
||||
|
||||
// finalvert_t structure
|
||||
// !!! if this is changed, it must be changed in d_iface.h too !!!
|
||||
#define fv_v 0 // !!! if this is moved, cases where the !!!
|
||||
// !!! address of this field is pushed in !!!
|
||||
// !!! d_polysa.s must be changed !!!
|
||||
#define fv_flags 24
|
||||
#define fv_reserved 28
|
||||
#define fv_size 32
|
||||
#define fv_shift 5
|
||||
|
||||
|
||||
// stvert_t structure
|
||||
// !!! if this is changed, it must be changed in modelgen.h too !!!
|
||||
#define stv_onseam 0
|
||||
#define stv_s 4
|
||||
#define stv_t 8
|
||||
#define stv_size 12
|
||||
|
||||
|
||||
// trivertx_t structure
|
||||
// !!! if this is changed, it must be changed in modelgen.h too !!!
|
||||
#define tv_v 0
|
||||
#define tv_lightnormalindex 3
|
||||
#define tv_size 4
|
||||
|
||||
// affinetridesc_t structure
|
||||
// !!! if this is changed, it must be changed in d_iface.h too !!!
|
||||
#define atd_pskin 0
|
||||
#define atd_pskindesc 4
|
||||
#define atd_skinwidth 8
|
||||
#define atd_skinheight 12
|
||||
#define atd_ptriangles 16
|
||||
#define atd_pfinalverts 20
|
||||
#define atd_numtriangles 24
|
||||
#define atd_drawtype 28
|
||||
#define atd_seamfixupX16 32
|
||||
#define atd_size 36
|
||||
|
||||
173
WinQuake/d_init.c
Normal file
173
WinQuake/d_init.c
Normal file
@@ -0,0 +1,173 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// d_init.c: rasterization driver initialization
|
||||
|
||||
#include "quakedef.h"
|
||||
#include "d_local.h"
|
||||
|
||||
#define NUM_MIPS 4
|
||||
|
||||
cvar_t d_subdiv16 = {"d_subdiv16", "1"};
|
||||
cvar_t d_mipcap = {"d_mipcap", "0"};
|
||||
cvar_t d_mipscale = {"d_mipscale", "1"};
|
||||
|
||||
surfcache_t *d_initial_rover;
|
||||
qboolean d_roverwrapped;
|
||||
int d_minmip;
|
||||
float d_scalemip[NUM_MIPS-1];
|
||||
|
||||
static float basemip[NUM_MIPS-1] = {1.0, 0.5*0.8, 0.25*0.8};
|
||||
|
||||
extern int d_aflatcolor;
|
||||
|
||||
void (*d_drawspans) (espan_t *pspan);
|
||||
|
||||
|
||||
/*
|
||||
===============
|
||||
D_Init
|
||||
===============
|
||||
*/
|
||||
void D_Init (void)
|
||||
{
|
||||
|
||||
r_skydirect = 1;
|
||||
|
||||
Cvar_RegisterVariable (&d_subdiv16);
|
||||
Cvar_RegisterVariable (&d_mipcap);
|
||||
Cvar_RegisterVariable (&d_mipscale);
|
||||
|
||||
r_drawpolys = false;
|
||||
r_worldpolysbacktofront = false;
|
||||
r_recursiveaffinetriangles = true;
|
||||
r_pixbytes = 1;
|
||||
r_aliasuvscale = 1.0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
===============
|
||||
D_CopyRects
|
||||
===============
|
||||
*/
|
||||
void D_CopyRects (vrect_t *prects, int transparent)
|
||||
{
|
||||
|
||||
// this function is only required if the CPU doesn't have direct access to the
|
||||
// back buffer, and there's some driver interface function that the driver
|
||||
// doesn't support and requires Quake to do in software (such as drawing the
|
||||
// console); Quake will then draw into wherever the driver points vid.buffer
|
||||
// and will call this function before swapping buffers
|
||||
|
||||
UNUSED(prects);
|
||||
UNUSED(transparent);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
===============
|
||||
D_EnableBackBufferAccess
|
||||
===============
|
||||
*/
|
||||
void D_EnableBackBufferAccess (void)
|
||||
{
|
||||
VID_LockBuffer ();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
===============
|
||||
D_TurnZOn
|
||||
===============
|
||||
*/
|
||||
void D_TurnZOn (void)
|
||||
{
|
||||
// not needed for software version
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
===============
|
||||
D_DisableBackBufferAccess
|
||||
===============
|
||||
*/
|
||||
void D_DisableBackBufferAccess (void)
|
||||
{
|
||||
VID_UnlockBuffer ();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
===============
|
||||
D_SetupFrame
|
||||
===============
|
||||
*/
|
||||
void D_SetupFrame (void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (r_dowarp)
|
||||
d_viewbuffer = r_warpbuffer;
|
||||
else
|
||||
d_viewbuffer = (void *)(byte *)vid.buffer;
|
||||
|
||||
if (r_dowarp)
|
||||
screenwidth = WARP_WIDTH;
|
||||
else
|
||||
screenwidth = vid.rowbytes;
|
||||
|
||||
d_roverwrapped = false;
|
||||
d_initial_rover = sc_rover;
|
||||
|
||||
d_minmip = d_mipcap.value;
|
||||
if (d_minmip > 3)
|
||||
d_minmip = 3;
|
||||
else if (d_minmip < 0)
|
||||
d_minmip = 0;
|
||||
|
||||
for (i=0 ; i<(NUM_MIPS-1) ; i++)
|
||||
d_scalemip[i] = basemip[i] * d_mipscale.value;
|
||||
|
||||
#if id386
|
||||
if (d_subdiv16.value)
|
||||
d_drawspans = D_DrawSpans16;
|
||||
else
|
||||
d_drawspans = D_DrawSpans8;
|
||||
#else
|
||||
d_drawspans = D_DrawSpans8;
|
||||
#endif
|
||||
|
||||
d_aflatcolor = 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
===============
|
||||
D_UpdateRects
|
||||
===============
|
||||
*/
|
||||
void D_UpdateRects (vrect_t *prect)
|
||||
{
|
||||
|
||||
// the software driver draws these directly to the vid buffer
|
||||
|
||||
UNUSED(prect);
|
||||
}
|
||||
|
||||
111
WinQuake/d_local.h
Normal file
111
WinQuake/d_local.h
Normal file
@@ -0,0 +1,111 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// d_local.h: private rasterization driver defs
|
||||
|
||||
#include "r_shared.h"
|
||||
|
||||
//
|
||||
// TODO: fine-tune this; it's based on providing some overage even if there
|
||||
// is a 2k-wide scan, with subdivision every 8, for 256 spans of 12 bytes each
|
||||
//
|
||||
#define SCANBUFFERPAD 0x1000
|
||||
|
||||
#define R_SKY_SMASK 0x007F0000
|
||||
#define R_SKY_TMASK 0x007F0000
|
||||
|
||||
#define DS_SPAN_LIST_END -128
|
||||
|
||||
#define SURFCACHE_SIZE_AT_320X200 600*1024
|
||||
|
||||
typedef struct surfcache_s
|
||||
{
|
||||
struct surfcache_s *next;
|
||||
struct surfcache_s **owner; // NULL is an empty chunk of memory
|
||||
int lightadj[MAXLIGHTMAPS]; // checked for strobe flush
|
||||
int dlight;
|
||||
int size; // including header
|
||||
unsigned width;
|
||||
unsigned height; // DEBUG only needed for debug
|
||||
float mipscale;
|
||||
struct texture_s *texture; // checked for animating textures
|
||||
byte data[4]; // width*height elements
|
||||
} surfcache_t;
|
||||
|
||||
// !!! if this is changed, it must be changed in asm_draw.h too !!!
|
||||
typedef struct sspan_s
|
||||
{
|
||||
int u, v, count;
|
||||
} sspan_t;
|
||||
|
||||
extern cvar_t d_subdiv16;
|
||||
|
||||
extern float scale_for_mip;
|
||||
|
||||
extern qboolean d_roverwrapped;
|
||||
extern surfcache_t *sc_rover;
|
||||
extern surfcache_t *d_initial_rover;
|
||||
|
||||
extern float d_sdivzstepu, d_tdivzstepu, d_zistepu;
|
||||
extern float d_sdivzstepv, d_tdivzstepv, d_zistepv;
|
||||
extern float d_sdivzorigin, d_tdivzorigin, d_ziorigin;
|
||||
|
||||
fixed16_t sadjust, tadjust;
|
||||
fixed16_t bbextents, bbextentt;
|
||||
|
||||
|
||||
void D_DrawSpans8 (espan_t *pspans);
|
||||
void D_DrawSpans16 (espan_t *pspans);
|
||||
void D_DrawZSpans (espan_t *pspans);
|
||||
void Turbulent8 (espan_t *pspan);
|
||||
void D_SpriteDrawSpans (sspan_t *pspan);
|
||||
|
||||
void D_DrawSkyScans8 (espan_t *pspan);
|
||||
void D_DrawSkyScans16 (espan_t *pspan);
|
||||
|
||||
void R_ShowSubDiv (void);
|
||||
void (*prealspandrawer)(void);
|
||||
surfcache_t *D_CacheSurface (msurface_t *surface, int miplevel);
|
||||
|
||||
extern int D_MipLevelForScale (float scale);
|
||||
|
||||
#if id386
|
||||
extern void D_PolysetAff8Start (void);
|
||||
extern void D_PolysetAff8End (void);
|
||||
#endif
|
||||
|
||||
extern short *d_pzbuffer;
|
||||
extern unsigned int d_zrowbytes, d_zwidth;
|
||||
|
||||
extern int *d_pscantable;
|
||||
extern int d_scantable[MAXHEIGHT];
|
||||
|
||||
extern int d_vrectx, d_vrecty, d_vrectright_particle, d_vrectbottom_particle;
|
||||
|
||||
extern int d_y_aspect_shift, d_pix_min, d_pix_max, d_pix_shift;
|
||||
|
||||
extern pixel_t *d_viewbuffer;
|
||||
|
||||
extern short *zspantable[MAXHEIGHT];
|
||||
|
||||
extern int d_minmip;
|
||||
extern float d_scalemip[3];
|
||||
|
||||
extern void (*d_drawspans) (espan_t *pspan);
|
||||
|
||||
107
WinQuake/d_modech.c
Normal file
107
WinQuake/d_modech.c
Normal file
@@ -0,0 +1,107 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// d_modech.c: called when mode has just changed
|
||||
|
||||
#include "quakedef.h"
|
||||
#include "d_local.h"
|
||||
|
||||
int d_vrectx, d_vrecty, d_vrectright_particle, d_vrectbottom_particle;
|
||||
|
||||
int d_y_aspect_shift, d_pix_min, d_pix_max, d_pix_shift;
|
||||
|
||||
int d_scantable[MAXHEIGHT];
|
||||
short *zspantable[MAXHEIGHT];
|
||||
|
||||
/*
|
||||
================
|
||||
D_Patch
|
||||
================
|
||||
*/
|
||||
void D_Patch (void)
|
||||
{
|
||||
#if id386
|
||||
|
||||
static qboolean protectset8 = false;
|
||||
|
||||
if (!protectset8)
|
||||
{
|
||||
Sys_MakeCodeWriteable ((int)D_PolysetAff8Start,
|
||||
(int)D_PolysetAff8End - (int)D_PolysetAff8Start);
|
||||
protectset8 = true;
|
||||
}
|
||||
|
||||
#endif // id386
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
D_ViewChanged
|
||||
================
|
||||
*/
|
||||
void D_ViewChanged (void)
|
||||
{
|
||||
int rowbytes;
|
||||
|
||||
if (r_dowarp)
|
||||
rowbytes = WARP_WIDTH;
|
||||
else
|
||||
rowbytes = vid.rowbytes;
|
||||
|
||||
scale_for_mip = xscale;
|
||||
if (yscale > xscale)
|
||||
scale_for_mip = yscale;
|
||||
|
||||
d_zrowbytes = vid.width * 2;
|
||||
d_zwidth = vid.width;
|
||||
|
||||
d_pix_min = r_refdef.vrect.width / 320;
|
||||
if (d_pix_min < 1)
|
||||
d_pix_min = 1;
|
||||
|
||||
d_pix_max = (int)((float)r_refdef.vrect.width / (320.0 / 4.0) + 0.5);
|
||||
d_pix_shift = 8 - (int)((float)r_refdef.vrect.width / 320.0 + 0.5);
|
||||
if (d_pix_max < 1)
|
||||
d_pix_max = 1;
|
||||
|
||||
if (pixelAspect > 1.4)
|
||||
d_y_aspect_shift = 1;
|
||||
else
|
||||
d_y_aspect_shift = 0;
|
||||
|
||||
d_vrectx = r_refdef.vrect.x;
|
||||
d_vrecty = r_refdef.vrect.y;
|
||||
d_vrectright_particle = r_refdef.vrectright - d_pix_max;
|
||||
d_vrectbottom_particle =
|
||||
r_refdef.vrectbottom - (d_pix_max << d_y_aspect_shift);
|
||||
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0 ; i<vid.height; i++)
|
||||
{
|
||||
d_scantable[i] = i*rowbytes;
|
||||
zspantable[i] = d_pzbuffer + i*d_zwidth;
|
||||
}
|
||||
}
|
||||
|
||||
D_Patch ();
|
||||
}
|
||||
|
||||
207
WinQuake/d_part.c
Normal file
207
WinQuake/d_part.c
Normal file
@@ -0,0 +1,207 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// d_part.c: software driver module for drawing particles
|
||||
|
||||
#include "quakedef.h"
|
||||
#include "d_local.h"
|
||||
|
||||
|
||||
/*
|
||||
==============
|
||||
D_EndParticles
|
||||
==============
|
||||
*/
|
||||
void D_EndParticles (void)
|
||||
{
|
||||
// not used by software driver
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==============
|
||||
D_StartParticles
|
||||
==============
|
||||
*/
|
||||
void D_StartParticles (void)
|
||||
{
|
||||
// not used by software driver
|
||||
}
|
||||
|
||||
|
||||
#if !id386
|
||||
|
||||
/*
|
||||
==============
|
||||
D_DrawParticle
|
||||
==============
|
||||
*/
|
||||
void D_DrawParticle (particle_t *pparticle)
|
||||
{
|
||||
vec3_t local, transformed;
|
||||
float zi;
|
||||
byte *pdest;
|
||||
short *pz;
|
||||
int i, izi, pix, count, u, v;
|
||||
|
||||
// transform point
|
||||
VectorSubtract (pparticle->org, r_origin, local);
|
||||
|
||||
transformed[0] = DotProduct(local, r_pright);
|
||||
transformed[1] = DotProduct(local, r_pup);
|
||||
transformed[2] = DotProduct(local, r_ppn);
|
||||
|
||||
if (transformed[2] < PARTICLE_Z_CLIP)
|
||||
return;
|
||||
|
||||
// project the point
|
||||
// FIXME: preadjust xcenter and ycenter
|
||||
zi = 1.0 / transformed[2];
|
||||
u = (int)(xcenter + zi * transformed[0] + 0.5);
|
||||
v = (int)(ycenter - zi * transformed[1] + 0.5);
|
||||
|
||||
if ((v > d_vrectbottom_particle) ||
|
||||
(u > d_vrectright_particle) ||
|
||||
(v < d_vrecty) ||
|
||||
(u < d_vrectx))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
pz = d_pzbuffer + (d_zwidth * v) + u;
|
||||
pdest = d_viewbuffer + d_scantable[v] + u;
|
||||
izi = (int)(zi * 0x8000);
|
||||
|
||||
pix = izi >> d_pix_shift;
|
||||
|
||||
if (pix < d_pix_min)
|
||||
pix = d_pix_min;
|
||||
else if (pix > d_pix_max)
|
||||
pix = d_pix_max;
|
||||
|
||||
switch (pix)
|
||||
{
|
||||
case 1:
|
||||
count = 1 << d_y_aspect_shift;
|
||||
|
||||
for ( ; count ; count--, pz += d_zwidth, pdest += screenwidth)
|
||||
{
|
||||
if (pz[0] <= izi)
|
||||
{
|
||||
pz[0] = izi;
|
||||
pdest[0] = pparticle->color;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 2:
|
||||
count = 2 << d_y_aspect_shift;
|
||||
|
||||
for ( ; count ; count--, pz += d_zwidth, pdest += screenwidth)
|
||||
{
|
||||
if (pz[0] <= izi)
|
||||
{
|
||||
pz[0] = izi;
|
||||
pdest[0] = pparticle->color;
|
||||
}
|
||||
|
||||
if (pz[1] <= izi)
|
||||
{
|
||||
pz[1] = izi;
|
||||
pdest[1] = pparticle->color;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 3:
|
||||
count = 3 << d_y_aspect_shift;
|
||||
|
||||
for ( ; count ; count--, pz += d_zwidth, pdest += screenwidth)
|
||||
{
|
||||
if (pz[0] <= izi)
|
||||
{
|
||||
pz[0] = izi;
|
||||
pdest[0] = pparticle->color;
|
||||
}
|
||||
|
||||
if (pz[1] <= izi)
|
||||
{
|
||||
pz[1] = izi;
|
||||
pdest[1] = pparticle->color;
|
||||
}
|
||||
|
||||
if (pz[2] <= izi)
|
||||
{
|
||||
pz[2] = izi;
|
||||
pdest[2] = pparticle->color;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 4:
|
||||
count = 4 << d_y_aspect_shift;
|
||||
|
||||
for ( ; count ; count--, pz += d_zwidth, pdest += screenwidth)
|
||||
{
|
||||
if (pz[0] <= izi)
|
||||
{
|
||||
pz[0] = izi;
|
||||
pdest[0] = pparticle->color;
|
||||
}
|
||||
|
||||
if (pz[1] <= izi)
|
||||
{
|
||||
pz[1] = izi;
|
||||
pdest[1] = pparticle->color;
|
||||
}
|
||||
|
||||
if (pz[2] <= izi)
|
||||
{
|
||||
pz[2] = izi;
|
||||
pdest[2] = pparticle->color;
|
||||
}
|
||||
|
||||
if (pz[3] <= izi)
|
||||
{
|
||||
pz[3] = izi;
|
||||
pdest[3] = pparticle->color;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
count = pix << d_y_aspect_shift;
|
||||
|
||||
for ( ; count ; count--, pz += d_zwidth, pdest += screenwidth)
|
||||
{
|
||||
for (i=0 ; i<pix ; i++)
|
||||
{
|
||||
if (pz[i] <= izi)
|
||||
{
|
||||
pz[i] = izi;
|
||||
pdest[i] = pparticle->color;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endif // !id386
|
||||
|
||||
477
WinQuake/d_parta.s
Normal file
477
WinQuake/d_parta.s
Normal file
@@ -0,0 +1,477 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
//
|
||||
// d_parta.s
|
||||
// x86 assembly-language 8-bpp particle-drawing code.
|
||||
//
|
||||
|
||||
#include "asm_i386.h"
|
||||
#include "quakeasm.h"
|
||||
#include "d_ifacea.h"
|
||||
#include "asm_draw.h"
|
||||
|
||||
#if id386
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// 8-bpp particle drawing code.
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
//FIXME: comments, full optimization
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// 8-bpp particle queueing code.
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
.text
|
||||
|
||||
#define P 12+4
|
||||
|
||||
.align 4
|
||||
.globl C(D_DrawParticle)
|
||||
C(D_DrawParticle):
|
||||
pushl %ebp // preserve caller's stack frame
|
||||
pushl %edi // preserve register variables
|
||||
pushl %ebx
|
||||
|
||||
movl P(%esp),%edi
|
||||
|
||||
// FIXME: better FP overlap in general here
|
||||
|
||||
// transform point
|
||||
// VectorSubtract (p->org, r_origin, local);
|
||||
flds C(r_origin)
|
||||
fsubrs pt_org(%edi)
|
||||
flds pt_org+4(%edi)
|
||||
fsubs C(r_origin)+4
|
||||
flds pt_org+8(%edi)
|
||||
fsubs C(r_origin)+8
|
||||
fxch %st(2) // local[0] | local[1] | local[2]
|
||||
|
||||
// transformed[2] = DotProduct(local, r_ppn);
|
||||
flds C(r_ppn) // r_ppn[0] | local[0] | local[1] | local[2]
|
||||
fmul %st(1),%st(0) // dot0 | local[0] | local[1] | local[2]
|
||||
flds C(r_ppn)+4 // r_ppn[1] | dot0 | local[0] | local[1] | local[2]
|
||||
fmul %st(3),%st(0) // dot1 | dot0 | local[0] | local[1] | local[2]
|
||||
flds C(r_ppn)+8 // r_ppn[2] | dot1 | dot0 | local[0] |
|
||||
// local[1] | local[2]
|
||||
fmul %st(5),%st(0) // dot2 | dot1 | dot0 | local[0] | local[1] | local[2]
|
||||
fxch %st(2) // dot0 | dot1 | dot2 | local[0] | local[1] | local[2]
|
||||
faddp %st(0),%st(1) // dot0 + dot1 | dot2 | local[0] | local[1] |
|
||||
// local[2]
|
||||
faddp %st(0),%st(1) // z | local[0] | local[1] | local[2]
|
||||
fld %st(0) // z | z | local[0] | local[1] |
|
||||
// local[2]
|
||||
fdivrs float_1 // 1/z | z | local[0] | local[1] | local[2]
|
||||
fxch %st(1) // z | 1/z | local[0] | local[1] | local[2]
|
||||
|
||||
// if (transformed[2] < PARTICLE_Z_CLIP)
|
||||
// return;
|
||||
fcomps float_particle_z_clip // 1/z | local[0] | local[1] | local[2]
|
||||
fxch %st(3) // local[2] | local[0] | local[1] | 1/z
|
||||
|
||||
flds C(r_pup) // r_pup[0] | local[2] | local[0] | local[1] | 1/z
|
||||
fmul %st(2),%st(0) // dot0 | local[2] | local[0] | local[1] | 1/z
|
||||
flds C(r_pup)+4 // r_pup[1] | dot0 | local[2] | local[0] |
|
||||
// local[1] | 1/z
|
||||
|
||||
fnstsw %ax
|
||||
testb $1,%ah
|
||||
jnz LPop6AndDone
|
||||
|
||||
// transformed[1] = DotProduct(local, r_pup);
|
||||
fmul %st(4),%st(0) // dot1 | dot0 | local[2] | local[0] | local[1] | 1/z
|
||||
flds C(r_pup)+8 // r_pup[2] | dot1 | dot0 | local[2] |
|
||||
// local[0] | local[1] | 1/z
|
||||
fmul %st(3),%st(0) // dot2 | dot1 | dot0 | local[2] | local[0] |
|
||||
// local[1] | 1/z
|
||||
fxch %st(2) // dot0 | dot1 | dot2 | local[2] | local[0] |
|
||||
// local[1] | 1/z
|
||||
faddp %st(0),%st(1) // dot0 + dot1 | dot2 | local[2] | local[0] |
|
||||
// local[1] | 1/z
|
||||
faddp %st(0),%st(1) // y | local[2] | local[0] | local[1] | 1/z
|
||||
fxch %st(3) // local[1] | local[2] | local[0] | y | 1/z
|
||||
|
||||
// transformed[0] = DotProduct(local, r_pright);
|
||||
fmuls C(r_pright)+4 // dot1 | local[2] | local[0] | y | 1/z
|
||||
fxch %st(2) // local[0] | local[2] | dot1 | y | 1/z
|
||||
fmuls C(r_pright) // dot0 | local[2] | dot1 | y | 1/z
|
||||
fxch %st(1) // local[2] | dot0 | dot1 | y | 1/z
|
||||
fmuls C(r_pright)+8 // dot2 | dot0 | dot1 | y | 1/z
|
||||
fxch %st(2) // dot1 | dot0 | dot2 | y | 1/z
|
||||
faddp %st(0),%st(1) // dot1 + dot0 | dot2 | y | 1/z
|
||||
|
||||
faddp %st(0),%st(1) // x | y | 1/z
|
||||
fxch %st(1) // y | x | 1/z
|
||||
|
||||
// project the point
|
||||
fmul %st(2),%st(0) // y/z | x | 1/z
|
||||
fxch %st(1) // x | y/z | 1/z
|
||||
fmul %st(2),%st(0) // x/z | y/z | 1/z
|
||||
fxch %st(1) // y/z | x/z | 1/z
|
||||
fsubrs C(ycenter) // v | x/z | 1/z
|
||||
fxch %st(1) // x/z | v | 1/z
|
||||
fadds C(xcenter) // u | v | 1/z
|
||||
// FIXME: preadjust xcenter and ycenter
|
||||
fxch %st(1) // v | u | 1/z
|
||||
fadds float_point5 // v | u | 1/z
|
||||
fxch %st(1) // u | v | 1/z
|
||||
fadds float_point5 // u | v | 1/z
|
||||
fxch %st(2) // 1/z | v | u
|
||||
fmuls DP_32768 // 1/z * 0x8000 | v | u
|
||||
fxch %st(2) // u | v | 1/z * 0x8000
|
||||
|
||||
// FIXME: use Terje's fp->int trick here?
|
||||
// FIXME: check we're getting proper rounding here
|
||||
fistpl DP_u // v | 1/z * 0x8000
|
||||
fistpl DP_v // 1/z * 0x8000
|
||||
|
||||
movl DP_u,%eax
|
||||
movl DP_v,%edx
|
||||
|
||||
// if ((v > d_vrectbottom_particle) ||
|
||||
// (u > d_vrectright_particle) ||
|
||||
// (v < d_vrecty) ||
|
||||
// (u < d_vrectx))
|
||||
// {
|
||||
// continue;
|
||||
// }
|
||||
|
||||
movl C(d_vrectbottom_particle),%ebx
|
||||
movl C(d_vrectright_particle),%ecx
|
||||
cmpl %ebx,%edx
|
||||
jg LPop1AndDone
|
||||
cmpl %ecx,%eax
|
||||
jg LPop1AndDone
|
||||
movl C(d_vrecty),%ebx
|
||||
movl C(d_vrectx),%ecx
|
||||
cmpl %ebx,%edx
|
||||
jl LPop1AndDone
|
||||
|
||||
cmpl %ecx,%eax
|
||||
jl LPop1AndDone
|
||||
|
||||
flds pt_color(%edi) // color | 1/z * 0x8000
|
||||
// FIXME: use Terje's fast fp->int trick?
|
||||
fistpl DP_Color // 1/z * 0x8000
|
||||
|
||||
movl C(d_viewbuffer),%ebx
|
||||
|
||||
addl %eax,%ebx
|
||||
movl C(d_scantable)(,%edx,4),%edi // point to the pixel
|
||||
|
||||
imull C(d_zrowbytes),%edx // point to the z pixel
|
||||
|
||||
leal (%edx,%eax,2),%edx
|
||||
movl C(d_pzbuffer),%eax
|
||||
|
||||
fistpl izi
|
||||
|
||||
addl %ebx,%edi
|
||||
addl %eax,%edx
|
||||
|
||||
// pix = izi >> d_pix_shift;
|
||||
|
||||
movl izi,%eax
|
||||
movl C(d_pix_shift),%ecx
|
||||
shrl %cl,%eax
|
||||
movl izi,%ebp
|
||||
|
||||
// if (pix < d_pix_min)
|
||||
// pix = d_pix_min;
|
||||
// else if (pix > d_pix_max)
|
||||
// pix = d_pix_max;
|
||||
|
||||
movl C(d_pix_min),%ebx
|
||||
movl C(d_pix_max),%ecx
|
||||
cmpl %ebx,%eax
|
||||
jnl LTestPixMax
|
||||
movl %ebx,%eax
|
||||
jmp LTestDone
|
||||
|
||||
LTestPixMax:
|
||||
cmpl %ecx,%eax
|
||||
jng LTestDone
|
||||
movl %ecx,%eax
|
||||
LTestDone:
|
||||
|
||||
movb DP_Color,%ch
|
||||
|
||||
movl C(d_y_aspect_shift),%ebx
|
||||
testl %ebx,%ebx
|
||||
jnz LDefault
|
||||
|
||||
cmpl $4,%eax
|
||||
ja LDefault
|
||||
|
||||
jmp DP_EntryTable-4(,%eax,4)
|
||||
|
||||
// 1x1
|
||||
.globl DP_1x1
|
||||
DP_1x1:
|
||||
cmpw %bp,(%edx) // just one pixel to do
|
||||
jg LDone
|
||||
movw %bp,(%edx)
|
||||
movb %ch,(%edi)
|
||||
jmp LDone
|
||||
|
||||
// 2x2
|
||||
.globl DP_2x2
|
||||
DP_2x2:
|
||||
pushl %esi
|
||||
movl C(screenwidth),%ebx
|
||||
movl C(d_zrowbytes),%esi
|
||||
|
||||
cmpw %bp,(%edx)
|
||||
jg L2x2_1
|
||||
movw %bp,(%edx)
|
||||
movb %ch,(%edi)
|
||||
L2x2_1:
|
||||
cmpw %bp,2(%edx)
|
||||
jg L2x2_2
|
||||
movw %bp,2(%edx)
|
||||
movb %ch,1(%edi)
|
||||
L2x2_2:
|
||||
cmpw %bp,(%edx,%esi,1)
|
||||
jg L2x2_3
|
||||
movw %bp,(%edx,%esi,1)
|
||||
movb %ch,(%edi,%ebx,1)
|
||||
L2x2_3:
|
||||
cmpw %bp,2(%edx,%esi,1)
|
||||
jg L2x2_4
|
||||
movw %bp,2(%edx,%esi,1)
|
||||
movb %ch,1(%edi,%ebx,1)
|
||||
L2x2_4:
|
||||
|
||||
popl %esi
|
||||
jmp LDone
|
||||
|
||||
// 3x3
|
||||
.globl DP_3x3
|
||||
DP_3x3:
|
||||
pushl %esi
|
||||
movl C(screenwidth),%ebx
|
||||
movl C(d_zrowbytes),%esi
|
||||
|
||||
cmpw %bp,(%edx)
|
||||
jg L3x3_1
|
||||
movw %bp,(%edx)
|
||||
movb %ch,(%edi)
|
||||
L3x3_1:
|
||||
cmpw %bp,2(%edx)
|
||||
jg L3x3_2
|
||||
movw %bp,2(%edx)
|
||||
movb %ch,1(%edi)
|
||||
L3x3_2:
|
||||
cmpw %bp,4(%edx)
|
||||
jg L3x3_3
|
||||
movw %bp,4(%edx)
|
||||
movb %ch,2(%edi)
|
||||
L3x3_3:
|
||||
|
||||
cmpw %bp,(%edx,%esi,1)
|
||||
jg L3x3_4
|
||||
movw %bp,(%edx,%esi,1)
|
||||
movb %ch,(%edi,%ebx,1)
|
||||
L3x3_4:
|
||||
cmpw %bp,2(%edx,%esi,1)
|
||||
jg L3x3_5
|
||||
movw %bp,2(%edx,%esi,1)
|
||||
movb %ch,1(%edi,%ebx,1)
|
||||
L3x3_5:
|
||||
cmpw %bp,4(%edx,%esi,1)
|
||||
jg L3x3_6
|
||||
movw %bp,4(%edx,%esi,1)
|
||||
movb %ch,2(%edi,%ebx,1)
|
||||
L3x3_6:
|
||||
|
||||
cmpw %bp,(%edx,%esi,2)
|
||||
jg L3x3_7
|
||||
movw %bp,(%edx,%esi,2)
|
||||
movb %ch,(%edi,%ebx,2)
|
||||
L3x3_7:
|
||||
cmpw %bp,2(%edx,%esi,2)
|
||||
jg L3x3_8
|
||||
movw %bp,2(%edx,%esi,2)
|
||||
movb %ch,1(%edi,%ebx,2)
|
||||
L3x3_8:
|
||||
cmpw %bp,4(%edx,%esi,2)
|
||||
jg L3x3_9
|
||||
movw %bp,4(%edx,%esi,2)
|
||||
movb %ch,2(%edi,%ebx,2)
|
||||
L3x3_9:
|
||||
|
||||
popl %esi
|
||||
jmp LDone
|
||||
|
||||
|
||||
// 4x4
|
||||
.globl DP_4x4
|
||||
DP_4x4:
|
||||
pushl %esi
|
||||
movl C(screenwidth),%ebx
|
||||
movl C(d_zrowbytes),%esi
|
||||
|
||||
cmpw %bp,(%edx)
|
||||
jg L4x4_1
|
||||
movw %bp,(%edx)
|
||||
movb %ch,(%edi)
|
||||
L4x4_1:
|
||||
cmpw %bp,2(%edx)
|
||||
jg L4x4_2
|
||||
movw %bp,2(%edx)
|
||||
movb %ch,1(%edi)
|
||||
L4x4_2:
|
||||
cmpw %bp,4(%edx)
|
||||
jg L4x4_3
|
||||
movw %bp,4(%edx)
|
||||
movb %ch,2(%edi)
|
||||
L4x4_3:
|
||||
cmpw %bp,6(%edx)
|
||||
jg L4x4_4
|
||||
movw %bp,6(%edx)
|
||||
movb %ch,3(%edi)
|
||||
L4x4_4:
|
||||
|
||||
cmpw %bp,(%edx,%esi,1)
|
||||
jg L4x4_5
|
||||
movw %bp,(%edx,%esi,1)
|
||||
movb %ch,(%edi,%ebx,1)
|
||||
L4x4_5:
|
||||
cmpw %bp,2(%edx,%esi,1)
|
||||
jg L4x4_6
|
||||
movw %bp,2(%edx,%esi,1)
|
||||
movb %ch,1(%edi,%ebx,1)
|
||||
L4x4_6:
|
||||
cmpw %bp,4(%edx,%esi,1)
|
||||
jg L4x4_7
|
||||
movw %bp,4(%edx,%esi,1)
|
||||
movb %ch,2(%edi,%ebx,1)
|
||||
L4x4_7:
|
||||
cmpw %bp,6(%edx,%esi,1)
|
||||
jg L4x4_8
|
||||
movw %bp,6(%edx,%esi,1)
|
||||
movb %ch,3(%edi,%ebx,1)
|
||||
L4x4_8:
|
||||
|
||||
leal (%edx,%esi,2),%edx
|
||||
leal (%edi,%ebx,2),%edi
|
||||
|
||||
cmpw %bp,(%edx)
|
||||
jg L4x4_9
|
||||
movw %bp,(%edx)
|
||||
movb %ch,(%edi)
|
||||
L4x4_9:
|
||||
cmpw %bp,2(%edx)
|
||||
jg L4x4_10
|
||||
movw %bp,2(%edx)
|
||||
movb %ch,1(%edi)
|
||||
L4x4_10:
|
||||
cmpw %bp,4(%edx)
|
||||
jg L4x4_11
|
||||
movw %bp,4(%edx)
|
||||
movb %ch,2(%edi)
|
||||
L4x4_11:
|
||||
cmpw %bp,6(%edx)
|
||||
jg L4x4_12
|
||||
movw %bp,6(%edx)
|
||||
movb %ch,3(%edi)
|
||||
L4x4_12:
|
||||
|
||||
cmpw %bp,(%edx,%esi,1)
|
||||
jg L4x4_13
|
||||
movw %bp,(%edx,%esi,1)
|
||||
movb %ch,(%edi,%ebx,1)
|
||||
L4x4_13:
|
||||
cmpw %bp,2(%edx,%esi,1)
|
||||
jg L4x4_14
|
||||
movw %bp,2(%edx,%esi,1)
|
||||
movb %ch,1(%edi,%ebx,1)
|
||||
L4x4_14:
|
||||
cmpw %bp,4(%edx,%esi,1)
|
||||
jg L4x4_15
|
||||
movw %bp,4(%edx,%esi,1)
|
||||
movb %ch,2(%edi,%ebx,1)
|
||||
L4x4_15:
|
||||
cmpw %bp,6(%edx,%esi,1)
|
||||
jg L4x4_16
|
||||
movw %bp,6(%edx,%esi,1)
|
||||
movb %ch,3(%edi,%ebx,1)
|
||||
L4x4_16:
|
||||
|
||||
popl %esi
|
||||
jmp LDone
|
||||
|
||||
// default case, handling any size particle
|
||||
LDefault:
|
||||
|
||||
// count = pix << d_y_aspect_shift;
|
||||
|
||||
movl %eax,%ebx
|
||||
movl %eax,DP_Pix
|
||||
movb C(d_y_aspect_shift),%cl
|
||||
shll %cl,%ebx
|
||||
|
||||
// for ( ; count ; count--, pz += d_zwidth, pdest += screenwidth)
|
||||
// {
|
||||
// for (i=0 ; i<pix ; i++)
|
||||
// {
|
||||
// if (pz[i] <= izi)
|
||||
// {
|
||||
// pz[i] = izi;
|
||||
// pdest[i] = color;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
LGenRowLoop:
|
||||
movl DP_Pix,%eax
|
||||
|
||||
LGenColLoop:
|
||||
cmpw %bp,-2(%edx,%eax,2)
|
||||
jg LGSkip
|
||||
movw %bp,-2(%edx,%eax,2)
|
||||
movb %ch,-1(%edi,%eax,1)
|
||||
LGSkip:
|
||||
decl %eax // --pix
|
||||
jnz LGenColLoop
|
||||
|
||||
addl C(d_zrowbytes),%edx
|
||||
addl C(screenwidth),%edi
|
||||
|
||||
decl %ebx // --count
|
||||
jnz LGenRowLoop
|
||||
|
||||
LDone:
|
||||
popl %ebx // restore register variables
|
||||
popl %edi
|
||||
popl %ebp // restore the caller's stack frame
|
||||
ret
|
||||
|
||||
LPop6AndDone:
|
||||
fstp %st(0)
|
||||
fstp %st(0)
|
||||
fstp %st(0)
|
||||
fstp %st(0)
|
||||
fstp %st(0)
|
||||
LPop1AndDone:
|
||||
fstp %st(0)
|
||||
jmp LDone
|
||||
|
||||
#endif // id386
|
||||
1744
WinQuake/d_polysa.s
Normal file
1744
WinQuake/d_polysa.s
Normal file
File diff suppressed because it is too large
Load Diff
1111
WinQuake/d_polyse.c
Normal file
1111
WinQuake/d_polyse.c
Normal file
File diff suppressed because it is too large
Load Diff
449
WinQuake/d_scan.c
Normal file
449
WinQuake/d_scan.c
Normal file
@@ -0,0 +1,449 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// d_scan.c
|
||||
//
|
||||
// Portable C scan-level rasterization code, all pixel depths.
|
||||
|
||||
#include "quakedef.h"
|
||||
#include "r_local.h"
|
||||
#include "d_local.h"
|
||||
|
||||
unsigned char *r_turb_pbase, *r_turb_pdest;
|
||||
fixed16_t r_turb_s, r_turb_t, r_turb_sstep, r_turb_tstep;
|
||||
int *r_turb_turb;
|
||||
int r_turb_spancount;
|
||||
|
||||
void D_DrawTurbulent8Span (void);
|
||||
|
||||
|
||||
/*
|
||||
=============
|
||||
D_WarpScreen
|
||||
|
||||
// this performs a slight compression of the screen at the same time as
|
||||
// the sine warp, to keep the edges from wrapping
|
||||
=============
|
||||
*/
|
||||
void D_WarpScreen (void)
|
||||
{
|
||||
int w, h;
|
||||
int u,v;
|
||||
byte *dest;
|
||||
int *turb;
|
||||
int *col;
|
||||
byte **row;
|
||||
byte *rowptr[MAXHEIGHT+(AMP2*2)];
|
||||
int column[MAXWIDTH+(AMP2*2)];
|
||||
float wratio, hratio;
|
||||
|
||||
w = r_refdef.vrect.width;
|
||||
h = r_refdef.vrect.height;
|
||||
|
||||
wratio = w / (float)scr_vrect.width;
|
||||
hratio = h / (float)scr_vrect.height;
|
||||
|
||||
for (v=0 ; v<scr_vrect.height+AMP2*2 ; v++)
|
||||
{
|
||||
rowptr[v] = d_viewbuffer + (r_refdef.vrect.y * screenwidth) +
|
||||
(screenwidth * (int)((float)v * hratio * h / (h + AMP2 * 2)));
|
||||
}
|
||||
|
||||
for (u=0 ; u<scr_vrect.width+AMP2*2 ; u++)
|
||||
{
|
||||
column[u] = r_refdef.vrect.x +
|
||||
(int)((float)u * wratio * w / (w + AMP2 * 2));
|
||||
}
|
||||
|
||||
turb = intsintable + ((int)(cl.time*SPEED)&(CYCLE-1));
|
||||
dest = vid.buffer + scr_vrect.y * vid.rowbytes + scr_vrect.x;
|
||||
|
||||
for (v=0 ; v<scr_vrect.height ; v++, dest += vid.rowbytes)
|
||||
{
|
||||
col = &column[turb[v]];
|
||||
row = &rowptr[v];
|
||||
|
||||
for (u=0 ; u<scr_vrect.width ; u+=4)
|
||||
{
|
||||
dest[u+0] = row[turb[u+0]][col[u+0]];
|
||||
dest[u+1] = row[turb[u+1]][col[u+1]];
|
||||
dest[u+2] = row[turb[u+2]][col[u+2]];
|
||||
dest[u+3] = row[turb[u+3]][col[u+3]];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#if !id386
|
||||
|
||||
/*
|
||||
=============
|
||||
D_DrawTurbulent8Span
|
||||
=============
|
||||
*/
|
||||
void D_DrawTurbulent8Span (void)
|
||||
{
|
||||
int sturb, tturb;
|
||||
|
||||
do
|
||||
{
|
||||
sturb = ((r_turb_s + r_turb_turb[(r_turb_t>>16)&(CYCLE-1)])>>16)&63;
|
||||
tturb = ((r_turb_t + r_turb_turb[(r_turb_s>>16)&(CYCLE-1)])>>16)&63;
|
||||
*r_turb_pdest++ = *(r_turb_pbase + (tturb<<6) + sturb);
|
||||
r_turb_s += r_turb_sstep;
|
||||
r_turb_t += r_turb_tstep;
|
||||
} while (--r_turb_spancount > 0);
|
||||
}
|
||||
|
||||
#endif // !id386
|
||||
|
||||
|
||||
/*
|
||||
=============
|
||||
Turbulent8
|
||||
=============
|
||||
*/
|
||||
void Turbulent8 (espan_t *pspan)
|
||||
{
|
||||
int count;
|
||||
fixed16_t snext, tnext;
|
||||
float sdivz, tdivz, zi, z, du, dv, spancountminus1;
|
||||
float sdivz16stepu, tdivz16stepu, zi16stepu;
|
||||
|
||||
r_turb_turb = sintable + ((int)(cl.time*SPEED)&(CYCLE-1));
|
||||
|
||||
r_turb_sstep = 0; // keep compiler happy
|
||||
r_turb_tstep = 0; // ditto
|
||||
|
||||
r_turb_pbase = (unsigned char *)cacheblock;
|
||||
|
||||
sdivz16stepu = d_sdivzstepu * 16;
|
||||
tdivz16stepu = d_tdivzstepu * 16;
|
||||
zi16stepu = d_zistepu * 16;
|
||||
|
||||
do
|
||||
{
|
||||
r_turb_pdest = (unsigned char *)((byte *)d_viewbuffer +
|
||||
(screenwidth * pspan->v) + pspan->u);
|
||||
|
||||
count = pspan->count;
|
||||
|
||||
// calculate the initial s/z, t/z, 1/z, s, and t and clamp
|
||||
du = (float)pspan->u;
|
||||
dv = (float)pspan->v;
|
||||
|
||||
sdivz = d_sdivzorigin + dv*d_sdivzstepv + du*d_sdivzstepu;
|
||||
tdivz = d_tdivzorigin + dv*d_tdivzstepv + du*d_tdivzstepu;
|
||||
zi = d_ziorigin + dv*d_zistepv + du*d_zistepu;
|
||||
z = (float)0x10000 / zi; // prescale to 16.16 fixed-point
|
||||
|
||||
r_turb_s = (int)(sdivz * z) + sadjust;
|
||||
if (r_turb_s > bbextents)
|
||||
r_turb_s = bbextents;
|
||||
else if (r_turb_s < 0)
|
||||
r_turb_s = 0;
|
||||
|
||||
r_turb_t = (int)(tdivz * z) + tadjust;
|
||||
if (r_turb_t > bbextentt)
|
||||
r_turb_t = bbextentt;
|
||||
else if (r_turb_t < 0)
|
||||
r_turb_t = 0;
|
||||
|
||||
do
|
||||
{
|
||||
// calculate s and t at the far end of the span
|
||||
if (count >= 16)
|
||||
r_turb_spancount = 16;
|
||||
else
|
||||
r_turb_spancount = count;
|
||||
|
||||
count -= r_turb_spancount;
|
||||
|
||||
if (count)
|
||||
{
|
||||
// calculate s/z, t/z, zi->fixed s and t at far end of span,
|
||||
// calculate s and t steps across span by shifting
|
||||
sdivz += sdivz16stepu;
|
||||
tdivz += tdivz16stepu;
|
||||
zi += zi16stepu;
|
||||
z = (float)0x10000 / zi; // prescale to 16.16 fixed-point
|
||||
|
||||
snext = (int)(sdivz * z) + sadjust;
|
||||
if (snext > bbextents)
|
||||
snext = bbextents;
|
||||
else if (snext < 16)
|
||||
snext = 16; // prevent round-off error on <0 steps from
|
||||
// from causing overstepping & running off the
|
||||
// edge of the texture
|
||||
|
||||
tnext = (int)(tdivz * z) + tadjust;
|
||||
if (tnext > bbextentt)
|
||||
tnext = bbextentt;
|
||||
else if (tnext < 16)
|
||||
tnext = 16; // guard against round-off error on <0 steps
|
||||
|
||||
r_turb_sstep = (snext - r_turb_s) >> 4;
|
||||
r_turb_tstep = (tnext - r_turb_t) >> 4;
|
||||
}
|
||||
else
|
||||
{
|
||||
// calculate s/z, t/z, zi->fixed s and t at last pixel in span (so
|
||||
// can't step off polygon), clamp, calculate s and t steps across
|
||||
// span by division, biasing steps low so we don't run off the
|
||||
// texture
|
||||
spancountminus1 = (float)(r_turb_spancount - 1);
|
||||
sdivz += d_sdivzstepu * spancountminus1;
|
||||
tdivz += d_tdivzstepu * spancountminus1;
|
||||
zi += d_zistepu * spancountminus1;
|
||||
z = (float)0x10000 / zi; // prescale to 16.16 fixed-point
|
||||
snext = (int)(sdivz * z) + sadjust;
|
||||
if (snext > bbextents)
|
||||
snext = bbextents;
|
||||
else if (snext < 16)
|
||||
snext = 16; // prevent round-off error on <0 steps from
|
||||
// from causing overstepping & running off the
|
||||
// edge of the texture
|
||||
|
||||
tnext = (int)(tdivz * z) + tadjust;
|
||||
if (tnext > bbextentt)
|
||||
tnext = bbextentt;
|
||||
else if (tnext < 16)
|
||||
tnext = 16; // guard against round-off error on <0 steps
|
||||
|
||||
if (r_turb_spancount > 1)
|
||||
{
|
||||
r_turb_sstep = (snext - r_turb_s) / (r_turb_spancount - 1);
|
||||
r_turb_tstep = (tnext - r_turb_t) / (r_turb_spancount - 1);
|
||||
}
|
||||
}
|
||||
|
||||
r_turb_s = r_turb_s & ((CYCLE<<16)-1);
|
||||
r_turb_t = r_turb_t & ((CYCLE<<16)-1);
|
||||
|
||||
D_DrawTurbulent8Span ();
|
||||
|
||||
r_turb_s = snext;
|
||||
r_turb_t = tnext;
|
||||
|
||||
} while (count > 0);
|
||||
|
||||
} while ((pspan = pspan->pnext) != NULL);
|
||||
}
|
||||
|
||||
|
||||
#if !id386
|
||||
|
||||
/*
|
||||
=============
|
||||
D_DrawSpans8
|
||||
=============
|
||||
*/
|
||||
void D_DrawSpans8 (espan_t *pspan)
|
||||
{
|
||||
int count, spancount;
|
||||
unsigned char *pbase, *pdest;
|
||||
fixed16_t s, t, snext, tnext, sstep, tstep;
|
||||
float sdivz, tdivz, zi, z, du, dv, spancountminus1;
|
||||
float sdivz8stepu, tdivz8stepu, zi8stepu;
|
||||
|
||||
sstep = 0; // keep compiler happy
|
||||
tstep = 0; // ditto
|
||||
|
||||
pbase = (unsigned char *)cacheblock;
|
||||
|
||||
sdivz8stepu = d_sdivzstepu * 8;
|
||||
tdivz8stepu = d_tdivzstepu * 8;
|
||||
zi8stepu = d_zistepu * 8;
|
||||
|
||||
do
|
||||
{
|
||||
pdest = (unsigned char *)((byte *)d_viewbuffer +
|
||||
(screenwidth * pspan->v) + pspan->u);
|
||||
|
||||
count = pspan->count;
|
||||
|
||||
// calculate the initial s/z, t/z, 1/z, s, and t and clamp
|
||||
du = (float)pspan->u;
|
||||
dv = (float)pspan->v;
|
||||
|
||||
sdivz = d_sdivzorigin + dv*d_sdivzstepv + du*d_sdivzstepu;
|
||||
tdivz = d_tdivzorigin + dv*d_tdivzstepv + du*d_tdivzstepu;
|
||||
zi = d_ziorigin + dv*d_zistepv + du*d_zistepu;
|
||||
z = (float)0x10000 / zi; // prescale to 16.16 fixed-point
|
||||
|
||||
s = (int)(sdivz * z) + sadjust;
|
||||
if (s > bbextents)
|
||||
s = bbextents;
|
||||
else if (s < 0)
|
||||
s = 0;
|
||||
|
||||
t = (int)(tdivz * z) + tadjust;
|
||||
if (t > bbextentt)
|
||||
t = bbextentt;
|
||||
else if (t < 0)
|
||||
t = 0;
|
||||
|
||||
do
|
||||
{
|
||||
// calculate s and t at the far end of the span
|
||||
if (count >= 8)
|
||||
spancount = 8;
|
||||
else
|
||||
spancount = count;
|
||||
|
||||
count -= spancount;
|
||||
|
||||
if (count)
|
||||
{
|
||||
// calculate s/z, t/z, zi->fixed s and t at far end of span,
|
||||
// calculate s and t steps across span by shifting
|
||||
sdivz += sdivz8stepu;
|
||||
tdivz += tdivz8stepu;
|
||||
zi += zi8stepu;
|
||||
z = (float)0x10000 / zi; // prescale to 16.16 fixed-point
|
||||
|
||||
snext = (int)(sdivz * z) + sadjust;
|
||||
if (snext > bbextents)
|
||||
snext = bbextents;
|
||||
else if (snext < 8)
|
||||
snext = 8; // prevent round-off error on <0 steps from
|
||||
// from causing overstepping & running off the
|
||||
// edge of the texture
|
||||
|
||||
tnext = (int)(tdivz * z) + tadjust;
|
||||
if (tnext > bbextentt)
|
||||
tnext = bbextentt;
|
||||
else if (tnext < 8)
|
||||
tnext = 8; // guard against round-off error on <0 steps
|
||||
|
||||
sstep = (snext - s) >> 3;
|
||||
tstep = (tnext - t) >> 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
// calculate s/z, t/z, zi->fixed s and t at last pixel in span (so
|
||||
// can't step off polygon), clamp, calculate s and t steps across
|
||||
// span by division, biasing steps low so we don't run off the
|
||||
// texture
|
||||
spancountminus1 = (float)(spancount - 1);
|
||||
sdivz += d_sdivzstepu * spancountminus1;
|
||||
tdivz += d_tdivzstepu * spancountminus1;
|
||||
zi += d_zistepu * spancountminus1;
|
||||
z = (float)0x10000 / zi; // prescale to 16.16 fixed-point
|
||||
snext = (int)(sdivz * z) + sadjust;
|
||||
if (snext > bbextents)
|
||||
snext = bbextents;
|
||||
else if (snext < 8)
|
||||
snext = 8; // prevent round-off error on <0 steps from
|
||||
// from causing overstepping & running off the
|
||||
// edge of the texture
|
||||
|
||||
tnext = (int)(tdivz * z) + tadjust;
|
||||
if (tnext > bbextentt)
|
||||
tnext = bbextentt;
|
||||
else if (tnext < 8)
|
||||
tnext = 8; // guard against round-off error on <0 steps
|
||||
|
||||
if (spancount > 1)
|
||||
{
|
||||
sstep = (snext - s) / (spancount - 1);
|
||||
tstep = (tnext - t) / (spancount - 1);
|
||||
}
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
*pdest++ = *(pbase + (s >> 16) + (t >> 16) * cachewidth);
|
||||
s += sstep;
|
||||
t += tstep;
|
||||
} while (--spancount > 0);
|
||||
|
||||
s = snext;
|
||||
t = tnext;
|
||||
|
||||
} while (count > 0);
|
||||
|
||||
} while ((pspan = pspan->pnext) != NULL);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#if !id386
|
||||
|
||||
/*
|
||||
=============
|
||||
D_DrawZSpans
|
||||
=============
|
||||
*/
|
||||
void D_DrawZSpans (espan_t *pspan)
|
||||
{
|
||||
int count, doublecount, izistep;
|
||||
int izi;
|
||||
short *pdest;
|
||||
unsigned ltemp;
|
||||
double zi;
|
||||
float du, dv;
|
||||
|
||||
// FIXME: check for clamping/range problems
|
||||
// we count on FP exceptions being turned off to avoid range problems
|
||||
izistep = (int)(d_zistepu * 0x8000 * 0x10000);
|
||||
|
||||
do
|
||||
{
|
||||
pdest = d_pzbuffer + (d_zwidth * pspan->v) + pspan->u;
|
||||
|
||||
count = pspan->count;
|
||||
|
||||
// calculate the initial 1/z
|
||||
du = (float)pspan->u;
|
||||
dv = (float)pspan->v;
|
||||
|
||||
zi = d_ziorigin + dv*d_zistepv + du*d_zistepu;
|
||||
// we count on FP exceptions being turned off to avoid range problems
|
||||
izi = (int)(zi * 0x8000 * 0x10000);
|
||||
|
||||
if ((long)pdest & 0x02)
|
||||
{
|
||||
*pdest++ = (short)(izi >> 16);
|
||||
izi += izistep;
|
||||
count--;
|
||||
}
|
||||
|
||||
if ((doublecount = count >> 1) > 0)
|
||||
{
|
||||
do
|
||||
{
|
||||
ltemp = izi >> 16;
|
||||
izi += izistep;
|
||||
ltemp |= izi & 0xFFFF0000;
|
||||
izi += izistep;
|
||||
*(int *)pdest = ltemp;
|
||||
pdest += 2;
|
||||
} while (--doublecount > 0);
|
||||
}
|
||||
|
||||
if (count & 1)
|
||||
*pdest = (short)(izi >> 16);
|
||||
|
||||
} while ((pspan = pspan->pnext) != NULL);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
89
WinQuake/d_scana.s
Normal file
89
WinQuake/d_scana.s
Normal file
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
//
|
||||
// d_scana.s
|
||||
// x86 assembly-language turbulent texture mapping code
|
||||
//
|
||||
|
||||
#include "asm_i386.h"
|
||||
#include "quakeasm.h"
|
||||
#include "asm_draw.h"
|
||||
#include "d_ifacea.h"
|
||||
|
||||
#if id386
|
||||
|
||||
.data
|
||||
|
||||
.text
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// turbulent texture mapping code
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
.align 4
|
||||
.globl C(D_DrawTurbulent8Span)
|
||||
C(D_DrawTurbulent8Span):
|
||||
pushl %ebp // preserve caller's stack frame pointer
|
||||
pushl %esi // preserve register variables
|
||||
pushl %edi
|
||||
pushl %ebx
|
||||
|
||||
movl C(r_turb_s),%esi
|
||||
movl C(r_turb_t),%ecx
|
||||
movl C(r_turb_pdest),%edi
|
||||
movl C(r_turb_spancount),%ebx
|
||||
|
||||
Llp:
|
||||
movl %ecx,%eax
|
||||
movl %esi,%edx
|
||||
sarl $16,%eax
|
||||
movl C(r_turb_turb),%ebp
|
||||
sarl $16,%edx
|
||||
andl $(CYCLE-1),%eax
|
||||
andl $(CYCLE-1),%edx
|
||||
movl (%ebp,%eax,4),%eax
|
||||
movl (%ebp,%edx,4),%edx
|
||||
addl %esi,%eax
|
||||
sarl $16,%eax
|
||||
addl %ecx,%edx
|
||||
sarl $16,%edx
|
||||
andl $(TURB_TEX_SIZE-1),%eax
|
||||
andl $(TURB_TEX_SIZE-1),%edx
|
||||
shll $6,%edx
|
||||
movl C(r_turb_pbase),%ebp
|
||||
addl %eax,%edx
|
||||
incl %edi
|
||||
addl C(r_turb_sstep),%esi
|
||||
addl C(r_turb_tstep),%ecx
|
||||
movb (%ebp,%edx,1),%dl
|
||||
decl %ebx
|
||||
movb %dl,-1(%edi)
|
||||
jnz Llp
|
||||
|
||||
movl %edi,C(r_turb_pdest)
|
||||
|
||||
popl %ebx // restore register variables
|
||||
popl %edi
|
||||
popl %esi
|
||||
popl %ebp // restore caller's stack frame pointer
|
||||
ret
|
||||
|
||||
#endif // id386
|
||||
|
||||
138
WinQuake/d_sky.c
Normal file
138
WinQuake/d_sky.c
Normal file
@@ -0,0 +1,138 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// d_sky.c
|
||||
|
||||
#include "quakedef.h"
|
||||
#include "r_local.h"
|
||||
#include "d_local.h"
|
||||
|
||||
#define SKY_SPAN_SHIFT 5
|
||||
#define SKY_SPAN_MAX (1 << SKY_SPAN_SHIFT)
|
||||
|
||||
|
||||
/*
|
||||
=================
|
||||
D_Sky_uv_To_st
|
||||
=================
|
||||
*/
|
||||
void D_Sky_uv_To_st (int u, int v, fixed16_t *s, fixed16_t *t)
|
||||
{
|
||||
float wu, wv, temp;
|
||||
vec3_t end;
|
||||
|
||||
if (r_refdef.vrect.width >= r_refdef.vrect.height)
|
||||
temp = (float)r_refdef.vrect.width;
|
||||
else
|
||||
temp = (float)r_refdef.vrect.height;
|
||||
|
||||
wu = 8192.0 * (float)(u-((int)vid.width>>1)) / temp;
|
||||
wv = 8192.0 * (float)(((int)vid.height>>1)-v) / temp;
|
||||
|
||||
end[0] = 4096*vpn[0] + wu*vright[0] + wv*vup[0];
|
||||
end[1] = 4096*vpn[1] + wu*vright[1] + wv*vup[1];
|
||||
end[2] = 4096*vpn[2] + wu*vright[2] + wv*vup[2];
|
||||
end[2] *= 3;
|
||||
VectorNormalize (end);
|
||||
|
||||
temp = skytime*skyspeed; // TODO: add D_SetupFrame & set this there
|
||||
*s = (int)((temp + 6*(SKYSIZE/2-1)*end[0]) * 0x10000);
|
||||
*t = (int)((temp + 6*(SKYSIZE/2-1)*end[1]) * 0x10000);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
=================
|
||||
D_DrawSkyScans8
|
||||
=================
|
||||
*/
|
||||
void D_DrawSkyScans8 (espan_t *pspan)
|
||||
{
|
||||
int count, spancount, u, v;
|
||||
unsigned char *pdest;
|
||||
fixed16_t s, t, snext, tnext, sstep, tstep;
|
||||
int spancountminus1;
|
||||
|
||||
sstep = 0; // keep compiler happy
|
||||
tstep = 0; // ditto
|
||||
|
||||
do
|
||||
{
|
||||
pdest = (unsigned char *)((byte *)d_viewbuffer +
|
||||
(screenwidth * pspan->v) + pspan->u);
|
||||
|
||||
count = pspan->count;
|
||||
|
||||
// calculate the initial s & t
|
||||
u = pspan->u;
|
||||
v = pspan->v;
|
||||
D_Sky_uv_To_st (u, v, &s, &t);
|
||||
|
||||
do
|
||||
{
|
||||
if (count >= SKY_SPAN_MAX)
|
||||
spancount = SKY_SPAN_MAX;
|
||||
else
|
||||
spancount = count;
|
||||
|
||||
count -= spancount;
|
||||
|
||||
if (count)
|
||||
{
|
||||
u += spancount;
|
||||
|
||||
// calculate s and t at far end of span,
|
||||
// calculate s and t steps across span by shifting
|
||||
D_Sky_uv_To_st (u, v, &snext, &tnext);
|
||||
|
||||
sstep = (snext - s) >> SKY_SPAN_SHIFT;
|
||||
tstep = (tnext - t) >> SKY_SPAN_SHIFT;
|
||||
}
|
||||
else
|
||||
{
|
||||
// calculate s and t at last pixel in span,
|
||||
// calculate s and t steps across span by division
|
||||
spancountminus1 = (float)(spancount - 1);
|
||||
|
||||
if (spancountminus1 > 0)
|
||||
{
|
||||
u += spancountminus1;
|
||||
D_Sky_uv_To_st (u, v, &snext, &tnext);
|
||||
|
||||
sstep = (snext - s) / spancountminus1;
|
||||
tstep = (tnext - t) / spancountminus1;
|
||||
}
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
*pdest++ = r_skysource[((t & R_SKY_TMASK) >> 8) +
|
||||
((s & R_SKY_SMASK) >> 16)];
|
||||
s += sstep;
|
||||
t += tstep;
|
||||
} while (--spancount > 0);
|
||||
|
||||
s = snext;
|
||||
t = tnext;
|
||||
|
||||
} while (count > 0);
|
||||
|
||||
} while ((pspan = pspan->pnext) != NULL);
|
||||
}
|
||||
|
||||
900
WinQuake/d_spr8.s
Normal file
900
WinQuake/d_spr8.s
Normal file
@@ -0,0 +1,900 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
//
|
||||
// d_spr8.s
|
||||
// x86 assembly-language horizontal 8-bpp transparent span-drawing code.
|
||||
//
|
||||
|
||||
#include "asm_i386.h"
|
||||
#include "quakeasm.h"
|
||||
#include "asm_draw.h"
|
||||
|
||||
#if id386
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// 8-bpp horizontal span drawing code for polygons, with transparency.
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
.text
|
||||
|
||||
// out-of-line, rarely-needed clamping code
|
||||
|
||||
LClampHigh0:
|
||||
movl C(bbextents),%esi
|
||||
jmp LClampReentry0
|
||||
LClampHighOrLow0:
|
||||
jg LClampHigh0
|
||||
xorl %esi,%esi
|
||||
jmp LClampReentry0
|
||||
|
||||
LClampHigh1:
|
||||
movl C(bbextentt),%edx
|
||||
jmp LClampReentry1
|
||||
LClampHighOrLow1:
|
||||
jg LClampHigh1
|
||||
xorl %edx,%edx
|
||||
jmp LClampReentry1
|
||||
|
||||
LClampLow2:
|
||||
movl $2048,%ebp
|
||||
jmp LClampReentry2
|
||||
LClampHigh2:
|
||||
movl C(bbextents),%ebp
|
||||
jmp LClampReentry2
|
||||
|
||||
LClampLow3:
|
||||
movl $2048,%ecx
|
||||
jmp LClampReentry3
|
||||
LClampHigh3:
|
||||
movl C(bbextentt),%ecx
|
||||
jmp LClampReentry3
|
||||
|
||||
LClampLow4:
|
||||
movl $2048,%eax
|
||||
jmp LClampReentry4
|
||||
LClampHigh4:
|
||||
movl C(bbextents),%eax
|
||||
jmp LClampReentry4
|
||||
|
||||
LClampLow5:
|
||||
movl $2048,%ebx
|
||||
jmp LClampReentry5
|
||||
LClampHigh5:
|
||||
movl C(bbextentt),%ebx
|
||||
jmp LClampReentry5
|
||||
|
||||
|
||||
#define pspans 4+16
|
||||
|
||||
.align 4
|
||||
.globl C(D_SpriteDrawSpans)
|
||||
C(D_SpriteDrawSpans):
|
||||
pushl %ebp // preserve caller's stack frame
|
||||
pushl %edi
|
||||
pushl %esi // preserve register variables
|
||||
pushl %ebx
|
||||
|
||||
//
|
||||
// set up scaled-by-8 steps, for 8-long segments; also set up cacheblock
|
||||
// and span list pointers, and 1/z step in 0.32 fixed-point
|
||||
//
|
||||
// FIXME: any overlap from rearranging?
|
||||
flds C(d_sdivzstepu)
|
||||
fmuls fp_8
|
||||
movl C(cacheblock),%edx
|
||||
flds C(d_tdivzstepu)
|
||||
fmuls fp_8
|
||||
movl pspans(%esp),%ebx // point to the first span descriptor
|
||||
flds C(d_zistepu)
|
||||
fmuls fp_8
|
||||
movl %edx,pbase // pbase = cacheblock
|
||||
flds C(d_zistepu)
|
||||
fmuls fp_64kx64k
|
||||
fxch %st(3)
|
||||
fstps sdivz8stepu
|
||||
fstps zi8stepu
|
||||
fstps tdivz8stepu
|
||||
fistpl izistep
|
||||
movl izistep,%eax
|
||||
rorl $16,%eax // put upper 16 bits in low word
|
||||
movl sspan_t_count(%ebx),%ecx
|
||||
movl %eax,izistep
|
||||
|
||||
cmpl $0,%ecx
|
||||
jle LNextSpan
|
||||
|
||||
LSpanLoop:
|
||||
|
||||
//
|
||||
// set up the initial s/z, t/z, and 1/z on the FP stack, and generate the
|
||||
// initial s and t values
|
||||
//
|
||||
// FIXME: pipeline FILD?
|
||||
fildl sspan_t_v(%ebx)
|
||||
fildl sspan_t_u(%ebx)
|
||||
|
||||
fld %st(1) // dv | du | dv
|
||||
fmuls C(d_sdivzstepv) // dv*d_sdivzstepv | du | dv
|
||||
fld %st(1) // du | dv*d_sdivzstepv | du | dv
|
||||
fmuls C(d_sdivzstepu) // du*d_sdivzstepu | dv*d_sdivzstepv | du | dv
|
||||
fld %st(2) // du | du*d_sdivzstepu | dv*d_sdivzstepv | du | dv
|
||||
fmuls C(d_tdivzstepu) // du*d_tdivzstepu | du*d_sdivzstepu |
|
||||
// dv*d_sdivzstepv | du | dv
|
||||
fxch %st(1) // du*d_sdivzstepu | du*d_tdivzstepu |
|
||||
// dv*d_sdivzstepv | du | dv
|
||||
faddp %st(0),%st(2) // du*d_tdivzstepu |
|
||||
// du*d_sdivzstepu + dv*d_sdivzstepv | du | dv
|
||||
fxch %st(1) // du*d_sdivzstepu + dv*d_sdivzstepv |
|
||||
// du*d_tdivzstepu | du | dv
|
||||
fld %st(3) // dv | du*d_sdivzstepu + dv*d_sdivzstepv |
|
||||
// du*d_tdivzstepu | du | dv
|
||||
fmuls C(d_tdivzstepv) // dv*d_tdivzstepv |
|
||||
// du*d_sdivzstepu + dv*d_sdivzstepv |
|
||||
// du*d_tdivzstepu | du | dv
|
||||
fxch %st(1) // du*d_sdivzstepu + dv*d_sdivzstepv |
|
||||
// dv*d_tdivzstepv | du*d_tdivzstepu | du | dv
|
||||
fadds C(d_sdivzorigin) // sdivz = d_sdivzorigin + dv*d_sdivzstepv +
|
||||
// du*d_sdivzstepu; stays in %st(2) at end
|
||||
fxch %st(4) // dv | dv*d_tdivzstepv | du*d_tdivzstepu | du |
|
||||
// s/z
|
||||
fmuls C(d_zistepv) // dv*d_zistepv | dv*d_tdivzstepv |
|
||||
// du*d_tdivzstepu | du | s/z
|
||||
fxch %st(1) // dv*d_tdivzstepv | dv*d_zistepv |
|
||||
// du*d_tdivzstepu | du | s/z
|
||||
faddp %st(0),%st(2) // dv*d_zistepv |
|
||||
// dv*d_tdivzstepv + du*d_tdivzstepu | du | s/z
|
||||
fxch %st(2) // du | dv*d_tdivzstepv + du*d_tdivzstepu |
|
||||
// dv*d_zistepv | s/z
|
||||
fmuls C(d_zistepu) // du*d_zistepu |
|
||||
// dv*d_tdivzstepv + du*d_tdivzstepu |
|
||||
// dv*d_zistepv | s/z
|
||||
fxch %st(1) // dv*d_tdivzstepv + du*d_tdivzstepu |
|
||||
// du*d_zistepu | dv*d_zistepv | s/z
|
||||
fadds C(d_tdivzorigin) // tdivz = d_tdivzorigin + dv*d_tdivzstepv +
|
||||
// du*d_tdivzstepu; stays in %st(1) at end
|
||||
fxch %st(2) // dv*d_zistepv | du*d_zistepu | t/z | s/z
|
||||
faddp %st(0),%st(1) // dv*d_zistepv + du*d_zistepu | t/z | s/z
|
||||
|
||||
flds fp_64k // fp_64k | dv*d_zistepv + du*d_zistepu | t/z | s/z
|
||||
fxch %st(1) // dv*d_zistepv + du*d_zistepu | fp_64k | t/z | s/z
|
||||
fadds C(d_ziorigin) // zi = d_ziorigin + dv*d_zistepv +
|
||||
// du*d_zistepu; stays in %st(0) at end
|
||||
// 1/z | fp_64k | t/z | s/z
|
||||
|
||||
fld %st(0) // FIXME: get rid of stall on FMUL?
|
||||
fmuls fp_64kx64k
|
||||
fxch %st(1)
|
||||
|
||||
//
|
||||
// calculate and clamp s & t
|
||||
//
|
||||
fdivr %st(0),%st(2) // 1/z | z*64k | t/z | s/z
|
||||
fxch %st(1)
|
||||
|
||||
fistpl izi // 0.32 fixed-point 1/z
|
||||
movl izi,%ebp
|
||||
|
||||
//
|
||||
// set pz to point to the first z-buffer pixel in the span
|
||||
//
|
||||
rorl $16,%ebp // put upper 16 bits in low word
|
||||
movl sspan_t_v(%ebx),%eax
|
||||
movl %ebp,izi
|
||||
movl sspan_t_u(%ebx),%ebp
|
||||
imull C(d_zrowbytes)
|
||||
shll $1,%ebp // a word per pixel
|
||||
addl C(d_pzbuffer),%eax
|
||||
addl %ebp,%eax
|
||||
movl %eax,pz
|
||||
|
||||
//
|
||||
// point %edi to the first pixel in the span
|
||||
//
|
||||
movl C(d_viewbuffer),%ebp
|
||||
movl sspan_t_v(%ebx),%eax
|
||||
pushl %ebx // preserve spans pointer
|
||||
movl C(tadjust),%edx
|
||||
movl C(sadjust),%esi
|
||||
movl C(d_scantable)(,%eax,4),%edi // v * screenwidth
|
||||
addl %ebp,%edi
|
||||
movl sspan_t_u(%ebx),%ebp
|
||||
addl %ebp,%edi // pdest = &pdestspan[scans->u];
|
||||
|
||||
//
|
||||
// now start the FDIV for the end of the span
|
||||
//
|
||||
cmpl $8,%ecx
|
||||
ja LSetupNotLast1
|
||||
|
||||
decl %ecx
|
||||
jz LCleanup1 // if only one pixel, no need to start an FDIV
|
||||
movl %ecx,spancountminus1
|
||||
|
||||
// finish up the s and t calcs
|
||||
fxch %st(1) // z*64k | 1/z | t/z | s/z
|
||||
|
||||
fld %st(0) // z*64k | z*64k | 1/z | t/z | s/z
|
||||
fmul %st(4),%st(0) // s | z*64k | 1/z | t/z | s/z
|
||||
fxch %st(1) // z*64k | s | 1/z | t/z | s/z
|
||||
fmul %st(3),%st(0) // t | s | 1/z | t/z | s/z
|
||||
fxch %st(1) // s | t | 1/z | t/z | s/z
|
||||
fistpl s // 1/z | t | t/z | s/z
|
||||
fistpl t // 1/z | t/z | s/z
|
||||
|
||||
fildl spancountminus1
|
||||
|
||||
flds C(d_tdivzstepu) // _d_tdivzstepu | spancountminus1
|
||||
flds C(d_zistepu) // _d_zistepu | _d_tdivzstepu | spancountminus1
|
||||
fmul %st(2),%st(0) // _d_zistepu*scm1 | _d_tdivzstepu | scm1
|
||||
fxch %st(1) // _d_tdivzstepu | _d_zistepu*scm1 | scm1
|
||||
fmul %st(2),%st(0) // _d_tdivzstepu*scm1 | _d_zistepu*scm1 | scm1
|
||||
fxch %st(2) // scm1 | _d_zistepu*scm1 | _d_tdivzstepu*scm1
|
||||
fmuls C(d_sdivzstepu) // _d_sdivzstepu*scm1 | _d_zistepu*scm1 |
|
||||
// _d_tdivzstepu*scm1
|
||||
fxch %st(1) // _d_zistepu*scm1 | _d_sdivzstepu*scm1 |
|
||||
// _d_tdivzstepu*scm1
|
||||
faddp %st(0),%st(3) // _d_sdivzstepu*scm1 | _d_tdivzstepu*scm1
|
||||
fxch %st(1) // _d_tdivzstepu*scm1 | _d_sdivzstepu*scm1
|
||||
faddp %st(0),%st(3) // _d_sdivzstepu*scm1
|
||||
faddp %st(0),%st(3)
|
||||
|
||||
flds fp_64k
|
||||
fdiv %st(1),%st(0) // this is what we've gone to all this trouble to
|
||||
// overlap
|
||||
jmp LFDIVInFlight1
|
||||
|
||||
LCleanup1:
|
||||
// finish up the s and t calcs
|
||||
fxch %st(1) // z*64k | 1/z | t/z | s/z
|
||||
|
||||
fld %st(0) // z*64k | z*64k | 1/z | t/z | s/z
|
||||
fmul %st(4),%st(0) // s | z*64k | 1/z | t/z | s/z
|
||||
fxch %st(1) // z*64k | s | 1/z | t/z | s/z
|
||||
fmul %st(3),%st(0) // t | s | 1/z | t/z | s/z
|
||||
fxch %st(1) // s | t | 1/z | t/z | s/z
|
||||
fistpl s // 1/z | t | t/z | s/z
|
||||
fistpl t // 1/z | t/z | s/z
|
||||
jmp LFDIVInFlight1
|
||||
|
||||
.align 4
|
||||
LSetupNotLast1:
|
||||
// finish up the s and t calcs
|
||||
fxch %st(1) // z*64k | 1/z | t/z | s/z
|
||||
|
||||
fld %st(0) // z*64k | z*64k | 1/z | t/z | s/z
|
||||
fmul %st(4),%st(0) // s | z*64k | 1/z | t/z | s/z
|
||||
fxch %st(1) // z*64k | s | 1/z | t/z | s/z
|
||||
fmul %st(3),%st(0) // t | s | 1/z | t/z | s/z
|
||||
fxch %st(1) // s | t | 1/z | t/z | s/z
|
||||
fistpl s // 1/z | t | t/z | s/z
|
||||
fistpl t // 1/z | t/z | s/z
|
||||
|
||||
fadds zi8stepu
|
||||
fxch %st(2)
|
||||
fadds sdivz8stepu
|
||||
fxch %st(2)
|
||||
flds tdivz8stepu
|
||||
faddp %st(0),%st(2)
|
||||
flds fp_64k
|
||||
fdiv %st(1),%st(0) // z = 1/1/z
|
||||
// this is what we've gone to all this trouble to
|
||||
// overlap
|
||||
LFDIVInFlight1:
|
||||
|
||||
addl s,%esi
|
||||
addl t,%edx
|
||||
movl C(bbextents),%ebx
|
||||
movl C(bbextentt),%ebp
|
||||
cmpl %ebx,%esi
|
||||
ja LClampHighOrLow0
|
||||
LClampReentry0:
|
||||
movl %esi,s
|
||||
movl pbase,%ebx
|
||||
shll $16,%esi
|
||||
cmpl %ebp,%edx
|
||||
movl %esi,sfracf
|
||||
ja LClampHighOrLow1
|
||||
LClampReentry1:
|
||||
movl %edx,t
|
||||
movl s,%esi // sfrac = scans->sfrac;
|
||||
shll $16,%edx
|
||||
movl t,%eax // tfrac = scans->tfrac;
|
||||
sarl $16,%esi
|
||||
movl %edx,tfracf
|
||||
|
||||
//
|
||||
// calculate the texture starting address
|
||||
//
|
||||
sarl $16,%eax
|
||||
addl %ebx,%esi
|
||||
imull C(cachewidth),%eax // (tfrac >> 16) * cachewidth
|
||||
addl %eax,%esi // psource = pbase + (sfrac >> 16) +
|
||||
// ((tfrac >> 16) * cachewidth);
|
||||
|
||||
//
|
||||
// determine whether last span or not
|
||||
//
|
||||
cmpl $8,%ecx
|
||||
jna LLastSegment
|
||||
|
||||
//
|
||||
// not the last segment; do full 8-wide segment
|
||||
//
|
||||
LNotLastSegment:
|
||||
|
||||
//
|
||||
// advance s/z, t/z, and 1/z, and calculate s & t at end of span and steps to
|
||||
// get there
|
||||
//
|
||||
|
||||
// pick up after the FDIV that was left in flight previously
|
||||
|
||||
fld %st(0) // duplicate it
|
||||
fmul %st(4),%st(0) // s = s/z * z
|
||||
fxch %st(1)
|
||||
fmul %st(3),%st(0) // t = t/z * z
|
||||
fxch %st(1)
|
||||
fistpl snext
|
||||
fistpl tnext
|
||||
movl snext,%eax
|
||||
movl tnext,%edx
|
||||
|
||||
subl $8,%ecx // count off this segments' pixels
|
||||
movl C(sadjust),%ebp
|
||||
pushl %ecx // remember count of remaining pixels
|
||||
movl C(tadjust),%ecx
|
||||
|
||||
addl %eax,%ebp
|
||||
addl %edx,%ecx
|
||||
|
||||
movl C(bbextents),%eax
|
||||
movl C(bbextentt),%edx
|
||||
|
||||
cmpl $2048,%ebp
|
||||
jl LClampLow2
|
||||
cmpl %eax,%ebp
|
||||
ja LClampHigh2
|
||||
LClampReentry2:
|
||||
|
||||
cmpl $2048,%ecx
|
||||
jl LClampLow3
|
||||
cmpl %edx,%ecx
|
||||
ja LClampHigh3
|
||||
LClampReentry3:
|
||||
|
||||
movl %ebp,snext
|
||||
movl %ecx,tnext
|
||||
|
||||
subl s,%ebp
|
||||
subl t,%ecx
|
||||
|
||||
//
|
||||
// set up advancetable
|
||||
//
|
||||
movl %ecx,%eax
|
||||
movl %ebp,%edx
|
||||
sarl $19,%edx // sstep >>= 16;
|
||||
movl C(cachewidth),%ebx
|
||||
sarl $19,%eax // tstep >>= 16;
|
||||
jz LIsZero
|
||||
imull %ebx,%eax // (tstep >> 16) * cachewidth;
|
||||
LIsZero:
|
||||
addl %edx,%eax // add in sstep
|
||||
// (tstep >> 16) * cachewidth + (sstep >> 16);
|
||||
movl tfracf,%edx
|
||||
movl %eax,advancetable+4 // advance base in t
|
||||
addl %ebx,%eax // ((tstep >> 16) + 1) * cachewidth +
|
||||
// (sstep >> 16);
|
||||
shll $13,%ebp // left-justify sstep fractional part
|
||||
movl %ebp,sstep
|
||||
movl sfracf,%ebx
|
||||
shll $13,%ecx // left-justify tstep fractional part
|
||||
movl %eax,advancetable // advance extra in t
|
||||
movl %ecx,tstep
|
||||
|
||||
movl pz,%ecx
|
||||
movl izi,%ebp
|
||||
|
||||
cmpw (%ecx),%bp
|
||||
jl Lp1
|
||||
movb (%esi),%al // get first source texel
|
||||
cmpb $(TRANSPARENT_COLOR),%al
|
||||
jz Lp1
|
||||
movw %bp,(%ecx)
|
||||
movb %al,(%edi) // store first dest pixel
|
||||
Lp1:
|
||||
addl izistep,%ebp
|
||||
adcl $0,%ebp
|
||||
addl tstep,%edx // advance tfrac fractional part by tstep frac
|
||||
|
||||
sbbl %eax,%eax // turn tstep carry into -1 (0 if none)
|
||||
addl sstep,%ebx // advance sfrac fractional part by sstep frac
|
||||
adcl advancetable+4(,%eax,4),%esi // point to next source texel
|
||||
|
||||
cmpw 2(%ecx),%bp
|
||||
jl Lp2
|
||||
movb (%esi),%al
|
||||
cmpb $(TRANSPARENT_COLOR),%al
|
||||
jz Lp2
|
||||
movw %bp,2(%ecx)
|
||||
movb %al,1(%edi)
|
||||
Lp2:
|
||||
addl izistep,%ebp
|
||||
adcl $0,%ebp
|
||||
addl tstep,%edx
|
||||
sbbl %eax,%eax
|
||||
addl sstep,%ebx
|
||||
adcl advancetable+4(,%eax,4),%esi
|
||||
|
||||
cmpw 4(%ecx),%bp
|
||||
jl Lp3
|
||||
movb (%esi),%al
|
||||
cmpb $(TRANSPARENT_COLOR),%al
|
||||
jz Lp3
|
||||
movw %bp,4(%ecx)
|
||||
movb %al,2(%edi)
|
||||
Lp3:
|
||||
addl izistep,%ebp
|
||||
adcl $0,%ebp
|
||||
addl tstep,%edx
|
||||
sbbl %eax,%eax
|
||||
addl sstep,%ebx
|
||||
adcl advancetable+4(,%eax,4),%esi
|
||||
|
||||
cmpw 6(%ecx),%bp
|
||||
jl Lp4
|
||||
movb (%esi),%al
|
||||
cmpb $(TRANSPARENT_COLOR),%al
|
||||
jz Lp4
|
||||
movw %bp,6(%ecx)
|
||||
movb %al,3(%edi)
|
||||
Lp4:
|
||||
addl izistep,%ebp
|
||||
adcl $0,%ebp
|
||||
addl tstep,%edx
|
||||
sbbl %eax,%eax
|
||||
addl sstep,%ebx
|
||||
adcl advancetable+4(,%eax,4),%esi
|
||||
|
||||
cmpw 8(%ecx),%bp
|
||||
jl Lp5
|
||||
movb (%esi),%al
|
||||
cmpb $(TRANSPARENT_COLOR),%al
|
||||
jz Lp5
|
||||
movw %bp,8(%ecx)
|
||||
movb %al,4(%edi)
|
||||
Lp5:
|
||||
addl izistep,%ebp
|
||||
adcl $0,%ebp
|
||||
addl tstep,%edx
|
||||
sbbl %eax,%eax
|
||||
addl sstep,%ebx
|
||||
adcl advancetable+4(,%eax,4),%esi
|
||||
|
||||
//
|
||||
// start FDIV for end of next segment in flight, so it can overlap
|
||||
//
|
||||
popl %eax
|
||||
cmpl $8,%eax // more than one segment after this?
|
||||
ja LSetupNotLast2 // yes
|
||||
|
||||
decl %eax
|
||||
jz LFDIVInFlight2 // if only one pixel, no need to start an FDIV
|
||||
movl %eax,spancountminus1
|
||||
fildl spancountminus1
|
||||
|
||||
flds C(d_zistepu) // _d_zistepu | spancountminus1
|
||||
fmul %st(1),%st(0) // _d_zistepu*scm1 | scm1
|
||||
flds C(d_tdivzstepu) // _d_tdivzstepu | _d_zistepu*scm1 | scm1
|
||||
fmul %st(2),%st(0) // _d_tdivzstepu*scm1 | _d_zistepu*scm1 | scm1
|
||||
fxch %st(1) // _d_zistepu*scm1 | _d_tdivzstepu*scm1 | scm1
|
||||
faddp %st(0),%st(3) // _d_tdivzstepu*scm1 | scm1
|
||||
fxch %st(1) // scm1 | _d_tdivzstepu*scm1
|
||||
fmuls C(d_sdivzstepu) // _d_sdivzstepu*scm1 | _d_tdivzstepu*scm1
|
||||
fxch %st(1) // _d_tdivzstepu*scm1 | _d_sdivzstepu*scm1
|
||||
faddp %st(0),%st(3) // _d_sdivzstepu*scm1
|
||||
flds fp_64k // 64k | _d_sdivzstepu*scm1
|
||||
fxch %st(1) // _d_sdivzstepu*scm1 | 64k
|
||||
faddp %st(0),%st(4) // 64k
|
||||
|
||||
fdiv %st(1),%st(0) // this is what we've gone to all this trouble to
|
||||
// overlap
|
||||
jmp LFDIVInFlight2
|
||||
|
||||
.align 4
|
||||
LSetupNotLast2:
|
||||
fadds zi8stepu
|
||||
fxch %st(2)
|
||||
fadds sdivz8stepu
|
||||
fxch %st(2)
|
||||
flds tdivz8stepu
|
||||
faddp %st(0),%st(2)
|
||||
flds fp_64k
|
||||
fdiv %st(1),%st(0) // z = 1/1/z
|
||||
// this is what we've gone to all this trouble to
|
||||
// overlap
|
||||
LFDIVInFlight2:
|
||||
pushl %eax
|
||||
|
||||
cmpw 10(%ecx),%bp
|
||||
jl Lp6
|
||||
movb (%esi),%al
|
||||
cmpb $(TRANSPARENT_COLOR),%al
|
||||
jz Lp6
|
||||
movw %bp,10(%ecx)
|
||||
movb %al,5(%edi)
|
||||
Lp6:
|
||||
addl izistep,%ebp
|
||||
adcl $0,%ebp
|
||||
addl tstep,%edx
|
||||
sbbl %eax,%eax
|
||||
addl sstep,%ebx
|
||||
adcl advancetable+4(,%eax,4),%esi
|
||||
|
||||
cmpw 12(%ecx),%bp
|
||||
jl Lp7
|
||||
movb (%esi),%al
|
||||
cmpb $(TRANSPARENT_COLOR),%al
|
||||
jz Lp7
|
||||
movw %bp,12(%ecx)
|
||||
movb %al,6(%edi)
|
||||
Lp7:
|
||||
addl izistep,%ebp
|
||||
adcl $0,%ebp
|
||||
addl tstep,%edx
|
||||
sbbl %eax,%eax
|
||||
addl sstep,%ebx
|
||||
adcl advancetable+4(,%eax,4),%esi
|
||||
|
||||
cmpw 14(%ecx),%bp
|
||||
jl Lp8
|
||||
movb (%esi),%al
|
||||
cmpb $(TRANSPARENT_COLOR),%al
|
||||
jz Lp8
|
||||
movw %bp,14(%ecx)
|
||||
movb %al,7(%edi)
|
||||
Lp8:
|
||||
addl izistep,%ebp
|
||||
adcl $0,%ebp
|
||||
addl tstep,%edx
|
||||
sbbl %eax,%eax
|
||||
addl sstep,%ebx
|
||||
adcl advancetable+4(,%eax,4),%esi
|
||||
|
||||
addl $8,%edi
|
||||
addl $16,%ecx
|
||||
movl %edx,tfracf
|
||||
movl snext,%edx
|
||||
movl %ebx,sfracf
|
||||
movl tnext,%ebx
|
||||
movl %edx,s
|
||||
movl %ebx,t
|
||||
|
||||
movl %ecx,pz
|
||||
movl %ebp,izi
|
||||
|
||||
popl %ecx // retrieve count
|
||||
|
||||
//
|
||||
// determine whether last span or not
|
||||
//
|
||||
cmpl $8,%ecx // are there multiple segments remaining?
|
||||
ja LNotLastSegment // yes
|
||||
|
||||
//
|
||||
// last segment of scan
|
||||
//
|
||||
LLastSegment:
|
||||
|
||||
//
|
||||
// advance s/z, t/z, and 1/z, and calculate s & t at end of span and steps to
|
||||
// get there. The number of pixels left is variable, and we want to land on the
|
||||
// last pixel, not step one past it, so we can't run into arithmetic problems
|
||||
//
|
||||
testl %ecx,%ecx
|
||||
jz LNoSteps // just draw the last pixel and we're done
|
||||
|
||||
// pick up after the FDIV that was left in flight previously
|
||||
|
||||
|
||||
fld %st(0) // duplicate it
|
||||
fmul %st(4),%st(0) // s = s/z * z
|
||||
fxch %st(1)
|
||||
fmul %st(3),%st(0) // t = t/z * z
|
||||
fxch %st(1)
|
||||
fistpl snext
|
||||
fistpl tnext
|
||||
|
||||
movl C(tadjust),%ebx
|
||||
movl C(sadjust),%eax
|
||||
|
||||
addl snext,%eax
|
||||
addl tnext,%ebx
|
||||
|
||||
movl C(bbextents),%ebp
|
||||
movl C(bbextentt),%edx
|
||||
|
||||
cmpl $2048,%eax
|
||||
jl LClampLow4
|
||||
cmpl %ebp,%eax
|
||||
ja LClampHigh4
|
||||
LClampReentry4:
|
||||
movl %eax,snext
|
||||
|
||||
cmpl $2048,%ebx
|
||||
jl LClampLow5
|
||||
cmpl %edx,%ebx
|
||||
ja LClampHigh5
|
||||
LClampReentry5:
|
||||
|
||||
cmpl $1,%ecx // don't bother
|
||||
je LOnlyOneStep // if two pixels in segment, there's only one step,
|
||||
// of the segment length
|
||||
subl s,%eax
|
||||
subl t,%ebx
|
||||
|
||||
addl %eax,%eax // convert to 15.17 format so multiply by 1.31
|
||||
addl %ebx,%ebx // reciprocal yields 16.48
|
||||
imull reciprocal_table-8(,%ecx,4) // sstep = (snext - s) / (spancount-1)
|
||||
movl %edx,%ebp
|
||||
|
||||
movl %ebx,%eax
|
||||
imull reciprocal_table-8(,%ecx,4) // tstep = (tnext - t) / (spancount-1)
|
||||
|
||||
LSetEntryvec:
|
||||
//
|
||||
// set up advancetable
|
||||
//
|
||||
movl spr8entryvec_table(,%ecx,4),%ebx
|
||||
movl %edx,%eax
|
||||
pushl %ebx // entry point into code for RET later
|
||||
movl %ebp,%ecx
|
||||
sarl $16,%ecx // sstep >>= 16;
|
||||
movl C(cachewidth),%ebx
|
||||
sarl $16,%edx // tstep >>= 16;
|
||||
jz LIsZeroLast
|
||||
imull %ebx,%edx // (tstep >> 16) * cachewidth;
|
||||
LIsZeroLast:
|
||||
addl %ecx,%edx // add in sstep
|
||||
// (tstep >> 16) * cachewidth + (sstep >> 16);
|
||||
movl tfracf,%ecx
|
||||
movl %edx,advancetable+4 // advance base in t
|
||||
addl %ebx,%edx // ((tstep >> 16) + 1) * cachewidth +
|
||||
// (sstep >> 16);
|
||||
shll $16,%ebp // left-justify sstep fractional part
|
||||
movl sfracf,%ebx
|
||||
shll $16,%eax // left-justify tstep fractional part
|
||||
movl %edx,advancetable // advance extra in t
|
||||
|
||||
movl %eax,tstep
|
||||
movl %ebp,sstep
|
||||
movl %ecx,%edx
|
||||
|
||||
movl pz,%ecx
|
||||
movl izi,%ebp
|
||||
|
||||
ret // jump to the number-of-pixels handler
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
LNoSteps:
|
||||
movl pz,%ecx
|
||||
subl $7,%edi // adjust for hardwired offset
|
||||
subl $14,%ecx
|
||||
jmp LEndSpan
|
||||
|
||||
|
||||
LOnlyOneStep:
|
||||
subl s,%eax
|
||||
subl t,%ebx
|
||||
movl %eax,%ebp
|
||||
movl %ebx,%edx
|
||||
jmp LSetEntryvec
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
.globl Spr8Entry2_8
|
||||
Spr8Entry2_8:
|
||||
subl $6,%edi // adjust for hardwired offsets
|
||||
subl $12,%ecx
|
||||
movb (%esi),%al
|
||||
jmp LLEntry2_8
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
.globl Spr8Entry3_8
|
||||
Spr8Entry3_8:
|
||||
subl $5,%edi // adjust for hardwired offsets
|
||||
subl $10,%ecx
|
||||
jmp LLEntry3_8
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
.globl Spr8Entry4_8
|
||||
Spr8Entry4_8:
|
||||
subl $4,%edi // adjust for hardwired offsets
|
||||
subl $8,%ecx
|
||||
jmp LLEntry4_8
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
.globl Spr8Entry5_8
|
||||
Spr8Entry5_8:
|
||||
subl $3,%edi // adjust for hardwired offsets
|
||||
subl $6,%ecx
|
||||
jmp LLEntry5_8
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
.globl Spr8Entry6_8
|
||||
Spr8Entry6_8:
|
||||
subl $2,%edi // adjust for hardwired offsets
|
||||
subl $4,%ecx
|
||||
jmp LLEntry6_8
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
.globl Spr8Entry7_8
|
||||
Spr8Entry7_8:
|
||||
decl %edi // adjust for hardwired offsets
|
||||
subl $2,%ecx
|
||||
jmp LLEntry7_8
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
.globl Spr8Entry8_8
|
||||
Spr8Entry8_8:
|
||||
cmpw (%ecx),%bp
|
||||
jl Lp9
|
||||
movb (%esi),%al
|
||||
cmpb $(TRANSPARENT_COLOR),%al
|
||||
jz Lp9
|
||||
movw %bp,(%ecx)
|
||||
movb %al,(%edi)
|
||||
Lp9:
|
||||
addl izistep,%ebp
|
||||
adcl $0,%ebp
|
||||
addl tstep,%edx
|
||||
sbbl %eax,%eax
|
||||
addl sstep,%ebx
|
||||
adcl advancetable+4(,%eax,4),%esi
|
||||
LLEntry7_8:
|
||||
cmpw 2(%ecx),%bp
|
||||
jl Lp10
|
||||
movb (%esi),%al
|
||||
cmpb $(TRANSPARENT_COLOR),%al
|
||||
jz Lp10
|
||||
movw %bp,2(%ecx)
|
||||
movb %al,1(%edi)
|
||||
Lp10:
|
||||
addl izistep,%ebp
|
||||
adcl $0,%ebp
|
||||
addl tstep,%edx
|
||||
sbbl %eax,%eax
|
||||
addl sstep,%ebx
|
||||
adcl advancetable+4(,%eax,4),%esi
|
||||
LLEntry6_8:
|
||||
cmpw 4(%ecx),%bp
|
||||
jl Lp11
|
||||
movb (%esi),%al
|
||||
cmpb $(TRANSPARENT_COLOR),%al
|
||||
jz Lp11
|
||||
movw %bp,4(%ecx)
|
||||
movb %al,2(%edi)
|
||||
Lp11:
|
||||
addl izistep,%ebp
|
||||
adcl $0,%ebp
|
||||
addl tstep,%edx
|
||||
sbbl %eax,%eax
|
||||
addl sstep,%ebx
|
||||
adcl advancetable+4(,%eax,4),%esi
|
||||
LLEntry5_8:
|
||||
cmpw 6(%ecx),%bp
|
||||
jl Lp12
|
||||
movb (%esi),%al
|
||||
cmpb $(TRANSPARENT_COLOR),%al
|
||||
jz Lp12
|
||||
movw %bp,6(%ecx)
|
||||
movb %al,3(%edi)
|
||||
Lp12:
|
||||
addl izistep,%ebp
|
||||
adcl $0,%ebp
|
||||
addl tstep,%edx
|
||||
sbbl %eax,%eax
|
||||
addl sstep,%ebx
|
||||
adcl advancetable+4(,%eax,4),%esi
|
||||
LLEntry4_8:
|
||||
cmpw 8(%ecx),%bp
|
||||
jl Lp13
|
||||
movb (%esi),%al
|
||||
cmpb $(TRANSPARENT_COLOR),%al
|
||||
jz Lp13
|
||||
movw %bp,8(%ecx)
|
||||
movb %al,4(%edi)
|
||||
Lp13:
|
||||
addl izistep,%ebp
|
||||
adcl $0,%ebp
|
||||
addl tstep,%edx
|
||||
sbbl %eax,%eax
|
||||
addl sstep,%ebx
|
||||
adcl advancetable+4(,%eax,4),%esi
|
||||
LLEntry3_8:
|
||||
cmpw 10(%ecx),%bp
|
||||
jl Lp14
|
||||
movb (%esi),%al
|
||||
cmpb $(TRANSPARENT_COLOR),%al
|
||||
jz Lp14
|
||||
movw %bp,10(%ecx)
|
||||
movb %al,5(%edi)
|
||||
Lp14:
|
||||
addl izistep,%ebp
|
||||
adcl $0,%ebp
|
||||
addl tstep,%edx
|
||||
sbbl %eax,%eax
|
||||
addl sstep,%ebx
|
||||
adcl advancetable+4(,%eax,4),%esi
|
||||
LLEntry2_8:
|
||||
cmpw 12(%ecx),%bp
|
||||
jl Lp15
|
||||
movb (%esi),%al
|
||||
cmpb $(TRANSPARENT_COLOR),%al
|
||||
jz Lp15
|
||||
movw %bp,12(%ecx)
|
||||
movb %al,6(%edi)
|
||||
Lp15:
|
||||
addl izistep,%ebp
|
||||
adcl $0,%ebp
|
||||
addl tstep,%edx
|
||||
sbbl %eax,%eax
|
||||
addl sstep,%ebx
|
||||
adcl advancetable+4(,%eax,4),%esi
|
||||
|
||||
LEndSpan:
|
||||
cmpw 14(%ecx),%bp
|
||||
jl Lp16
|
||||
movb (%esi),%al // load first texel in segment
|
||||
cmpb $(TRANSPARENT_COLOR),%al
|
||||
jz Lp16
|
||||
movw %bp,14(%ecx)
|
||||
movb %al,7(%edi)
|
||||
Lp16:
|
||||
|
||||
//
|
||||
// clear s/z, t/z, 1/z from FP stack
|
||||
//
|
||||
fstp %st(0)
|
||||
fstp %st(0)
|
||||
fstp %st(0)
|
||||
|
||||
popl %ebx // restore spans pointer
|
||||
LNextSpan:
|
||||
addl $(sspan_t_size),%ebx // point to next span
|
||||
movl sspan_t_count(%ebx),%ecx
|
||||
cmpl $0,%ecx // any more spans?
|
||||
jg LSpanLoop // yes
|
||||
jz LNextSpan // yes, but this one's empty
|
||||
|
||||
popl %ebx // restore register variables
|
||||
popl %esi
|
||||
popl %edi
|
||||
popl %ebp // restore the caller's stack frame
|
||||
ret
|
||||
|
||||
#endif // id386
|
||||
442
WinQuake/d_sprite.c
Normal file
442
WinQuake/d_sprite.c
Normal file
@@ -0,0 +1,442 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// d_sprite.c: software top-level rasterization driver module for drawing
|
||||
// sprites
|
||||
|
||||
#include "quakedef.h"
|
||||
#include "d_local.h"
|
||||
|
||||
static int sprite_height;
|
||||
static int minindex, maxindex;
|
||||
static sspan_t *sprite_spans;
|
||||
|
||||
#if !id386
|
||||
|
||||
/*
|
||||
=====================
|
||||
D_SpriteDrawSpans
|
||||
=====================
|
||||
*/
|
||||
void D_SpriteDrawSpans (sspan_t *pspan)
|
||||
{
|
||||
int count, spancount, izistep;
|
||||
int izi;
|
||||
byte *pbase, *pdest;
|
||||
fixed16_t s, t, snext, tnext, sstep, tstep;
|
||||
float sdivz, tdivz, zi, z, du, dv, spancountminus1;
|
||||
float sdivz8stepu, tdivz8stepu, zi8stepu;
|
||||
byte btemp;
|
||||
short *pz;
|
||||
|
||||
sstep = 0; // keep compiler happy
|
||||
tstep = 0; // ditto
|
||||
|
||||
pbase = cacheblock;
|
||||
|
||||
sdivz8stepu = d_sdivzstepu * 8;
|
||||
tdivz8stepu = d_tdivzstepu * 8;
|
||||
zi8stepu = d_zistepu * 8;
|
||||
|
||||
// we count on FP exceptions being turned off to avoid range problems
|
||||
izistep = (int)(d_zistepu * 0x8000 * 0x10000);
|
||||
|
||||
do
|
||||
{
|
||||
pdest = (byte *)d_viewbuffer + (screenwidth * pspan->v) + pspan->u;
|
||||
pz = d_pzbuffer + (d_zwidth * pspan->v) + pspan->u;
|
||||
|
||||
count = pspan->count;
|
||||
|
||||
if (count <= 0)
|
||||
goto NextSpan;
|
||||
|
||||
// calculate the initial s/z, t/z, 1/z, s, and t and clamp
|
||||
du = (float)pspan->u;
|
||||
dv = (float)pspan->v;
|
||||
|
||||
sdivz = d_sdivzorigin + dv*d_sdivzstepv + du*d_sdivzstepu;
|
||||
tdivz = d_tdivzorigin + dv*d_tdivzstepv + du*d_tdivzstepu;
|
||||
zi = d_ziorigin + dv*d_zistepv + du*d_zistepu;
|
||||
z = (float)0x10000 / zi; // prescale to 16.16 fixed-point
|
||||
// we count on FP exceptions being turned off to avoid range problems
|
||||
izi = (int)(zi * 0x8000 * 0x10000);
|
||||
|
||||
s = (int)(sdivz * z) + sadjust;
|
||||
if (s > bbextents)
|
||||
s = bbextents;
|
||||
else if (s < 0)
|
||||
s = 0;
|
||||
|
||||
t = (int)(tdivz * z) + tadjust;
|
||||
if (t > bbextentt)
|
||||
t = bbextentt;
|
||||
else if (t < 0)
|
||||
t = 0;
|
||||
|
||||
do
|
||||
{
|
||||
// calculate s and t at the far end of the span
|
||||
if (count >= 8)
|
||||
spancount = 8;
|
||||
else
|
||||
spancount = count;
|
||||
|
||||
count -= spancount;
|
||||
|
||||
if (count)
|
||||
{
|
||||
// calculate s/z, t/z, zi->fixed s and t at far end of span,
|
||||
// calculate s and t steps across span by shifting
|
||||
sdivz += sdivz8stepu;
|
||||
tdivz += tdivz8stepu;
|
||||
zi += zi8stepu;
|
||||
z = (float)0x10000 / zi; // prescale to 16.16 fixed-point
|
||||
|
||||
snext = (int)(sdivz * z) + sadjust;
|
||||
if (snext > bbextents)
|
||||
snext = bbextents;
|
||||
else if (snext < 8)
|
||||
snext = 8; // prevent round-off error on <0 steps from
|
||||
// from causing overstepping & running off the
|
||||
// edge of the texture
|
||||
|
||||
tnext = (int)(tdivz * z) + tadjust;
|
||||
if (tnext > bbextentt)
|
||||
tnext = bbextentt;
|
||||
else if (tnext < 8)
|
||||
tnext = 8; // guard against round-off error on <0 steps
|
||||
|
||||
sstep = (snext - s) >> 3;
|
||||
tstep = (tnext - t) >> 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
// calculate s/z, t/z, zi->fixed s and t at last pixel in span (so
|
||||
// can't step off polygon), clamp, calculate s and t steps across
|
||||
// span by division, biasing steps low so we don't run off the
|
||||
// texture
|
||||
spancountminus1 = (float)(spancount - 1);
|
||||
sdivz += d_sdivzstepu * spancountminus1;
|
||||
tdivz += d_tdivzstepu * spancountminus1;
|
||||
zi += d_zistepu * spancountminus1;
|
||||
z = (float)0x10000 / zi; // prescale to 16.16 fixed-point
|
||||
snext = (int)(sdivz * z) + sadjust;
|
||||
if (snext > bbextents)
|
||||
snext = bbextents;
|
||||
else if (snext < 8)
|
||||
snext = 8; // prevent round-off error on <0 steps from
|
||||
// from causing overstepping & running off the
|
||||
// edge of the texture
|
||||
|
||||
tnext = (int)(tdivz * z) + tadjust;
|
||||
if (tnext > bbextentt)
|
||||
tnext = bbextentt;
|
||||
else if (tnext < 8)
|
||||
tnext = 8; // guard against round-off error on <0 steps
|
||||
|
||||
if (spancount > 1)
|
||||
{
|
||||
sstep = (snext - s) / (spancount - 1);
|
||||
tstep = (tnext - t) / (spancount - 1);
|
||||
}
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
btemp = *(pbase + (s >> 16) + (t >> 16) * cachewidth);
|
||||
if (btemp != 255)
|
||||
{
|
||||
if (*pz <= (izi >> 16))
|
||||
{
|
||||
*pz = izi >> 16;
|
||||
*pdest = btemp;
|
||||
}
|
||||
}
|
||||
|
||||
izi += izistep;
|
||||
pdest++;
|
||||
pz++;
|
||||
s += sstep;
|
||||
t += tstep;
|
||||
} while (--spancount > 0);
|
||||
|
||||
s = snext;
|
||||
t = tnext;
|
||||
|
||||
} while (count > 0);
|
||||
|
||||
NextSpan:
|
||||
pspan++;
|
||||
|
||||
} while (pspan->count != DS_SPAN_LIST_END);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
=====================
|
||||
D_SpriteScanLeftEdge
|
||||
=====================
|
||||
*/
|
||||
void D_SpriteScanLeftEdge (void)
|
||||
{
|
||||
int i, v, itop, ibottom, lmaxindex;
|
||||
emitpoint_t *pvert, *pnext;
|
||||
sspan_t *pspan;
|
||||
float du, dv, vtop, vbottom, slope;
|
||||
fixed16_t u, u_step;
|
||||
|
||||
pspan = sprite_spans;
|
||||
i = minindex;
|
||||
if (i == 0)
|
||||
i = r_spritedesc.nump;
|
||||
|
||||
lmaxindex = maxindex;
|
||||
if (lmaxindex == 0)
|
||||
lmaxindex = r_spritedesc.nump;
|
||||
|
||||
vtop = ceil (r_spritedesc.pverts[i].v);
|
||||
|
||||
do
|
||||
{
|
||||
pvert = &r_spritedesc.pverts[i];
|
||||
pnext = pvert - 1;
|
||||
|
||||
vbottom = ceil (pnext->v);
|
||||
|
||||
if (vtop < vbottom)
|
||||
{
|
||||
du = pnext->u - pvert->u;
|
||||
dv = pnext->v - pvert->v;
|
||||
slope = du / dv;
|
||||
u_step = (int)(slope * 0x10000);
|
||||
// adjust u to ceil the integer portion
|
||||
u = (int)((pvert->u + (slope * (vtop - pvert->v))) * 0x10000) +
|
||||
(0x10000 - 1);
|
||||
itop = (int)vtop;
|
||||
ibottom = (int)vbottom;
|
||||
|
||||
for (v=itop ; v<ibottom ; v++)
|
||||
{
|
||||
pspan->u = u >> 16;
|
||||
pspan->v = v;
|
||||
u += u_step;
|
||||
pspan++;
|
||||
}
|
||||
}
|
||||
|
||||
vtop = vbottom;
|
||||
|
||||
i--;
|
||||
if (i == 0)
|
||||
i = r_spritedesc.nump;
|
||||
|
||||
} while (i != lmaxindex);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
=====================
|
||||
D_SpriteScanRightEdge
|
||||
=====================
|
||||
*/
|
||||
void D_SpriteScanRightEdge (void)
|
||||
{
|
||||
int i, v, itop, ibottom;
|
||||
emitpoint_t *pvert, *pnext;
|
||||
sspan_t *pspan;
|
||||
float du, dv, vtop, vbottom, slope, uvert, unext, vvert, vnext;
|
||||
fixed16_t u, u_step;
|
||||
|
||||
pspan = sprite_spans;
|
||||
i = minindex;
|
||||
|
||||
vvert = r_spritedesc.pverts[i].v;
|
||||
if (vvert < r_refdef.fvrecty_adj)
|
||||
vvert = r_refdef.fvrecty_adj;
|
||||
if (vvert > r_refdef.fvrectbottom_adj)
|
||||
vvert = r_refdef.fvrectbottom_adj;
|
||||
|
||||
vtop = ceil (vvert);
|
||||
|
||||
do
|
||||
{
|
||||
pvert = &r_spritedesc.pverts[i];
|
||||
pnext = pvert + 1;
|
||||
|
||||
vnext = pnext->v;
|
||||
if (vnext < r_refdef.fvrecty_adj)
|
||||
vnext = r_refdef.fvrecty_adj;
|
||||
if (vnext > r_refdef.fvrectbottom_adj)
|
||||
vnext = r_refdef.fvrectbottom_adj;
|
||||
|
||||
vbottom = ceil (vnext);
|
||||
|
||||
if (vtop < vbottom)
|
||||
{
|
||||
uvert = pvert->u;
|
||||
if (uvert < r_refdef.fvrectx_adj)
|
||||
uvert = r_refdef.fvrectx_adj;
|
||||
if (uvert > r_refdef.fvrectright_adj)
|
||||
uvert = r_refdef.fvrectright_adj;
|
||||
|
||||
unext = pnext->u;
|
||||
if (unext < r_refdef.fvrectx_adj)
|
||||
unext = r_refdef.fvrectx_adj;
|
||||
if (unext > r_refdef.fvrectright_adj)
|
||||
unext = r_refdef.fvrectright_adj;
|
||||
|
||||
du = unext - uvert;
|
||||
dv = vnext - vvert;
|
||||
slope = du / dv;
|
||||
u_step = (int)(slope * 0x10000);
|
||||
// adjust u to ceil the integer portion
|
||||
u = (int)((uvert + (slope * (vtop - vvert))) * 0x10000) +
|
||||
(0x10000 - 1);
|
||||
itop = (int)vtop;
|
||||
ibottom = (int)vbottom;
|
||||
|
||||
for (v=itop ; v<ibottom ; v++)
|
||||
{
|
||||
pspan->count = (u >> 16) - pspan->u;
|
||||
u += u_step;
|
||||
pspan++;
|
||||
}
|
||||
}
|
||||
|
||||
vtop = vbottom;
|
||||
vvert = vnext;
|
||||
|
||||
i++;
|
||||
if (i == r_spritedesc.nump)
|
||||
i = 0;
|
||||
|
||||
} while (i != maxindex);
|
||||
|
||||
pspan->count = DS_SPAN_LIST_END; // mark the end of the span list
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
=====================
|
||||
D_SpriteCalculateGradients
|
||||
=====================
|
||||
*/
|
||||
void D_SpriteCalculateGradients (void)
|
||||
{
|
||||
vec3_t p_normal, p_saxis, p_taxis, p_temp1;
|
||||
float distinv;
|
||||
|
||||
TransformVector (r_spritedesc.vpn, p_normal);
|
||||
TransformVector (r_spritedesc.vright, p_saxis);
|
||||
TransformVector (r_spritedesc.vup, p_taxis);
|
||||
VectorInverse (p_taxis);
|
||||
|
||||
distinv = 1.0 / (-DotProduct (modelorg, r_spritedesc.vpn));
|
||||
|
||||
d_sdivzstepu = p_saxis[0] * xscaleinv;
|
||||
d_tdivzstepu = p_taxis[0] * xscaleinv;
|
||||
|
||||
d_sdivzstepv = -p_saxis[1] * yscaleinv;
|
||||
d_tdivzstepv = -p_taxis[1] * yscaleinv;
|
||||
|
||||
d_zistepu = p_normal[0] * xscaleinv * distinv;
|
||||
d_zistepv = -p_normal[1] * yscaleinv * distinv;
|
||||
|
||||
d_sdivzorigin = p_saxis[2] - xcenter * d_sdivzstepu -
|
||||
ycenter * d_sdivzstepv;
|
||||
d_tdivzorigin = p_taxis[2] - xcenter * d_tdivzstepu -
|
||||
ycenter * d_tdivzstepv;
|
||||
d_ziorigin = p_normal[2] * distinv - xcenter * d_zistepu -
|
||||
ycenter * d_zistepv;
|
||||
|
||||
TransformVector (modelorg, p_temp1);
|
||||
|
||||
sadjust = ((fixed16_t)(DotProduct (p_temp1, p_saxis) * 0x10000 + 0.5)) -
|
||||
(-(cachewidth >> 1) << 16);
|
||||
tadjust = ((fixed16_t)(DotProduct (p_temp1, p_taxis) * 0x10000 + 0.5)) -
|
||||
(-(sprite_height >> 1) << 16);
|
||||
|
||||
// -1 (-epsilon) so we never wander off the edge of the texture
|
||||
bbextents = (cachewidth << 16) - 1;
|
||||
bbextentt = (sprite_height << 16) - 1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
=====================
|
||||
D_DrawSprite
|
||||
=====================
|
||||
*/
|
||||
void D_DrawSprite (void)
|
||||
{
|
||||
int i, nump;
|
||||
float ymin, ymax;
|
||||
emitpoint_t *pverts;
|
||||
sspan_t spans[MAXHEIGHT+1];
|
||||
|
||||
sprite_spans = spans;
|
||||
|
||||
// find the top and bottom vertices, and make sure there's at least one scan to
|
||||
// draw
|
||||
ymin = 999999.9;
|
||||
ymax = -999999.9;
|
||||
pverts = r_spritedesc.pverts;
|
||||
|
||||
for (i=0 ; i<r_spritedesc.nump ; i++)
|
||||
{
|
||||
if (pverts->v < ymin)
|
||||
{
|
||||
ymin = pverts->v;
|
||||
minindex = i;
|
||||
}
|
||||
|
||||
if (pverts->v > ymax)
|
||||
{
|
||||
ymax = pverts->v;
|
||||
maxindex = i;
|
||||
}
|
||||
|
||||
pverts++;
|
||||
}
|
||||
|
||||
ymin = ceil (ymin);
|
||||
ymax = ceil (ymax);
|
||||
|
||||
if (ymin >= ymax)
|
||||
return; // doesn't cross any scans at all
|
||||
|
||||
cachewidth = r_spritedesc.pspriteframe->width;
|
||||
sprite_height = r_spritedesc.pspriteframe->height;
|
||||
cacheblock = (byte *)&r_spritedesc.pspriteframe->pixels[0];
|
||||
|
||||
// copy the first vertex to the last vertex, so we don't have to deal with
|
||||
// wrapping
|
||||
nump = r_spritedesc.nump;
|
||||
pverts = r_spritedesc.pverts;
|
||||
pverts[nump] = pverts[0];
|
||||
|
||||
D_SpriteCalculateGradients ();
|
||||
D_SpriteScanLeftEdge ();
|
||||
D_SpriteScanRightEdge ();
|
||||
D_SpriteDrawSpans (sprite_spans);
|
||||
}
|
||||
|
||||
335
WinQuake/d_surf.c
Normal file
335
WinQuake/d_surf.c
Normal file
@@ -0,0 +1,335 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// d_surf.c: rasterization driver surface heap manager
|
||||
|
||||
#include "quakedef.h"
|
||||
#include "d_local.h"
|
||||
#include "r_local.h"
|
||||
|
||||
float surfscale;
|
||||
qboolean r_cache_thrash; // set if surface cache is thrashing
|
||||
|
||||
int sc_size;
|
||||
surfcache_t *sc_rover, *sc_base;
|
||||
|
||||
#define GUARDSIZE 4
|
||||
|
||||
|
||||
int D_SurfaceCacheForRes (int width, int height)
|
||||
{
|
||||
int size, pix;
|
||||
|
||||
if (COM_CheckParm ("-surfcachesize"))
|
||||
{
|
||||
size = Q_atoi(com_argv[COM_CheckParm("-surfcachesize")+1]) * 1024;
|
||||
return size;
|
||||
}
|
||||
|
||||
size = SURFCACHE_SIZE_AT_320X200;
|
||||
|
||||
pix = width*height;
|
||||
if (pix > 64000)
|
||||
size += (pix-64000)*3;
|
||||
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
void D_CheckCacheGuard (void)
|
||||
{
|
||||
byte *s;
|
||||
int i;
|
||||
|
||||
s = (byte *)sc_base + sc_size;
|
||||
for (i=0 ; i<GUARDSIZE ; i++)
|
||||
if (s[i] != (byte)i)
|
||||
Sys_Error ("D_CheckCacheGuard: failed");
|
||||
}
|
||||
|
||||
void D_ClearCacheGuard (void)
|
||||
{
|
||||
byte *s;
|
||||
int i;
|
||||
|
||||
s = (byte *)sc_base + sc_size;
|
||||
for (i=0 ; i<GUARDSIZE ; i++)
|
||||
s[i] = (byte)i;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
D_InitCaches
|
||||
|
||||
================
|
||||
*/
|
||||
void D_InitCaches (void *buffer, int size)
|
||||
{
|
||||
|
||||
if (!msg_suppress_1)
|
||||
Con_Printf ("%ik surface cache\n", size/1024);
|
||||
|
||||
sc_size = size - GUARDSIZE;
|
||||
sc_base = (surfcache_t *)buffer;
|
||||
sc_rover = sc_base;
|
||||
|
||||
sc_base->next = NULL;
|
||||
sc_base->owner = NULL;
|
||||
sc_base->size = sc_size;
|
||||
|
||||
D_ClearCacheGuard ();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==================
|
||||
D_FlushCaches
|
||||
==================
|
||||
*/
|
||||
void D_FlushCaches (void)
|
||||
{
|
||||
surfcache_t *c;
|
||||
|
||||
if (!sc_base)
|
||||
return;
|
||||
|
||||
for (c = sc_base ; c ; c = c->next)
|
||||
{
|
||||
if (c->owner)
|
||||
*c->owner = NULL;
|
||||
}
|
||||
|
||||
sc_rover = sc_base;
|
||||
sc_base->next = NULL;
|
||||
sc_base->owner = NULL;
|
||||
sc_base->size = sc_size;
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
D_SCAlloc
|
||||
=================
|
||||
*/
|
||||
surfcache_t *D_SCAlloc (int width, int size)
|
||||
{
|
||||
surfcache_t *new;
|
||||
qboolean wrapped_this_time;
|
||||
|
||||
if ((width < 0) || (width > 256))
|
||||
Sys_Error ("D_SCAlloc: bad cache width %d\n", width);
|
||||
|
||||
if ((size <= 0) || (size > 0x10000))
|
||||
Sys_Error ("D_SCAlloc: bad cache size %d\n", size);
|
||||
|
||||
size = (int)&((surfcache_t *)0)->data[size];
|
||||
size = (size + 3) & ~3;
|
||||
if (size > sc_size)
|
||||
Sys_Error ("D_SCAlloc: %i > cache size",size);
|
||||
|
||||
// if there is not size bytes after the rover, reset to the start
|
||||
wrapped_this_time = false;
|
||||
|
||||
if ( !sc_rover || (byte *)sc_rover - (byte *)sc_base > sc_size - size)
|
||||
{
|
||||
if (sc_rover)
|
||||
{
|
||||
wrapped_this_time = true;
|
||||
}
|
||||
sc_rover = sc_base;
|
||||
}
|
||||
|
||||
// colect and free surfcache_t blocks until the rover block is large enough
|
||||
new = sc_rover;
|
||||
if (sc_rover->owner)
|
||||
*sc_rover->owner = NULL;
|
||||
|
||||
while (new->size < size)
|
||||
{
|
||||
// free another
|
||||
sc_rover = sc_rover->next;
|
||||
if (!sc_rover)
|
||||
Sys_Error ("D_SCAlloc: hit the end of memory");
|
||||
if (sc_rover->owner)
|
||||
*sc_rover->owner = NULL;
|
||||
|
||||
new->size += sc_rover->size;
|
||||
new->next = sc_rover->next;
|
||||
}
|
||||
|
||||
// create a fragment out of any leftovers
|
||||
if (new->size - size > 256)
|
||||
{
|
||||
sc_rover = (surfcache_t *)( (byte *)new + size);
|
||||
sc_rover->size = new->size - size;
|
||||
sc_rover->next = new->next;
|
||||
sc_rover->width = 0;
|
||||
sc_rover->owner = NULL;
|
||||
new->next = sc_rover;
|
||||
new->size = size;
|
||||
}
|
||||
else
|
||||
sc_rover = new->next;
|
||||
|
||||
new->width = width;
|
||||
// DEBUG
|
||||
if (width > 0)
|
||||
new->height = (size - sizeof(*new) + sizeof(new->data)) / width;
|
||||
|
||||
new->owner = NULL; // should be set properly after return
|
||||
|
||||
if (d_roverwrapped)
|
||||
{
|
||||
if (wrapped_this_time || (sc_rover >= d_initial_rover))
|
||||
r_cache_thrash = true;
|
||||
}
|
||||
else if (wrapped_this_time)
|
||||
{
|
||||
d_roverwrapped = true;
|
||||
}
|
||||
|
||||
D_CheckCacheGuard (); // DEBUG
|
||||
return new;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
=================
|
||||
D_SCDump
|
||||
=================
|
||||
*/
|
||||
void D_SCDump (void)
|
||||
{
|
||||
surfcache_t *test;
|
||||
|
||||
for (test = sc_base ; test ; test = test->next)
|
||||
{
|
||||
if (test == sc_rover)
|
||||
Sys_Printf ("ROVER:\n");
|
||||
printf ("%p : %i bytes %i width\n",test, test->size, test->width);
|
||||
}
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
// if the num is not a power of 2, assume it will not repeat
|
||||
|
||||
int MaskForNum (int num)
|
||||
{
|
||||
if (num==128)
|
||||
return 127;
|
||||
if (num==64)
|
||||
return 63;
|
||||
if (num==32)
|
||||
return 31;
|
||||
if (num==16)
|
||||
return 15;
|
||||
return 255;
|
||||
}
|
||||
|
||||
int D_log2 (int num)
|
||||
{
|
||||
int c;
|
||||
|
||||
c = 0;
|
||||
|
||||
while (num>>=1)
|
||||
c++;
|
||||
return c;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
/*
|
||||
================
|
||||
D_CacheSurface
|
||||
================
|
||||
*/
|
||||
surfcache_t *D_CacheSurface (msurface_t *surface, int miplevel)
|
||||
{
|
||||
surfcache_t *cache;
|
||||
|
||||
//
|
||||
// if the surface is animating or flashing, flush the cache
|
||||
//
|
||||
r_drawsurf.texture = R_TextureAnimation (surface->texinfo->texture);
|
||||
r_drawsurf.lightadj[0] = d_lightstylevalue[surface->styles[0]];
|
||||
r_drawsurf.lightadj[1] = d_lightstylevalue[surface->styles[1]];
|
||||
r_drawsurf.lightadj[2] = d_lightstylevalue[surface->styles[2]];
|
||||
r_drawsurf.lightadj[3] = d_lightstylevalue[surface->styles[3]];
|
||||
|
||||
//
|
||||
// see if the cache holds apropriate data
|
||||
//
|
||||
cache = surface->cachespots[miplevel];
|
||||
|
||||
if (cache && !cache->dlight && surface->dlightframe != r_framecount
|
||||
&& cache->texture == r_drawsurf.texture
|
||||
&& cache->lightadj[0] == r_drawsurf.lightadj[0]
|
||||
&& cache->lightadj[1] == r_drawsurf.lightadj[1]
|
||||
&& cache->lightadj[2] == r_drawsurf.lightadj[2]
|
||||
&& cache->lightadj[3] == r_drawsurf.lightadj[3] )
|
||||
return cache;
|
||||
|
||||
//
|
||||
// determine shape of surface
|
||||
//
|
||||
surfscale = 1.0 / (1<<miplevel);
|
||||
r_drawsurf.surfmip = miplevel;
|
||||
r_drawsurf.surfwidth = surface->extents[0] >> miplevel;
|
||||
r_drawsurf.rowbytes = r_drawsurf.surfwidth;
|
||||
r_drawsurf.surfheight = surface->extents[1] >> miplevel;
|
||||
|
||||
//
|
||||
// allocate memory if needed
|
||||
//
|
||||
if (!cache) // if a texture just animated, don't reallocate it
|
||||
{
|
||||
cache = D_SCAlloc (r_drawsurf.surfwidth,
|
||||
r_drawsurf.surfwidth * r_drawsurf.surfheight);
|
||||
surface->cachespots[miplevel] = cache;
|
||||
cache->owner = &surface->cachespots[miplevel];
|
||||
cache->mipscale = surfscale;
|
||||
}
|
||||
|
||||
if (surface->dlightframe == r_framecount)
|
||||
cache->dlight = 1;
|
||||
else
|
||||
cache->dlight = 0;
|
||||
|
||||
r_drawsurf.surfdat = (pixel_t *)cache->data;
|
||||
|
||||
cache->texture = r_drawsurf.texture;
|
||||
cache->lightadj[0] = r_drawsurf.lightadj[0];
|
||||
cache->lightadj[1] = r_drawsurf.lightadj[1];
|
||||
cache->lightadj[2] = r_drawsurf.lightadj[2];
|
||||
cache->lightadj[3] = r_drawsurf.lightadj[3];
|
||||
|
||||
//
|
||||
// draw and light the surface texture
|
||||
//
|
||||
r_drawsurf.surf = surface;
|
||||
|
||||
c_surf++;
|
||||
R_DrawSurface ();
|
||||
|
||||
return surface->cachespots[miplevel];
|
||||
}
|
||||
|
||||
|
||||
50
WinQuake/d_vars.c
Normal file
50
WinQuake/d_vars.c
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// r_vars.c: global refresh variables
|
||||
|
||||
#if !id386
|
||||
|
||||
#include "quakedef.h"
|
||||
|
||||
// all global and static refresh variables are collected in a contiguous block
|
||||
// to avoid cache conflicts.
|
||||
|
||||
//-------------------------------------------------------
|
||||
// global refresh variables
|
||||
//-------------------------------------------------------
|
||||
|
||||
// FIXME: make into one big structure, like cl or sv
|
||||
// FIXME: do separately for refresh engine and driver
|
||||
|
||||
float d_sdivzstepu, d_tdivzstepu, d_zistepu;
|
||||
float d_sdivzstepv, d_tdivzstepv, d_zistepv;
|
||||
float d_sdivzorigin, d_tdivzorigin, d_ziorigin;
|
||||
|
||||
fixed16_t sadjust, tadjust, bbextents, bbextentt;
|
||||
|
||||
pixel_t *cacheblock;
|
||||
int cachewidth;
|
||||
pixel_t *d_viewbuffer;
|
||||
short *d_pzbuffer;
|
||||
unsigned int d_zrowbytes;
|
||||
unsigned int d_zwidth;
|
||||
|
||||
#endif // !id386
|
||||
|
||||
213
WinQuake/d_varsa.s
Normal file
213
WinQuake/d_varsa.s
Normal file
@@ -0,0 +1,213 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
//
|
||||
// d_varsa.s
|
||||
//
|
||||
|
||||
#include "asm_i386.h"
|
||||
#include "quakeasm.h"
|
||||
#include "asm_draw.h"
|
||||
#include "d_ifacea.h"
|
||||
|
||||
#if id386
|
||||
|
||||
.data
|
||||
|
||||
//-------------------------------------------------------
|
||||
// global refresh variables
|
||||
//-------------------------------------------------------
|
||||
|
||||
// FIXME: put all refresh variables into one contiguous block. Make into one
|
||||
// big structure, like cl or sv?
|
||||
|
||||
.align 4
|
||||
.globl C(d_sdivzstepu)
|
||||
.globl C(d_tdivzstepu)
|
||||
.globl C(d_zistepu)
|
||||
.globl C(d_sdivzstepv)
|
||||
.globl C(d_tdivzstepv)
|
||||
.globl C(d_zistepv)
|
||||
.globl C(d_sdivzorigin)
|
||||
.globl C(d_tdivzorigin)
|
||||
.globl C(d_ziorigin)
|
||||
C(d_sdivzstepu): .single 0
|
||||
C(d_tdivzstepu): .single 0
|
||||
C(d_zistepu): .single 0
|
||||
C(d_sdivzstepv): .single 0
|
||||
C(d_tdivzstepv): .single 0
|
||||
C(d_zistepv): .single 0
|
||||
C(d_sdivzorigin): .single 0
|
||||
C(d_tdivzorigin): .single 0
|
||||
C(d_ziorigin): .single 0
|
||||
|
||||
.globl C(sadjust)
|
||||
.globl C(tadjust)
|
||||
.globl C(bbextents)
|
||||
.globl C(bbextentt)
|
||||
C(sadjust): .long 0
|
||||
C(tadjust): .long 0
|
||||
C(bbextents): .long 0
|
||||
C(bbextentt): .long 0
|
||||
|
||||
.globl C(cacheblock)
|
||||
.globl C(d_viewbuffer)
|
||||
.globl C(cachewidth)
|
||||
.globl C(d_pzbuffer)
|
||||
.globl C(d_zrowbytes)
|
||||
.globl C(d_zwidth)
|
||||
C(cacheblock): .long 0
|
||||
C(cachewidth): .long 0
|
||||
C(d_viewbuffer): .long 0
|
||||
C(d_pzbuffer): .long 0
|
||||
C(d_zrowbytes): .long 0
|
||||
C(d_zwidth): .long 0
|
||||
|
||||
|
||||
//-------------------------------------------------------
|
||||
// ASM-only variables
|
||||
//-------------------------------------------------------
|
||||
.globl izi
|
||||
izi: .long 0
|
||||
|
||||
.globl pbase, s, t, sfracf, tfracf, snext, tnext
|
||||
.globl spancountminus1, zi16stepu, sdivz16stepu, tdivz16stepu
|
||||
.globl zi8stepu, sdivz8stepu, tdivz8stepu, pz
|
||||
s: .long 0
|
||||
t: .long 0
|
||||
snext: .long 0
|
||||
tnext: .long 0
|
||||
sfracf: .long 0
|
||||
tfracf: .long 0
|
||||
pbase: .long 0
|
||||
zi8stepu: .long 0
|
||||
sdivz8stepu: .long 0
|
||||
tdivz8stepu: .long 0
|
||||
zi16stepu: .long 0
|
||||
sdivz16stepu: .long 0
|
||||
tdivz16stepu: .long 0
|
||||
spancountminus1: .long 0
|
||||
pz: .long 0
|
||||
|
||||
.globl izistep
|
||||
izistep: .long 0
|
||||
|
||||
//-------------------------------------------------------
|
||||
// local variables for d_draw16.s
|
||||
//-------------------------------------------------------
|
||||
|
||||
.globl reciprocal_table_16, entryvec_table_16
|
||||
// 1/2, 1/3, 1/4, 1/5, 1/6, 1/7, 1/8, 1/9, 1/10, 1/11, 1/12, 1/13,
|
||||
// 1/14, and 1/15 in 0.32 form
|
||||
reciprocal_table_16: .long 0x40000000, 0x2aaaaaaa, 0x20000000
|
||||
.long 0x19999999, 0x15555555, 0x12492492
|
||||
.long 0x10000000, 0xe38e38e, 0xccccccc, 0xba2e8ba
|
||||
.long 0xaaaaaaa, 0x9d89d89, 0x9249249, 0x8888888
|
||||
|
||||
#ifndef NeXT
|
||||
.extern Entry2_16
|
||||
.extern Entry3_16
|
||||
.extern Entry4_16
|
||||
.extern Entry5_16
|
||||
.extern Entry6_16
|
||||
.extern Entry7_16
|
||||
.extern Entry8_16
|
||||
.extern Entry9_16
|
||||
.extern Entry10_16
|
||||
.extern Entry11_16
|
||||
.extern Entry12_16
|
||||
.extern Entry13_16
|
||||
.extern Entry14_16
|
||||
.extern Entry15_16
|
||||
.extern Entry16_16
|
||||
#endif
|
||||
|
||||
entryvec_table_16: .long 0, Entry2_16, Entry3_16, Entry4_16
|
||||
.long Entry5_16, Entry6_16, Entry7_16, Entry8_16
|
||||
.long Entry9_16, Entry10_16, Entry11_16, Entry12_16
|
||||
.long Entry13_16, Entry14_16, Entry15_16, Entry16_16
|
||||
|
||||
//-------------------------------------------------------
|
||||
// local variables for d_parta.s
|
||||
//-------------------------------------------------------
|
||||
.globl DP_Count, DP_u, DP_v, DP_32768, DP_Color, DP_Pix, DP_EntryTable
|
||||
DP_Count: .long 0
|
||||
DP_u: .long 0
|
||||
DP_v: .long 0
|
||||
DP_32768: .single 32768.0
|
||||
DP_Color: .long 0
|
||||
DP_Pix: .long 0
|
||||
|
||||
|
||||
#ifndef NeXT
|
||||
.extern DP_1x1
|
||||
.extern DP_2x2
|
||||
.extern DP_3x3
|
||||
.extern DP_4x4
|
||||
#endif
|
||||
|
||||
DP_EntryTable: .long DP_1x1, DP_2x2, DP_3x3, DP_4x4
|
||||
|
||||
//
|
||||
// advancetable is 8 bytes, but points to the middle of that range so negative
|
||||
// offsets will work
|
||||
//
|
||||
.globl advancetable, sstep, tstep, pspantemp, counttemp, jumptemp
|
||||
advancetable: .long 0, 0
|
||||
sstep: .long 0
|
||||
tstep: .long 0
|
||||
|
||||
pspantemp: .long 0
|
||||
counttemp: .long 0
|
||||
jumptemp: .long 0
|
||||
|
||||
// 1/2, 1/3, 1/4, 1/5, 1/6, and 1/7 in 0.32 form
|
||||
.globl reciprocal_table, entryvec_table
|
||||
reciprocal_table: .long 0x40000000, 0x2aaaaaaa, 0x20000000
|
||||
.long 0x19999999, 0x15555555, 0x12492492
|
||||
|
||||
#ifndef NeXT
|
||||
.extern Entry2_8
|
||||
.extern Entry3_8
|
||||
.extern Entry4_8
|
||||
.extern Entry5_8
|
||||
.extern Entry6_8
|
||||
.extern Entry7_8
|
||||
.extern Entry8_8
|
||||
#endif
|
||||
|
||||
entryvec_table: .long 0, Entry2_8, Entry3_8, Entry4_8
|
||||
.long Entry5_8, Entry6_8, Entry7_8, Entry8_8
|
||||
|
||||
#ifndef NeXT
|
||||
.extern Spr8Entry2_8
|
||||
.extern Spr8Entry3_8
|
||||
.extern Spr8Entry4_8
|
||||
.extern Spr8Entry5_8
|
||||
.extern Spr8Entry6_8
|
||||
.extern Spr8Entry7_8
|
||||
.extern Spr8Entry8_8
|
||||
#endif
|
||||
|
||||
.globl spr8entryvec_table
|
||||
spr8entryvec_table: .long 0, Spr8Entry2_8, Spr8Entry3_8, Spr8Entry4_8
|
||||
.long Spr8Entry5_8, Spr8Entry6_8, Spr8Entry7_8, Spr8Entry8_8
|
||||
|
||||
#endif // id386
|
||||
|
||||
47
WinQuake/d_zpoint.c
Normal file
47
WinQuake/d_zpoint.c
Normal file
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
// d_zpoint.c: software driver module for drawing z-buffered points
|
||||
|
||||
#include "quakedef.h"
|
||||
#include "d_local.h"
|
||||
|
||||
|
||||
/*
|
||||
=====================
|
||||
D_DrawZPoint
|
||||
=====================
|
||||
*/
|
||||
void D_DrawZPoint (void)
|
||||
{
|
||||
byte *pdest;
|
||||
short *pz;
|
||||
int izi;
|
||||
|
||||
pz = d_pzbuffer + (d_zwidth * r_zpointdesc.v) + r_zpointdesc.u;
|
||||
pdest = d_viewbuffer + d_scantable[r_zpointdesc.v] + r_zpointdesc.u;
|
||||
izi = (int)(r_zpointdesc.zi * 0x8000);
|
||||
|
||||
if (*pz <= izi)
|
||||
{
|
||||
*pz = izi;
|
||||
*pdest = r_zpointdesc.color;
|
||||
}
|
||||
}
|
||||
|
||||
487
WinQuake/data/COMEXP.TXT
Normal file
487
WinQuake/data/COMEXP.TXT
Normal file
@@ -0,0 +1,487 @@
|
||||
COMMERCIAL EXPLOITATION LICENSE AGREEMENT FOR QUAKE
|
||||
|
||||
This Commercial Exploitation License Agreement for QUAKE
|
||||
(the "Agreement") is between Id Software, Inc., a Texas
|
||||
Corporation, (hereinafter "Id Software") and Licensee (as described
|
||||
on the signature page hereof) and is made effective beginning on
|
||||
the date of last signature hereto (the "Effective Date").
|
||||
|
||||
R E C I T A L S
|
||||
|
||||
WHEREAS, Id Software is the owner and developer of the
|
||||
computer software game entitled QUAKE;
|
||||
|
||||
WHEREAS, Id Software desires to license certain
|
||||
non-exclusive rights regarding QUAKE to Licensee; and
|
||||
|
||||
WHEREAS, Licensee desires to receive a license for such
|
||||
rights.
|
||||
|
||||
T E R M S A N D C O N D I T I O N S
|
||||
|
||||
NOW, THEREFORE, for and in consideration of the mutual
|
||||
premises contained herein and for other good and valuable
|
||||
consideration, the receipt and sufficiency of which is hereby
|
||||
acknowledged, the undersigned parties do hereby agree as follows:
|
||||
|
||||
1. DEFINITIONS. As used in this Agreement, the parties
|
||||
hereto agree the words set forth below shall have the specified
|
||||
meanings:
|
||||
|
||||
a. "Authorized Copy" shall mean one (1) copy of the
|
||||
Subject Game actually purchased by Licensee from an
|
||||
Id Software approved retailer; and
|
||||
|
||||
b. "Subject Game" shall mean the full registered
|
||||
version of QUAKE on a CD-ROM and shall not mean the
|
||||
shareware or any other version.
|
||||
|
||||
2. GRANT OF RIGHTS. Id Software hereby grants to
|
||||
Licensee and Licensee hereby accepts, subject to the provisions and
|
||||
conditions hereof, a world-wide (except as otherwise provided
|
||||
herein), non-exclusive, non-transferable, and non-assignable
|
||||
license to:
|
||||
|
||||
a. publicly display an Authorized Copy in exchange for
|
||||
rental payment;
|
||||
|
||||
b. run the Authorized Copy so that it will accept
|
||||
network/modem connections in exchange for payments
|
||||
from end-users who also must have actually purchased
|
||||
an Authorized Copy; and
|
||||
|
||||
c. otherwise commercially exploit an Authorized Copy,
|
||||
except that Licensee shall not copy, reproduce,
|
||||
manufacture or distribute the Authorized Copy.
|
||||
|
||||
3. RESERVATION OF RIGHTS AND PROHIBITIONS. Id Software
|
||||
expressly reserves all rights not granted herein. Under no
|
||||
circumstances shall Licensee copy, reproduce, manufacture or
|
||||
distribute (free of charge or otherwise) the Authorized Copy or the
|
||||
Subject Game. Licensee shall not reverse engineer, decompile,
|
||||
disassemble, modify or alter the Authorized Copy. Licensee is not
|
||||
receiving any rights hereunder regarding the Trademark or any
|
||||
artwork, sound, music or other element of the Subject Game.
|
||||
|
||||
4. OWNERSHIP. Title to and all ownership rights in and
|
||||
to the Subject Game, and the QUAKE Trademark (the "Trademark") and
|
||||
the copyrights, trademarks, patents and other intellectual property
|
||||
rights related thereto shall remain with Id Software which shall have
|
||||
the exclusive right to protect the same by copyright or otherwise.
|
||||
Licensee shall have no ownership rights in or to the Subject Game or
|
||||
the Trademark and Licensee shall not own any intellectual property
|
||||
rights regarding the Authorized Copy, including, without limitation,
|
||||
the copyright regarding the Authorized Copy. Licensee acknowledges
|
||||
that it only has a limited license to use the Authorized Copy, as
|
||||
specified in that certain QUAKE Enduser License contained within the
|
||||
Authorized Copy and as specified in this Agreement.
|
||||
|
||||
5. TERM AND TERMINATION.
|
||||
|
||||
a. The term of this Agreement and the license granted
|
||||
herein begins on the Effective Date and shall expire on a date one
|
||||
(1) calendar year from the Effective Date.
|
||||
|
||||
b. Either party may terminate this Agreement, for any
|
||||
reason or no reason, on thirty (30) days written notice to the
|
||||
other party. Termination will be effective on the thirtieth (30th)
|
||||
day following delivery of the described notice. Notwithstanding
|
||||
anything to the contrary herein, this Agreement shall immediately
|
||||
terminate, without the requirement of any notice from Id Software
|
||||
to Licensee, upon the occurrence of any of the following: (a) if
|
||||
Licensee shall file a petition in bankruptcy or make an assignment
|
||||
for the benefit of creditors, or if any bankruptcy proceeding or
|
||||
assignment for benefit of creditors, shall be commenced against
|
||||
Licensee and not be dismissed within sixty (60) days after the date
|
||||
of its commencement; (b) the insolvency of Licensee; (c) the
|
||||
cessation by Licensee of its business; or (d) the cessation by
|
||||
Licensee, without the prior written consent of Id Software of the
|
||||
distribution, manufacture, and sale responsibilities embodied
|
||||
herein. Further, Id Software may elect to terminate this Agreement
|
||||
upon the occurrence of any of the following: (1) if Licensee's
|
||||
business operations are interrupted for forty (40) consecutive
|
||||
calendar days; or (2) if each of two Id Software audit inspections
|
||||
during any eighteen (18) month period demonstrates an
|
||||
understatement by Licensee of Royalty payments due Id Software for
|
||||
the six (6) month period immediately preceding each such inspection
|
||||
of five percent (5%) or more. Upon the occurrence of such
|
||||
terminating event, and the election of Id Software, if necessary,
|
||||
to cause such termination, this Agreement and any and all rights
|
||||
thereunder shall terminate without prejudice to any rights or
|
||||
claims Id Software may have, and all rights hereunder shall
|
||||
thereupon terminate, revert to and be vested in Id Software.
|
||||
|
||||
6. EFFECT OF TERMINATION OR EXPIRATION. Termination or
|
||||
expiration of this Agreement, either by Id Software or
|
||||
automatically, shall not create any liability against Id Software.
|
||||
Upon expiration or earlier termination of this Agreement, Licensee
|
||||
shall have no further right to exercise the rights licensed
|
||||
hereunder or otherwise acquired in relation to this Agreement.
|
||||
|
||||
7. INDEMNIFICATION. Licensee hereby agrees to
|
||||
indemnify, hold harmless and defend Id Software and Id Software's
|
||||
predecessors, successors, assigns, officers, directors,
|
||||
shareholders, employees, agents, representatives, licensees,
|
||||
sublicensees, distributors, attorneys and accountants
|
||||
(collectively, the "Id Related Parties") from and against any and
|
||||
all damages, claims, losses, causes of action, liabilities,
|
||||
lawsuits, judgments and expenses (including, without limitation,
|
||||
reasonable attorneys' fees and expenses) arising from, relating to
|
||||
or in connection with a breach of this Agreement by Licensee and
|
||||
arising from, relating to or in connection with the Licensee's use
|
||||
or non-use of the Authorized Copy (collectively, the "Claims"). Id
|
||||
Software agrees to notify Licensee of any such Claims within a
|
||||
reasonable time after Id Software learns of same. Licensee, at its
|
||||
own expense, shall defend Id Software and the Id Related Parties
|
||||
from any and all Claims. Id Software and the Id Related Parties
|
||||
reserve the right to participate in any defense of the Claims with
|
||||
counsel of their choice, and at their own expense. In the event
|
||||
Licensee fails to provide a defense, then Licensee shall be
|
||||
responsible for paying the attorneys' fees and expenses incurred by
|
||||
Id Software and the Id Related Parties regarding the defense of the
|
||||
Claims. Id Software and the Id Related Parties, as applicable,
|
||||
agree to reasonably assist in the defense of the Claims. No
|
||||
settlement by Licensee of any Claims shall be valid unless Licensee
|
||||
receives the prior written consent of Id Software and the Id
|
||||
Related Parties, as applicable, to any such settlement.
|
||||
|
||||
8. CONFIDENTIALITY. It is understood and agreed that
|
||||
any proprietary information of Id Software that may from time to
|
||||
time be made available or become known to Licensee is to be treated
|
||||
as confidential, is to be used solely in connection with Licensee's
|
||||
performance under this Agreement, and is to be disclosed only to
|
||||
employees of Licensee who have a need for access. Such proprietary
|
||||
information shall include, but not be limited to, trade secrets,
|
||||
release information, financial information, personnel information,
|
||||
and the like. Reasonable measures shall be taken by Licensee to
|
||||
protect the confidentiality of Id Software's proprietary
|
||||
information and any memoranda or papers containing proprietary
|
||||
information of Id Software's that Licensee may receive are to be
|
||||
returned to Id Software upon request. Licensee's obligations and
|
||||
duties under this paragraph shall survive expiration or earlier
|
||||
termination of this Agreement. Licensee shall obtain from its
|
||||
employees an undertaking in a form which may be supplied by Id
|
||||
Software, and which is subject to Id Software's prior written
|
||||
approval, not to use or disclose to any third party any information
|
||||
or knowledge concerning the business of Id Software which may be
|
||||
communicated to such employees.
|
||||
|
||||
9. LIMITATION OF LIABILITY. ID SOFTWARE EXPRESSLY
|
||||
DISCLAIMS ALL WARRANTIES NOT PROVIDED BY ID SOFTWARE HEREUNDER.
|
||||
UNDER NO CIRCUMSTANCES SHALL ID SOFTWARE BE LIABLE TO LICENSEE FOR
|
||||
ACTUAL, SPECIAL, INCIDENTAL, CONSEQUENTIAL OR PUNITIVE DAMAGES OR
|
||||
ANY OTHER DAMAGES, WHETHER OR NOT ID SOFTWARE RECEIVES NOTICE OF
|
||||
ANY SUCH DAMAGES.
|
||||
|
||||
10. COMPLIANCE WITH APPLICABLE LAWS. In performing
|
||||
under this Agreement, Licensee agrees to comply with all applicable
|
||||
laws, [including, without limitation, 22 U.S.C., 2778 and 22
|
||||
U.S.C. C.F.R. Parts 120-130 (1995)] regulations, ordinances and
|
||||
statutes, including, but not limited to, the import/export laws and
|
||||
regulations of the United States and its governmental and
|
||||
regulatory agencies (including, without limitation, the Bureau of
|
||||
Export Administration and the U.S. Department of Commerce) and all
|
||||
applicable international treaties and laws. Further, Licensee
|
||||
shall defend, indemnify and hold harmless Id Software from any and
|
||||
all sales tax, tariffs and/or duties in connection with Licensee's
|
||||
performance hereunder.
|
||||
|
||||
11. SPECIFIC UNDERTAKINGS BY LICENSEE. In addition to
|
||||
the obligations of Licensee otherwise set forth in this Agreement,
|
||||
during the term of this Agreement, and thereafter where specified,
|
||||
Licensee agrees that:
|
||||
|
||||
a. It will not attack the title of Id Software to the
|
||||
Subject Game or the Trademark and any copyright, patent or
|
||||
trademark or other intellectual property right related thereto and
|
||||
it will not attack the validity of the license granted hereunder
|
||||
during the term hereof or thereafter; and
|
||||
|
||||
b. It will promptly inform Id Software of any
|
||||
unauthorized use of the Authorized Copy, the Subject Game and the
|
||||
Trademark and any portions thereof and reasonably assist Id
|
||||
Software in the enforcement of any rights Id Software may have
|
||||
against such unauthorized users.
|
||||
|
||||
12. FINANCIAL OBLIGATIONS AND ACCOUNTING.
|
||||
|
||||
a. Payment of Royalties. Licensee agrees to pay Id
|
||||
Software a royalty ("Royalty") at the rate of twelve and one-half
|
||||
percent (12.5%) of Net Income. The term "Net Income" shall mean
|
||||
all revenue received by Licensee from the commercial use of the
|
||||
Authorized Copy, less only Licensee's actual, documented costs
|
||||
relating directly to such use. A Royalty shall only be due for
|
||||
those months in which Licensee's gross revenue from QUAKE
|
||||
distribution exceeds U.S. Five Thousand Dollars ($5,000.00) and in
|
||||
such months Licensee shall pay a full Royalty on all revenue
|
||||
received.
|
||||
|
||||
b. Rendition of Statements. Licensee shall account to
|
||||
Id Software with regard to transactions hereunder within forty-five
|
||||
(45) days following the conclusion of each calendar quarter.
|
||||
Licensee hereby represents and warrants that such statements of
|
||||
account to be prepared shall be true and correct. The accounts
|
||||
shall show in summary form the appropriate calculations relating to
|
||||
the computation of Royalties, if any. The statements shall also
|
||||
show the gross revenue received by Licensee per month. The
|
||||
Royalties payable to Id Software hereunder shall be remitted with
|
||||
the particular statement indicating such amount to be due. All
|
||||
statements hereunder shall be deemed rendered when deposited,
|
||||
postage prepaid, in the United States mail, addressed to Id
|
||||
Software at Id Software's address set forth on the signature page
|
||||
hereof.
|
||||
|
||||
c. Books of Account and Audits. Licensee shall keep
|
||||
books of account relating to the commercial use of the Authorized
|
||||
Copy on the basis of generally accepted accounting principles and
|
||||
shall maintain such books of account for a period of at least two
|
||||
(2) years after the expiration or earlier termination of this
|
||||
Agreement; provided, however, that Licensee shall not be required
|
||||
to keep such records longer than seven (7) years from their date of
|
||||
origination. Id Software may, upon reasonable notice and at its
|
||||
own expense, audit the applicable records at Licensee's office, in
|
||||
order to verify statements rendered hereunder. Any such audit
|
||||
shall take place during reasonable business hours and in such
|
||||
manner so as not to interfere with Licensee's normal business
|
||||
activities. Id Software agrees that such information inspected
|
||||
and/or copied on behalf of Id Software hereunder shall be used only
|
||||
for the purpose of determining the accuracy of the statements, and
|
||||
shall be revealed only to such officers, directors, employees,
|
||||
agents and/or representatives of Id Software as necessary to verify
|
||||
the accuracy of the statements. If in an audit of Licensee's books
|
||||
and records it is determined that there is a short fall of ten
|
||||
percent (10%) or more in Royalties reported for any calendar
|
||||
quarter, in addition to payment of such short fall and interest as
|
||||
may be due, as provided herein, Licensee shall reimburse Id
|
||||
Software for the full out-of-pocket costs of the audit including
|
||||
reasonable travel costs and expenses; provided, however, that the
|
||||
amount of reimbursement paid by Licensee shall not exceed U.S.
|
||||
Fifteen Thousand Dollars ($15,000.00) for any audit.
|
||||
|
||||
d. Payment of the Royalty. Licensee assumes all risks
|
||||
associated with fluctuations in foreign currency exchange rates.
|
||||
Licensee shall pay and agrees to pay all sums due Id Software in
|
||||
United States Dollars. With respect to Royalties due for
|
||||
commercial use outside the United States, other currencies shall be
|
||||
exchanged at the expense of Licensee into United States Dollars
|
||||
using the bid price quoted at the Citibank, N.A. of New York, New
|
||||
York, for the purchase of United States Dollars at the close of
|
||||
business on the last day of the calendar quarter during which any
|
||||
amounts accrue. Payment of the Royalties shall be made in Dallas
|
||||
County, Texas.
|
||||
|
||||
e. Interest. If Id Software does not receive the
|
||||
applicable Royalty payment on or before the due date of such
|
||||
payment, Licensee agrees to pay and shall pay interest on Royalties
|
||||
owed to Id Software from such date as specified in the following
|
||||
sentence at a rate per annum equal to the Index Rate. For purposes
|
||||
of clarification, the interest will begin to accrue on the first
|
||||
(1st) day following the due date of the Royalty payment, unless the
|
||||
Royalty payment is paid timely. The "Index Rate" shall be the
|
||||
prime rate as published in The Wall Street Journal's "Money Rates"
|
||||
table. If multiple prime rates are quoted in the table, then the
|
||||
highest prime rate will be the Index Rate. In the event that the
|
||||
prime rate is no longer published in the "Money Rates" table, then
|
||||
Id Software will choose a substitute Index Rate which is based upon
|
||||
comparable information. The applicable interest rate will be
|
||||
determined and take effect on the first day of each month.
|
||||
|
||||
NOTHING HEREIN SHALL BE CONSTRUED AS A REQUEST OR DEMAND BY
|
||||
ID SOFTWARE OF INTEREST AT A RATE HIGHER THAN ALLOWED BY APPLICABLE
|
||||
LAW. IT IS THE INTENT OF THE PARTIES HERETO THAT NO INTEREST BE
|
||||
CHARGED HEREUNDER WHICH EXCEEDS THE MAXIMUM RATE ALLOWED BY
|
||||
APPLICABLE LAW. IF THE RATE REFERENCED ABOVE EXCEEDS THE MAXIMUM
|
||||
RATE ALLOWED BY APPLICABLE LAW, THEN THE INTEREST RATE MADE
|
||||
APPLICABLE HEREIN SHALL BE THE MAXIMUM RATE ALLOWED BY APPLICABLE
|
||||
LAW.
|
||||
|
||||
13. SUBLICENSE. Licensee shall not be entitled to
|
||||
sublicense any of its rights under this Agreement.
|
||||
|
||||
14. GOODWILL. Licensee recognizes the great value of
|
||||
the goodwill associated with the Subject Game and the Trademark,
|
||||
and acknowledges that such goodwill, now existing and hereafter
|
||||
created, exclusively belongs to Id Software and that the Trademark
|
||||
has acquired a secondary meaning in the mind of the public.
|
||||
|
||||
15. REMEDIES. In the event of a breach of this
|
||||
Agreement by Id Software, Licensee's sole remedy shall be to
|
||||
terminate this Agreement. In the event of a breach by Licensee of
|
||||
this Agreement, Id Software may pursue the remedies to which it is
|
||||
entitled under applicable law, including, but not limited to,
|
||||
termination of this Agreement. Licensee agrees that its failure to
|
||||
comply with the terms of this Agreement upon expiration or earlier
|
||||
termination hereof or Licensee's unauthorized use of the Authorized
|
||||
Copy may result in immediate and irreparable damage to Id Software
|
||||
for which there is no adequate remedy at law, and in the event of
|
||||
such failure by Licensee, Id Software shall be entitled to
|
||||
injunctive relief. Pursuit of any remedy by Id Software shall not
|
||||
constitute a waiver of any other right or remedy of Id Software
|
||||
under this Agreement or under applicable law. Termination of this
|
||||
Agreement shall not be a pre-condition to Id Software pursuing its
|
||||
other remedies for breach.
|
||||
|
||||
16. LICENSEE'S WARRANTIES. Licensee warrants and
|
||||
represents that it has full legal rights to enter into this
|
||||
Agreement and to perform its obligations hereunder and that it will
|
||||
comply, at all times during the terms of this Agreement, with all
|
||||
applicable laws, as set forth hereinabove.
|
||||
|
||||
17. BANKRUPTCY. If Licensee's liabilities exceed its
|
||||
assets, or if Licensee becomes unable to pay its debts as they
|
||||
become due or if Licensee files for voluntary bankruptcy, or is
|
||||
placed in bankruptcy which is not dissolved or dismissed after
|
||||
thirty (30) days from the petition filing date, or if Licensee
|
||||
becomes insolvent, or makes an assignment for the benefit of its
|
||||
creditors or an arrangement pursuant to any bankruptcy laws or if
|
||||
Licensee discontinues its business or if a receiver is appointed
|
||||
for its business, this Agreement shall automatically terminate,
|
||||
without notice, and become null and void; provided, however, all
|
||||
duties of Licensee upon termination or expiration of this Agreement
|
||||
shall continue in full force and effect.
|
||||
|
||||
18. ENTIRE AGREEMENT AND ASSIGNMENT. This Agreement
|
||||
constitutes the entire understanding between Licensee and Id
|
||||
Software regarding the Subject Game. Each and every clause of this
|
||||
Agreement is severable from the whole and shall survive unless the
|
||||
entire Agreement is declared unenforceable. No prior or present
|
||||
agreements or representations shall be binding upon any of the
|
||||
parties hereto unless incorporated in this Agreement. No
|
||||
modification or change in this Agreement shall be valid or binding
|
||||
upon the parties unless in writing, executed by the parties to be
|
||||
bound thereby. This Agreement shall bind and inure to the benefit
|
||||
of Id Software, its successors and assigns, and Id Software may
|
||||
assign its rights hereunder, in Id Software's sole discretion.
|
||||
This Agreement is personal to Licensee, and Licensee shall not
|
||||
sublicense, assign, transfer, convey nor franchise its rights
|
||||
granted hereunder.
|
||||
|
||||
19. CHOICE OF LAW, VENUE AND SERVICE OF PROCESS. This
|
||||
Agreement shall be construed in accordance with the laws of the
|
||||
State of Texas and applicable U.S. federal law and all claims
|
||||
and/or lawsuits in connection with this Agreement must be brought
|
||||
in Dallas County, Texas. Licensee hereby agrees that service of
|
||||
process by certified mail to the address set forth below, with
|
||||
return receipt requested, shall constitute valid service of process
|
||||
upon Licensee. If for any reason Licensee has moved or cannot be
|
||||
validly served, then Licensee appoints the Secretary of State of
|
||||
the state of Texas to accept service of process on Licensee's
|
||||
behalf.
|
||||
|
||||
20. EXCUSED PERFORMANCE. Neither party shall be deemed
|
||||
to be in default of any provision of this Agreement nor be liable
|
||||
for any delay, failure in performance or interruption of service,
|
||||
resulting directly or indirectly from acts of God, civil or
|
||||
military authority, civil disturbance, military action, war,
|
||||
strikes, other catastrophes or any other similar cause beyond its
|
||||
reasonable control. Written notice to the non-affected party of any
|
||||
such condition shall be given by the affected party within ten (10)
|
||||
days of the event.
|
||||
|
||||
21. DELIVERY OF NOTICES, AND DELIVERY OF PAYMENTS.
|
||||
Unless otherwise directed in writing by the parties, all notices
|
||||
given hereunder and all payments made hereunder shall be sent to
|
||||
the addresses set forth on the signature page hereof. All
|
||||
notices, requests, consents and other communications under this
|
||||
Agreement shall be in writing and shall be deemed to have been
|
||||
delivered on the date personally delivered or on the date deposited
|
||||
in the United States Postal Service, postage prepaid, by certified
|
||||
mail, return receipt requested, or telegraphed and confirmed, or
|
||||
delivered by electronic facsimile and confirmed. Any notice to Id
|
||||
Software shall also be sent to its counsel: D. Wade Cloud, Jr.,
|
||||
Hiersche, Martens, Hayward, Drakeley & Urbach, P.C., 15303 Dallas
|
||||
Parkway, Suite 700, LB 17, Dallas, Texas 75248.
|
||||
|
||||
22. NO PARTNERSHIP, ETC. This Agreement does not
|
||||
constitute and shall not be construed as constituting a partnership
|
||||
or joint venture between Id Software and Licensee. Neither party
|
||||
shall have any right to obligate or bind the other party in any
|
||||
manner whatsoever, and nothing herein contained shall give, or is
|
||||
intended to give, any rights of any kind to any third persons.
|
||||
|
||||
23. COUNTERPARTS. This Agreement may be executed in
|
||||
several counterparts, each of which will be deemed to be an
|
||||
original, and each of which alone and all of which together, shall
|
||||
constitute one and the same instrument, but in making proof of this
|
||||
Agreement it shall not be necessary to produce or account for each
|
||||
copy of any counterpart other than the counterpart signed by the
|
||||
party against whom this Agreement is to be enforced. This
|
||||
Agreement may be transmitted by facsimile, and it is the intent of
|
||||
the parties for the facsimile of any autograph printed by a
|
||||
receiving facsimile machine to be an original signature and for the
|
||||
facsimile and any complete photocopy of the Agreement to be deemed
|
||||
an original counterpart.
|
||||
|
||||
24. MEDIATION. If a dispute arises out of or relates to
|
||||
this Agreement, or a breach of this Agreement, and if the dispute
|
||||
cannot be settled through direct discussion, then the parties agree
|
||||
to endeavor to settle the dispute in an amicable manner by
|
||||
mediation, under the applicable provisions of Section 154.00 et
|
||||
seq., Texas Civil Practices and Remedies Code, as supplemented by
|
||||
the rules of the Association of Attorney Mediators.
|
||||
|
||||
25. SURVIVAL. The following provisions shall survive
|
||||
the expiration or earlier termination of this Agreement:
|
||||
paragraphs 4., 7., 8., and the audit rights of Id Software in
|
||||
paragraph 12.c.
|
||||
|
||||
26. MISCELLANEOUS.
|
||||
|
||||
a. All captions in this Agreement are intended solely
|
||||
for the convenience of the parties, and none shall effect the
|
||||
meaning or construction of any provision.
|
||||
|
||||
b. The terms and conditions of this Agreement have been
|
||||
negotiated fully and freely among the parties. Accordingly, the
|
||||
preparation of this Agreement by counsel for a given party will not
|
||||
be material to the construction hereof, and the terms of this
|
||||
Agreement shall not be strictly construed against such party.
|
||||
|
||||
By signing in the spaces provided below, the parties have
|
||||
agreed to all of the terms and conditions set forth in this
|
||||
Agreement.
|
||||
|
||||
|
||||
AGREED:
|
||||
|
||||
LICENSEE:
|
||||
|
||||
|
||||
Signed:_______________________________
|
||||
Printed Name:_________________________
|
||||
Title:________________________________
|
||||
Address:______________________________
|
||||
______________________________________
|
||||
______________________________________
|
||||
Telephone #: _________________________
|
||||
Fax #:________________________________
|
||||
E-Mail Address:_______________________
|
||||
Date: ________________________________
|
||||
|
||||
|
||||
AGREED:
|
||||
|
||||
ID SOFTWARE, INC.
|
||||
|
||||
|
||||
Signed:_______________________________
|
||||
Printed Name:_________________________
|
||||
Title:________________________________
|
||||
Address:______________________________
|
||||
______________________________________
|
||||
______________________________________
|
||||
Telephone #: _________________________
|
||||
Fax #:________________________________
|
||||
E-Mail Address:_______________________
|
||||
Date: ________________________________
|
||||
|
||||
|
||||
|
||||
June 10, 1996
|
||||
|
||||
|
||||
|
||||
COMMERCIAL EXPLOITATION LICENSE AGREEMENT FOR QUAKE
|
||||
(DWC:dw:3406.0299:dwc\doc:5017)
|
||||
|
||||
|
||||
119
WinQuake/data/HELP.TXT
Normal file
119
WinQuake/data/HELP.TXT
Normal file
@@ -0,0 +1,119 @@
|
||||
TECH SUPPORT
|
||||
Any of the information listed below could change. Check the id software
|
||||
Web Site, at www.idsoftware.com, for updates.
|
||||
|
||||
A. Tech Support Options
|
||||
id Software does charge for technical support, but we strive to offer
|
||||
this service at the lowest cost possible. Because volume on the support
|
||||
lines dictate costs, we periodically adjust our rates for Voice Tech
|
||||
Support. Check our web site for current pricing.
|
||||
|
||||
Paying for Voice or Automated Support
|
||||
1 -- You can get Voice Support using a major credit card for a one-time
|
||||
shot. The system asks for your credit card number and expiration date,
|
||||
then pre-authorizes your credit card for the tech support call. You will
|
||||
only be billed for the number of minutes actually used.
|
||||
|
||||
2 -- You can assign yourself a rechargeable PIN account. The system prompts
|
||||
you for your credit card information, and assigns you a PIN account number.
|
||||
You can use the PIN to access Voice Support, Automated Support and the
|
||||
Game Hints Line. Once your account runs out, you can charge it up again.
|
||||
|
||||
3 -- You may also charge up a PIN account using the number 1 (900) call-2-id.
|
||||
Then call back at 1(800)ID-GAMES (1(800)434-3627), and use your new PIN to
|
||||
receive all the support and hints you wish.
|
||||
|
||||
4 -- id Software's Game Hints Line is accessible either using a PIN account
|
||||
via 1 (800) ID-GAMES (see above), or by calling 1 (900) CALL2-ID, which
|
||||
places the call on your phone bill.
|
||||
|
||||
1. Voice Support
|
||||
Telephone -- 1 (800) id-games
|
||||
|
||||
Lines Open from 12 noon to 10pm Central Time, 7 Days a
|
||||
week ($1.75 per minute). Closed some holidays
|
||||
|
||||
Please have the following information handy.
|
||||
1. Game title and version number. (The version
|
||||
number can be found on the end text screen.)
|
||||
2. Your operating system, processor, processor
|
||||
speed and amount of RAM.
|
||||
3. If you are having a sound, video or modem
|
||||
problem, we need to know the device brand name
|
||||
and model.
|
||||
|
||||
2. Automated Support
|
||||
Telephone -- 1 (800) id-games
|
||||
|
||||
Lines Open 24 hours a day, 365 days a year, or 366 days
|
||||
in Leap years ($0.25 per minute)
|
||||
|
||||
Please have pencil and paper handy.
|
||||
|
||||
3. E-mail Support
|
||||
Just send your e-mail to support@idsoftware.com
|
||||
|
||||
We will do our best to respond within 48 hours after
|
||||
receiving your e-mail.
|
||||
|
||||
When sending e-mail, cut and paste the following into your
|
||||
e-mail message and fill in the blanks:
|
||||
|
||||
Date:
|
||||
Name:
|
||||
Phone number:
|
||||
E-mail address: (please include this, we redirect tons of mail)
|
||||
Game Title:
|
||||
Version #:
|
||||
Operating system (eg., DOS 6.0 or Windows 95):
|
||||
Computer type:
|
||||
Processor type:
|
||||
Processor speed:
|
||||
Video card brand and model: (only if video problem)
|
||||
Audio card brand and model: (only if audio problem)
|
||||
Modem brand and model: (only if modem problem)
|
||||
Network card brand and model: (only if netgame problem)
|
||||
Network configuration (eg., NET.CFG file): (only if netgame problem)
|
||||
Drivers, protocol stacks, and versions: (eg., lsl v2.14, exp16odi
|
||||
v2.33, and ipxodi v3.01) (only if netgame problem)
|
||||
If there were any error messages or fault information, report them
|
||||
here:
|
||||
Please state the problem you encountered:
|
||||
Please state how to reproduce the problem:
|
||||
|
||||
4. Web Support
|
||||
Found at www.idsoftware.com
|
||||
|
||||
Our web support pages provide the same information that's
|
||||
available via Automated Support, except it's free!
|
||||
|
||||
5. News Sites
|
||||
For information, FAQ, or announcements:
|
||||
rec.games.computer.quake.announce
|
||||
For editing and hecking Quake-related files:
|
||||
rec.games.computer.quake.editing
|
||||
For general Quake discussion:
|
||||
rec.games.computer.quake.misc
|
||||
|
||||
6. Game Hints Line
|
||||
Telephone -- 1 (800) id-games or 1 (900) call-2-id
|
||||
|
||||
Lines Open 24 hours a day, 365 days a year, or 366 days
|
||||
in Leap years ($0.85 per minute)
|
||||
You must be 18 years of age or have parental permission
|
||||
to call 1 (900) call-2-id.
|
||||
|
||||
B. In Europe
|
||||
The help lines in Europe are open 7:30am - 5:00pm GMT,
|
||||
Monday - Friday.
|
||||
|
||||
English: +44 01923 209145
|
||||
German: +44 (0)1923 209151
|
||||
French: +44 (0)1923 209148
|
||||
|
||||
C. Problems
|
||||
If you have an unfavorable experience using our services, please
|
||||
send e-mail to 911@idsoftware.com. We would also like to hear
|
||||
from you if you have something positive to share with us. Kindly
|
||||
include your full name, address, phone number, and the problem
|
||||
encountered or information you'd like to tell us about.
|
||||
97
WinQuake/data/LICINFO.TXT
Normal file
97
WinQuake/data/LICINFO.TXT
Normal file
@@ -0,0 +1,97 @@
|
||||
Here is a brief explanation of all the legal mumbo jumbo contained in the
|
||||
various license agreements that may or may not be part of this package.
|
||||
|
||||
(This document was designed to be a quick overview of our license terms.
|
||||
You must refer to the full text of the license for a complete listing of
|
||||
terms and conditions.)
|
||||
|
||||
QUAKE SHAREWARE END USER LICENSE (slicnse.txt) or
|
||||
What You Can and Cannot Do With the Shareware Version of Quake.
|
||||
|
||||
CAN DO:
|
||||
-- Play & Enjoy the single player game
|
||||
-- Setup a shareware version based server on a not-for-profit basis
|
||||
|
||||
CANNOT DO:
|
||||
-- Run the game with user developed levels.
|
||||
-- You may not commercially exploit the shareware version in any way
|
||||
This specifically excludes retail distribution of the shareware
|
||||
version. Do not call or e-mail to ask if you can be a retail
|
||||
distributor of the shareware version -- the answer is no!
|
||||
-- Commercially exploit any id copyrighted and/or trademarked property.
|
||||
Example: Game names, logos, graphics, etc.
|
||||
|
||||
|
||||
QUAKE REGISTERED VERSION END USER LICENSE (rlicnse.txt) or
|
||||
What You Can and Cannot Do With the Registered Version of Quake.
|
||||
|
||||
CAN DO:
|
||||
-- Play & Enjoy the single player game
|
||||
-- Setup a registered version based server on a not-for-profit basis
|
||||
-- Develop new levels and/or level creation utilities.
|
||||
-- Play the game and/or setup a Registered Version based server using
|
||||
a user-developed level.
|
||||
|
||||
CANNOT DO:
|
||||
-- Commercially exploit the Registered Version of Quake in any way;
|
||||
see commercially exploitation license info below.
|
||||
-- Commercially exploit any id copyrighted and/or trademarked
|
||||
property.
|
||||
Example: Game names, logos, game graphics, etc.
|
||||
-- Sell user-developed levels and/or tools
|
||||
|
||||
COMMERCIAL EXPLOITATION LICENSE (comexp.txt -- accompanies Quake
|
||||
registered version only)
|
||||
|
||||
If you are interested in trying to make money using the registered version
|
||||
of Quake (this sort of thing is not allowed using the shareware version) you
|
||||
must sign our easy-to-digest Commercial Exploitation License.
|
||||
|
||||
This is a royalty free license that allows you to run Quake for a profit
|
||||
through a certain monthly gross profit range. If your Quake-related business
|
||||
becomes successful the agreement brings id into the revenue stream.
|
||||
|
||||
Basic terms of the commercial exploitation license:
|
||||
|
||||
-- License grants a royalty free commercial exploitation right for the
|
||||
registered version of Quake as a whole so long as Quake's monthly gross
|
||||
revenue is below $5,000.00
|
||||
|
||||
-- License provides for a 12.5% royalty to be paid to id Software in months
|
||||
where the licensee's Quake related monthly gross revenue is above $5,000.00
|
||||
|
||||
-- Royalty is based off net income. Net income is defined as Quake-related
|
||||
gross income less Quake-related expenses.
|
||||
|
||||
-- License expressly prohibits commercial exploitation via the sale (retail
|
||||
or otherwise) of the shareware or registered versions of Quake.
|
||||
|
||||
-- License expressly prohibits advertising/marketing use of our copyrighted
|
||||
and/or trademarked properties.
|
||||
|
||||
To get into bed with us on this deal you must print two (2) copies of the
|
||||
document named comexp.txt. (You should find comexp.txt somewhere on the
|
||||
registered version CD.) Sign/fill in the blanks of both copies where
|
||||
indicated and mail both to:
|
||||
|
||||
id Software
|
||||
18601 LBJ #666
|
||||
Mesquite, TX 75150
|
||||
Attn: ComExp License
|
||||
|
||||
We will then countersign the documents and mail one back to you.
|
||||
|
||||
Two items worth noting here:
|
||||
|
||||
1. It is VERY IMPORTANT that the information you enter in the signature
|
||||
block be legible. We prefer it if you enter the info into the blanks before
|
||||
printing your two copies. If we cannot read your information we will not be
|
||||
able to return the documents to you.
|
||||
|
||||
2. The terms of this document are not subject to negotiation. If you cannot
|
||||
live with the terms spelled out in the agreement do not engage in any
|
||||
commercial exploitation of Quake and do not sign the document.
|
||||
|
||||
|
||||
|
||||
|
||||
1030
WinQuake/data/MANUAL.TXT
Normal file
1030
WinQuake/data/MANUAL.TXT
Normal file
File diff suppressed because it is too large
Load Diff
103
WinQuake/data/ORDER.TXT
Normal file
103
WinQuake/data/ORDER.TXT
Normal file
@@ -0,0 +1,103 @@
|
||||
ORDERING INFO
|
||||
To order the full version of Quake (or any other id Software
|
||||
product) in North America, call our fulfillment center at 1-800-idgames
|
||||
(1-800-434-3627). Except as noted by our operators, you can expect
|
||||
Airborne Express afternoon delivery. The price for the full version
|
||||
of Quake (available on PC CDROM only) is $45, plus $5 shipping, for a
|
||||
total of $50. Our fulfillment center accepts Visa, Mastercard, and
|
||||
American Express. You can also fax, mail, or email your order using
|
||||
the attached forms. The fax number is (317) 361-3710 and the email
|
||||
address is idsoftware@stream.com. To prepay and order with a check
|
||||
by mail, send your check and the order form to:
|
||||
|
||||
id Software
|
||||
P.O. Box 4500
|
||||
Crawfordsville, IN 47933
|
||||
|
||||
To see an electronic catalog of our software, tshirts, hint books, and
|
||||
other merchandise available, check out the Shopping Maul section of our
|
||||
website at www.idsoftware.com.
|
||||
|
||||
INTERNATIONAL ORDERS
|
||||
Quake is available worldwide as a full retail product. To find out
|
||||
which local stores carry Quake and other id products, contact the
|
||||
following international affiliates:
|
||||
|
||||
Europe Australia
|
||||
GT Interactive Software Roadshow New Media
|
||||
1712 583791 (U.K.) 1 902 962000
|
||||
|
||||
Taiwan Singapore
|
||||
U.S. Summit Corporation Summit Co. (Singapore) Pte. Ltd.
|
||||
706-0660 273-9988
|
||||
|
||||
Malaysia Honk Kong
|
||||
Summit Co. (Malaysia) Sdn Bhd Tsun Tsun Trading Company
|
||||
757-2244 571-4231
|
||||
|
||||
Thailand Israel/Jordan/Lebanon/Egypt
|
||||
U.S. Summit Corp. (Overseas) Mirage Mulimedia
|
||||
374-3956 972 3 510 5764
|
||||
|
||||
If you are in a territory that cannot access 1(800)idgames, and you
|
||||
wish to order our products directly, you must place your order in
|
||||
writing to the fax, mail, or email addresses listed above under
|
||||
ORDERING INFO.
|
||||
|
||||
International phone orders will NOT be accepted. Unfortunately, due
|
||||
to international shipping costs, all international orders are sent
|
||||
out via US Mail. This means we cannot guarantee timeliness of delivery
|
||||
due to customs and other delays inherent to international shipping
|
||||
______________________________________________________________________
|
||||
ORDER FORM -- USE THIS FORM TO FAX , MAIL OR EMAIL YOUR ORDER.
|
||||
|
||||
id Software Order Center Date ______________
|
||||
PO BOX 4500 Phone: 1800 id games
|
||||
Crawfordsville, IN 47933 Fax: (317) 361-3710
|
||||
idsoftware@stream.com
|
||||
|
||||
|
||||
Product List and Prices in U.S. Currency: (check items)
|
||||
|
||||
Quake (CD ROM only) $45 ____
|
||||
The Ultimate DOOM (Mac version available – must specify) $25 ____
|
||||
DOOM II (Mac version available – must specify) $40 ____
|
||||
Master Levels for DOOM II (CD ROM only) $25 ____
|
||||
Final DOOM (CD ROM only) $40 ____
|
||||
DOOM Hint Book $15 ____
|
||||
Original DOOM Tshirt (S,M.L.XL) $13 ____
|
||||
The Ultimate DOOM Tshirt (XXL only) $13 ____
|
||||
Final DOOM Tshirt $13 ____
|
||||
Heretic:Shadow of the Serpent Riders (CD ROM only) $40 ____
|
||||
Heretic Hint Book $15 ____
|
||||
Hexen:Beyond Heretic (Mac version available – must specify) $40 ____
|
||||
Hexen:Deathkings of the Dark Citadel (CD ROM only) $25 ____
|
||||
Hexen Hint Book $15 ____
|
||||
Hexen Tshirt (XXL only) $13 ____
|
||||
Wolfenstein 3D (PC CD only) $20 ____
|
||||
Commander Keen (3.5 disk only) $15 ____
|
||||
|
||||
Order total: $______
|
||||
|
||||
Name: Age (optional):
|
||||
|
||||
Form of payment (check, money order, or credit card):
|
||||
|
||||
Credit card number: Expiration Date:
|
||||
|
||||
Exact mailing address:______________________________________
|
||||
_______________________________________
|
||||
_______________________________________
|
||||
_______________________________________
|
||||
|
||||
Phone: Fax: Email:
|
||||
|
||||
Shipping: US orders-$5.00 first product/$2.00 each additional
|
||||
(allow 3-5 business days)
|
||||
|
||||
International shipping for prepaid orders are via US Mail, and
|
||||
we cannot guarantee the time it will take to arrive.
|
||||
|
||||
*Prices subject to change
|
||||
|
||||
|
||||
456
WinQuake/data/README.TXT
Normal file
456
WinQuake/data/README.TXT
Normal file
@@ -0,0 +1,456 @@
|
||||
Welcome to Quake!
|
||||
|
||||
This file details how to get Quake running on your system and what to do
|
||||
if you have problems. We would like to thank Gandalf Technologies, Inc and
|
||||
MPath Interactive for the use of their technology. We would also like to
|
||||
thank Trent Reznor and Nine Inch Nails for their tremendous contributions
|
||||
to Quake's entire audio portion.
|
||||
|
||||
The NIN logo is a Registered Trademark licensed to Nothing Interactive, Inc.
|
||||
All Rights Reserved.
|
||||
|
||||
Quake System Requirements
|
||||
-------------------------
|
||||
IBM PC and Compatibles
|
||||
Pentium processor or better
|
||||
VGA Compatible Display or better
|
||||
8MB RAM minimum, 16MB recommended (16 MB required for running under Win95)
|
||||
CD-ROM drive Required
|
||||
MS-DOS 5.0 or better or Windows 95 (does NOT run under Windows NT)
|
||||
Hard Drive (30MB for Shareware, 80 MB for Registered)
|
||||
|
||||
*** IMPORTANT!: Quake requires a floating point processor.
|
||||
Systems that do not have an FPU installed will not run Quake -- at all.
|
||||
|
||||
*** IMPORTANT Video Adapter Note! ***
|
||||
On some ATI Mach32 cards, Quake can come up with a garbled video display.
|
||||
This is due to a problem with the card in which 320x200 mode isn't
|
||||
initialized correctly. Workarounds include:
|
||||
|
||||
1) If running from Windows, start Quake from an icon, or from a windowed
|
||||
(not fullscreen) MS-DOS prompt. If Quake is already running and has
|
||||
the garbled screen, press Alt-Enter twice to switch to the desktop and
|
||||
back to fullscreen, and the screen will display properly.
|
||||
|
||||
2) If running from DOS, either put the line
|
||||
|
||||
vid_mode 1
|
||||
|
||||
in id1\autoexec.cfg, or, typing blind, press tilde ('~') to bring down
|
||||
the console, type
|
||||
|
||||
vid_mode 1<enter>
|
||||
|
||||
and the screen will display properly.
|
||||
|
||||
========================================================================
|
||||
Here are the text files included with the shareware release of Quake and
|
||||
what they are:
|
||||
|
||||
README.TXT This file
|
||||
TECHINFO.TXT Technical information on Quake's subsystems and
|
||||
their advanced use.
|
||||
MANUAL.TXT Text version of the printed game manual
|
||||
LICINFO.TXT Info on the various license files included with Quake
|
||||
SLICNSE.TXT Shareware Quake end-user license
|
||||
ORDER.TXT How to order Quake
|
||||
HELP.TXT How to get help with Quake
|
||||
|
||||
Here are the text files included with the registered version of Quake and
|
||||
what they are:
|
||||
|
||||
README.TXT This file
|
||||
TECHINFO.TXT Technical information on Quake's subsystems and
|
||||
their advanced use.
|
||||
MANUAL.TXT Text version of the printed game manual
|
||||
LICINFO.TXT Info on the various license files included with Quake
|
||||
RLICNSE.TXT Registered Quake end-user license
|
||||
COMEXP.TXT Commercial exploitation agreement
|
||||
ORDER.TXT How to order Quake
|
||||
HELP.TXT How to get help with Quake
|
||||
|
||||
|
||||
Running Quake
|
||||
-------------
|
||||
|
||||
DOS: To launch Quake from the DOS Prompt, go to the Quake directory and
|
||||
simply type "QUAKE" <ENTER>. (no quotes)
|
||||
|
||||
Windows 95: To launch Quake in single player mode, double click on the file
|
||||
QUAKE.EXE From Windows Explorer. To run Quake in Multi-Player mode using
|
||||
the TCP/IP protocol, first check your network settings to ensure the
|
||||
protocol is installed, then double click on the Q95.BAT file to launch the
|
||||
game. In this version (v0.91) there is a minor bug that will cause the
|
||||
Q95.BAT file to exit the first time you run it, without running Quake.
|
||||
Merely double-click on that file again and it will work.
|
||||
|
||||
Audio Setup
|
||||
-----------
|
||||
|
||||
When using a Sound Card with Quake, there are a few setup steps which must
|
||||
be taken. First, the "BLASTER" environment variable setting must be in your
|
||||
autoexec.bat (or you can type it in manually from the MS-DOS command prompt).
|
||||
Running the Sound Blaster utility diagnose.exe will automatically configure
|
||||
your sound card and put this statement in your autoexec.bat file for you.
|
||||
A typical blaster setting looks like this (although yours may vary):
|
||||
|
||||
SET BLASTER=A220 I5 D1 H5 P330 T6
|
||||
|
||||
If you want to play the audio track from the CD-ROM while playing Quake,
|
||||
you must ensure that the audio cable from the CD-ROM is connected to the
|
||||
sound card.
|
||||
|
||||
If you think your sound card is setup properly and it STILL doesn't work,
|
||||
check to make sure that your BLASTER environment variable contains the
|
||||
high DMA setting (H5 in the above example).
|
||||
|
||||
If you don't get sound while trying to play the audio track, check to see
|
||||
if a small cable goes from the back of your CD-ROM player directly to your
|
||||
sound card. If the CD-ROM audio cable is connected to your sound board (or
|
||||
the motherboard in some cases) and you STILL don't hear CD Audio coming from
|
||||
your speakers, make sure the MIXER program has the CD volume turned up.
|
||||
You will also need to run the CD-ROM driver MSCDEX.EXE. Here is an example
|
||||
of the files you should see (yours probably will vary) listed in your
|
||||
CONFIG.SYS and AUTOEXEC.BAT (explanation is in parentheses):
|
||||
|
||||
CONFIG.SYS:
|
||||
|
||||
DEVICE=C:\PROSCSI\CDROM.SYS /D:PROCD01 (CD-ROM driver)
|
||||
|
||||
AUTOEXEC.BAT:
|
||||
|
||||
SET BLASTER=A220 I5 D1 H5 P330 T6 (sound environment variable setting)
|
||||
C:\WINDOWS\COMMAND\MSCDEX.EXE /D:PROCD01 /L:D (CD-ROM driver)
|
||||
|
||||
===================================================
|
||||
UltraSound MAX and UltraSound PnP Support for Quake
|
||||
===================================================
|
||||
|
||||
Before running Quake, make sure that your sound card works and your
|
||||
environment variables are set correctly.
|
||||
|
||||
Other UltraSound Cards (ACE & Classic)
|
||||
--------------------------------------
|
||||
These drivers are not for the UltraSound ACE or UltraSound Classic
|
||||
sound cards. We have heard mixed reports that MegaEm or SBOS
|
||||
have a chance of working with the UltraSound Classic but there is a
|
||||
short sound F/X delay.
|
||||
|
||||
UltraSound PnP and PnP Pro
|
||||
--------------------------
|
||||
You must make sure that you do NOT have IWSBOS or MegaEm loaded.
|
||||
|
||||
Setup
|
||||
-----
|
||||
Quake will automatically detect that the UltraSound Max or PnP
|
||||
are installed. It does this by looking at the SET INTERWAVE (PnP)
|
||||
and SET ULTRA16 (Max) environment variables.
|
||||
|
||||
Quake will use the settings found on the SET ULTRASND/ULTRA16 (Max)
|
||||
and in the IW.INI (PnP) file to determine what port settings to use.
|
||||
|
||||
Troubleshooting Windows 95 (DOS Box)
|
||||
------------------------------------
|
||||
We recommend that you restart your computer in MS-DOS Mode. DOS Box
|
||||
may or may not work, so use at your own risk.
|
||||
|
||||
CD Audio Input
|
||||
--------------
|
||||
If you have not already enabled CD audio output by default you will
|
||||
need to enable it. For the UltraSound MAX you can run "ULTRINIT -EC".
|
||||
For the UltraSound PnP you will need to enable the CD audio output
|
||||
in Win'95 and then restart your computer into MS-DOS.
|
||||
|
||||
===================================================
|
||||
Mouse Setup
|
||||
-----------
|
||||
|
||||
If you are going to use a mouse when playing Quake, you will need to load
|
||||
your mouse driver. This should go in the AUTOEXEC.BAT file as well. Here
|
||||
is an example:
|
||||
|
||||
C:\LOGITECH\MOUSE\MOUSE.EXE (mouse driver)
|
||||
|
||||
|
||||
Booting Clean
|
||||
-------------
|
||||
|
||||
If you are going to be running Quake with only 8 megabytes of RAM, it is best
|
||||
to boot clean . You eliminate unwanted utilities or applications from taking
|
||||
up valuable memory, without having to alter your regular AUTOEXEC.BAT and
|
||||
CONFIG.SYS. Booting clean can be done in one of two ways. If you have
|
||||
MS-DOS version 6.xx, booting clean is as simple a pressing the shift key
|
||||
when you see the words "Starting MS-DOS". If you have MS-DOS ver 5.xx you
|
||||
will need to make a system disk.
|
||||
|
||||
To make a boot disk, type the following from the MS-DOS command prompt:
|
||||
|
||||
FORMAT A: /S
|
||||
|
||||
1. Make sure that this is a disk you wish to erase.
|
||||
2. This disk absolutely HAS to be formatted in the A: drive.
|
||||
|
||||
To use the system disk, place the disk in the A: drive and reset the
|
||||
computer.
|
||||
|
||||
NOTE: If your sound card requires a driver to be loaded, or you will be
|
||||
using a mouse, or you will be using Quake's CD audio feature, the system
|
||||
disk will need to have a CONFIG.SYS and AUTOEXEC.BAT that load the
|
||||
appropriate drivers.
|
||||
|
||||
Creating a Quake Shortcut
|
||||
|
||||
As an alternative to making a Boot Disk, Windows 95 users can create a
|
||||
Quake Shortcut. By double clicking onthis shortcut, Windows 95 will reboot
|
||||
in MS-DOS mode and install only the desired drivers, giving you the same
|
||||
results as using a Boot Disk. To create a Quake Shortcut, do the following:
|
||||
|
||||
1. Using Explorer, right click and drag the file QUAKE.EXE, from the Quake
|
||||
directory, to your desktop. Windows 95 will make an MS-DOS Icon titled
|
||||
"Shortcut to quake".
|
||||
2. Right click on the new icon, and from the menu that pops up, choose
|
||||
"Properties". Then choose the "Program" tab at the top.
|
||||
3. Now click on the "Advanced..." button near the bottom. The "Advanced
|
||||
Program Settings" window should appear.
|
||||
4. Select the "MS-DOS mode" check box and the "Specify a new MS-DOS
|
||||
configuration" option button.
|
||||
5. Now simply fill in the "CONFIG.SYS for MS-DOS mode:" and "AUTOEXEC.BAT
|
||||
for MS-DOS mode:" boxes with the same sound, CD-ROM and mouse settings as
|
||||
mentioned above in the Boot Disks section.
|
||||
6. Click on "OK" when you are finished. If you wish, you can change your
|
||||
Quake Shortcut Icon to something a little more exciting by clicking on
|
||||
"Change Icon...".
|
||||
7. To finish, click on "OK" again.
|
||||
8. You can rename your Quake Shortcut by right clicking on the shortcut
|
||||
icon, choosing "Rename" and typing in the new name.
|
||||
|
||||
|
||||
======================================================
|
||||
== Known Problems ==
|
||||
======================================================
|
||||
|
||||
Problem: Zombies sometime get stuck on the ground and connot get back up.
|
||||
(You can still hear them, but you cannot kill them. This bug makes it
|
||||
impossible to get 100% kills on whatever level it occurs on.)
|
||||
Solution: There is no workaround for this bug.
|
||||
|
||||
Problem: It is sometimes possible for the player to get stuck in a room or
|
||||
in a wall.
|
||||
Solution: If you get stuck, use the 'kill' console command. It is a good
|
||||
idea to save your game often.
|
||||
|
||||
Problem: View centering problems. Sometimes during a game, the view will not
|
||||
center properly. The end result is the player view looking up torwards the
|
||||
ceiling while walking.
|
||||
Solution: Exit to the next level or use the 'kill' console command..
|
||||
|
||||
|
||||
======================================================
|
||||
== Troubleshooting ==
|
||||
======================================================
|
||||
|
||||
If Quake fails to start up, or has problems not addressed elsewhere in the
|
||||
documentation, try the -safe command line switch, which disables a number
|
||||
of parts of Quake that can be problems if there are hardware or configuration
|
||||
problems. The -safe command line switch is equivalent to -stdvid, -nosound,
|
||||
-nonet, and -nocdaudio together. Those four switches do the following:
|
||||
|
||||
-stdvid: disables VESA video modes.
|
||||
|
||||
-nosound: disables sound card support.
|
||||
|
||||
-nonet: disables network card support.
|
||||
|
||||
-nocdaudio: disables CD audio support.
|
||||
|
||||
If -safe makes the problem go away, try using each of the switches
|
||||
individually to isolate the area in which you're experiencing the problem,
|
||||
then either correct the configuration or hardware problem or play Quake with
|
||||
that functionality disabled.
|
||||
|
||||
If you still have problems, try booting clean in conjunction with
|
||||
the -safe command line parameter. For information on booting clean, refer
|
||||
to the "Booting Clean" section above.
|
||||
|
||||
If you experience page faults while running Quarterdeck's QDPMI DPMI server,
|
||||
this is caused by a bug in QDPMI. Workarounds: Remove QDPMI from CONFIG.SYS,
|
||||
issue the command QDPMI OFF before running QUAKE, or get the update patch
|
||||
for QDPMI from Quarterdeck. You may be running QDPMI without knowing it if
|
||||
you have QEMM installed, because it can be installed as part of the QEMM
|
||||
installation.
|
||||
|
||||
|
||||
Technical Support
|
||||
-----------------
|
||||
|
||||
If you are having trouble installing or running Quake you can receive
|
||||
technical support by sending e-mailing to support@idsoftware.com. You can
|
||||
also refer to our web page, www.idsoftware.com, or call 1-800-idgames.
|
||||
|
||||
When sending support e-mail, cut and paste the following into your e-mail
|
||||
message and fill in the blanks:
|
||||
|
||||
Date:
|
||||
Name:
|
||||
Phone number:
|
||||
E-mail address: (please include this, we redirect tons of mail)
|
||||
Game Title:
|
||||
Version #:
|
||||
Operating system (i.e., DOS 6.0 or Windows 95):
|
||||
Computer type:
|
||||
BIOS date:
|
||||
BIOS version:
|
||||
Processor type:
|
||||
Processor speed:
|
||||
Do you program at school/work?
|
||||
Do you provide tech. support at school/work?
|
||||
Please state the problem you encountered:
|
||||
Please state how to reproduce the problem:
|
||||
|
||||
If program crashed with nasty undecipherable techno-garbage, please
|
||||
look for the eight-digit hex number which comes after "eip="
|
||||
and write it down here:
|
||||
|
||||
** NOTE: If you are sending a bug report, PLEASE refer to the TECHINFO.TXT
|
||||
file for the correct form and procedures.
|
||||
|
||||
|
||||
======================================================
|
||||
== Version History ==
|
||||
======================================================
|
||||
v1.01 -- Bugs fixed
|
||||
------------------------------------------------------
|
||||
* Fixed modem code
|
||||
* Fixed fraglimit & timelimit
|
||||
* Added NOEXIT cvar (so no one can exit a level)
|
||||
------------------------------------------------------
|
||||
v1.00 -- Bugs fixed
|
||||
------------------------------------------------------
|
||||
* Gravis Ultrasound audio support (still has bugs)
|
||||
* More deathmatch start spots on E1M6 and END
|
||||
* Print server version and PROG CRC on connect
|
||||
* -dedicated starts start.map if nothing else specified
|
||||
* fixed lookspring function during net game
|
||||
* fixed rare crash during long running dedicated server
|
||||
------------------------------------------------------
|
||||
v0.94 -- Bugs fixed / Features added -- LIMITED BETA VERSION
|
||||
------------------------------------------------------
|
||||
* Totally rewritten menus
|
||||
* New lighting model with overbrighting
|
||||
* Parsed lowercase BLASTER parms
|
||||
* Better Sound Blaster shutdown code
|
||||
* Rewrote BLASTER initialization
|
||||
* Fixed DMA channel 0 bugs
|
||||
* Added SBPro 8 stereo setup
|
||||
* Fix delayed sound on 8 bit Sound Blasters
|
||||
* Fixed speed key affecting angle-turning from keyboard
|
||||
* Fixed "no such Alias frame" bugs
|
||||
* Fixed Zombie not getting up bug
|
||||
* Checked for very high joystick values, signalling a failed read
|
||||
* Unstuck jumping Fiends and Spawn
|
||||
* Fixed large BModels blinking out in complex areas
|
||||
* Fixed s_localsound with no sound started
|
||||
* Saved spawn parms in savegame
|
||||
* Fixed screenshot save location
|
||||
* Bind with no arguments no longer clears value
|
||||
* Allow console in intermission / finale
|
||||
* Fixed false gib messages
|
||||
* Full-screen TAB scoreboard in DeathMatch
|
||||
* Fixed "+playdemo <demo>" from command line
|
||||
* Trapped overflow in sizebuf messages
|
||||
* Moveup / movedown in water!
|
||||
* Fixed-up Talk command
|
||||
* Added unsupported crosshair option ("crosshair 1" from console)
|
||||
* Colored chat messages with notify sound
|
||||
* Fixed "connect during intermission" bug
|
||||
* Changelevel while demos running no longer crashes
|
||||
* Fixed changelevel with no map left up loading screen
|
||||
* Fixed long names entered from the console causing crash
|
||||
* Stopped demos changing while in the menus
|
||||
|
||||
* Fixed modem initialization from menu
|
||||
* Fixed serial reliable stream getting stalled
|
||||
* Serial/modem code fixes
|
||||
16550a lost transmit buffer empty interrupts
|
||||
fixed sometimes processing interrupts from com1 when using com2
|
||||
added com3/com4 support from menus
|
||||
fixed first character of modem init not getting sent
|
||||
saved serial/modem settings in config.cfg
|
||||
* Fixed name and colors not always sent to server at startup
|
||||
* Fixed "stopdemo" crashing the system when there wasn't a demo playing
|
||||
* Added server's TCP/IP and IPX addresses (if available) to status command
|
||||
|
||||
* In 0.92, an additional check for a usable VESA video mode was added;
|
||||
the numpages field was verified to be greater than 0, and no mode was
|
||||
supported that had numpages set to 0 (which indicates that there's not
|
||||
enough video memory for that mode). ATI's VESA driver, m64vbe,
|
||||
reports 0 for numpages, so VESA video modes that were available in 0.91
|
||||
were no longer available in 0.92. This extra numpages check has
|
||||
been removed.
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
v0.93 -- Never officially released; internal testing only.
|
||||
-----------------------------------------------------------------------
|
||||
v0.92 -- Bugs fixed
|
||||
-----------------------------------------------------------------------
|
||||
Typing long strings in the hostname or modem init field in the menus caused
|
||||
crashes.
|
||||
|
||||
Under Win95 IPX was detected but not functional, resulting in the game
|
||||
exiting to DOS.
|
||||
|
||||
If -nosound, got "S_LocalSound: can't cache" on every keypress in the menu.
|
||||
|
||||
When vid_nopageflip was set to 1 in VESA modes, going underwater resulted in
|
||||
only the upper left corner of the drawing area being updated.
|
||||
|
||||
The single player scoreboard (tab) printed text incorrectly in all modes
|
||||
greater than 320 pixels wide.
|
||||
|
||||
On network connections that dropped packets, the reliable message stream
|
||||
could get stopped up, resulting in frag counts and talk messages no longer
|
||||
being delivered, although game movement continued.
|
||||
|
||||
The com port settings from the menu were getting saved & restored but
|
||||
not used.
|
||||
|
||||
Direct serial connections did not work with slist.
|
||||
|
||||
Quake now checks the vesa information for hardware incabable of page-flipping.
|
||||
|
||||
Menu sound sometimes didn't play.
|
||||
|
||||
Q95 (qlaunch.exe) frequently failed to execute on the first attempt.
|
||||
|
||||
Q95 (quakeudp.dll) was running out of buffers when running a server.
|
||||
|
||||
Teams were not being set according to pants colors.
|
||||
|
||||
|
||||
Joystick notes
|
||||
--------------
|
||||
Your joystick must be plugged in when Quake is launched.
|
||||
|
||||
If you have a joystick plugged in, but don't want to use it in Quake
|
||||
(it slows the game down a few percent), or you have weird hardware that
|
||||
doesn't like being tested as a joystick add "-nojoy" to your Quake
|
||||
command line.
|
||||
|
||||
You can turn off joystick reading during the game by typing "joystick 0" at
|
||||
the Quake command console.
|
||||
|
||||
You MUST configure your buttons from the configure keys menu before they will
|
||||
work. There is no default configuration.
|
||||
|
||||
If your joystick or interface card improperly sets the third or fourth
|
||||
joystick buttons, type "joybuttons 2" at the quake console or in your
|
||||
.CFG file.
|
||||
|
||||
The "mlook" button command now lets the joystick as well as the mouse control
|
||||
pitch angles.
|
||||
|
||||
The "sidestep" buttom command works on joysticks as with mice and keyboard
|
||||
movement.
|
||||
|
||||
The "invert mouse up/down" menu option also inverts the joystick pitch
|
||||
direction.
|
||||
204
WinQuake/data/RLICNSE.TXT
Normal file
204
WinQuake/data/RLICNSE.TXT
Normal file
@@ -0,0 +1,204 @@
|
||||
REGISTERED VERSION: QUAKE
|
||||
LIMITED USE SOFTWARE LICENSE AGREEMENT
|
||||
|
||||
This Limited Use Software License Agreement (the
|
||||
"Agreement") is a legal agreement between you, the end-user, and Id
|
||||
Software, Inc. ("ID"). By continuing the installation of this game
|
||||
program, by loading or running the game, or by placing or copying
|
||||
the game program onto your computer hard drive, you are agreeing to
|
||||
be bound by the terms of this Agreement. If you do not agree to
|
||||
the terms of this Agreement, promptly return the game program and
|
||||
the accompanying items (including all written materials), along
|
||||
with your receipt to the place from where you obtained them for a
|
||||
full refund.
|
||||
|
||||
ID SOFTWARE LICENSE
|
||||
|
||||
1. Grant of License. ID grants to you the limited
|
||||
right to use one (1) copy of the enclosed or foregoing game program
|
||||
(the "Software") on a single computer. You have no ownership or
|
||||
proprietary rights in or to the Software or the written materials
|
||||
accompanying the Software. For purposes of this section, "use"
|
||||
means loading the Software into RAM, as well as installation on a
|
||||
hard disk or other storage device. You may create a map editor,
|
||||
modify maps and make your own maps (collectively referenced as the
|
||||
"Permitted Derivative Works") for the Software. Permitted
|
||||
Derivative Works may not be sold, whether by you or by any other
|
||||
person or entity, but you may exchange the Permitted Derivative
|
||||
Works at no charge amongst other end-users. The Software, together
|
||||
with any archive copy thereof, shall be either returned to ID or
|
||||
destroyed when no longer used in accordance with this Agreement, or
|
||||
when the right to use the Software is terminated. You agree that
|
||||
the Software will not be shipped, transferred or exported into any
|
||||
country in violation of the U.S. Export Administration Act (or any
|
||||
other law governing such matters) and that you will not utilize, in
|
||||
any other manner, the Software in violation of any applicable law.
|
||||
|
||||
2. Commercial Use is Prohibited. Except as provided in
|
||||
paragraph 5. hereinbelow in regard to the Software, under no
|
||||
circumstances shall you, the end-user, be permitted, allowed or
|
||||
authorized to commercially exploit the Software, any data
|
||||
comprising the Software. Neither you nor anyone at your direction
|
||||
shall do any of the following acts (any such acts shall be deemed
|
||||
void and a breach of this Agreement) with regard to the Software,
|
||||
or any portion thereof, such as a screen display or a screenshot:
|
||||
|
||||
a. Rent the Software;
|
||||
|
||||
b. Sell the Software;
|
||||
|
||||
c. Lease or lend the Software;
|
||||
|
||||
d. Offer the Software on a pay-per-play basis;
|
||||
|
||||
e. Distribute, by electronic means or otherwise, the
|
||||
Software for money or any other consideration; or
|
||||
|
||||
f. In any other manner and through any medium
|
||||
whatsoever commercially exploit the Software or use
|
||||
the Software for any commercial purpose.
|
||||
|
||||
3. Additional Prohibited Uses. Neither you nor anyone
|
||||
at your direction shall take the following action in regard to the
|
||||
Software, or any portion thereof, such as a screen display or a
|
||||
screenshot:
|
||||
|
||||
a. Modify, disassemble, reverse engineer or decompile
|
||||
the Software;
|
||||
|
||||
b. Translate the Software;
|
||||
|
||||
c. Reproduce the Software;
|
||||
|
||||
d. Publicly display the Software;
|
||||
|
||||
e. Prepare derivative works based upon the Software
|
||||
(except Permitted Derivative Works); or
|
||||
|
||||
f. Distribute, by electronic means or otherwise, the
|
||||
Software.
|
||||
|
||||
4. Use of Other Material is Prohibited. Use, in any manner, of
|
||||
the trademarks, such as Quake(tm) and the NIN(r) logo, logos, symbols,
|
||||
art work, images, screen displays or screenshots, sound effects, music,
|
||||
and other such material contained within, generated by or relating to
|
||||
the Software is prohibited.
|
||||
|
||||
5. To Receive Permission to Commercially Exploit. If
|
||||
you desire to commercially exploit the Software, you may execute
|
||||
the Commercial Exploitation License Agreement for QUAKE (the
|
||||
"License") contained within the QUAKE install package and forward
|
||||
the original License to Id Software at the address noted therein.
|
||||
Please note that ID may refuse your request and not sign the
|
||||
License in ID's sole discretion.
|
||||
|
||||
6. Restrictions Apply to Third Parties. The
|
||||
prohibitions and restrictions described herein apply to anyone in
|
||||
possession of the Software and/or Permitted Derivative Works.
|
||||
|
||||
7. Copyright. The Software and all copyrights related
|
||||
thereto (including all characters and other images generated by the
|
||||
Software or depicted in the Software) is owned by ID and is protected
|
||||
by United States copyright laws and international treaty provisions.
|
||||
You must treat the Software like any other copyrighted material,
|
||||
except that you may either (a) make one copy of the Software solely
|
||||
for back-up or archival purposes, or (b) transfer the Software to a
|
||||
single hard disk provided you keep the original solely for back-up or
|
||||
archival purposes. You may not otherwise reproduce, copy or disclose
|
||||
to others, in whole or in any part, the Software. You may not copy
|
||||
the written materials accompanying the Software. The same
|
||||
restrictions and prohibitions regarding your use of the Software as
|
||||
provided in this Agreement apply to your use of the written materials
|
||||
accompanying the Software. The written materials are owned by ID and
|
||||
are protected by United States copyright laws and international
|
||||
treaties. You agree to use your best efforts to see that any user of
|
||||
the Software licensed hereunder complies with this Agreement.
|
||||
|
||||
8. Limited Warranty. ID warrants that if properly
|
||||
installed and operated on a computer for which it is designed, the
|
||||
Software will perform substantially in accordance with the
|
||||
accompanying written materials for a period of ninety (90) days
|
||||
from the date of purchase of the Software. ID's entire liability
|
||||
and your exclusive remedy shall be, at ID's option, either (a)
|
||||
return of the price paid or (b) repair or replacement of the
|
||||
Software that does not meet ID's Limited Warranty. To make a
|
||||
warranty claim, return the Software to the point of purchase,
|
||||
accompanied by proof of purchase, your name, your address, and a
|
||||
statement of defect, or return the Software with the above
|
||||
information to ID. This Limited Warranty is void if failure of the
|
||||
Software has resulted in whole or in part from accident, abuse,
|
||||
misapplication or violation of this Agreement. Any replacement
|
||||
Software will be warranted for the remainder of the original
|
||||
warranty period or thirty (30) days from your receipt of the
|
||||
replacement software, whichever is longer. This warranty allocates
|
||||
risks of product failure between Licensee and ID. ID's product
|
||||
pricing reflects this allocation of risk and the limitations of
|
||||
liability contained in this warranty.
|
||||
|
||||
9. NO OTHER WARRANTIES. ID DISCLAIMS ALL OTHER
|
||||
WARRANTIES, BOTH EXPRESS IMPLIED, INCLUDING BUT NOT LIMITED TO,
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
|
||||
PURPOSE WITH RESPECT TO THE SOFTWARE AND THE ACCOMPANYING WRITTEN
|
||||
MATERIALS. THIS LIMITED WARRANTY GIVES YOU SPECIFIC LEGAL RIGHTS.
|
||||
YOU MAY HAVE OTHER RIGHTS WHICH VARY FROM JURISDICTION TO
|
||||
JURISDICTION. ID DOES NOT WARRANT THAT THE OPERATION OF THE
|
||||
SOFTWARE WILL BE UNINTERRUPTED, ERROR FREE OR MEET LICENSEE'S
|
||||
SPECIFIC REQUIREMENTS. THE WARRANTY SET FORTH ABOVE IS IN LIEU OF
|
||||
ALL OTHER EXPRESS WARRANTIES WHETHER ORAL OR WRITTEN. THE AGENTS,
|
||||
EMPLOYEES, DISTRIBUTORS, AND DEALERS OF ID ARE NOT AUTHORIZED TO
|
||||
MAKE MODIFICATIONS TO THIS WARRANTY, OR ADDITIONAL WARRANTIES ON
|
||||
BEHALF OF ID. ADDITIONAL STATEMENTS SUCH AS DEALER ADVERTISING OR
|
||||
PRESENTATIONS, WHETHER ORAL OR WRITTEN, DO NOT CONSTITUTE
|
||||
WARRANTIES BY ID AND SHOULD NOT BE RELIED UPON.
|
||||
|
||||
10. Exclusive Remedies. You agree that your exclusive
|
||||
remedy against ID, its affiliates, contractors, suppliers, and
|
||||
agents for loss or damage caused by any defect or failure in the
|
||||
Software regardless of the form of action, whether in contract,
|
||||
tort, including negligence, strict liability or otherwise, shall be
|
||||
the return of the purchase price paid or replacement of the
|
||||
Software. This Agreement shall be construed in accordance with and
|
||||
governed by the laws of the State of Texas. Copyright and other
|
||||
proprietary matters will be governed by United States laws and
|
||||
international treaties. IN ANY CASE, ID SHALL NOT BE LIABLE FOR
|
||||
LOSS OF DATA, LOSS OF PROFITS, LOST SAVINGS, SPECIAL, INCIDENTAL,
|
||||
CONSEQUENTIAL, INDIRECT OR OTHER SIMILAR DAMAGES ARISING FROM
|
||||
BREACH OF WARRANTY, BREACH OF CONTRACT, NEGLIGENCE, OR OTHER LEGAL
|
||||
THEORY EVEN IF ID OR ITS AGENT HAS BEEN ADVISED OF THE POSSIBILITY
|
||||
OF SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. Some
|
||||
jurisdictions do not allow the exclusion or limitation of
|
||||
incidental or consequential damages, so the above limitation or
|
||||
exclusion may not apply to you.
|
||||
|
||||
11. General Provisions. Neither this Agreement nor any
|
||||
part or portion hereof shall be assigned, sublicensed or otherwise
|
||||
transferred by you. Should any provision of this Agreement be held
|
||||
to be void, invalid, unenforceable or illegal by a court, the
|
||||
validity and enforceability of the other provisions shall not be
|
||||
affected thereby. If any provision is determined to be
|
||||
unenforceable, you agree to a modification of such provision to
|
||||
provide for enforcement of the provision's intent, to the extent
|
||||
permitted by applicable law. Failure of a party to enforce any
|
||||
provision of this Agreement shall not constitute or be construed as
|
||||
a waiver of such provision or of the right to enforce such
|
||||
provision. If you fail to comply with any terms of this Agreement,
|
||||
YOUR LICENSE IS AUTOMATICALLY TERMINATED.
|
||||
|
||||
YOU ACKNOWLEDGE THAT YOU HAVE READ THIS AGREEMENT, THAT YOU
|
||||
UNDERSTAND THIS AGREEMENT, AND UNDERSTAND THAT BY CONTINUING THE
|
||||
INSTALLATION OF THE SOFTWARE, BY LOADING OR RUNNING THE SOFTWARE, OR
|
||||
BY PLACING OR COPYING THE SOFTWARE ONTO YOUR COMPUTER HARD DRIVE, YOU
|
||||
AGREE TO BE BOUND BY THIS AGREEMENT'S TERMS AND CONDITIONS. YOU
|
||||
FURTHER AGREE THAT, EXCEPT FOR WRITTEN SEPARATE AGREEMENTS BETWEEN ID
|
||||
AND YOU, THIS AGREEMENT IS A COMPLETE AND EXCLUSIVE STATEMENT OF THE
|
||||
RIGHTS AND LIABILITIES OF THE PARTIES. THIS AGREEMENT SUPERSEDES ALL
|
||||
PRIOR ORAL AGREEMENTS, PROPOSALS OR UNDERSTANDINGS, AND ANY OTHER
|
||||
COMMUNICATIONS BETWEEN ID AND YOU RELATING TO THE SUBJECT MATTER OF
|
||||
THIS AGREEMENT.
|
||||
|
||||
June 21, 1996
|
||||
|
||||
REGISTERED VERSION: QUAKE LIMITED USE SOFTWARE LICENSE AGREEMENT Page 4
|
||||
(DWC:dw:3406.0024:DWC\doc:1164)
|
||||
|
||||
|
||||
175
WinQuake/data/SLICNSE.TXT
Normal file
175
WinQuake/data/SLICNSE.TXT
Normal file
@@ -0,0 +1,175 @@
|
||||
SHAREWARE VERSION: QUAKE
|
||||
LIMITED USE SOFTWARE LICENSE AGREEMENT
|
||||
|
||||
This Limited Use Software License Agreement (the "Agreement") is a
|
||||
legal agreement between you, the end-user, and id Software, Inc.
|
||||
("ID"). By continuing the installation of this game program, by
|
||||
loading or running the game, or by placing or copying the game
|
||||
program onto your computer hard drive, you are agreeing to be bound
|
||||
by the terms of this Agreement.
|
||||
|
||||
ID SOFTWARE LICENSE
|
||||
|
||||
1. Grant of License. ID grants to you the limited right to use
|
||||
one (1) copy of the enclosed or foregoing Id Software game program
|
||||
(the "Software"), which is the shareware version or episode one of
|
||||
the game program. For purposes of this section, "use" means loading
|
||||
the Software into RAM, as well as installation on a hard disk or
|
||||
other storage device. You agree that the Software will not be
|
||||
shipped, transferred or exported into any country in violation of
|
||||
the U.S. Export Administration Act (or any other law governing such
|
||||
matters) and that you will not utilize, in any other manner, the
|
||||
Software in violation of any applicable law.
|
||||
|
||||
2. Commercial Use is Prohibited. Under no circumstances shall
|
||||
you, the end-user, be permitted, allowed or authorized to
|
||||
commercially exploit the Software, or any portion thereof, such
|
||||
as a screen display or a screenshot. Neither you nor anyone at your
|
||||
direction shall do any of the following acts:
|
||||
|
||||
a. Rent the Software;
|
||||
|
||||
b. Sell the Software;
|
||||
|
||||
c. Lease or lend the Software;
|
||||
|
||||
d. Offer the Software on a pay-per-play basis;
|
||||
|
||||
e. Distribute the Software for money or any other
|
||||
consideration; or
|
||||
|
||||
f. In any other manner and through any medium
|
||||
whatsoever commercially exploit the Software or use
|
||||
the Software for any commercial purpose.
|
||||
|
||||
3. Additional Prohibited Uses. Neither you, nor anyone at your
|
||||
direction, shall take the following action in regard to the
|
||||
Software, or any portion thereof, such as a screen display or
|
||||
a screenshot:
|
||||
|
||||
a. Modify, disassemble, reverse engineer or decompile
|
||||
the Software;
|
||||
|
||||
b. Translate the Software;
|
||||
|
||||
c. Reproduce the Software;
|
||||
|
||||
d. Publicly display the Software; or
|
||||
|
||||
e. Prepare derivative works based upon the Software.
|
||||
|
||||
4. Use of Other Material is Prohibited. Use, in any manner, of
|
||||
the trademarks, such as Quake(tm) and the NIN(r) logo, logos, symbols,
|
||||
art work, images, screen displays or screenshots, sound effects, music,
|
||||
and other such material contained within, generated by or relating to
|
||||
the Software is prohibited.
|
||||
|
||||
5. Restrictions Apply to Third Parties. The prohibitions and
|
||||
restrictions described herein apply to anyone in possession of
|
||||
the Software.
|
||||
|
||||
6. Permitted Distribution. So long as this Agreement
|
||||
accompanies the Software at all times, ID grants to Providers the
|
||||
limited right to distribute, free of charge, except normal access
|
||||
fees, and by electronic means only, the Software; provided, however,
|
||||
the Software must be so electronically distributed only in a
|
||||
compressed format. The term "Providers," as used in the foregoing
|
||||
sentence, shall mean persons whose business it is to provide
|
||||
services on the Internet, on commercial online networks, or on the
|
||||
BBS. Anyone who receives the Software from a Provider shall be
|
||||
limited to all the terms and conditions of this Agreement. Further,
|
||||
ID grants to you, the end-user, the limited right to distribute,
|
||||
free of charge only, the Software as a whole.
|
||||
|
||||
7. Copyright. The Software is owned by ID and is protected by
|
||||
United States copyright laws and international treaty provisions.
|
||||
You must treat the Software like any other copyrighted material,
|
||||
except that you may make copies of the Software to give to other
|
||||
persons. You may not charge or receive any consideration from any
|
||||
other person for the receipt or use of the Software. You agree to
|
||||
use your best efforts to see that any user of the Software licensed
|
||||
hereunder complies with this Agreement.
|
||||
|
||||
8. Limited Warranty. ID warrants that if properly installed and
|
||||
operated on a computer for which it is designed, the Software will
|
||||
perform substantially in accordance with its designed purpose for a
|
||||
period of ninety (90) days from the date the Software is first
|
||||
obtained by an end-user. ID's entire liability and your exclusive
|
||||
remedy shall be, at ID's option, either (a) return of the retail
|
||||
price paid, if any, or (b) repair or replacement of the Software
|
||||
that does not meet ID's Limited Warranty. To make a warranty claim,
|
||||
return the Software to the point of purchase, accompanied by proof
|
||||
of purchase, your name, your address, and a statement of defect, or
|
||||
return the Software with the above information to ID. This Limited
|
||||
Warranty is void if failure of the Software has resulted in whole
|
||||
or in part from accident, abuse, misapplication or violation of this
|
||||
Agreement. Any replacement Software will be warranted for the
|
||||
remainder of the original warranty period or thirty (30) days,
|
||||
whichever is longer. This warranty allocates risks of product
|
||||
failure between Licensee and ID. ID's product pricing reflects this
|
||||
allocation of risk and the limitations of liability contained in
|
||||
this warranty.
|
||||
|
||||
9. NO OTHER WARRANTIES. ID DISCLAIMS ALL OTHER WARRANTIES,
|
||||
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A pARTICULAR PURPOSE
|
||||
WITH RESPECT TO THE SOFTWARE AND THE ACCOMPANYING WRITTEN MATERIALS,
|
||||
IF ANY. THIS LIMITED WARRANTY GIVES YOU SPECIFIC LEGAL RIGHTS. YOU
|
||||
MAY HAVE OTHERS WHICH VARY FROM JURISDICTION TO JURISDICTION. ID
|
||||
DOES NOT WARRANT THAT THE OPERATION OF THE SOFTWARE WILL BE
|
||||
UNINTERRUPTED, ERROR FREE OR MEET LICENSEE'S SPECIFIC REQUIREMENTS.
|
||||
THE WARRANTY SET FORTH ABOVE IS IN LIEU OF ALL OTHER EXPRESS
|
||||
WARRANTIES WHETHER ORAL OR WRITTEN. THE AGENTS, EMPLOYEES,
|
||||
DISTRIBUTORS, AND DEALERS OF ID ARE NOT AUTHORIZED TO MAKE
|
||||
MODIFICATIONS TO THIS WARRANTY, OR ADDITIONAL WARRANTIES ON BEHALF
|
||||
OF ID. ADDITIONAL STATEMENTS SUCH AS DEALER ADVERTISING OR
|
||||
PRESENTATIONS, WHETHER ORAL OR WRITTEN, DO NOT CONSTITUTE WARRANTIES
|
||||
BY ID AND SHOULD NOT BE RELIED UPON.
|
||||
|
||||
10. Exclusive Remedies. You agree that your exclusive remedy
|
||||
against ID, its affiliates, contractors, suppliers, and agents for
|
||||
loss or damage caused by any defect or failure in the Software
|
||||
regardless of the form of action, whether in contract,tort,
|
||||
including negligence, strict liability or otherwise, shall be the
|
||||
return of the retail purchase price paid, if any, or replacement of
|
||||
the Software. This Agreement shall be construed in accordance with
|
||||
and governed by the laws of the State of Texas. Copyright and other
|
||||
proprietary matters will be governed by United States laws and
|
||||
international treaties. IN ANY CASE, ID SHALL NOT BE LIABLE FOR LOSS
|
||||
OF DATA, LOSS OF PROFITS, LOST SAVINGS, SPECIAL, INCIDENTAL,
|
||||
CONSEQUENTIAL, INDIRECT OR OTHER SIMILAR DAMAGES ARISING FROM BREACH
|
||||
OF WARRANTY, BREACH OF CONTRACT, NEGLIGENCE, OR OTHER LEGAL THEORY
|
||||
EVEN IF ID OR ITS AGENT HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. Some jurisdictions do
|
||||
not allow the exclusion or limitation of incidental or consequential
|
||||
damages, so the above limitation or exclusion may not apply to you.
|
||||
|
||||
11. General Provisions. Neither this Agreement nor any part or
|
||||
portion hereof shall be assigned or sublicensed, except as described
|
||||
herein. Should any provision of this Agreement be held to be void,
|
||||
invalid, unenforceable or illegal by a court, the validity and
|
||||
enforceability of the other provisions shall not be affected thereby.
|
||||
If any provision is determined to be unenforceable, you agree to a
|
||||
modification of such provision to provide for enforcement of the
|
||||
provision's intent, to the extent permitted by applicable law. Failure
|
||||
of a party to enforce any provision of this Agreement shall not
|
||||
constitute or be construed as a waiver of such provision or of the
|
||||
right to enforce such provision. If you fail to comply with any terms
|
||||
of this Agreement, YOUR LICENSE IS AUTOMATICALLY TERMINATED.
|
||||
|
||||
YOU ACKNOWLEDGE THAT YOU HAVE READ THIS AGREEMENT, YOU UNDERSTAND
|
||||
THIS AGREEMENT, AND UNDERSTAND THAT BY CONTINUING THE INSTALLATION
|
||||
OF THE SOFTWARE, BY LOADING OR RUNNING THE SOFTWARE, OR BY PLACING
|
||||
OR COPYING THE SOFTWARE ONTO YOUR COMPUTER HARD DRIVE, YOU AGREE TO
|
||||
BE BOUND BY THIS AGREEMENT'S TERMS AND CONDITIONS. YOU FURTHER
|
||||
AGREE THAT, EXCEPT FOR WRITTEN SEPARATE AGREEMENTS BETWEEN ID AND
|
||||
YOU, THIS AGREEMENT IS A COMPLETE AND EXCLUSIVE STATEMENT OF THE
|
||||
RIGHTS AND LIABILITIES OF THE PARTIES. THIS AGREEMENT SUPERSEDES
|
||||
ALL PRIOR ORAL AGREEMENTS, PROPOSALS OR UNDERSTANDINGS, AND ANY
|
||||
OTHER COMMUNICATIONS BETWEEN ID AND YOU RELATING TO THE SUBJECT
|
||||
MATTER OF THIS AGREEMENT.
|
||||
|
||||
June 21, 1996
|
||||
|
||||
SHAREWARE VERSION: QUAKE LIMITED USE SOFTWARE LICENSE AGREEMENT
|
||||
(DWC:dw:3406.0024:DWC\doc:1163)
|
||||
1901
WinQuake/data/TECHINFO.TXT
Normal file
1901
WinQuake/data/TECHINFO.TXT
Normal file
File diff suppressed because it is too large
Load Diff
177
WinQuake/docs/INSTALL
Normal file
177
WinQuake/docs/INSTALL
Normal file
@@ -0,0 +1,177 @@
|
||||
INSTALL for Linux Quake
|
||||
-----------------------
|
||||
|
||||
Quake for Linux provides several different binary executables to support
|
||||
different hardware and drivers.
|
||||
|
||||
Included with Linux Quake are:
|
||||
- SVGALib Quake (squake)
|
||||
This is a software renderer Quake that runs at the text console in Linux.
|
||||
- GLQuake (glquake, glquake.glx and glquake.3dfxgl)
|
||||
This is a hardware renderer Quake that runs using hardware 3D
|
||||
acceleration.
|
||||
- X11 Quake (quake.x11)
|
||||
Software rendering in a window under X11.
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
Mount the Quake CD as one would usually mount a CDROM, this can be
|
||||
accomplished by using the command:
|
||||
|
||||
mount /dev/cdrom /mnt
|
||||
|
||||
As root. Once the CD is mounted, run the setup script on the CD as root.
|
||||
|
||||
$ su
|
||||
Password:
|
||||
# mount /dev/cdrom /mnt
|
||||
# /bin/sh /mnt/setup
|
||||
|
||||
The script will ask some questions about what options you want to install
|
||||
and automatically install the software into /usr/local/games/quake.
|
||||
|
||||
Requirements
|
||||
------------
|
||||
|
||||
Requirements for SVGALib Quake:
|
||||
|
||||
- SVGALib 1.20 or later (/lib/libvga.so.1.2.10)
|
||||
- libc 5.2.18 or later (5.0.9 will not work, /lib/libc.so.5.2.18)
|
||||
or glibc (libc6) for the glibc version
|
||||
- CD-ROM for CDAudio
|
||||
- Soundcard capable of mmap'd buffers. USSLite 3.5.4 was used to build squake
|
||||
with. Works fine on SoundBlaster 16 and Gravis Ultrasound MAX.
|
||||
- SVGALib supported mouse (usually if it works with X, it'll work with
|
||||
squake).
|
||||
- Kernel 2.0.24 or later
|
||||
- untested with 2.1 kernels, your mileage may vary
|
||||
|
||||
Requirements for GLQuake:
|
||||
|
||||
- 3DFX based card for the GLQuake version, VooDoo, VooDoo Rush or VooDoo2
|
||||
at this writing. In order to use 3DFX hardware, you must have 3DFX's
|
||||
GLIDE drivers installed. RPMs for these drivers are available at:
|
||||
http://glide.xxedgexx.com/3DfxRPMS.html
|
||||
- For the glX version, an OpenGL implementation that includes hardware
|
||||
glX support.
|
||||
- CD-ROM for CDAudio
|
||||
- Soundcard capable of mmap'd buffers. USSLite 3.5.4 was used to build squake
|
||||
with. Works fine on SoundBlaster 16 and Gravis Ultrasound MAX.
|
||||
- SVGALib compatible mouse for glquake or X11 for glquake.glx
|
||||
- Kernel 2.0.24 or later
|
||||
- untested with 2.1 kernels, your mileage may vary
|
||||
|
||||
Requirements for X11 Quake:
|
||||
|
||||
- X11R5 later, only tested with XFree86, should work with most X Servers
|
||||
- libc 5.2.18 or later (5.0.9 will not work, /lib/libc.so.5.2.18)
|
||||
or glibc (libc6) for the glibc version
|
||||
- CD-ROM for CDAudio
|
||||
- Soundcard capable of mmap'd buffers. USSLite 3.5.4 was used to build squake
|
||||
with. Works fine on SoundBlaster 16 and Gravis Ultrasound MAX.
|
||||
- SVGALib supported mouse (usually if it works with X, it'll work with
|
||||
squake).
|
||||
- Kernel 2.0.24 or later
|
||||
- untested with 2.1 kernels, your mileage may vary
|
||||
|
||||
Additional notes for SVGALib Quake
|
||||
----------------------------------
|
||||
|
||||
SVGALib may not detect a 3-button mouse properly (it
|
||||
will only use two buttons). Check your /etc/vga/libvga.config
|
||||
and set it up for your mouse type.
|
||||
|
||||
Also, newer versions of SVGALib have an mouse_accel_type option. Most
|
||||
users will want to set this to "off" in /etc/vga/libvga.config.
|
||||
|
||||
Additional notes for GLQuake
|
||||
----------------------------
|
||||
|
||||
There are three different ways to execute GLQuake:
|
||||
|
||||
1. The binary "glquake" requires Mesa 3-D 2.5 or later installed and compiled
|
||||
with 3DFX support (fxMesa..() function interface). It also requires
|
||||
svgalib 1.3.0 or later for keyboard/mouse input. This binary is a console
|
||||
application. Mesa 3-D requires GLIDE to be installed.
|
||||
|
||||
2. The shell script "glquake.3dfxgl" runs the "glquake" binary after
|
||||
preloading the lib3dfxgl.so library. This is a port of 3DFX's Win32
|
||||
OpenGL MCD (Mini Client Driver) to Linux. It is faster than Mesa 3-D
|
||||
since it was written specifically with supporting GLQuake in mind.
|
||||
lib3dfxgl.so requires that GLIDE be installed.
|
||||
|
||||
3. The binary "glquake.glx" is linked against standard OpenGL libraries.
|
||||
It should run on many different hardward OpenGL implementations under
|
||||
Linux and X11. This binary is an X11 application and must be run under
|
||||
X11. It will work with Mesa 3-D as a standard glX based OpenGL
|
||||
applications. If the Mesa 3-D library is compiled with 3DFX support,
|
||||
you can have Mesa 3-D support 3DFX hardware under X11 by setting the
|
||||
enviroment variable "MESA_GLX_FX" to "fullscreen" for fullscreen mode
|
||||
and "window" for windowed mode, eg. "export MESA_GLX_FX=fullscreen" for sh
|
||||
or "setenv MESA_GLX_FX fullscreen" for csh.
|
||||
|
||||
For glquake, you must also have SVGALib or later installed (1.3.0 or later
|
||||
prefered). GLQuake uses SVGALib for mouse and keyboard handling.
|
||||
|
||||
If you have gpm and/or selection running, you will have to terminate them
|
||||
before running GLQuake since they will not give up the mouse when GLQuake
|
||||
attempts to run. You can kill gpm by typing 'killall gpm' as root.
|
||||
|
||||
You must run GLQuake as root or setuid root since it needs to access things
|
||||
such as sound, keyboard, mouse and the 3DFX video. Future versions may not
|
||||
require root permissions.
|
||||
|
||||
Additional notes for X11 Quake
|
||||
------------------------------
|
||||
|
||||
This is a windowed version that is generic for X11. It runs in a window
|
||||
and can be resized. You can specify a starting window size with:
|
||||
-width <width>
|
||||
-height <height>
|
||||
-winsize <width> <height>
|
||||
Default is 320x200. It works in 16bit modes, but it's slower (twice as many
|
||||
bytes to copy).
|
||||
|
||||
No other video modes are supported (just runs windowed). Mouse is read, but
|
||||
not "grabbed" by default. Go to the Options menu and turn on Use Mouse to grab
|
||||
the mouse and use it in the game (or type "_windowed_mouse 1" at the console).
|
||||
|
||||
Command Line Options for Linux Quake
|
||||
------------------------------------
|
||||
|
||||
-mem <mb>
|
||||
Specify memory in megabytes to allocate (default is 8MB, which should be fine
|
||||
for most needs).
|
||||
|
||||
-nostdout
|
||||
Don't do any output to stdout
|
||||
|
||||
-mdev <device> (SVGALib based versions only)
|
||||
Mouse device, default is /dev/mouse
|
||||
|
||||
-mrate <speed> (SVGALib based versions only)
|
||||
Mouse baud rate, default is 1200
|
||||
|
||||
-cddev <device>
|
||||
CD device, default is /dev/cdrom
|
||||
|
||||
-mode <modenum>
|
||||
Use indicated video mode
|
||||
|
||||
-nokdb
|
||||
Don't initialize keyboard
|
||||
|
||||
-sndbits <8 or 16>
|
||||
Set sound bit sample size. Default is 16 if supported.
|
||||
|
||||
-sndspeed <speed>
|
||||
Set sound speed. Usual values are 8000, 11025, 22051 and 44100.
|
||||
Default is 11025.
|
||||
|
||||
-sndmono
|
||||
Set mono sound
|
||||
|
||||
-sndstereo
|
||||
Set stereo sound (default if supported)
|
||||
|
||||
39
WinQuake/docs/INSTALL.Q2Mission
Normal file
39
WinQuake/docs/INSTALL.Q2Mission
Normal file
@@ -0,0 +1,39 @@
|
||||
INSTALL for Linux Quake2 Mission Packs
|
||||
--------------------------------------
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
Mount the Quake2 Mission Pack CD as one would usually mount a CDROM, this can
|
||||
be accomplished by using the command:
|
||||
|
||||
mount /dev/cdrom /mnt
|
||||
|
||||
As root. Once the CD is mounted, run the setup script on the CD as root.
|
||||
|
||||
$ su
|
||||
Password:
|
||||
# mount /dev/cdrom /mnt
|
||||
# /bin/sh /mnt/setup
|
||||
|
||||
The script will ask some questions about what options you want to install
|
||||
and automatically install the software into /usr/local/games/quake2.
|
||||
|
||||
After Installation
|
||||
------------------
|
||||
|
||||
To run Quake2 Mission Pack #1: The Reckoning add the following option when
|
||||
executing Quake2:
|
||||
|
||||
./quake2 +set game xatrix
|
||||
|
||||
To run Quake2 Mission Pack #2: Ground Zero add the following:
|
||||
|
||||
./quake2 +set game rogue
|
||||
|
||||
Requirements
|
||||
------------
|
||||
|
||||
The Quake2 Mission Packs require a previous installation of Quake2.
|
||||
|
||||
|
||||
177
WinQuake/docs/INSTALL.Quake
Normal file
177
WinQuake/docs/INSTALL.Quake
Normal file
@@ -0,0 +1,177 @@
|
||||
INSTALL for Linux Quake
|
||||
-----------------------
|
||||
|
||||
Quake for Linux provides several different binary executables to support
|
||||
different hardware and drivers.
|
||||
|
||||
Included with Linux Quake are:
|
||||
- SVGALib Quake (squake)
|
||||
This is a software renderer Quake that runs at the text console in Linux.
|
||||
- GLQuake (glquake, glquake.glx and glquake.3dfxgl)
|
||||
This is a hardware renderer Quake that runs using hardware 3D
|
||||
acceleration.
|
||||
- X11 Quake (quake.x11)
|
||||
Software rendering in a window under X11.
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
Mount the Quake CD as one would usually mount a CDROM, this can be
|
||||
accomplished by using the command:
|
||||
|
||||
mount /dev/cdrom /mnt
|
||||
|
||||
As root. Once the CD is mounted, run the setup script on the CD as root.
|
||||
|
||||
$ su
|
||||
Password:
|
||||
# mount /dev/cdrom /mnt
|
||||
# /bin/sh /mnt/setup
|
||||
|
||||
The script will ask some questions about what options you want to install
|
||||
and automatically install the software into /usr/local/games/quake.
|
||||
|
||||
Requirements
|
||||
------------
|
||||
|
||||
Requirements for SVGALib Quake:
|
||||
|
||||
- SVGALib 1.20 or later (/lib/libvga.so.1.2.10)
|
||||
- libc 5.2.18 or later (5.0.9 will not work, /lib/libc.so.5.2.18)
|
||||
or glibc (libc6) for the glibc version
|
||||
- CD-ROM for CDAudio
|
||||
- Soundcard capable of mmap'd buffers. USSLite 3.5.4 was used to build squake
|
||||
with. Works fine on SoundBlaster 16 and Gravis Ultrasound MAX.
|
||||
- SVGALib supported mouse (usually if it works with X, it'll work with
|
||||
squake).
|
||||
- Kernel 2.0.24 or later
|
||||
- untested with 2.1 kernels, your mileage may vary
|
||||
|
||||
Requirements for GLQuake:
|
||||
|
||||
- 3DFX based card for the GLQuake version, VooDoo, VooDoo Rush or VooDoo2
|
||||
at this writing. In order to use 3DFX hardware, you must have 3DFX's
|
||||
GLIDE drivers installed. RPMs for these drivers are available at:
|
||||
http://glide.xxedgexx.com/3DfxRPMS.html
|
||||
- For the glX version, an OpenGL implementation that includes hardware
|
||||
glX support.
|
||||
- CD-ROM for CDAudio
|
||||
- Soundcard capable of mmap'd buffers. USSLite 3.5.4 was used to build squake
|
||||
with. Works fine on SoundBlaster 16 and Gravis Ultrasound MAX.
|
||||
- SVGALib compatible mouse for glquake or X11 for glquake.glx
|
||||
- Kernel 2.0.24 or later
|
||||
- untested with 2.1 kernels, your mileage may vary
|
||||
|
||||
Requirements for X11 Quake:
|
||||
|
||||
- X11R5 later, only tested with XFree86, should work with most X Servers
|
||||
- libc 5.2.18 or later (5.0.9 will not work, /lib/libc.so.5.2.18)
|
||||
or glibc (libc6) for the glibc version
|
||||
- CD-ROM for CDAudio
|
||||
- Soundcard capable of mmap'd buffers. USSLite 3.5.4 was used to build squake
|
||||
with. Works fine on SoundBlaster 16 and Gravis Ultrasound MAX.
|
||||
- SVGALib supported mouse (usually if it works with X, it'll work with
|
||||
squake).
|
||||
- Kernel 2.0.24 or later
|
||||
- untested with 2.1 kernels, your mileage may vary
|
||||
|
||||
Additional notes for SVGALib Quake
|
||||
----------------------------------
|
||||
|
||||
SVGALib may not detect a 3-button mouse properly (it
|
||||
will only use two buttons). Check your /etc/vga/libvga.config
|
||||
and set it up for your mouse type.
|
||||
|
||||
Also, newer versions of SVGALib have an mouse_accel_type option. Most
|
||||
users will want to set this to "off" in /etc/vga/libvga.config.
|
||||
|
||||
Additional notes for GLQuake
|
||||
----------------------------
|
||||
|
||||
There are three different ways to execute GLQuake:
|
||||
|
||||
1. The binary "glquake" requires Mesa 3-D 2.5 or later installed and compiled
|
||||
with 3DFX support (fxMesa..() function interface). It also requires
|
||||
svgalib 1.3.0 or later for keyboard/mouse input. This binary is a console
|
||||
application. Mesa 3-D requires GLIDE to be installed.
|
||||
|
||||
2. The shell script "glquake.3dfxgl" runs the "glquake" binary after
|
||||
preloading the lib3dfxgl.so library. This is a port of 3DFX's Win32
|
||||
OpenGL MCD (Mini Client Driver) to Linux. It is faster than Mesa 3-D
|
||||
since it was written specifically with supporting GLQuake in mind.
|
||||
lib3dfxgl.so requires that GLIDE be installed.
|
||||
|
||||
3. The binary "glquake.glx" is linked against standard OpenGL libraries.
|
||||
It should run on many different hardward OpenGL implementations under
|
||||
Linux and X11. This binary is an X11 application and must be run under
|
||||
X11. It will work with Mesa 3-D as a standard glX based OpenGL
|
||||
applications. If the Mesa 3-D library is compiled with 3DFX support,
|
||||
you can have Mesa 3-D support 3DFX hardware under X11 by setting the
|
||||
enviroment variable "MESA_GLX_FX" to "fullscreen" for fullscreen mode
|
||||
and "window" for windowed mode, eg. "export MESA_GLX_FX=fullscreen" for sh
|
||||
or "setenv MESA_GLX_FX fullscreen" for csh.
|
||||
|
||||
For glquake, you must also have SVGALib or later installed (1.3.0 or later
|
||||
prefered). GLQuake uses SVGALib for mouse and keyboard handling.
|
||||
|
||||
If you have gpm and/or selection running, you will have to terminate them
|
||||
before running GLQuake since they will not give up the mouse when GLQuake
|
||||
attempts to run. You can kill gpm by typing 'killall gpm' as root.
|
||||
|
||||
You must run GLQuake as root or setuid root since it needs to access things
|
||||
such as sound, keyboard, mouse and the 3DFX video. Future versions may not
|
||||
require root permissions.
|
||||
|
||||
Additional notes for X11 Quake
|
||||
------------------------------
|
||||
|
||||
This is a windowed version that is generic for X11. It runs in a window
|
||||
and can be resized. You can specify a starting window size with:
|
||||
-width <width>
|
||||
-height <height>
|
||||
-winsize <width> <height>
|
||||
Default is 320x200. It works in 16bit modes, but it's slower (twice as many
|
||||
bytes to copy).
|
||||
|
||||
No other video modes are supported (just runs windowed). Mouse is read, but
|
||||
not "grabbed" by default. Go to the Options menu and turn on Use Mouse to grab
|
||||
the mouse and use it in the game (or type "_windowed_mouse 1" at the console).
|
||||
|
||||
Command Line Options for Linux Quake
|
||||
------------------------------------
|
||||
|
||||
-mem <mb>
|
||||
Specify memory in megabytes to allocate (default is 8MB, which should be fine
|
||||
for most needs).
|
||||
|
||||
-nostdout
|
||||
Don't do any output to stdout
|
||||
|
||||
-mdev <device> (SVGALib based versions only)
|
||||
Mouse device, default is /dev/mouse
|
||||
|
||||
-mrate <speed> (SVGALib based versions only)
|
||||
Mouse baud rate, default is 1200
|
||||
|
||||
-cddev <device>
|
||||
CD device, default is /dev/cdrom
|
||||
|
||||
-mode <modenum>
|
||||
Use indicated video mode
|
||||
|
||||
-nokdb
|
||||
Don't initialize keyboard
|
||||
|
||||
-sndbits <8 or 16>
|
||||
Set sound bit sample size. Default is 16 if supported.
|
||||
|
||||
-sndspeed <speed>
|
||||
Set sound speed. Usual values are 8000, 11025, 22051 and 44100.
|
||||
Default is 11025.
|
||||
|
||||
-sndmono
|
||||
Set mono sound
|
||||
|
||||
-sndstereo
|
||||
Set stereo sound (default if supported)
|
||||
|
||||
218
WinQuake/docs/INSTALL.Quake2
Normal file
218
WinQuake/docs/INSTALL.Quake2
Normal file
@@ -0,0 +1,218 @@
|
||||
INSTALL for Linux Quake2
|
||||
------------------------
|
||||
|
||||
Quake2 for Linux supports the following video subsystems:
|
||||
|
||||
- SVGALib Console Graphics (ref_soft.so)
|
||||
- Requires SVGALib 1.2.0 or later
|
||||
- X11 Window Graphics (ref_softx.so)
|
||||
- X11R5 or later, XShm shared memory extension supported
|
||||
- 3DFX fxMesa with Mesa 3-D or 3DFX Miniport (ref_gl.so)
|
||||
- Mesa 3-D 2.6 or later, specifically compiled for 3DFX support
|
||||
Mesa 3-D 2.6 compiled with 3DFX support is provided with this archive.
|
||||
- Generic glX (X11) based OpenGL (ref_glx.so)
|
||||
- Requires a glX based hardware accelerated OpenGL implementation.
|
||||
Mesa 3-D 2.6 supports this on 3DFX hardware.
|
||||
|
||||
Also included is a specific 3DFX mini-OpenGL implementation for running Quake2
|
||||
on 3DFX hardware.
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
Mount the Quake2 CD as one would usually mount a CDROM, this can be
|
||||
accomplished by using the command:
|
||||
|
||||
mount /dev/cdrom /mnt
|
||||
|
||||
As root. Once the CD is mounted, run the setup script on the CD as root.
|
||||
|
||||
$ su
|
||||
Password:
|
||||
# mount /dev/cdrom /mnt
|
||||
# /bin/sh /mnt/setup
|
||||
|
||||
The script will ask some questions about what options you want to install
|
||||
and automatically install the software into /usr/local/games/quake2.
|
||||
|
||||
Make sure you have the appropirate hardware, drivers and libraries installed
|
||||
for the renderer you are going to play on.
|
||||
|
||||
Quake2 for Linux supports the following renderers:
|
||||
|
||||
- ref_soft
|
||||
Software rendering under SVGALib (console only). SVGALib 1.2.10 or later
|
||||
is required. Note that SVGALib 1.2.11 supports the ability to run a
|
||||
SVGALib application under X11 as it will automatically allocate a new
|
||||
console. The default mode is 320x240 (ModeX) since that is the lowest
|
||||
resolution supported by Quake2. If SVGALib supports your video card, higher
|
||||
resolution modes such as 640x480 and 800x600 are also supported.
|
||||
|
||||
Please note that you may need to configure your mouse for SVGALib in
|
||||
/etc/vga/libvga.config (or /etc/libvga.config).
|
||||
|
||||
- ref_softx
|
||||
Software rendering under X11. This uses the MITSHM Extension and should
|
||||
work will virtually all Linux X Servers. **NOTE: Do not resize the window
|
||||
under X11. You must use the Video menu to change resolution/window size.
|
||||
|
||||
By default, the mouse will not be 'tied' to the Quake2 window. To cause
|
||||
Quake2 to grab the mouse, select 'Windowed Mouse' from the video menu,
|
||||
or type '_windowed_mouse 0' at the console. Do the reverse to release it.
|
||||
You can bind keys to grab and release the mouse in the console, like so:
|
||||
bind i "_windowed_mouse 1"
|
||||
bind o "_windowed_mouse 0"
|
||||
Then "i" will grab the mouse and "o" will release it.
|
||||
|
||||
- ref_gl
|
||||
This render can be run with two different OpenGL drivers: Mesa 3-D
|
||||
ontop of Linux GLIDE, or 3DFX's mini-OpenGL Quake driver.
|
||||
For Mesa 3-D, the necessary libMesaGL.so.2.6 is included with this archive.
|
||||
You must copy it to /usr/lib or /usr/local/lib and run ldconfig (as root)
|
||||
in order to use it. You can do this as follows:
|
||||
tar cf - lib*GL* | (cd /usr/lib; tar xf -)
|
||||
You should use tar to keep the symlinks intact. Once you copy them over
|
||||
run ldconfig.
|
||||
You must also download and install the Linux GLIDE drivers at
|
||||
http://www.3dfx.com/software/download_glidel.html
|
||||
And install them as instructed.
|
||||
RPMs for GLIDE are available at :
|
||||
http://glide.xxedgexx.com/3DfxRPMS.html
|
||||
With version 3.20, the GL library is entirely runtime loaded. This means
|
||||
you can specify what shared object to load for GL display.
|
||||
To use Mesa 3-D GL (console), run quake with:
|
||||
./quake2 +set vid_ref gl +set gl_driver libMesaGL.so.2
|
||||
To use the 3DFX OpenGL Miniport, run the included quake2.3dfxgl:
|
||||
./quake2 +set vid_ref gl +set gl_driver lib3dfxgl.so
|
||||
The gl_driver cvar indicates the name of the library to load for GL
|
||||
functions. It can be in any directory listed in /etc/ld.so.conf
|
||||
or in /etc/quake2.conf
|
||||
|
||||
**NOTE: There is a problem on libc5 systems where a vid_restart (causing
|
||||
a reload of the video system) will crash. There doesn't seem to be a
|
||||
solution to this yet. It looks to be some sort of ld.so dynamic loading
|
||||
interaction with SVGALib and ref_gl.so. A work around is to start in
|
||||
software mode (./quake2 +set vid_ref soft), then use the menu to set your
|
||||
mode and a vid_restart will work when going from software to GL. Exit
|
||||
out then and save your video mode settings.
|
||||
This problem does not occur on libc6 (glibc) based systems; vid_restart
|
||||
works fine on there.
|
||||
|
||||
- ref_glx
|
||||
ref_glx should run on many different hardward OpenGL implementations under
|
||||
Linux and X11. This binary is an X11 application and must be run under
|
||||
X11. It will work with Mesa 3-D as a standard glX based OpenGL
|
||||
applications. If the Mesa 3-D library is compiled with 3DFX support,
|
||||
you can have Mesa 3-D support 3DFX hardware under X11 by setting the
|
||||
enviroment variable "MESA_GLX_FX" to "fullscreen" for fullscreen mode
|
||||
and "window" for windowed mode, eg. "export MESA_GLX_FX=fullscreen" for sh
|
||||
or "setenv MESA_GLX_FX fullscreen" for csh.
|
||||
|
||||
As with ref_gl, the "gl_driver" cvar indicates the shared library to load
|
||||
for OpenGL functions (the glX functions must provided in that library
|
||||
as well).
|
||||
|
||||
Permissions
|
||||
-----------
|
||||
|
||||
Quake2 requires root permissions to use the software (SVGALib) and GL (MesaGL
|
||||
w/3dfx) renders. In order to make this secure, some special considerations
|
||||
must be made.
|
||||
|
||||
Quake2 should get setuid root:
|
||||
chown root quake2
|
||||
chmod 4711 quake2
|
||||
|
||||
And the ref_soft.so and ref_gl.so files must owned by root.
|
||||
|
||||
The file /etc/quake2.conf must be installed. This file contains a single
|
||||
line with the path of where the ref shared libraries can be found.
|
||||
A sample one is included that lists /usr/games/quake2 as the default
|
||||
path. The libraries are only loaded out of the directory listed in
|
||||
/etc/quake2.conf for security considerations.
|
||||
|
||||
Special permissions are not required for the softx renderer, but quake2 may
|
||||
still need to be setuid root to open the sound device (quake2 will give up
|
||||
setuid root permissions before loading softx).
|
||||
|
||||
NOTE: If you use a setuid quake2 binary and run it as a normal user, it
|
||||
will NOT be able to switch renderers on the fly because root permissions
|
||||
are given up after the renderer is loaded. You can switch renderers on the
|
||||
fly if you run quake2 as root (su or log in as root).
|
||||
|
||||
NOTE: When the quake2 binary is run in dedicated server mode
|
||||
(+set dedicated 1), no special permissions are required and
|
||||
/etc/quake2.conf is not read since no renderer is loaded.
|
||||
|
||||
----
|
||||
|
||||
The first time you run Quake2, it will use ref_soft or ref_softx based
|
||||
on whether a DISPLAY environment variable exists.
|
||||
|
||||
To force the loading of a specific renderer at load time, use the following
|
||||
command lines:
|
||||
|
||||
./quake2 +set vid_ref soft
|
||||
./quake2 +set vid_ref softx
|
||||
./quake2 +set vid_ref gl
|
||||
./quake2 +set vid_ref glx
|
||||
|
||||
Linux Specific Cvars
|
||||
--------------------
|
||||
|
||||
To set this, use +set on the command line, i.e.:
|
||||
./quake2 +set cd_dev /dev/hdc +set sndmono 1
|
||||
|
||||
nocdaudio (defaults to 0)
|
||||
Do not enable cd audio if not zero
|
||||
|
||||
sndbits (defaults to 16)
|
||||
Set sound bit sample size.
|
||||
|
||||
sndspeed (defaults to 0)
|
||||
Set sound speed. Usual values are 8000, 11025, 22051 and 44100.
|
||||
If set to zero, causes the sound driver to attempt speeds in the following
|
||||
order: 11025, 22051, 44100, 8000.
|
||||
|
||||
sndchannels (defaults to 2)
|
||||
Indicates stereo or mono sound. Defaults to 2 (stereo). Use 1 for mono.
|
||||
|
||||
nostdout (defaults to 0)
|
||||
Whether to output console msgs to standard out. Non-zero is cease output.
|
||||
|
||||
Dedicated server
|
||||
----------------
|
||||
|
||||
To run Linux Quake2 as a dedicated server, just run it as follows:
|
||||
|
||||
./quake2 +set dedicated 1
|
||||
|
||||
You can also set dmflags, timelimit, etc. in a config file, like so:
|
||||
set timelimit 20
|
||||
set fraglimit 25
|
||||
set dmflags 532
|
||||
map fact3
|
||||
|
||||
Then exec that config file on load, like so:
|
||||
|
||||
./quake2 +set dedicated 1 +exec server.cfg
|
||||
|
||||
If you use a config file, you must put a 'map' command in it or the
|
||||
server won't load a map.
|
||||
|
||||
To run a dedicated server in the background, use this;
|
||||
|
||||
nohup ./quake2 +set dedicated 1 +exec server.cfg &
|
||||
|
||||
A better way is to run Quake2 on a tty via screen. screen can be found
|
||||
at ftp://prep.ai.mit.edu/pub/gnu/screen-3.7.4.tar.gz, but it comes with
|
||||
most modern Linux installations now.
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
|
||||
Linux Quake2 is an unsupported product. Usage of this product is bound by
|
||||
the legal notice found on the distribution Quake2 CDROM.
|
||||
|
||||
/// Zoid
|
||||
zoid@idsoftware.com
|
||||
|
||||
157
WinQuake/docs/README
Normal file
157
WinQuake/docs/README
Normal file
@@ -0,0 +1,157 @@
|
||||
README for Linux Quake
|
||||
----------------------
|
||||
|
||||
This README convers all versions of Quake for Linux:
|
||||
- SVGALib Quake (squake)
|
||||
- GLQuake (glquake, glquake.glx and glquake.3dfxgl)
|
||||
- X11 Quake (quake.x11)
|
||||
|
||||
Requirements for SVGALib Quake:
|
||||
|
||||
- SVGALib 1.20 or later (/lib/libvga.so.1.2.10)
|
||||
- libc 5.2.18 or later (5.0.9 will not work, /lib/libc.so.5.2.18)
|
||||
or glibc (libc6) for the glibc version
|
||||
- CD-ROM for CDAudio
|
||||
- Soundcard capable of mmap'd buffers. USSLite 3.5.4 was used to build squake
|
||||
with. Works fine on SoundBlaster 16 and Gravis Ultrasound MAX.
|
||||
- SVGALib supported mouse (usually if it works with X, it'll work with
|
||||
squake).
|
||||
- Kernel 2.0.24 or later
|
||||
- untested with 2.1 kernels, your mileage may vary
|
||||
|
||||
Requirements for GLQuake:
|
||||
|
||||
- 3DFX based card for the GLQuake version, VooDoo, VooDoo Rush or VooDoo2
|
||||
at this writing. In order to use 3DFX hardware, you must have 3DFX's
|
||||
GLIDE drivers installed. RPMs for these drivers are available at:
|
||||
http://glide.xxedgexx.com/3DfxRPMS.html
|
||||
- For the glX version, an OpenGL implementation that includes hardware
|
||||
glX support.
|
||||
- CD-ROM for CDAudio
|
||||
- Soundcard capable of mmap'd buffers. USSLite 3.5.4 was used to build squake
|
||||
with. Works fine on SoundBlaster 16 and Gravis Ultrasound MAX.
|
||||
- SVGALib compatible mouse for glquake or X11 for glquake.glx
|
||||
- Kernel 2.0.24 or later
|
||||
- untested with 2.1 kernels, your mileage may vary
|
||||
|
||||
Requirements for X11 Quake:
|
||||
|
||||
- X11R5 later, only tested with XFree86, should work with most X Servers
|
||||
- libc 5.2.18 or later (5.0.9 will not work, /lib/libc.so.5.2.18)
|
||||
or glibc (libc6) for the glibc version
|
||||
- CD-ROM for CDAudio
|
||||
- Soundcard capable of mmap'd buffers. USSLite 3.5.4 was used to build squake
|
||||
with. Works fine on SoundBlaster 16 and Gravis Ultrasound MAX.
|
||||
- SVGALib supported mouse (usually if it works with X, it'll work with
|
||||
squake).
|
||||
- Kernel 2.0.24 or later
|
||||
- untested with 2.1 kernels, your mileage may vary
|
||||
|
||||
Additional notes for SVGALib Quake
|
||||
----------------------------------
|
||||
|
||||
SVGALib may not detect a 3-button mouse properly (it
|
||||
will only use two buttons). Check your /etc/vga/libvga.config
|
||||
and set it up for your mouse type.
|
||||
|
||||
Additional notes for GLQuake
|
||||
----------------------------
|
||||
|
||||
There are three different ways to execute GLQuake:
|
||||
|
||||
1. The binary "glquake" requires Mesa 3-D 2.5 or later installed and compiled
|
||||
with 3DFX support (fxMesa..() function interface). It also requires
|
||||
svgalib 1.3.0 or later for keyboard/mouse input. This binary is a console
|
||||
application. Mesa 3-D requires GLIDE to be installed.
|
||||
|
||||
2. The shell script "glquake.3dfxgl" runs the "glquake" binary after
|
||||
preloading the lib3dfxgl.so library. This is a port of 3DFX's Win32
|
||||
OpenGL MCD (Mini Client Driver) to Linux. It is faster than Mesa 3-D
|
||||
since it was written specifically with supporting GLQuake in mind.
|
||||
lib3dfxgl.so requires that GLIDE be installed.
|
||||
|
||||
3. The binary "glquake.glx" is linked against standard OpenGL libraries.
|
||||
It should run on many different hardward OpenGL implementations under
|
||||
Linux and X11. This binary is an X11 application and must be run under
|
||||
X11. It will work with Mesa 3-D as a standard glX based OpenGL
|
||||
applications. If the Mesa 3-D library is compiled with 3DFX support,
|
||||
you can have Mesa 3-D support 3DFX hardware under X11 by setting the
|
||||
enviroment variable "MESA_GLX_FX" to "fullscreen" for fullscreen mode
|
||||
and "window" for windowed mode, eg. "export MESA_GLX_FX=fullscreen" for sh
|
||||
or "setenv MESA_GLX_FX fullscreen" for csh.
|
||||
|
||||
For glquake, you must also have SVGALib or later installed (1.3.0 or later
|
||||
prefered). GLQuake uses SVGALib for mouse and keyboard handling.
|
||||
|
||||
If you have gpm and/or selection running, you will have to terminate them
|
||||
before running GLQuake since they will not give up the mouse when GLQuake
|
||||
attempts to run. You can kill gpm by typing 'killall gpm' as root.
|
||||
|
||||
You must run GLQuake as root or setuid root since it needs to access things
|
||||
such as sound, keyboard, mouse and the 3DFX video. Future versions may not
|
||||
require root permissions.
|
||||
|
||||
Additional notes for X11 Quake
|
||||
------------------------------
|
||||
|
||||
This is a windowed version that is generic for X11. It runs in a window
|
||||
and can be resized. You can specify a starting window size with:
|
||||
-width <width>
|
||||
-height <height>
|
||||
-winsize <width> <height>
|
||||
Default is 320x200. It works in 16bit modes, but it's slower (twice as many
|
||||
bytes to copy).
|
||||
|
||||
No other video modes are supported (just runs windowed). Mouse is read, but
|
||||
not "grabbed" by default. Go to the Options menu and turn on Use Mouse to grab
|
||||
the mouse and use it in the game (or type "_windowed_mouse 1" at the console).
|
||||
|
||||
Command Line Options for Linux Quake
|
||||
------------------------------------
|
||||
|
||||
-mem <mb>
|
||||
Specify memory in megabytes to allocate (default is 8MB, which should be fine
|
||||
for most needs).
|
||||
|
||||
-nostdout
|
||||
Don't do any output to stdout
|
||||
|
||||
-mdev <device> (SVGALib based versions only)
|
||||
Mouse device, default is /dev/mouse
|
||||
|
||||
-mrate <speed> (SVGALib based versions only)
|
||||
Mouse baud rate, default is 1200
|
||||
|
||||
-cddev <device>
|
||||
CD device, default is /dev/cdrom
|
||||
|
||||
-mode <modenum>
|
||||
Use indicated video mode
|
||||
|
||||
-nokdb
|
||||
Don't initialize keyboard
|
||||
|
||||
-sndbits <8 or 16>
|
||||
Set sound bit sample size. Default is 16 if supported.
|
||||
|
||||
-sndspeed <speed>
|
||||
Set sound speed. Usual values are 8000, 11025, 22051 and 44100.
|
||||
Default is 11025.
|
||||
|
||||
-sndmono
|
||||
Set mono sound
|
||||
|
||||
-sndstereo
|
||||
Set stereo sound (default if supported)
|
||||
|
||||
End Notes
|
||||
---------
|
||||
|
||||
Linux Quake is *NOT* an officially supported product. Mail about it
|
||||
will be deleted. Do not email id about this product. If you are having
|
||||
technical difficultly, you can email me, but make sure you have the correct
|
||||
kernel, libc, svgalib and other software versions before you email me.
|
||||
|
||||
Dave 'Zoid' Kirsch
|
||||
zoid@idsoftware.com
|
||||
Official Quake Unix Port Administrator
|
||||
107
WinQuake/docs/README.X11
Normal file
107
WinQuake/docs/README.X11
Normal file
@@ -0,0 +1,107 @@
|
||||
|
||||
README for Linux SVGALib Quake
|
||||
------------------------------
|
||||
|
||||
Requirements:
|
||||
|
||||
- X11R5 later, only tested with XFree86, should work with most X Servers
|
||||
- libc 5.2.18 or later (5.0.9 will not work, /lib/libc.so.5.2.18)
|
||||
- CD-ROM for CDAudio
|
||||
- Soundcard capable of mmap'd buffers. USSLite 3.5.4 was used to build squake
|
||||
with. Works fine on SoundBlaster 16 and Gravis Ultrasound MAX.
|
||||
- SVGALib supported mouse (usually if it works with X, it'll work with
|
||||
squake).
|
||||
- Kernel 2.0.24 or later
|
||||
- untested with 2.1 kernels, your mileage may vary
|
||||
|
||||
This is a windowed version that is generic for X11. It runs in a window
|
||||
and can be resized. You can specify a starting window size with:
|
||||
-width <width>
|
||||
-height <height>
|
||||
-winsize <width> <height>
|
||||
Default is 320x200. It works in 16bit modes, but it's slower (twice as many
|
||||
bytes to copy).
|
||||
|
||||
No other video modes are supported (just runs windowed). Mouse is read, but
|
||||
not "grabbed" by default. Go to the Options menu and turn on Use Mouse to grab
|
||||
the mouse and use it in the game. If you want to move the mouse out of
|
||||
QWCL, you have to turn Use Mouse off.
|
||||
|
||||
Full sound support is included. The default sound rate is 16-bit stereo,
|
||||
11KHz. You can change this in the options section below.
|
||||
|
||||
New Command Line Options for Linux SVGAlib Quake
|
||||
------------------------------------------------
|
||||
|
||||
-mem <mb>
|
||||
Specify memory in megabytes to allocate (default is 8MB, which should be fine
|
||||
for most needs).
|
||||
|
||||
-nostdout
|
||||
Don't do any output to stdout
|
||||
|
||||
-cddev <device>
|
||||
CD device, default is /dev/cdrom
|
||||
|
||||
-sndbits <8 or 16>
|
||||
Set sound bit sample size. Default is 16 if supported.
|
||||
|
||||
-sndspeed <speed>
|
||||
Set sound speed. Usual values are 8000, 11025, 22051 and 44100.
|
||||
Default is 11025.
|
||||
|
||||
-sndmono
|
||||
Set mono sound
|
||||
|
||||
-sndstereo
|
||||
Set stereo sound (default if supported)
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
Boot DOS (I know, but you need it to run the Quake install program) and
|
||||
install Quake from your Quake CD to a DOS parition.
|
||||
|
||||
Boot Linux and make a directory for Quake. Copy everything from the DOS Quake
|
||||
directory into it. i.e.:
|
||||
(cd /dos/quake; tar cf - .) | (cd ~/quake; tar xf -)
|
||||
|
||||
Quake for X11 does not need to be setuid root. Sound can fail if /dev/dsp is
|
||||
not mode 666.
|
||||
|
||||
Quake may segfault if it tries to initialize your sound card and their isn't
|
||||
one. Same with the CDROM. If it dies, try it with -nosound and/or
|
||||
-nocdaudio. If you have a sound card it died on and you know it is
|
||||
supported by USSLite (the driver that comes with the Linux kernel), let me
|
||||
know and I'll take a look at it.
|
||||
|
||||
It should work with SCSI CDROMs, but is untested.
|
||||
|
||||
Full TCP/IP network support is in, including listen and dedicated server
|
||||
modes.
|
||||
|
||||
All of the options described in TECHINFO.TXT and MANUAL.TXT from the Quake
|
||||
distribution will work, 'cept for stuff with vid modes and stuff.
|
||||
|
||||
End Notes
|
||||
---------
|
||||
|
||||
Linux Quake is *NOT* an officially supported product. Mail about it
|
||||
will be deleted. Do not email id about this product. If you are having
|
||||
technical difficultly, you can email me, but make sure you have the correct
|
||||
kernel, libc, svgalib and other software versions before you email me.
|
||||
|
||||
Dave 'Zoid' Kirsch
|
||||
zoid@idsoftware.com
|
||||
Official Quake Unix Port Administrator
|
||||
|
||||
Acks
|
||||
----
|
||||
|
||||
Greg Alexander <galexand@sietch.bloomington.in.us> for initial work in SVGALib
|
||||
support.
|
||||
Dave Taylor <ddt@crack.com> for basic Linux support.
|
||||
id Software for Quake and making me port it. :)
|
||||
|
||||
Lots of people on #linux, #quake for testing.
|
||||
|
||||
162
WinQuake/docs/readme.glquake
Normal file
162
WinQuake/docs/readme.glquake
Normal file
@@ -0,0 +1,162 @@
|
||||
Linux Glquake v0.98, Quake v1.09 release notes
|
||||
|
||||
Requirements
|
||||
------------
|
||||
|
||||
For 3DFX based hardware, you must download and install Linux GLIDE from
|
||||
http://glide.xxedgexx.com/3DfxRPMS.html and install as per the
|
||||
instructions.
|
||||
|
||||
Running GLQuake
|
||||
---------------
|
||||
|
||||
There are three different ways to execute GLQuake:
|
||||
|
||||
1. The binary "glquake" requires Mesa 3-D 2.5 or later installed and compiled
|
||||
with 3DFX support (fxMesa..() function interface). It also requires
|
||||
svgalib 1.3.0 or later for keyboard/mouse input. This binary is a console
|
||||
application. Mesa 3-D requires GLIDE to be installed.
|
||||
|
||||
2. The shell script "glquake.3dfxgl" runs the "glquake" binary after
|
||||
preloading the lib3dfxgl.so library. This is a port of 3DFX's Win32
|
||||
OpenGL MCD (Mini Client Driver) to Linux. It is faster than Mesa 3-D
|
||||
since it was written specifically with supporting GLQuake in mind.
|
||||
lib3dfxgl.so requires that GLIDE be installed.
|
||||
|
||||
3. The binary "glquake.glx" is linked against standard OpenGL libraries.
|
||||
It should run on many different hardward OpenGL implementations under
|
||||
Linux and X11. This binary is an X11 application and must be run under
|
||||
X11. It will work with Mesa 3-D as a standard glX based OpenGL
|
||||
applications. If the Mesa 3-D library is compiled with 3DFX support,
|
||||
you can have Mesa 3-D support 3DFX hardware under X11 by setting the
|
||||
enviroment variable "MESA_GLX_FX" to "fullscreen" for fullscreen mode
|
||||
and "window" for windowed mode.
|
||||
|
||||
You must also have SVGALib 1.3.0 or later installed. GLQuake uses SVGALib
|
||||
for mouse and keyboard handling.
|
||||
|
||||
If you have gpm and/or selection running, you will have to terminate them
|
||||
before running GLQuake since they will not give up the mouse when GLQuake
|
||||
attempts to run. You can kill gpm by typing 'killall gpm' as root.
|
||||
|
||||
You must run GLQuake as root or setuid root since it needs to access things
|
||||
such as sound, keyboard, mouse and the 3DFX video. Future versions may not
|
||||
require root permissions.
|
||||
|
||||
resolution options
|
||||
------------------
|
||||
glquake -width 512 -height 384
|
||||
Tries to run glquake at the specified resolution.
|
||||
Only highend VooDoo cards support such high resolutions (most
|
||||
cards on the market right now do not). Another popular and supported mode
|
||||
is 512x384 (-width 512 -height 384) which can offer a faster speed than
|
||||
the default 640x480.
|
||||
|
||||
You can also specify the resolution of the console independant of the screen
|
||||
resolution.
|
||||
|
||||
glquake -conwidth 320
|
||||
This will specify a console resolution of 320 by 240 (the height is
|
||||
automatically determined by the default 4:3 aspect ratio, you can also
|
||||
specify the height directly with -conheight).
|
||||
|
||||
In higher resolution modes such as 800x600 and 1024x768, glquake will default
|
||||
to a 640x480 console, since the font becomes small enough at higher
|
||||
resolutions to become unreadable. If do you wish to have a higher resolution
|
||||
console and status bar, specify it as well, such as:
|
||||
glquake -width 800 -height 600 -conwidth 800
|
||||
|
||||
texture options
|
||||
---------------
|
||||
The amount of textures used in the game can have a large impact on performance.
|
||||
There are several options that let you trade off visual quality for better
|
||||
performance.
|
||||
|
||||
There is no way to flush already loaded textures, so it is best to change
|
||||
these options on the command line, or they will only take effect on some of
|
||||
the textures when you change levels.
|
||||
|
||||
OpenGL only allows textures to repeat on power of two boundaries (32, 64,
|
||||
128, etc), but software quake had a number of textures that repeated at 24
|
||||
or 96 pixel boundaries. These need to be either stretched out to the next
|
||||
higher size, or shrunk down to the next lower. By default, they are filtered
|
||||
down to the smaller size, but you can cause it to use the larger size if you
|
||||
really want by using:
|
||||
|
||||
glquake +gl_round_down 0
|
||||
This will generally run well on a normal 4 MB 3dfx card, but for other cards
|
||||
that have either worse texture management or slower texture swapping speeds,
|
||||
there are some additional settings that can drastically lower the amount of
|
||||
textures to be managed.
|
||||
|
||||
glquake +gl_picmip 1
|
||||
This causes all textures to have one half the dimensions they otherwise would.
|
||||
This makes them blurry, but very small. You can set this to 2 to make the
|
||||
textures one quarter the resolution on each axis for REALLY blurry textures.
|
||||
|
||||
glquake +gl_playermip 1
|
||||
This is similar to picmip, but is only used for other players in deathmatch.
|
||||
Each player in a deathmatch requires an individual skin texture, so this can
|
||||
be a serious problem for texture management. It wouldn't be unreasonable to
|
||||
set this to 2 or even 3 if you are playing competatively (and don't care if
|
||||
the other guys have smudged skins). If you change this during the game, it
|
||||
will take effect as soon as a player changes their skin colors.
|
||||
|
||||
run time options
|
||||
----------------
|
||||
At the console, you can set these values to effect drawing.
|
||||
|
||||
gl_texturemode GL_NEAREST
|
||||
Sets texture mapping to point sampled, which may be faster on some GL systems
|
||||
(not on 3dfx).
|
||||
|
||||
gl_texturemode GL_LINEAR_MIPMAP
|
||||
This is the default texture mode.
|
||||
|
||||
gl_texturemode GL_LINEAR_MIPMAP_LINEAR
|
||||
This is the highest quality texture mapping (trilinear), but only very high
|
||||
end hardware (intergraph intense 3D / realizm) supports it. Not that big of
|
||||
a deal, actually.
|
||||
|
||||
gl_finish 0
|
||||
This causes the game to not issue a glFinish() call each frame, which may make
|
||||
some hardware run faster. If this is cleared, the 3dfx will back up a number
|
||||
of frames and not be very playable.
|
||||
|
||||
gl_flashblend 0
|
||||
By default, glquake just draws a shaded ball around objects that are emiting
|
||||
light. Clearing this variable will cause it to properly relight the world
|
||||
like normal quake, but it can be a significant speed hit on some systems.
|
||||
|
||||
gl_ztrick 0
|
||||
Glquake uses a buffering method that avoids clearing the Z buffer, but some
|
||||
hardware platforms don't like it. If the status bar and console are flashing
|
||||
every other frame, clear this variable.
|
||||
|
||||
gl_keeptjunctions 0
|
||||
If you clear this, glquake will remove colinear vertexes when it reloads the
|
||||
level. This can give a few percent speedup, but it can leave a couple stray
|
||||
blinking pixels on the screen.
|
||||
|
||||
novelty features
|
||||
----------------
|
||||
These are some rendering tricks that were easy to do in glquake. They aren't
|
||||
very robust, but they are pretty cool to look at.
|
||||
|
||||
r_shadows 1
|
||||
This causes every object to cast a shadow.
|
||||
|
||||
r_wateralpha 0.7
|
||||
This sets the opacity of water textures, so you can see through it in properly
|
||||
processed maps. 0.3 is very faint, almost like fog. 1 is completely solid
|
||||
(the default). Unfortunately, the standard quake maps don't contain any
|
||||
visibility information for seeing past water surfaces, so you can't just play
|
||||
quake with this turned on. If you just want to see what it looks like, you
|
||||
can set "r_novis 1", but that will make things go very slow. When I get a
|
||||
chance, I will probably release some maps that have been processed properly
|
||||
for this.
|
||||
|
||||
r_mirroralpha 0.3
|
||||
This changes one particular texture (the stained glass texture in the EASY
|
||||
start hall) into a mirror. The value is the opacity of the mirror surface.
|
||||
|
||||
127
WinQuake/docs/readme.squake
Normal file
127
WinQuake/docs/readme.squake
Normal file
@@ -0,0 +1,127 @@
|
||||
|
||||
README for Linux SVGALib Quake
|
||||
------------------------------
|
||||
|
||||
Requirements:
|
||||
|
||||
- SVGALib 1.20 or later (/lib/libvga.so.1.2.10)
|
||||
- libc 5.2.18 or later (5.0.9 will not work, /lib/libc.so.5.2.18)
|
||||
- CD-ROM for CDAudio
|
||||
- Soundcard capable of mmap'd buffers. USSLite 3.5.4 was used to build squake
|
||||
with. Works fine on SoundBlaster 16 and Gravis Ultrasound MAX.
|
||||
- SVGALib supported mouse (usually if it works with X, it'll work with
|
||||
squake).
|
||||
- Kernel 2.0.24 or later
|
||||
- untested with 2.1 kernels, your mileage may vary
|
||||
|
||||
Here's the release you've been waiting for. Linux squake supports
|
||||
320x200x256, the various modeX modes (320x400, 360x400, etc) as well as high
|
||||
res modes if your card is supported by SVGALib. Use the Quake console command
|
||||
vid_describemodes to list supported modes and the command vid_mode <number> to
|
||||
change modes.
|
||||
|
||||
Full sound support is included. The default sound rate is 16-bit stereo,
|
||||
11KHz. You can change this in the options section below.
|
||||
|
||||
Mouse works great, but SVGALib may not detect a 3-button mouse properly (it
|
||||
will only use two buttons). Check your /etc/libvga.config (or
|
||||
/etc/vga/libvga.config for SlackWare users).
|
||||
|
||||
**Version 1.1 fixes some crash bugs with the mission packs.
|
||||
|
||||
New Command Line Options for Linux SVGAlib Quake
|
||||
------------------------------------------------
|
||||
|
||||
-mem <mb>
|
||||
Specify memory in megabytes to allocate (default is 8MB, which should be fine
|
||||
for most needs).
|
||||
|
||||
-nostdout
|
||||
Don't do any output to stdout
|
||||
|
||||
-mdev <device>
|
||||
Mouse device, default is /dev/mouse
|
||||
|
||||
-mrate <speed>
|
||||
Mouse baud rate, default is 1200
|
||||
|
||||
-cddev <device>
|
||||
CD device, default is /dev/cdrom
|
||||
|
||||
-mode <modenum>
|
||||
Use indicated video mode
|
||||
|
||||
-nokdb
|
||||
Don't initialize keyboard
|
||||
|
||||
-sndbits <8 or 16>
|
||||
Set sound bit sample size. Default is 16 if supported.
|
||||
|
||||
-sndspeed <speed>
|
||||
Set sound speed. Usual values are 8000, 11025, 22051 and 44100.
|
||||
Default is 11025.
|
||||
|
||||
-sndmono
|
||||
Set mono sound
|
||||
|
||||
-sndstereo
|
||||
Set stereo sound (default if supported)
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
Boot DOS (I know, but you need it to run the Quake install program) and
|
||||
install Quake from your Quake CD to a DOS parition.
|
||||
|
||||
Boot Linux and make a directory for Quake. Copy everything from the DOS Quake
|
||||
directory into it. i.e.:
|
||||
(cd /dos/quake; tar cf - .) | (cd ~/quake; tar xf -)
|
||||
|
||||
Place squake into your Quake directory. You must make it setuid root (since
|
||||
Quake access stuff like direct video writes, the raw keyboard mode, CD, etc).
|
||||
Quake will setuid back to the normal user as soon as it opens these files.
|
||||
Make Quake suid root as follows:
|
||||
chown root squake
|
||||
chmod 4755 squake
|
||||
|
||||
Run squake. I don't recommend running it as root, since all the saved
|
||||
config.cfg files will be then owned as root. Use your normal account, unless
|
||||
you do everything as root, then your mileage will vary.
|
||||
|
||||
squake may segfault if it tries to initialize your sound card and their isn't
|
||||
one. Same with the CDROM. If it dies, try it with -nosound and/or
|
||||
-nocdaudio. If you have a sound card it died on and you know it is
|
||||
supported by USSLite (the driver that comes with the Linux kernel), let me
|
||||
know and I'll take a look at it.
|
||||
|
||||
It should work with SCSI CDROMs, but is untested.
|
||||
|
||||
Full TCP/IP network support is in, including listen and dedicated server
|
||||
modes. squake makes a nice dedicated server as you don't need the X11
|
||||
libraries kicking around.
|
||||
|
||||
All of the options described in TECHINFO.TXT and MANUAL.TXT from the Quake
|
||||
distribution will work, 'cept for stuff with vid modes and stuff.
|
||||
|
||||
End Notes
|
||||
---------
|
||||
|
||||
Linux SVGALib Quake is *NOT* an officially supported product. Mail about it
|
||||
will be deleted. Do not email id about this product. If you are having
|
||||
technical difficultly, you can email me, but make sure you have the correct
|
||||
kernel, libc, svgalib and other software versions before you email me.
|
||||
|
||||
Dave 'Zoid' Kirsch
|
||||
zoid@threewave.com
|
||||
Official Quake Unix Port Administrator
|
||||
|
||||
Acks
|
||||
----
|
||||
|
||||
Greg Alexander <galexand@sietch.bloomington.in.us> for initial work in SVGALib
|
||||
support.
|
||||
Dave Taylor <ddt@crack.com> for basic Linux support.
|
||||
id Software for Quake and making me port it. :)
|
||||
|
||||
Lots of people on #linux, #quake for testing.
|
||||
|
||||
257
WinQuake/dos_v2.c
Normal file
257
WinQuake/dos_v2.c
Normal file
@@ -0,0 +1,257 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
#include <sys/segments.h>
|
||||
#include <go32.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/nearptr.h>
|
||||
#include <dos.h>
|
||||
#include <string.h>
|
||||
#include <dpmi.h>
|
||||
// #include <osfcn.h>
|
||||
#include <bios.h>
|
||||
|
||||
#include "dosisms.h"
|
||||
|
||||
_go32_dpmi_registers hmm;
|
||||
|
||||
// globals
|
||||
regs_t regs;
|
||||
void (*dos_error_func)(char *msg, ...);
|
||||
|
||||
static unsigned conventional_memory = -1;
|
||||
|
||||
__dpmi_regs callback_regs;
|
||||
|
||||
void map_in_conventional_memory(void)
|
||||
{
|
||||
if (conventional_memory == -1)
|
||||
{
|
||||
if (__djgpp_nearptr_enable())
|
||||
{
|
||||
conventional_memory = __djgpp_conventional_base;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int ptr2real(void *ptr)
|
||||
{
|
||||
map_in_conventional_memory();
|
||||
return (int)ptr - conventional_memory;
|
||||
}
|
||||
|
||||
void *real2ptr(unsigned int real)
|
||||
{
|
||||
map_in_conventional_memory();
|
||||
return (void *) (real + conventional_memory);
|
||||
}
|
||||
|
||||
void *far2ptr(unsigned int farptr)
|
||||
{
|
||||
return real2ptr(((farptr & ~0xffff) >>12) + (farptr&0xffff));
|
||||
}
|
||||
|
||||
unsigned int ptr2far(void *ptr)
|
||||
{
|
||||
return ((ptr2real(ptr)&~0xf) << 12) + (ptr2real(ptr) & 0xf);
|
||||
}
|
||||
|
||||
int dos_inportb(int port)
|
||||
{
|
||||
return inportb(port);
|
||||
}
|
||||
|
||||
int dos_inportw(int port)
|
||||
{
|
||||
return inportw(port);
|
||||
}
|
||||
|
||||
void dos_outportb(int port, int val)
|
||||
{
|
||||
outportb(port, val);
|
||||
}
|
||||
|
||||
void dos_outportw(int port, int val)
|
||||
{
|
||||
outportw(port, val);
|
||||
}
|
||||
|
||||
void dos_irqenable(void)
|
||||
{
|
||||
enable();
|
||||
}
|
||||
|
||||
void dos_irqdisable(void)
|
||||
{
|
||||
disable();
|
||||
}
|
||||
|
||||
//
|
||||
// Returns 0 on success
|
||||
//
|
||||
|
||||
int dos_int86(int vec)
|
||||
{
|
||||
int rc;
|
||||
regs.x.ss = regs.x.sp = 0;
|
||||
rc = _go32_dpmi_simulate_int(vec, (_go32_dpmi_registers *) ®s);
|
||||
return rc || (regs.x.flags & 1);
|
||||
}
|
||||
|
||||
int dos_int386(int vec, regs_t *inregs, regs_t *outregs)
|
||||
{
|
||||
int rc;
|
||||
memcpy(outregs, inregs, sizeof(regs_t));
|
||||
outregs->x.ss = outregs->x.sp = 0;
|
||||
rc = _go32_dpmi_simulate_int(vec, (_go32_dpmi_registers *) outregs);
|
||||
return rc || (outregs->x.flags & 1);
|
||||
}
|
||||
|
||||
//
|
||||
// Because of a quirk in dj's alloc-dos-memory wrapper, you need to keep
|
||||
// the seginfo structure around for when you free the mem.
|
||||
//
|
||||
|
||||
static _go32_dpmi_seginfo seginfo[10];
|
||||
|
||||
void *dos_getmemory(int size)
|
||||
{
|
||||
|
||||
int rc;
|
||||
_go32_dpmi_seginfo info;
|
||||
static int firsttime=1;
|
||||
int i;
|
||||
|
||||
if (firsttime)
|
||||
{
|
||||
memset(seginfo, 0, sizeof(seginfo));
|
||||
firsttime = 0;
|
||||
}
|
||||
|
||||
info.size = (size+15) / 16;
|
||||
rc = _go32_dpmi_allocate_dos_memory(&info);
|
||||
if (rc)
|
||||
return 0;
|
||||
|
||||
for (i=0;i<10;i++)
|
||||
if (!seginfo[i].rm_segment) break;
|
||||
seginfo[i] = info;
|
||||
return real2ptr((int) info.rm_segment << 4);
|
||||
|
||||
}
|
||||
|
||||
void dos_freememory(void *ptr)
|
||||
{
|
||||
|
||||
int i;
|
||||
int segment;
|
||||
|
||||
segment = ptr2real(ptr) >> 4;
|
||||
for (i=0 ; i<10 ; i++)
|
||||
if (seginfo[i].rm_segment == segment)
|
||||
{
|
||||
_go32_dpmi_free_dos_memory(&seginfo[i]);
|
||||
seginfo[i].rm_segment = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static struct handlerhistory_s
|
||||
{
|
||||
int intr;
|
||||
_go32_dpmi_seginfo pm_oldvec;
|
||||
} handlerhistory[4];
|
||||
|
||||
static int handlercount=0;
|
||||
|
||||
void dos_registerintr(int intr, void (*handler)(void))
|
||||
{
|
||||
_go32_dpmi_seginfo info;
|
||||
struct handlerhistory_s *oldstuff;
|
||||
|
||||
oldstuff = &handlerhistory[handlercount];
|
||||
|
||||
// remember old handler
|
||||
_go32_dpmi_get_protected_mode_interrupt_vector(intr, &oldstuff->pm_oldvec);
|
||||
oldstuff->intr = intr;
|
||||
|
||||
info.pm_offset = (int) handler;
|
||||
_go32_dpmi_allocate_iret_wrapper(&info);
|
||||
|
||||
// set new protected mode handler
|
||||
_go32_dpmi_set_protected_mode_interrupt_vector(intr, &info);
|
||||
|
||||
handlercount++;
|
||||
|
||||
}
|
||||
|
||||
void dos_restoreintr(int intr)
|
||||
{
|
||||
|
||||
int i;
|
||||
struct handlerhistory_s *oldstuff;
|
||||
|
||||
// find and reinstall previous interrupt
|
||||
for (i=0 ; i<handlercount ; i++)
|
||||
{
|
||||
oldstuff = &handlerhistory[i];
|
||||
if (oldstuff->intr == intr)
|
||||
{
|
||||
_go32_dpmi_set_protected_mode_interrupt_vector(intr,
|
||||
&oldstuff->pm_oldvec);
|
||||
oldstuff->intr = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void dos_usleep(int usecs)
|
||||
{
|
||||
usleep(usecs);
|
||||
}
|
||||
|
||||
int dos_getheapsize(void)
|
||||
{
|
||||
return _go32_dpmi_remaining_physical_memory();
|
||||
}
|
||||
|
||||
int dos_lockmem(void *addr, int size)
|
||||
{
|
||||
__dpmi_meminfo info;
|
||||
info.address = (long) addr + __djgpp_base_address;
|
||||
info.size = size;
|
||||
if (__dpmi_lock_linear_region(&info))
|
||||
return __dpmi_error;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
int dos_unlockmem(void *addr, int size)
|
||||
{
|
||||
__dpmi_meminfo info;
|
||||
info.address = (long) addr + __djgpp_base_address;
|
||||
info.size = size;
|
||||
if (__dpmi_unlock_linear_region(&info))
|
||||
return __dpmi_error;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
77
WinQuake/dosasm.s
Normal file
77
WinQuake/dosasm.s
Normal file
@@ -0,0 +1,77 @@
|
||||
#include "asm_i386.h"
|
||||
|
||||
.data
|
||||
fpenv: .long 0, 0, 0, 0, 0, 0, 0, 0
|
||||
|
||||
.text
|
||||
.globl C(StartMSRInterval)
|
||||
C(StartMSRInterval):
|
||||
movl $0x11,%ecx // read the CESR
|
||||
.byte 0x0F
|
||||
.byte 0x32 // RDMSR
|
||||
|
||||
andl $0xFE3FFE3F,%eax // stop both counters
|
||||
.byte 0x0F
|
||||
.byte 0x30 // WRMSR
|
||||
|
||||
movl 4(%esp),%eax // point counter 0 to desired event, with counters
|
||||
andl $0x3F,%eax // still stopped
|
||||
movl $0x11,%ecx
|
||||
.byte 0x0F
|
||||
.byte 0x30 // WRMSR
|
||||
|
||||
movl $0x12,%ecx // set counter 0 to the value 0
|
||||
subl %eax,%eax
|
||||
subl %edx,%edx
|
||||
.byte 0x0F
|
||||
.byte 0x30 // WRMSR
|
||||
|
||||
movl 4(%esp),%eax // restart counter 0 with selected event
|
||||
andl $0x3F,%eax
|
||||
subl %edx,%edx
|
||||
orl $0xC0,%eax
|
||||
movl $0x11,%ecx // control and event select
|
||||
.byte 0x0F
|
||||
.byte 0x30 // WRMSR
|
||||
|
||||
ret
|
||||
|
||||
.globl C(EndMSRInterval)
|
||||
C(EndMSRInterval):
|
||||
movl $0x12,%ecx // counter 0
|
||||
.byte 0x0F
|
||||
.byte 0x32 // RDMSR
|
||||
|
||||
ret // lower 32 bits of count in %eax
|
||||
|
||||
#if 0
|
||||
.data
|
||||
Lxxx: .long 0
|
||||
|
||||
.text
|
||||
|
||||
.globl C(setstackcheck)
|
||||
C(setstackcheck):
|
||||
|
||||
movl %esp,%eax
|
||||
subl $0x38000,%eax
|
||||
movl $0x5A5A5A5A,(%eax)
|
||||
movl %eax,Lxxx
|
||||
|
||||
ret
|
||||
|
||||
|
||||
.globl C(dostackcheck)
|
||||
C(dostackcheck):
|
||||
|
||||
movl Lxxx,%edx
|
||||
movl $0,%eax
|
||||
|
||||
cmpl $0x5A5A5A5A,(%edx)
|
||||
jz qqq
|
||||
incl %eax
|
||||
qqq:
|
||||
|
||||
ret
|
||||
#endif
|
||||
|
||||
100
WinQuake/dosisms.h
Normal file
100
WinQuake/dosisms.h
Normal file
@@ -0,0 +1,100 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
|
||||
//
|
||||
// dosisms.h: I'd call it dos.h, but the name's taken
|
||||
//
|
||||
|
||||
#ifndef _DOSISMS_H_
|
||||
#define _DOSISMS_H_
|
||||
|
||||
int dos_lockmem(void *addr, int size);
|
||||
int dos_unlockmem(void *addr, int size);
|
||||
|
||||
typedef union {
|
||||
struct {
|
||||
unsigned long edi;
|
||||
unsigned long esi;
|
||||
unsigned long ebp;
|
||||
unsigned long res;
|
||||
unsigned long ebx;
|
||||
unsigned long edx;
|
||||
unsigned long ecx;
|
||||
unsigned long eax;
|
||||
} d;
|
||||
struct {
|
||||
unsigned short di, di_hi;
|
||||
unsigned short si, si_hi;
|
||||
unsigned short bp, bp_hi;
|
||||
unsigned short res, res_hi;
|
||||
unsigned short bx, bx_hi;
|
||||
unsigned short dx, dx_hi;
|
||||
unsigned short cx, cx_hi;
|
||||
unsigned short ax, ax_hi;
|
||||
unsigned short flags;
|
||||
unsigned short es;
|
||||
unsigned short ds;
|
||||
unsigned short fs;
|
||||
unsigned short gs;
|
||||
unsigned short ip;
|
||||
unsigned short cs;
|
||||
unsigned short sp;
|
||||
unsigned short ss;
|
||||
} x;
|
||||
struct {
|
||||
unsigned char edi[4];
|
||||
unsigned char esi[4];
|
||||
unsigned char ebp[4];
|
||||
unsigned char res[4];
|
||||
unsigned char bl, bh, ebx_b2, ebx_b3;
|
||||
unsigned char dl, dh, edx_b2, edx_b3;
|
||||
unsigned char cl, ch, ecx_b2, ecx_b3;
|
||||
unsigned char al, ah, eax_b2, eax_b3;
|
||||
} h;
|
||||
} regs_t;
|
||||
|
||||
unsigned int ptr2real(void *ptr);
|
||||
void *real2ptr(unsigned int real);
|
||||
void *far2ptr(unsigned int farptr);
|
||||
unsigned int ptr2far(void *ptr);
|
||||
|
||||
int dos_inportb(int port);
|
||||
int dos_inportw(int port);
|
||||
void dos_outportb(int port, int val);
|
||||
void dos_outportw(int port, int val);
|
||||
|
||||
void dos_irqenable(void);
|
||||
void dos_irqdisable(void);
|
||||
void dos_registerintr(int intr, void (*handler)(void));
|
||||
void dos_restoreintr(int intr);
|
||||
|
||||
int dos_int86(int vec);
|
||||
|
||||
void *dos_getmemory(int size);
|
||||
void dos_freememory(void *ptr);
|
||||
|
||||
void dos_usleep(int usecs);
|
||||
|
||||
int dos_getheapsize(void);
|
||||
|
||||
extern regs_t regs;
|
||||
|
||||
#endif // _DOSISMS_H_
|
||||
|
||||
902
WinQuake/draw.c
Normal file
902
WinQuake/draw.c
Normal file
@@ -0,0 +1,902 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
|
||||
// draw.c -- this is the only file outside the refresh that touches the
|
||||
// vid buffer
|
||||
|
||||
#include "quakedef.h"
|
||||
|
||||
typedef struct {
|
||||
vrect_t rect;
|
||||
int width;
|
||||
int height;
|
||||
byte *ptexbytes;
|
||||
int rowbytes;
|
||||
} rectdesc_t;
|
||||
|
||||
static rectdesc_t r_rectdesc;
|
||||
|
||||
byte *draw_chars; // 8*8 graphic characters
|
||||
qpic_t *draw_disc;
|
||||
qpic_t *draw_backtile;
|
||||
|
||||
//=============================================================================
|
||||
/* Support Routines */
|
||||
|
||||
typedef struct cachepic_s
|
||||
{
|
||||
char name[MAX_QPATH];
|
||||
cache_user_t cache;
|
||||
} cachepic_t;
|
||||
|
||||
#define MAX_CACHED_PICS 128
|
||||
cachepic_t menu_cachepics[MAX_CACHED_PICS];
|
||||
int menu_numcachepics;
|
||||
|
||||
|
||||
qpic_t *Draw_PicFromWad (char *name)
|
||||
{
|
||||
return W_GetLumpName (name);
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
Draw_CachePic
|
||||
================
|
||||
*/
|
||||
qpic_t *Draw_CachePic (char *path)
|
||||
{
|
||||
cachepic_t *pic;
|
||||
int i;
|
||||
qpic_t *dat;
|
||||
|
||||
for (pic=menu_cachepics, i=0 ; i<menu_numcachepics ; pic++, i++)
|
||||
if (!strcmp (path, pic->name))
|
||||
break;
|
||||
|
||||
if (i == menu_numcachepics)
|
||||
{
|
||||
if (menu_numcachepics == MAX_CACHED_PICS)
|
||||
Sys_Error ("menu_numcachepics == MAX_CACHED_PICS");
|
||||
menu_numcachepics++;
|
||||
strcpy (pic->name, path);
|
||||
}
|
||||
|
||||
dat = Cache_Check (&pic->cache);
|
||||
|
||||
if (dat)
|
||||
return dat;
|
||||
|
||||
//
|
||||
// load the pic from disk
|
||||
//
|
||||
COM_LoadCacheFile (path, &pic->cache);
|
||||
|
||||
dat = (qpic_t *)pic->cache.data;
|
||||
if (!dat)
|
||||
{
|
||||
Sys_Error ("Draw_CachePic: failed to load %s", path);
|
||||
}
|
||||
|
||||
SwapPic (dat);
|
||||
|
||||
return dat;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
===============
|
||||
Draw_Init
|
||||
===============
|
||||
*/
|
||||
void Draw_Init (void)
|
||||
{
|
||||
int i;
|
||||
|
||||
draw_chars = W_GetLumpName ("conchars");
|
||||
draw_disc = W_GetLumpName ("disc");
|
||||
draw_backtile = W_GetLumpName ("backtile");
|
||||
|
||||
r_rectdesc.width = draw_backtile->width;
|
||||
r_rectdesc.height = draw_backtile->height;
|
||||
r_rectdesc.ptexbytes = draw_backtile->data;
|
||||
r_rectdesc.rowbytes = draw_backtile->width;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
Draw_Character
|
||||
|
||||
Draws one 8*8 graphics character with 0 being transparent.
|
||||
It can be clipped to the top of the screen to allow the console to be
|
||||
smoothly scrolled off.
|
||||
================
|
||||
*/
|
||||
void Draw_Character (int x, int y, int num)
|
||||
{
|
||||
byte *dest;
|
||||
byte *source;
|
||||
unsigned short *pusdest;
|
||||
int drawline;
|
||||
int row, col;
|
||||
|
||||
num &= 255;
|
||||
|
||||
if (y <= -8)
|
||||
return; // totally off screen
|
||||
|
||||
#ifdef PARANOID
|
||||
if (y > vid.height - 8 || x < 0 || x > vid.width - 8)
|
||||
Sys_Error ("Con_DrawCharacter: (%i, %i)", x, y);
|
||||
if (num < 0 || num > 255)
|
||||
Sys_Error ("Con_DrawCharacter: char %i", num);
|
||||
#endif
|
||||
|
||||
row = num>>4;
|
||||
col = num&15;
|
||||
source = draw_chars + (row<<10) + (col<<3);
|
||||
|
||||
if (y < 0)
|
||||
{ // clipped
|
||||
drawline = 8 + y;
|
||||
source -= 128*y;
|
||||
y = 0;
|
||||
}
|
||||
else
|
||||
drawline = 8;
|
||||
|
||||
|
||||
if (r_pixbytes == 1)
|
||||
{
|
||||
dest = vid.conbuffer + y*vid.conrowbytes + x;
|
||||
|
||||
while (drawline--)
|
||||
{
|
||||
if (source[0])
|
||||
dest[0] = source[0];
|
||||
if (source[1])
|
||||
dest[1] = source[1];
|
||||
if (source[2])
|
||||
dest[2] = source[2];
|
||||
if (source[3])
|
||||
dest[3] = source[3];
|
||||
if (source[4])
|
||||
dest[4] = source[4];
|
||||
if (source[5])
|
||||
dest[5] = source[5];
|
||||
if (source[6])
|
||||
dest[6] = source[6];
|
||||
if (source[7])
|
||||
dest[7] = source[7];
|
||||
source += 128;
|
||||
dest += vid.conrowbytes;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// FIXME: pre-expand to native format?
|
||||
pusdest = (unsigned short *)
|
||||
((byte *)vid.conbuffer + y*vid.conrowbytes + (x<<1));
|
||||
|
||||
while (drawline--)
|
||||
{
|
||||
if (source[0])
|
||||
pusdest[0] = d_8to16table[source[0]];
|
||||
if (source[1])
|
||||
pusdest[1] = d_8to16table[source[1]];
|
||||
if (source[2])
|
||||
pusdest[2] = d_8to16table[source[2]];
|
||||
if (source[3])
|
||||
pusdest[3] = d_8to16table[source[3]];
|
||||
if (source[4])
|
||||
pusdest[4] = d_8to16table[source[4]];
|
||||
if (source[5])
|
||||
pusdest[5] = d_8to16table[source[5]];
|
||||
if (source[6])
|
||||
pusdest[6] = d_8to16table[source[6]];
|
||||
if (source[7])
|
||||
pusdest[7] = d_8to16table[source[7]];
|
||||
|
||||
source += 128;
|
||||
pusdest += (vid.conrowbytes >> 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
Draw_String
|
||||
================
|
||||
*/
|
||||
void Draw_String (int x, int y, char *str)
|
||||
{
|
||||
while (*str)
|
||||
{
|
||||
Draw_Character (x, y, *str);
|
||||
str++;
|
||||
x += 8;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
Draw_DebugChar
|
||||
|
||||
Draws a single character directly to the upper right corner of the screen.
|
||||
This is for debugging lockups by drawing different chars in different parts
|
||||
of the code.
|
||||
================
|
||||
*/
|
||||
void Draw_DebugChar (char num)
|
||||
{
|
||||
byte *dest;
|
||||
byte *source;
|
||||
int drawline;
|
||||
extern byte *draw_chars;
|
||||
int row, col;
|
||||
|
||||
if (!vid.direct)
|
||||
return; // don't have direct FB access, so no debugchars...
|
||||
|
||||
drawline = 8;
|
||||
|
||||
row = num>>4;
|
||||
col = num&15;
|
||||
source = draw_chars + (row<<10) + (col<<3);
|
||||
|
||||
dest = vid.direct + 312;
|
||||
|
||||
while (drawline--)
|
||||
{
|
||||
dest[0] = source[0];
|
||||
dest[1] = source[1];
|
||||
dest[2] = source[2];
|
||||
dest[3] = source[3];
|
||||
dest[4] = source[4];
|
||||
dest[5] = source[5];
|
||||
dest[6] = source[6];
|
||||
dest[7] = source[7];
|
||||
source += 128;
|
||||
dest += 320;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
=============
|
||||
Draw_Pic
|
||||
=============
|
||||
*/
|
||||
void Draw_Pic (int x, int y, qpic_t *pic)
|
||||
{
|
||||
byte *dest, *source;
|
||||
unsigned short *pusdest;
|
||||
int v, u;
|
||||
|
||||
if ((x < 0) ||
|
||||
(x + pic->width > vid.width) ||
|
||||
(y < 0) ||
|
||||
(y + pic->height > vid.height))
|
||||
{
|
||||
Sys_Error ("Draw_Pic: bad coordinates");
|
||||
}
|
||||
|
||||
source = pic->data;
|
||||
|
||||
if (r_pixbytes == 1)
|
||||
{
|
||||
dest = vid.buffer + y * vid.rowbytes + x;
|
||||
|
||||
for (v=0 ; v<pic->height ; v++)
|
||||
{
|
||||
Q_memcpy (dest, source, pic->width);
|
||||
dest += vid.rowbytes;
|
||||
source += pic->width;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// FIXME: pretranslate at load time?
|
||||
pusdest = (unsigned short *)vid.buffer + y * (vid.rowbytes >> 1) + x;
|
||||
|
||||
for (v=0 ; v<pic->height ; v++)
|
||||
{
|
||||
for (u=0 ; u<pic->width ; u++)
|
||||
{
|
||||
pusdest[u] = d_8to16table[source[u]];
|
||||
}
|
||||
|
||||
pusdest += vid.rowbytes >> 1;
|
||||
source += pic->width;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
=============
|
||||
Draw_TransPic
|
||||
=============
|
||||
*/
|
||||
void Draw_TransPic (int x, int y, qpic_t *pic)
|
||||
{
|
||||
byte *dest, *source, tbyte;
|
||||
unsigned short *pusdest;
|
||||
int v, u;
|
||||
|
||||
if (x < 0 || (unsigned)(x + pic->width) > vid.width || y < 0 ||
|
||||
(unsigned)(y + pic->height) > vid.height)
|
||||
{
|
||||
Sys_Error ("Draw_TransPic: bad coordinates");
|
||||
}
|
||||
|
||||
source = pic->data;
|
||||
|
||||
if (r_pixbytes == 1)
|
||||
{
|
||||
dest = vid.buffer + y * vid.rowbytes + x;
|
||||
|
||||
if (pic->width & 7)
|
||||
{ // general
|
||||
for (v=0 ; v<pic->height ; v++)
|
||||
{
|
||||
for (u=0 ; u<pic->width ; u++)
|
||||
if ( (tbyte=source[u]) != TRANSPARENT_COLOR)
|
||||
dest[u] = tbyte;
|
||||
|
||||
dest += vid.rowbytes;
|
||||
source += pic->width;
|
||||
}
|
||||
}
|
||||
else
|
||||
{ // unwound
|
||||
for (v=0 ; v<pic->height ; v++)
|
||||
{
|
||||
for (u=0 ; u<pic->width ; u+=8)
|
||||
{
|
||||
if ( (tbyte=source[u]) != TRANSPARENT_COLOR)
|
||||
dest[u] = tbyte;
|
||||
if ( (tbyte=source[u+1]) != TRANSPARENT_COLOR)
|
||||
dest[u+1] = tbyte;
|
||||
if ( (tbyte=source[u+2]) != TRANSPARENT_COLOR)
|
||||
dest[u+2] = tbyte;
|
||||
if ( (tbyte=source[u+3]) != TRANSPARENT_COLOR)
|
||||
dest[u+3] = tbyte;
|
||||
if ( (tbyte=source[u+4]) != TRANSPARENT_COLOR)
|
||||
dest[u+4] = tbyte;
|
||||
if ( (tbyte=source[u+5]) != TRANSPARENT_COLOR)
|
||||
dest[u+5] = tbyte;
|
||||
if ( (tbyte=source[u+6]) != TRANSPARENT_COLOR)
|
||||
dest[u+6] = tbyte;
|
||||
if ( (tbyte=source[u+7]) != TRANSPARENT_COLOR)
|
||||
dest[u+7] = tbyte;
|
||||
}
|
||||
dest += vid.rowbytes;
|
||||
source += pic->width;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// FIXME: pretranslate at load time?
|
||||
pusdest = (unsigned short *)vid.buffer + y * (vid.rowbytes >> 1) + x;
|
||||
|
||||
for (v=0 ; v<pic->height ; v++)
|
||||
{
|
||||
for (u=0 ; u<pic->width ; u++)
|
||||
{
|
||||
tbyte = source[u];
|
||||
|
||||
if (tbyte != TRANSPARENT_COLOR)
|
||||
{
|
||||
pusdest[u] = d_8to16table[tbyte];
|
||||
}
|
||||
}
|
||||
|
||||
pusdest += vid.rowbytes >> 1;
|
||||
source += pic->width;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
=============
|
||||
Draw_TransPicTranslate
|
||||
=============
|
||||
*/
|
||||
void Draw_TransPicTranslate (int x, int y, qpic_t *pic, byte *translation)
|
||||
{
|
||||
byte *dest, *source, tbyte;
|
||||
unsigned short *pusdest;
|
||||
int v, u;
|
||||
|
||||
if (x < 0 || (unsigned)(x + pic->width) > vid.width || y < 0 ||
|
||||
(unsigned)(y + pic->height) > vid.height)
|
||||
{
|
||||
Sys_Error ("Draw_TransPic: bad coordinates");
|
||||
}
|
||||
|
||||
source = pic->data;
|
||||
|
||||
if (r_pixbytes == 1)
|
||||
{
|
||||
dest = vid.buffer + y * vid.rowbytes + x;
|
||||
|
||||
if (pic->width & 7)
|
||||
{ // general
|
||||
for (v=0 ; v<pic->height ; v++)
|
||||
{
|
||||
for (u=0 ; u<pic->width ; u++)
|
||||
if ( (tbyte=source[u]) != TRANSPARENT_COLOR)
|
||||
dest[u] = translation[tbyte];
|
||||
|
||||
dest += vid.rowbytes;
|
||||
source += pic->width;
|
||||
}
|
||||
}
|
||||
else
|
||||
{ // unwound
|
||||
for (v=0 ; v<pic->height ; v++)
|
||||
{
|
||||
for (u=0 ; u<pic->width ; u+=8)
|
||||
{
|
||||
if ( (tbyte=source[u]) != TRANSPARENT_COLOR)
|
||||
dest[u] = translation[tbyte];
|
||||
if ( (tbyte=source[u+1]) != TRANSPARENT_COLOR)
|
||||
dest[u+1] = translation[tbyte];
|
||||
if ( (tbyte=source[u+2]) != TRANSPARENT_COLOR)
|
||||
dest[u+2] = translation[tbyte];
|
||||
if ( (tbyte=source[u+3]) != TRANSPARENT_COLOR)
|
||||
dest[u+3] = translation[tbyte];
|
||||
if ( (tbyte=source[u+4]) != TRANSPARENT_COLOR)
|
||||
dest[u+4] = translation[tbyte];
|
||||
if ( (tbyte=source[u+5]) != TRANSPARENT_COLOR)
|
||||
dest[u+5] = translation[tbyte];
|
||||
if ( (tbyte=source[u+6]) != TRANSPARENT_COLOR)
|
||||
dest[u+6] = translation[tbyte];
|
||||
if ( (tbyte=source[u+7]) != TRANSPARENT_COLOR)
|
||||
dest[u+7] = translation[tbyte];
|
||||
}
|
||||
dest += vid.rowbytes;
|
||||
source += pic->width;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// FIXME: pretranslate at load time?
|
||||
pusdest = (unsigned short *)vid.buffer + y * (vid.rowbytes >> 1) + x;
|
||||
|
||||
for (v=0 ; v<pic->height ; v++)
|
||||
{
|
||||
for (u=0 ; u<pic->width ; u++)
|
||||
{
|
||||
tbyte = source[u];
|
||||
|
||||
if (tbyte != TRANSPARENT_COLOR)
|
||||
{
|
||||
pusdest[u] = d_8to16table[tbyte];
|
||||
}
|
||||
}
|
||||
|
||||
pusdest += vid.rowbytes >> 1;
|
||||
source += pic->width;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Draw_CharToConback (int num, byte *dest)
|
||||
{
|
||||
int row, col;
|
||||
byte *source;
|
||||
int drawline;
|
||||
int x;
|
||||
|
||||
row = num>>4;
|
||||
col = num&15;
|
||||
source = draw_chars + (row<<10) + (col<<3);
|
||||
|
||||
drawline = 8;
|
||||
|
||||
while (drawline--)
|
||||
{
|
||||
for (x=0 ; x<8 ; x++)
|
||||
if (source[x])
|
||||
dest[x] = 0x60 + source[x];
|
||||
source += 128;
|
||||
dest += 320;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
Draw_ConsoleBackground
|
||||
|
||||
================
|
||||
*/
|
||||
void Draw_ConsoleBackground (int lines)
|
||||
{
|
||||
int x, y, v;
|
||||
byte *src, *dest;
|
||||
unsigned short *pusdest;
|
||||
int f, fstep;
|
||||
qpic_t *conback;
|
||||
char ver[100];
|
||||
|
||||
conback = Draw_CachePic ("gfx/conback.lmp");
|
||||
|
||||
// hack the version number directly into the pic
|
||||
#ifdef _WIN32
|
||||
sprintf (ver, "(WinQuake) %4.2f", (float)VERSION);
|
||||
dest = conback->data + 320*186 + 320 - 11 - 8*strlen(ver);
|
||||
#elif defined(X11)
|
||||
sprintf (ver, "(X11 Quake %2.2f) %4.2f", (float)X11_VERSION, (float)VERSION);
|
||||
dest = conback->data + 320*186 + 320 - 11 - 8*strlen(ver);
|
||||
#elif defined(__linux__)
|
||||
sprintf (ver, "(Linux Quake %2.2f) %4.2f", (float)LINUX_VERSION, (float)VERSION);
|
||||
dest = conback->data + 320*186 + 320 - 11 - 8*strlen(ver);
|
||||
#else
|
||||
dest = conback->data + 320 - 43 + 320*186;
|
||||
sprintf (ver, "%4.2f", VERSION);
|
||||
#endif
|
||||
|
||||
for (x=0 ; x<strlen(ver) ; x++)
|
||||
Draw_CharToConback (ver[x], dest+(x<<3));
|
||||
|
||||
// draw the pic
|
||||
if (r_pixbytes == 1)
|
||||
{
|
||||
dest = vid.conbuffer;
|
||||
|
||||
for (y=0 ; y<lines ; y++, dest += vid.conrowbytes)
|
||||
{
|
||||
v = (vid.conheight - lines + y)*200/vid.conheight;
|
||||
src = conback->data + v*320;
|
||||
if (vid.conwidth == 320)
|
||||
memcpy (dest, src, vid.conwidth);
|
||||
else
|
||||
{
|
||||
f = 0;
|
||||
fstep = 320*0x10000/vid.conwidth;
|
||||
for (x=0 ; x<vid.conwidth ; x+=4)
|
||||
{
|
||||
dest[x] = src[f>>16];
|
||||
f += fstep;
|
||||
dest[x+1] = src[f>>16];
|
||||
f += fstep;
|
||||
dest[x+2] = src[f>>16];
|
||||
f += fstep;
|
||||
dest[x+3] = src[f>>16];
|
||||
f += fstep;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pusdest = (unsigned short *)vid.conbuffer;
|
||||
|
||||
for (y=0 ; y<lines ; y++, pusdest += (vid.conrowbytes >> 1))
|
||||
{
|
||||
// FIXME: pre-expand to native format?
|
||||
// FIXME: does the endian switching go away in production?
|
||||
v = (vid.conheight - lines + y)*200/vid.conheight;
|
||||
src = conback->data + v*320;
|
||||
f = 0;
|
||||
fstep = 320*0x10000/vid.conwidth;
|
||||
for (x=0 ; x<vid.conwidth ; x+=4)
|
||||
{
|
||||
pusdest[x] = d_8to16table[src[f>>16]];
|
||||
f += fstep;
|
||||
pusdest[x+1] = d_8to16table[src[f>>16]];
|
||||
f += fstep;
|
||||
pusdest[x+2] = d_8to16table[src[f>>16]];
|
||||
f += fstep;
|
||||
pusdest[x+3] = d_8to16table[src[f>>16]];
|
||||
f += fstep;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==============
|
||||
R_DrawRect8
|
||||
==============
|
||||
*/
|
||||
void R_DrawRect8 (vrect_t *prect, int rowbytes, byte *psrc,
|
||||
int transparent)
|
||||
{
|
||||
byte t;
|
||||
int i, j, srcdelta, destdelta;
|
||||
byte *pdest;
|
||||
|
||||
pdest = vid.buffer + (prect->y * vid.rowbytes) + prect->x;
|
||||
|
||||
srcdelta = rowbytes - prect->width;
|
||||
destdelta = vid.rowbytes - prect->width;
|
||||
|
||||
if (transparent)
|
||||
{
|
||||
for (i=0 ; i<prect->height ; i++)
|
||||
{
|
||||
for (j=0 ; j<prect->width ; j++)
|
||||
{
|
||||
t = *psrc;
|
||||
if (t != TRANSPARENT_COLOR)
|
||||
{
|
||||
*pdest = t;
|
||||
}
|
||||
|
||||
psrc++;
|
||||
pdest++;
|
||||
}
|
||||
|
||||
psrc += srcdelta;
|
||||
pdest += destdelta;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i=0 ; i<prect->height ; i++)
|
||||
{
|
||||
memcpy (pdest, psrc, prect->width);
|
||||
psrc += rowbytes;
|
||||
pdest += vid.rowbytes;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==============
|
||||
R_DrawRect16
|
||||
==============
|
||||
*/
|
||||
void R_DrawRect16 (vrect_t *prect, int rowbytes, byte *psrc,
|
||||
int transparent)
|
||||
{
|
||||
byte t;
|
||||
int i, j, srcdelta, destdelta;
|
||||
unsigned short *pdest;
|
||||
|
||||
// FIXME: would it be better to pre-expand native-format versions?
|
||||
|
||||
pdest = (unsigned short *)vid.buffer +
|
||||
(prect->y * (vid.rowbytes >> 1)) + prect->x;
|
||||
|
||||
srcdelta = rowbytes - prect->width;
|
||||
destdelta = (vid.rowbytes >> 1) - prect->width;
|
||||
|
||||
if (transparent)
|
||||
{
|
||||
for (i=0 ; i<prect->height ; i++)
|
||||
{
|
||||
for (j=0 ; j<prect->width ; j++)
|
||||
{
|
||||
t = *psrc;
|
||||
if (t != TRANSPARENT_COLOR)
|
||||
{
|
||||
*pdest = d_8to16table[t];
|
||||
}
|
||||
|
||||
psrc++;
|
||||
pdest++;
|
||||
}
|
||||
|
||||
psrc += srcdelta;
|
||||
pdest += destdelta;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i=0 ; i<prect->height ; i++)
|
||||
{
|
||||
for (j=0 ; j<prect->width ; j++)
|
||||
{
|
||||
*pdest = d_8to16table[*psrc];
|
||||
psrc++;
|
||||
pdest++;
|
||||
}
|
||||
|
||||
psrc += srcdelta;
|
||||
pdest += destdelta;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
=============
|
||||
Draw_TileClear
|
||||
|
||||
This repeats a 64*64 tile graphic to fill the screen around a sized down
|
||||
refresh window.
|
||||
=============
|
||||
*/
|
||||
void Draw_TileClear (int x, int y, int w, int h)
|
||||
{
|
||||
int width, height, tileoffsetx, tileoffsety;
|
||||
byte *psrc;
|
||||
vrect_t vr;
|
||||
|
||||
r_rectdesc.rect.x = x;
|
||||
r_rectdesc.rect.y = y;
|
||||
r_rectdesc.rect.width = w;
|
||||
r_rectdesc.rect.height = h;
|
||||
|
||||
vr.y = r_rectdesc.rect.y;
|
||||
height = r_rectdesc.rect.height;
|
||||
|
||||
tileoffsety = vr.y % r_rectdesc.height;
|
||||
|
||||
while (height > 0)
|
||||
{
|
||||
vr.x = r_rectdesc.rect.x;
|
||||
width = r_rectdesc.rect.width;
|
||||
|
||||
if (tileoffsety != 0)
|
||||
vr.height = r_rectdesc.height - tileoffsety;
|
||||
else
|
||||
vr.height = r_rectdesc.height;
|
||||
|
||||
if (vr.height > height)
|
||||
vr.height = height;
|
||||
|
||||
tileoffsetx = vr.x % r_rectdesc.width;
|
||||
|
||||
while (width > 0)
|
||||
{
|
||||
if (tileoffsetx != 0)
|
||||
vr.width = r_rectdesc.width - tileoffsetx;
|
||||
else
|
||||
vr.width = r_rectdesc.width;
|
||||
|
||||
if (vr.width > width)
|
||||
vr.width = width;
|
||||
|
||||
psrc = r_rectdesc.ptexbytes +
|
||||
(tileoffsety * r_rectdesc.rowbytes) + tileoffsetx;
|
||||
|
||||
if (r_pixbytes == 1)
|
||||
{
|
||||
R_DrawRect8 (&vr, r_rectdesc.rowbytes, psrc, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
R_DrawRect16 (&vr, r_rectdesc.rowbytes, psrc, 0);
|
||||
}
|
||||
|
||||
vr.x += vr.width;
|
||||
width -= vr.width;
|
||||
tileoffsetx = 0; // only the left tile can be left-clipped
|
||||
}
|
||||
|
||||
vr.y += vr.height;
|
||||
height -= vr.height;
|
||||
tileoffsety = 0; // only the top tile can be top-clipped
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
=============
|
||||
Draw_Fill
|
||||
|
||||
Fills a box of pixels with a single color
|
||||
=============
|
||||
*/
|
||||
void Draw_Fill (int x, int y, int w, int h, int c)
|
||||
{
|
||||
byte *dest;
|
||||
unsigned short *pusdest;
|
||||
unsigned uc;
|
||||
int u, v;
|
||||
|
||||
if (r_pixbytes == 1)
|
||||
{
|
||||
dest = vid.buffer + y*vid.rowbytes + x;
|
||||
for (v=0 ; v<h ; v++, dest += vid.rowbytes)
|
||||
for (u=0 ; u<w ; u++)
|
||||
dest[u] = c;
|
||||
}
|
||||
else
|
||||
{
|
||||
uc = d_8to16table[c];
|
||||
|
||||
pusdest = (unsigned short *)vid.buffer + y * (vid.rowbytes >> 1) + x;
|
||||
for (v=0 ; v<h ; v++, pusdest += (vid.rowbytes >> 1))
|
||||
for (u=0 ; u<w ; u++)
|
||||
pusdest[u] = uc;
|
||||
}
|
||||
}
|
||||
//=============================================================================
|
||||
|
||||
/*
|
||||
================
|
||||
Draw_FadeScreen
|
||||
|
||||
================
|
||||
*/
|
||||
void Draw_FadeScreen (void)
|
||||
{
|
||||
int x,y;
|
||||
byte *pbuf;
|
||||
|
||||
VID_UnlockBuffer ();
|
||||
S_ExtraUpdate ();
|
||||
VID_LockBuffer ();
|
||||
|
||||
for (y=0 ; y<vid.height ; y++)
|
||||
{
|
||||
int t;
|
||||
|
||||
pbuf = (byte *)(vid.buffer + vid.rowbytes*y);
|
||||
t = (y & 1) << 1;
|
||||
|
||||
for (x=0 ; x<vid.width ; x++)
|
||||
{
|
||||
if ((x & 3) != t)
|
||||
pbuf[x] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
VID_UnlockBuffer ();
|
||||
S_ExtraUpdate ();
|
||||
VID_LockBuffer ();
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
/*
|
||||
================
|
||||
Draw_BeginDisc
|
||||
|
||||
Draws the little blue disc in the corner of the screen.
|
||||
Call before beginning any disc IO.
|
||||
================
|
||||
*/
|
||||
void Draw_BeginDisc (void)
|
||||
{
|
||||
|
||||
D_BeginDirectRect (vid.width - 24, 0, draw_disc->data, 24, 24);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
Draw_EndDisc
|
||||
|
||||
Erases the disc icon.
|
||||
Call after completing any disc IO
|
||||
================
|
||||
*/
|
||||
void Draw_EndDisc (void)
|
||||
{
|
||||
|
||||
D_EndDirectRect (vid.width - 24, 0, 24, 24);
|
||||
}
|
||||
|
||||
40
WinQuake/draw.h
Normal file
40
WinQuake/draw.h
Normal file
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
|
||||
// draw.h -- these are the only functions outside the refresh allowed
|
||||
// to touch the vid buffer
|
||||
|
||||
extern qpic_t *draw_disc; // also used on sbar
|
||||
|
||||
void Draw_Init (void);
|
||||
void Draw_Character (int x, int y, int num);
|
||||
void Draw_DebugChar (char num);
|
||||
void Draw_Pic (int x, int y, qpic_t *pic);
|
||||
void Draw_TransPic (int x, int y, qpic_t *pic);
|
||||
void Draw_TransPicTranslate (int x, int y, qpic_t *pic, byte *translation);
|
||||
void Draw_ConsoleBackground (int lines);
|
||||
void Draw_BeginDisc (void);
|
||||
void Draw_EndDisc (void);
|
||||
void Draw_TileClear (int x, int y, int w, int h);
|
||||
void Draw_Fill (int x, int y, int w, int h, int c);
|
||||
void Draw_FadeScreen (void);
|
||||
void Draw_String (int x, int y, char *str);
|
||||
qpic_t *Draw_PicFromWad (char *name);
|
||||
qpic_t *Draw_CachePic (char *path);
|
||||
392
WinQuake/dxsdk/SDK/INC/D3D.H
Normal file
392
WinQuake/dxsdk/SDK/INC/D3D.H
Normal file
@@ -0,0 +1,392 @@
|
||||
/*==========================================================================;
|
||||
*
|
||||
* Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved.
|
||||
*
|
||||
* File: d3d.h
|
||||
* Content: Direct3D include file
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef _D3D_H_
|
||||
#define _D3D_H_
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
#define COM_NO_WINDOWS_H
|
||||
#include <objbase.h>
|
||||
#else
|
||||
#include "d3dcom.h"
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#define D3DAPI WINAPI
|
||||
#else
|
||||
#define D3DAPI
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Interface IID's
|
||||
*/
|
||||
#if defined( _WIN32 ) && !defined( _NO_COM)
|
||||
DEFINE_GUID( IID_IDirect3D, 0x3BBA0080,0x2421,0x11CF,0xA3,0x1A,0x00,0xAA,0x00,0xB9,0x33,0x56 );
|
||||
DEFINE_GUID( IID_IDirect3DTexture, 0x2CDCD9E0,0x25A0,0x11CF,0xA3,0x1A,0x00,0xAA,0x00,0xB9,0x33,0x56 );
|
||||
DEFINE_GUID( IID_IDirect3DLight, 0x4417C142,0x33AD,0x11CF,0x81,0x6F,0x00,0x00,0xC0,0x20,0x15,0x6E );
|
||||
DEFINE_GUID( IID_IDirect3DMaterial, 0x4417C144,0x33AD,0x11CF,0x81,0x6F,0x00,0x00,0xC0,0x20,0x15,0x6E );
|
||||
DEFINE_GUID( IID_IDirect3DExecuteBuffer,0x4417C145,0x33AD,0x11CF,0x81,0x6F,0x00,0x00,0xC0,0x20,0x15,0x6E );
|
||||
DEFINE_GUID( IID_IDirect3DViewport, 0x4417C146,0x33AD,0x11CF,0x81,0x6F,0x00,0x00,0xC0,0x20,0x15,0x6E );
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Data structures
|
||||
*/
|
||||
#ifdef __cplusplus
|
||||
|
||||
/* 'struct' not 'class' per the way DECLARE_INTERFACE_ is defined */
|
||||
struct IDirect3D;
|
||||
struct IDirect3DDevice;
|
||||
struct IDirect3DExecuteBuffer;
|
||||
struct IDirect3DLight;
|
||||
struct IDirect3DMaterial;
|
||||
struct IDirect3DTexture;
|
||||
struct IDirect3DViewport;
|
||||
typedef struct IDirect3D *LPDIRECT3D;
|
||||
typedef struct IDirect3DDevice *LPDIRECT3DDEVICE;
|
||||
typedef struct IDirect3DExecuteBuffer *LPDIRECT3DEXECUTEBUFFER;
|
||||
typedef struct IDirect3DLight *LPDIRECT3DLIGHT;
|
||||
typedef struct IDirect3DMaterial *LPDIRECT3DMATERIAL;
|
||||
typedef struct IDirect3DTexture *LPDIRECT3DTEXTURE;
|
||||
typedef struct IDirect3DViewport *LPDIRECT3DVIEWPORT;
|
||||
|
||||
#else
|
||||
|
||||
typedef struct IDirect3D *LPDIRECT3D;
|
||||
typedef struct IDirect3DDevice *LPDIRECT3DDEVICE;
|
||||
typedef struct IDirect3DExecuteBuffer *LPDIRECT3DEXECUTEBUFFER;
|
||||
typedef struct IDirect3DLight *LPDIRECT3DLIGHT;
|
||||
typedef struct IDirect3DMaterial *LPDIRECT3DMATERIAL;
|
||||
typedef struct IDirect3DTexture *LPDIRECT3DTEXTURE;
|
||||
typedef struct IDirect3DViewport *LPDIRECT3DVIEWPORT;
|
||||
|
||||
#endif
|
||||
|
||||
#include "d3dtypes.h"
|
||||
#include "d3dcaps.h"
|
||||
|
||||
/*
|
||||
* IDirect3D
|
||||
*/
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3D
|
||||
DECLARE_INTERFACE_(IDirect3D, IUnknown)
|
||||
{
|
||||
/*** IUnknown methods ***/
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID* ppvObj) PURE;
|
||||
STDMETHOD_(ULONG, AddRef) (THIS) PURE;
|
||||
STDMETHOD_(ULONG, Release) (THIS) PURE;
|
||||
/*** IDirect3D methods ***/
|
||||
STDMETHOD(Initialize) (THIS_ REFIID) PURE;
|
||||
STDMETHOD(EnumDevices)(THIS_ LPD3DENUMDEVICESCALLBACK, LPVOID) PURE;
|
||||
STDMETHOD(CreateLight) (THIS_ LPDIRECT3DLIGHT*, IUnknown*) PURE;
|
||||
STDMETHOD(CreateMaterial) (THIS_ LPDIRECT3DMATERIAL*, IUnknown*) PURE;
|
||||
STDMETHOD(CreateViewport) (THIS_ LPDIRECT3DVIEWPORT*, IUnknown*) PURE;
|
||||
STDMETHOD(FindDevice)(THIS_ LPD3DFINDDEVICESEARCH, LPD3DFINDDEVICERESULT) PURE;
|
||||
};
|
||||
|
||||
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirect3D_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b)
|
||||
#define IDirect3D_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||
#define IDirect3D_Release(p) (p)->lpVtbl->Release(p)
|
||||
#define IDirect3D_Initialize(p, a) (p)->lpVtbl->Initialize(p, a)
|
||||
#define IDirect3D_EnumDevices(p, a, b) (p)->lpVtbl->EnumDevices(p, a, b)
|
||||
#define IDirect3D_CreateLight(p, a, b) (p)->lpVtbl->CreateLight(p, a, b)
|
||||
#define IDirect3D_CreateMaterial(p, a, b) (p)->lpVtbl->CreateMaterial(p, a, b)
|
||||
#define IDirect3D_CreateViewport(p, a, b) (p)->lpVtbl->CreateViewport(p, a, b)
|
||||
#define IDirect3D_FindDevice(p, a, b) (p)->lpVtbl->FindDevice(p, a, b)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* IDirect3DDevice
|
||||
*/
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DDevice
|
||||
DECLARE_INTERFACE_(IDirect3DDevice, IUnknown)
|
||||
{
|
||||
/*** IUnknown methods ***/
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID* ppvObj) PURE;
|
||||
STDMETHOD_(ULONG, AddRef) (THIS) PURE;
|
||||
STDMETHOD_(ULONG, Release) (THIS) PURE;
|
||||
/*** IDirect3DDevice methods ***/
|
||||
STDMETHOD(Initialize) (THIS_ LPDIRECT3D, LPGUID, LPD3DDEVICEDESC) PURE;
|
||||
STDMETHOD(GetCaps) (THIS_ LPD3DDEVICEDESC, LPD3DDEVICEDESC) PURE;
|
||||
STDMETHOD(SwapTextureHandles) (THIS_ LPDIRECT3DTEXTURE, LPDIRECT3DTEXTURE) PURE;
|
||||
STDMETHOD(CreateExecuteBuffer) (THIS_ LPD3DEXECUTEBUFFERDESC, LPDIRECT3DEXECUTEBUFFER*, IUnknown*) PURE;
|
||||
STDMETHOD(GetStats) (THIS_ LPD3DSTATS) PURE;
|
||||
STDMETHOD(Execute) (THIS_ LPDIRECT3DEXECUTEBUFFER, LPDIRECT3DVIEWPORT, DWORD) PURE;
|
||||
STDMETHOD(AddViewport) (THIS_ LPDIRECT3DVIEWPORT) PURE;
|
||||
STDMETHOD(DeleteViewport) (THIS_ LPDIRECT3DVIEWPORT) PURE;
|
||||
STDMETHOD(NextViewport) (THIS_ LPDIRECT3DVIEWPORT, LPDIRECT3DVIEWPORT*, DWORD) PURE;
|
||||
STDMETHOD(Pick) (THIS_ LPDIRECT3DEXECUTEBUFFER, LPDIRECT3DVIEWPORT, DWORD, LPD3DRECT) PURE;
|
||||
STDMETHOD(GetPickRecords)(THIS_ LPDWORD, LPD3DPICKRECORD) PURE;
|
||||
STDMETHOD(EnumTextureFormats) (THIS_ LPD3DENUMTEXTUREFORMATSCALLBACK, LPVOID) PURE;
|
||||
STDMETHOD(CreateMatrix) (THIS_ LPD3DMATRIXHANDLE) PURE;
|
||||
STDMETHOD(SetMatrix) (THIS_ D3DMATRIXHANDLE, LPD3DMATRIX) PURE;
|
||||
STDMETHOD(GetMatrix) (THIS_ D3DMATRIXHANDLE, LPD3DMATRIX) PURE;
|
||||
STDMETHOD(DeleteMatrix) (THIS_ D3DMATRIXHANDLE) PURE;
|
||||
STDMETHOD_(HRESULT, BeginScene) (THIS) PURE;
|
||||
STDMETHOD_(HRESULT, EndScene) (THIS) PURE;
|
||||
STDMETHOD(GetDirect3D) (THIS_ LPDIRECT3D*) PURE;
|
||||
};
|
||||
|
||||
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirect3DDevice_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b)
|
||||
#define IDirect3DDevice_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||
#define IDirect3DDevice_Release(p) (p)->lpVtbl->Release(p)
|
||||
#define IDirect3DDevice_Initialize(p, a, b, c) (p)->lpVtbl->Initialize(p, a, b, c)
|
||||
#define IDirect3DDevice_GetCaps(p, a, b) (p)->lpVtbl->GetCaps(p, a, b)
|
||||
#define IDirect3DDevice_SwapTextureHandles(p, a, b) (p)->lpVtbl->SwapTextureHandles(p, a, b)
|
||||
#define IDirect3DDevice_CreateExecuteBuffer(p, a, b, c) (p)->lpVtbl->ExecuteBuffer(p, a, b, c)
|
||||
#define IDirect3DDevice_GetStats(p, a) (p)->lpVtbl->CreateViewport(p, a)
|
||||
#define IDirect3DDevice_Execute(p, a, b, c) (p)->lpVtbl->Execute(p, a, b, c)
|
||||
#define IDirect3DDevice_AddViewport(p, a) (p)->lpVtbl->AddViewport(p, a)
|
||||
#define IDirect3DDevice_DeleteViewport(p, a) (p)->lpVtbl->DeleteViewport(p, a)
|
||||
#define IDirect3DDevice_NextViewport(p, a, b) (p)->lpVtbl->NextViewport(p, a, b)
|
||||
#define IDirect3DDevice_Pick(p, a, b, c, d) (p)->lpVtbl->Pick(p, a, b, c, d)
|
||||
#define IDirect3DDevice_GetPickRecords(p, a, b) (p)->lpVtbl->GetPickRecords(p, a, b)
|
||||
#define IDirect3DDevice_EnumTextureFormats(p, a, b) (p)->lpVtbl->EnumTextureFormats(p, a, b)
|
||||
#define IDirect3DDevice_CreateMatrix(p, a) (p)->lpVtbl->CreateMatrix(p, a)
|
||||
#define IDirect3DDevice_SetMatrix(p, a, b) (p)->lpVtbl->SetMatrix(p, a, b)
|
||||
#define IDirect3DDevice_GetMatrix(p, a, b) (p)->lpVtbl->GetMatrix(p, a, b)
|
||||
#define IDirect3DDevice_DeleteMatrix(p, a) (p)->lpVtbl->DeleteMatrix(p, a)
|
||||
#define IDirect3DDevice_BeginScene(p) (p)->lpVtbl->BeginScene(p)
|
||||
#define IDirect3DDevice_EndScene(p) (p)->lpVtbl->EndScene(p)
|
||||
#define IDirect3DDevice_GetDirect3D(p, a) (p)->lpVtbl->GetDirect3D(p, a)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* IDirect3DExecuteBuffer
|
||||
*/
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DExecuteBuffer
|
||||
DECLARE_INTERFACE_(IDirect3DExecuteBuffer, IUnknown)
|
||||
{
|
||||
/*** IUnknown methods ***/
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID* ppvObj) PURE;
|
||||
STDMETHOD_(ULONG, AddRef) (THIS) PURE;
|
||||
STDMETHOD_(ULONG, Release) (THIS) PURE;
|
||||
/*** IDirect3DExecuteBuffer methods ***/
|
||||
STDMETHOD(Initialize) (THIS_ LPDIRECT3DDEVICE, LPD3DEXECUTEBUFFERDESC) PURE;
|
||||
STDMETHOD(Lock) (THIS_ LPD3DEXECUTEBUFFERDESC) PURE;
|
||||
STDMETHOD_(HRESULT, Unlock) (THIS) PURE;
|
||||
STDMETHOD(SetExecuteData) (THIS_ LPD3DEXECUTEDATA) PURE;
|
||||
STDMETHOD(GetExecuteData) (THIS_ LPD3DEXECUTEDATA) PURE;
|
||||
STDMETHOD(Validate) (THIS_ LPDWORD, LPD3DVALIDATECALLBACK, LPVOID, DWORD) PURE;
|
||||
STDMETHOD(Optimize) (THIS_ DWORD) PURE;
|
||||
};
|
||||
|
||||
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirect3DExecuteBuffer_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b)
|
||||
#define IDirect3DExecuteBuffer_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||
#define IDirect3DExecuteBuffer_Release(p) (p)->lpVtbl->Release(p)
|
||||
#define IDirect3DExecuteBuffer_Initialize(p, a, b) (p)->lpVtbl->Initialize(p, a, b)
|
||||
#define IDirect3DExecuteBuffer_Lock(p, a) (p)->lpVtbl->Lock(p, a)
|
||||
#define IDirect3DExecuteBuffer_Unlock(p, a) (p)->lpVtbl->Unlock(p)
|
||||
#define IDirect3DExecuteBuffer_SetExecuteData(p, a) (p)->lpVtbl->SetExecuteData(p, a)
|
||||
#define IDirect3DExecuteBuffer_Validate(p, a, b, c, d) (p)->lpVtbl->Validata(p, a, b, c, d)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Flags for execute buffer calls
|
||||
*/
|
||||
#define D3DNEXT_NEXT 0x00000001l
|
||||
#define D3DNEXT_HEAD 0x00000002l
|
||||
#define D3DNEXT_TAIL 0x00000004l
|
||||
|
||||
/*
|
||||
* IDirect3DLight
|
||||
*/
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DLight
|
||||
DECLARE_INTERFACE_(IDirect3DLight, IUnknown)
|
||||
{
|
||||
/*** IUnknown methods ***/
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID* ppvObj) PURE;
|
||||
STDMETHOD_(ULONG, AddRef) (THIS) PURE;
|
||||
STDMETHOD_(ULONG, Release) (THIS) PURE;
|
||||
/*** IDirect3DLight methods ***/
|
||||
STDMETHOD(Initialize) (THIS_ LPDIRECT3D) PURE;
|
||||
STDMETHOD(SetLight) (THIS_ LPD3DLIGHT) PURE;
|
||||
STDMETHOD(GetLight) (THIS_ LPD3DLIGHT) PURE;
|
||||
};
|
||||
|
||||
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirect3DLight_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b)
|
||||
#define IDirect3DLight_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||
#define IDirect3DLight_Release(p) (p)->lpVtbl->Release(p)
|
||||
#define IDirect3DLight_Initialize(p, a) (p)->lpVtbl->Initialize(p, a)
|
||||
#define IDirect3DLight_SetLight(p, a) (p)->lpVtbl->SetLight(p, a)
|
||||
#define IDirect3DLight_GetLight(p, a) (p)->lpVtbl->GetLight(p, a)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* IDirect3DMaterial
|
||||
*/
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DMaterial
|
||||
DECLARE_INTERFACE_(IDirect3DMaterial, IUnknown)
|
||||
{
|
||||
/*** IUnknown methods ***/
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID* ppvObj) PURE;
|
||||
STDMETHOD_(ULONG, AddRef) (THIS) PURE;
|
||||
STDMETHOD_(ULONG, Release) (THIS) PURE;
|
||||
/*** IDirect3DMaterial methods ***/
|
||||
STDMETHOD(Initialize) (THIS_ LPDIRECT3D) PURE;
|
||||
STDMETHOD(SetMaterial) (THIS_ LPD3DMATERIAL) PURE;
|
||||
STDMETHOD(GetMaterial) (THIS_ LPD3DMATERIAL) PURE;
|
||||
STDMETHOD(GetHandle) (THIS_ LPDIRECT3DDEVICE, LPD3DMATERIALHANDLE) PURE;
|
||||
STDMETHOD_(HRESULT, Reserve) (THIS) PURE;
|
||||
STDMETHOD_(HRESULT, Unreserve) (THIS) PURE;
|
||||
};
|
||||
|
||||
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirect3DMaterial_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b)
|
||||
#define IDirect3DMaterial_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||
#define IDirect3DMaterial_Release(p) (p)->lpVtbl->Release(p)
|
||||
#define IDirect3DMaterial_Initialize(p, a) (p)->lpVtbl->Initialize(p, a)
|
||||
#define IDirect3DMaterial_SetMaterial(p, a) (p)->lpVtbl->SetLight(p, a)
|
||||
#define IDirect3DMaterial_GetMaterial(p, a) (p)->lpVtbl->GetLight(p, a)
|
||||
#define IDirect3DMaterial_GetHandle(p, a, b) (p)->lpVtbl->GetHandle(p, a, b)
|
||||
#define IDirect3DMaterial_Reserve(p) (p)->lpVtbl->Reserve(p)
|
||||
#define IDirect3DMaterial_Unreserve(p) (p)->lpVtbl->Unreserve(p)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* IDirect3DTexture
|
||||
*/
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DTexture
|
||||
DECLARE_INTERFACE_(IDirect3DTexture, IUnknown)
|
||||
{
|
||||
/*** IUnknown methods ***/
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID* ppvObj) PURE;
|
||||
STDMETHOD_(ULONG, AddRef) (THIS) PURE;
|
||||
STDMETHOD_(ULONG, Release) (THIS) PURE;
|
||||
/*** IDirect3DTexture methods ***/
|
||||
STDMETHOD(Initialize) (THIS_ LPDIRECT3DDEVICE, LPDIRECTDRAWSURFACE) PURE;
|
||||
STDMETHOD(GetHandle) (THIS_ LPDIRECT3DDEVICE, LPD3DTEXTUREHANDLE) PURE;
|
||||
STDMETHOD(PaletteChanged) (THIS_ DWORD, DWORD) PURE;
|
||||
STDMETHOD(Load) (THIS_ LPDIRECT3DTEXTURE) PURE;
|
||||
STDMETHOD_(HRESULT, Unload) (THIS) PURE;
|
||||
};
|
||||
|
||||
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirect3DTexture_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b)
|
||||
#define IDirect3DTexture_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||
#define IDirect3DTexture_Release(p) (p)->lpVtbl->Release(p)
|
||||
#define IDirect3DTexture_Initialize(p, a, b) (p)->lpVtbl->Initialize(p, a, b)
|
||||
#define IDirect3DTexture_GetHandle(p, a, b) (p)->lpVtbl->GetHandle(p, a, b)
|
||||
#define IDirect3DTexture_PaletteChanged(p, a, b) (p)->lpVtbl->PaletteChanged(p, a, b)
|
||||
#define IDirect3DTexture_Load(p, a) (p)->lpVtbl->Load(p, a)
|
||||
#define IDirect3DTexture_Unload(p) (p)->lpVtbl->Unload(p)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* IDirect3DViewport
|
||||
*/
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DViewport
|
||||
DECLARE_INTERFACE_(IDirect3DViewport, IUnknown)
|
||||
{
|
||||
/*** IUnknown methods ***/
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID* ppvObj) PURE;
|
||||
STDMETHOD_(ULONG, AddRef) (THIS) PURE;
|
||||
STDMETHOD_(ULONG, Release) (THIS) PURE;
|
||||
/*** IDirect3DViewport methods ***/
|
||||
STDMETHOD(Initialize) (THIS_ LPDIRECT3D) PURE;
|
||||
STDMETHOD(GetViewport) (THIS_ LPD3DVIEWPORT) PURE;
|
||||
STDMETHOD(SetViewport) (THIS_ LPD3DVIEWPORT) PURE;
|
||||
STDMETHOD(TransformVertices) (THIS_ DWORD, LPD3DTRANSFORMDATA, DWORD, LPDWORD) PURE;
|
||||
STDMETHOD(LightElements) (THIS_ DWORD, LPD3DLIGHTDATA) PURE;
|
||||
STDMETHOD(SetBackground) (THIS_ D3DMATERIALHANDLE) PURE;
|
||||
STDMETHOD(GetBackground) (THIS_ LPD3DMATERIALHANDLE, LPBOOL) PURE;
|
||||
STDMETHOD(SetBackgroundDepth) (THIS_ LPDIRECTDRAWSURFACE) PURE;
|
||||
STDMETHOD(GetBackgroundDepth) (THIS_ LPDIRECTDRAWSURFACE*, LPBOOL) PURE;
|
||||
STDMETHOD(Clear) (THIS_ DWORD, LPD3DRECT, DWORD) PURE;
|
||||
STDMETHOD(AddLight) (THIS_ LPDIRECT3DLIGHT) PURE;
|
||||
STDMETHOD(DeleteLight) (THIS_ LPDIRECT3DLIGHT) PURE;
|
||||
STDMETHOD(NextLight) (THIS_ LPDIRECT3DLIGHT, LPDIRECT3DLIGHT*, DWORD) PURE;
|
||||
};
|
||||
|
||||
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirect3DViewport_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b)
|
||||
#define IDirect3DViewport_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||
#define IDirect3DViewport_Release(p) (p)->lpVtbl->Release(p)
|
||||
#define IDirect3DViewport_Initialize(p, a) (p)->lpVtbl->Initialize(p, a)
|
||||
#define IDirect3DViewport_GetViewport(p, a) (p)->lpVtbl->GetViewport(p, a)
|
||||
#define IDirect3DViewport_SetViewport(p, a) (p)->lpVtbl->SetViewport(p, a)
|
||||
#define IDirect3DViewport_TransformVertices(p, a, b, c, d) (p)->lpVtbl->TransformVertices(p, a, b, c, d)
|
||||
#define IDirect3DViewport_LightElements(p, a, b) (p)->lpVtbl->LightElements(p, a, b)
|
||||
#define IDirect3DViewport_SetBackground(p, a) (p)->lpVtbl->SetBackground(p, a)
|
||||
#define IDirect3DViewport_GetBackground(p, a, b) (p)->lpVtbl->GetBackground(p, a, b)
|
||||
#define IDirect3DViewport_Clear(p, a, b, c) (p)->lpVtbl->Clear(p, a, b, c)
|
||||
#define IDirect3DViewport_AddLight(p, a) (p)->lpVtbl->AddLight(p, a)
|
||||
#define IDirect3DViewport_DeleteLight(p, a) (p)->lpVtbl->DeleteLight(p, a)
|
||||
#define IDirect3DViewport_NextLight(p, a, b, c) (p)->lpVtbl->NextLight(p, a, b, c)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Direct3D Errors
|
||||
* DirectDraw error codes are used when errors not specified here.
|
||||
*/
|
||||
#define D3D_OK DD_OK
|
||||
#define D3DERR_BADMAJORVERSION MAKE_DDHRESULT(700)
|
||||
#define D3DERR_BADMINORVERSION MAKE_DDHRESULT(701)
|
||||
|
||||
#define D3DERR_EXECUTE_CREATE_FAILED MAKE_DDHRESULT(710)
|
||||
#define D3DERR_EXECUTE_DESTROY_FAILED MAKE_DDHRESULT(711)
|
||||
#define D3DERR_EXECUTE_LOCK_FAILED MAKE_DDHRESULT(712)
|
||||
#define D3DERR_EXECUTE_UNLOCK_FAILED MAKE_DDHRESULT(713)
|
||||
#define D3DERR_EXECUTE_LOCKED MAKE_DDHRESULT(714)
|
||||
#define D3DERR_EXECUTE_NOT_LOCKED MAKE_DDHRESULT(715)
|
||||
|
||||
#define D3DERR_EXECUTE_FAILED MAKE_DDHRESULT(716)
|
||||
#define D3DERR_EXECUTE_CLIPPED_FAILED MAKE_DDHRESULT(717)
|
||||
|
||||
#define D3DERR_TEXTURE_NO_SUPPORT MAKE_DDHRESULT(720)
|
||||
#define D3DERR_TEXTURE_CREATE_FAILED MAKE_DDHRESULT(721)
|
||||
#define D3DERR_TEXTURE_DESTROY_FAILED MAKE_DDHRESULT(722)
|
||||
#define D3DERR_TEXTURE_LOCK_FAILED MAKE_DDHRESULT(723)
|
||||
#define D3DERR_TEXTURE_UNLOCK_FAILED MAKE_DDHRESULT(724)
|
||||
#define D3DERR_TEXTURE_LOAD_FAILED MAKE_DDHRESULT(725)
|
||||
#define D3DERR_TEXTURE_SWAP_FAILED MAKE_DDHRESULT(726)
|
||||
#define D3DERR_TEXTURE_LOCKED MAKE_DDHRESULT(727)
|
||||
#define D3DERR_TEXTURE_NOT_LOCKED MAKE_DDHRESULT(728)
|
||||
#define D3DERR_TEXTURE_GETSURF_FAILED MAKE_DDHRESULT(729)
|
||||
|
||||
#define D3DERR_MATRIX_CREATE_FAILED MAKE_DDHRESULT(730)
|
||||
#define D3DERR_MATRIX_DESTROY_FAILED MAKE_DDHRESULT(731)
|
||||
#define D3DERR_MATRIX_SETDATA_FAILED MAKE_DDHRESULT(732)
|
||||
#define D3DERR_MATRIX_GETDATA_FAILED MAKE_DDHRESULT(733)
|
||||
#define D3DERR_SETVIEWPORTDATA_FAILED MAKE_DDHRESULT(734)
|
||||
|
||||
#define D3DERR_MATERIAL_CREATE_FAILED MAKE_DDHRESULT(740)
|
||||
#define D3DERR_MATERIAL_DESTROY_FAILED MAKE_DDHRESULT(741)
|
||||
#define D3DERR_MATERIAL_SETDATA_FAILED MAKE_DDHRESULT(742)
|
||||
#define D3DERR_MATERIAL_GETDATA_FAILED MAKE_DDHRESULT(743)
|
||||
|
||||
#define D3DERR_LIGHT_SET_FAILED MAKE_DDHRESULT(750)
|
||||
|
||||
#define D3DERR_SCENE_IN_SCENE MAKE_DDHRESULT(760)
|
||||
#define D3DERR_SCENE_NOT_IN_SCENE MAKE_DDHRESULT(761)
|
||||
#define D3DERR_SCENE_BEGIN_FAILED MAKE_DDHRESULT(762)
|
||||
#define D3DERR_SCENE_END_FAILED MAKE_DDHRESULT(763)
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif /* _D3D_H_ */
|
||||
290
WinQuake/dxsdk/SDK/INC/D3DCAPS.H
Normal file
290
WinQuake/dxsdk/SDK/INC/D3DCAPS.H
Normal file
@@ -0,0 +1,290 @@
|
||||
/*==========================================================================;
|
||||
*
|
||||
* Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved.
|
||||
*
|
||||
* File: d3dcaps.h
|
||||
* Content: Direct3D capabilities include file
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef _D3DCAPS_H
|
||||
#define _D3DCAPS_H
|
||||
|
||||
/*
|
||||
* Pull in DirectDraw include file automatically:
|
||||
*/
|
||||
#include <ddraw.h>
|
||||
|
||||
#pragma pack(4)
|
||||
|
||||
/* Description of capabilities of transform */
|
||||
|
||||
typedef struct _D3DTRANSFORMCAPS {
|
||||
DWORD dwSize;
|
||||
DWORD dwCaps;
|
||||
} D3DTRANSFORMCAPS, *LPD3DTRANSFORMCAPS;
|
||||
|
||||
#define D3DTRANSFORMCAPS_CLIP 0x00000001L /* Will clip whilst transforming */
|
||||
|
||||
/* Description of capabilities of lighting */
|
||||
|
||||
typedef struct _D3DLIGHTINGCAPS {
|
||||
DWORD dwSize;
|
||||
DWORD dwCaps; /* Lighting caps */
|
||||
DWORD dwLightingModel; /* Lighting model - RGB or mono */
|
||||
DWORD dwNumLights; /* Number of lights that can be handled */
|
||||
} D3DLIGHTINGCAPS, *LPD3DLIGHTINGCAPS;
|
||||
|
||||
#define D3DLIGHTINGMODEL_RGB 0x00000001L
|
||||
#define D3DLIGHTINGMODEL_MONO 0x00000002L
|
||||
|
||||
#define D3DLIGHTCAPS_POINT 0x00000001L /* Point lights supported */
|
||||
#define D3DLIGHTCAPS_SPOT 0x00000002L /* Spot lights supported */
|
||||
#define D3DLIGHTCAPS_DIRECTIONAL 0x00000004L /* Directional lights supported */
|
||||
#define D3DLIGHTCAPS_PARALLELPOINT 0x00000008L /* Parallel point lights supported */
|
||||
#define D3DLIGHTCAPS_GLSPOT 0x00000010L /* GL syle spot lights supported */
|
||||
|
||||
/* Description of capabilities for each primitive type */
|
||||
|
||||
typedef struct _D3DPrimCaps {
|
||||
DWORD dwSize;
|
||||
DWORD dwMiscCaps; /* Capability flags */
|
||||
DWORD dwRasterCaps;
|
||||
DWORD dwZCmpCaps;
|
||||
DWORD dwSrcBlendCaps;
|
||||
DWORD dwDestBlendCaps;
|
||||
DWORD dwAlphaCmpCaps;
|
||||
DWORD dwShadeCaps;
|
||||
DWORD dwTextureCaps;
|
||||
DWORD dwTextureFilterCaps;
|
||||
DWORD dwTextureBlendCaps;
|
||||
DWORD dwTextureAddressCaps;
|
||||
DWORD dwStippleWidth; /* maximum width and height of */
|
||||
DWORD dwStippleHeight; /* of supported stipple (up to 32x32) */
|
||||
} D3DPRIMCAPS, *LPD3DPRIMCAPS;
|
||||
|
||||
/* D3DPRIMCAPS dwMiscCaps */
|
||||
|
||||
#define D3DPMISCCAPS_MASKPLANES 0x00000001L
|
||||
#define D3DPMISCCAPS_MASKZ 0x00000002L
|
||||
#define D3DPMISCCAPS_LINEPATTERNREP 0x00000004L
|
||||
#define D3DPMISCCAPS_CONFORMANT 0x00000008L
|
||||
#define D3DPMISCCAPS_CULLNONE 0x00000010L
|
||||
#define D3DPMISCCAPS_CULLCW 0x00000020L
|
||||
#define D3DPMISCCAPS_CULLCCW 0x00000040L
|
||||
|
||||
/* D3DPRIMCAPS dwRasterCaps */
|
||||
|
||||
#define D3DPRASTERCAPS_DITHER 0x00000001L
|
||||
#define D3DPRASTERCAPS_ROP2 0x00000002L
|
||||
#define D3DPRASTERCAPS_XOR 0x00000004L
|
||||
#define D3DPRASTERCAPS_PAT 0x00000008L
|
||||
#define D3DPRASTERCAPS_ZTEST 0x00000010L
|
||||
#define D3DPRASTERCAPS_SUBPIXEL 0x00000020L
|
||||
#define D3DPRASTERCAPS_SUBPIXELX 0x00000040L
|
||||
#define D3DPRASTERCAPS_FOGVERTEX 0x00000080L
|
||||
#define D3DPRASTERCAPS_FOGTABLE 0x00000100L
|
||||
#define D3DPRASTERCAPS_STIPPLE 0x00000200L
|
||||
|
||||
/* D3DPRIMCAPS dwZCmpCaps, dwAlphaCmpCaps */
|
||||
|
||||
#define D3DPCMPCAPS_NEVER 0x00000001L
|
||||
#define D3DPCMPCAPS_LESS 0x00000002L
|
||||
#define D3DPCMPCAPS_EQUAL 0x00000004L
|
||||
#define D3DPCMPCAPS_LESSEQUAL 0x00000008L
|
||||
#define D3DPCMPCAPS_GREATER 0x00000010L
|
||||
#define D3DPCMPCAPS_NOTEQUAL 0x00000020L
|
||||
#define D3DPCMPCAPS_GREATEREQUAL 0x00000040L
|
||||
#define D3DPCMPCAPS_ALWAYS 0x00000080L
|
||||
|
||||
/* D3DPRIMCAPS dwSourceBlendCaps, dwDestBlendCaps */
|
||||
|
||||
#define D3DPBLENDCAPS_ZERO 0x00000001L
|
||||
#define D3DPBLENDCAPS_ONE 0x00000002L
|
||||
#define D3DPBLENDCAPS_SRCCOLOR 0x00000004L
|
||||
#define D3DPBLENDCAPS_INVSRCCOLOR 0x00000008L
|
||||
#define D3DPBLENDCAPS_SRCALPHA 0x00000010L
|
||||
#define D3DPBLENDCAPS_INVSRCALPHA 0x00000020L
|
||||
#define D3DPBLENDCAPS_DESTALPHA 0x00000040L
|
||||
#define D3DPBLENDCAPS_INVDESTALPHA 0x00000080L
|
||||
#define D3DPBLENDCAPS_DESTCOLOR 0x00000100L
|
||||
#define D3DPBLENDCAPS_INVDESTCOLOR 0x00000200L
|
||||
#define D3DPBLENDCAPS_SRCALPHASAT 0x00000400L
|
||||
#define D3DPBLENDCAPS_BOTHSRCALPHA 0x00000800L
|
||||
#define D3DPBLENDCAPS_BOTHINVSRCALPHA 0x00001000L
|
||||
|
||||
/* D3DPRIMCAPS dwShadeCaps */
|
||||
|
||||
#define D3DPSHADECAPS_COLORFLATMONO 0x00000001L
|
||||
#define D3DPSHADECAPS_COLORFLATRGB 0x00000002L
|
||||
#define D3DPSHADECAPS_COLORGOURAUDMONO 0x00000004L
|
||||
#define D3DPSHADECAPS_COLORGOURAUDRGB 0x00000008L
|
||||
#define D3DPSHADECAPS_COLORPHONGMONO 0x00000010L
|
||||
#define D3DPSHADECAPS_COLORPHONGRGB 0x00000020L
|
||||
|
||||
#define D3DPSHADECAPS_SPECULARFLATMONO 0x00000040L
|
||||
#define D3DPSHADECAPS_SPECULARFLATRGB 0x00000080L
|
||||
#define D3DPSHADECAPS_SPECULARGOURAUDMONO 0x00000100L
|
||||
#define D3DPSHADECAPS_SPECULARGOURAUDRGB 0x00000200L
|
||||
#define D3DPSHADECAPS_SPECULARPHONGMONO 0x00000400L
|
||||
#define D3DPSHADECAPS_SPECULARPHONGRGB 0x00000800L
|
||||
|
||||
#define D3DPSHADECAPS_ALPHAFLATBLEND 0x00001000L
|
||||
#define D3DPSHADECAPS_ALPHAFLATSTIPPLED 0x00002000L
|
||||
#define D3DPSHADECAPS_ALPHAGOURAUDBLEND 0x00004000L
|
||||
#define D3DPSHADECAPS_ALPHAGOURAUDSTIPPLED 0x00008000L
|
||||
#define D3DPSHADECAPS_ALPHAPHONGBLEND 0x00010000L
|
||||
#define D3DPSHADECAPS_ALPHAPHONGSTIPPLED 0x00020000L
|
||||
|
||||
#define D3DPSHADECAPS_FOGFLAT 0x00040000L
|
||||
#define D3DPSHADECAPS_FOGGOURAUD 0x00080000L
|
||||
#define D3DPSHADECAPS_FOGPHONG 0x00100000L
|
||||
|
||||
/* D3DPRIMCAPS dwTextureCaps */
|
||||
|
||||
#define D3DPTEXTURECAPS_PERSPECTIVE 0x00000001L
|
||||
#define D3DPTEXTURECAPS_POW2 0x00000002L
|
||||
#define D3DPTEXTURECAPS_ALPHA 0x00000004L
|
||||
#define D3DPTEXTURECAPS_TRANSPARENCY 0x00000008L
|
||||
#define D3DPTEXTURECAPS_BORDER 0x00000010L
|
||||
#define D3DPTEXTURECAPS_SQUAREONLY 0x00000020L
|
||||
|
||||
/* D3DPRIMCAPS dwTextureFilterCaps */
|
||||
|
||||
#define D3DPTFILTERCAPS_NEAREST 0x00000001L
|
||||
#define D3DPTFILTERCAPS_LINEAR 0x00000002L
|
||||
#define D3DPTFILTERCAPS_MIPNEAREST 0x00000004L
|
||||
#define D3DPTFILTERCAPS_MIPLINEAR 0x00000008L
|
||||
#define D3DPTFILTERCAPS_LINEARMIPNEAREST 0x00000010L
|
||||
#define D3DPTFILTERCAPS_LINEARMIPLINEAR 0x00000020L
|
||||
|
||||
/* D3DPRIMCAPS dwTextureBlendCaps */
|
||||
|
||||
#define D3DPTBLENDCAPS_DECAL 0x00000001L
|
||||
#define D3DPTBLENDCAPS_MODULATE 0x00000002L
|
||||
#define D3DPTBLENDCAPS_DECALALPHA 0x00000004L
|
||||
#define D3DPTBLENDCAPS_MODULATEALPHA 0x00000008L
|
||||
#define D3DPTBLENDCAPS_DECALMASK 0x00000010L
|
||||
#define D3DPTBLENDCAPS_MODULATEMASK 0x00000020L
|
||||
#define D3DPTBLENDCAPS_COPY 0x00000040L
|
||||
|
||||
/* D3DPRIMCAPS dwTextureAddressCaps */
|
||||
#define D3DPTADDRESSCAPS_WRAP 0x00000001L
|
||||
#define D3DPTADDRESSCAPS_MIRROR 0x00000002L
|
||||
#define D3DPTADDRESSCAPS_CLAMP 0x00000004L
|
||||
|
||||
/*
|
||||
* Description for a device.
|
||||
* This is used to describe a device that is to be created or to query
|
||||
* the current device.
|
||||
*/
|
||||
typedef struct _D3DDeviceDesc {
|
||||
DWORD dwSize; /* Size of D3DDEVICEDESC structure */
|
||||
DWORD dwFlags; /* Indicates which fields have valid data */
|
||||
D3DCOLORMODEL dcmColorModel; /* Color model of device */
|
||||
DWORD dwDevCaps; /* Capabilities of device */
|
||||
D3DTRANSFORMCAPS dtcTransformCaps; /* Capabilities of transform */
|
||||
BOOL bClipping; /* Device can do 3D clipping */
|
||||
D3DLIGHTINGCAPS dlcLightingCaps; /* Capabilities of lighting */
|
||||
D3DPRIMCAPS dpcLineCaps;
|
||||
D3DPRIMCAPS dpcTriCaps;
|
||||
DWORD dwDeviceRenderBitDepth; /* One of DDBB_8, 16, etc.. */
|
||||
DWORD dwDeviceZBufferBitDepth;/* One of DDBD_16, 32, etc.. */
|
||||
DWORD dwMaxBufferSize; /* Maximum execute buffer size */
|
||||
DWORD dwMaxVertexCount; /* Maximum vertex count */
|
||||
} D3DDEVICEDESC, *LPD3DDEVICEDESC;
|
||||
|
||||
typedef HRESULT (FAR PASCAL * LPD3DENUMDEVICESCALLBACK)(LPGUID lpGuid, LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC, LPD3DDEVICEDESC, LPVOID);
|
||||
|
||||
/* D3DDEVICEDESC dwFlags indicating valid fields */
|
||||
|
||||
#define D3DDD_COLORMODEL 0x00000001L /* dcmColorModel is valid */
|
||||
#define D3DDD_DEVCAPS 0x00000002L /* dwDevCaps is valid */
|
||||
#define D3DDD_TRANSFORMCAPS 0x00000004L /* dtcTransformCaps is valid */
|
||||
#define D3DDD_LIGHTINGCAPS 0x00000008L /* dlcLightingCaps is valid */
|
||||
#define D3DDD_BCLIPPING 0x00000010L /* bClipping is valid */
|
||||
#define D3DDD_LINECAPS 0x00000020L /* dpcLineCaps is valid */
|
||||
#define D3DDD_TRICAPS 0x00000040L /* dpcTriCaps is valid */
|
||||
#define D3DDD_DEVICERENDERBITDEPTH 0x00000080L /* dwDeviceRenderBitDepth is valid */
|
||||
#define D3DDD_DEVICEZBUFFERBITDEPTH 0x00000100L /* dwDeviceZBufferBitDepth is valid */
|
||||
#define D3DDD_MAXBUFFERSIZE 0x00000200L /* dwMaxBufferSize is valid */
|
||||
#define D3DDD_MAXVERTEXCOUNT 0x00000400L /* dwMaxVertexCount is valid */
|
||||
|
||||
/* D3DDEVICEDESC dwDevCaps flags */
|
||||
|
||||
#define D3DDEVCAPS_FLOATTLVERTEX 0x00000001L /* Device accepts floating point */
|
||||
/* for post-transform vertex data */
|
||||
#define D3DDEVCAPS_SORTINCREASINGZ 0x00000002L /* Device needs data sorted for increasing Z*/
|
||||
#define D3DDEVCAPS_SORTDECREASINGZ 0X00000004L /* Device needs data sorted for decreasing Z*/
|
||||
#define D3DDEVCAPS_SORTEXACT 0x00000008L /* Device needs data sorted exactly */
|
||||
|
||||
#define D3DDEVCAPS_EXECUTESYSTEMMEMORY 0x00000010L /* Device can use execute buffers from system memory */
|
||||
#define D3DDEVCAPS_EXECUTEVIDEOMEMORY 0x00000020L /* Device can use execute buffers from video memory */
|
||||
#define D3DDEVCAPS_TLVERTEXSYSTEMMEMORY 0x00000040L /* Device can use TL buffers from system memory */
|
||||
#define D3DDEVCAPS_TLVERTEXVIDEOMEMORY 0x00000080L /* Device can use TL buffers from video memory */
|
||||
#define D3DDEVCAPS_TEXTURESYSTEMMEMORY 0x00000100L /* Device can texture from system memory */
|
||||
#define D3DDEVCAPS_TEXTUREVIDEOMEMORY 0x00000200L /* Device can texture from device memory */
|
||||
|
||||
#define D3DFDS_COLORMODEL 0x00000001L /* Match color model */
|
||||
#define D3DFDS_GUID 0x00000002L /* Match guid */
|
||||
#define D3DFDS_HARDWARE 0x00000004L /* Match hardware/software */
|
||||
#define D3DFDS_TRIANGLES 0x00000008L /* Match in triCaps */
|
||||
#define D3DFDS_LINES 0x00000010L /* Match in lineCaps */
|
||||
#define D3DFDS_MISCCAPS 0x00000020L /* Match primCaps.dwMiscCaps */
|
||||
#define D3DFDS_RASTERCAPS 0x00000040L /* Match primCaps.dwRasterCaps */
|
||||
#define D3DFDS_ZCMPCAPS 0x00000080L /* Match primCaps.dwZCmpCaps */
|
||||
#define D3DFDS_ALPHACMPCAPS 0x00000100L /* Match primCaps.dwAlphaCmpCaps */
|
||||
#define D3DFDS_SRCBLENDCAPS 0x00000200L /* Match primCaps.dwSourceBlendCaps */
|
||||
#define D3DFDS_DSTBLENDCAPS 0x00000400L /* Match primCaps.dwDestBlendCaps */
|
||||
#define D3DFDS_SHADECAPS 0x00000800L /* Match primCaps.dwShadeCaps */
|
||||
#define D3DFDS_TEXTURECAPS 0x00001000L /* Match primCaps.dwTextureCaps */
|
||||
#define D3DFDS_TEXTUREFILTERCAPS 0x00002000L /* Match primCaps.dwTextureFilterCaps */
|
||||
#define D3DFDS_TEXTUREBLENDCAPS 0x00004000L /* Match primCaps.dwTextureBlendCaps */
|
||||
#define D3DFDS_TEXTUREADDRESSCAPS 0x00008000L /* Match primCaps.dwTextureBlendCaps */
|
||||
|
||||
/*
|
||||
* FindDevice arguments
|
||||
*/
|
||||
typedef struct _D3DFINDDEVICESEARCH {
|
||||
DWORD dwSize;
|
||||
DWORD dwFlags;
|
||||
BOOL bHardware;
|
||||
D3DCOLORMODEL dcmColorModel;
|
||||
GUID guid;
|
||||
DWORD dwCaps;
|
||||
D3DPRIMCAPS dpcPrimCaps;
|
||||
} D3DFINDDEVICESEARCH, *LPD3DFINDDEVICESEARCH;
|
||||
|
||||
typedef struct _D3DFINDDEVICERESULT {
|
||||
DWORD dwSize;
|
||||
GUID guid; /* guid which matched */
|
||||
D3DDEVICEDESC ddHwDesc; /* hardware D3DDEVICEDESC */
|
||||
D3DDEVICEDESC ddSwDesc; /* software D3DDEVICEDESC */
|
||||
} D3DFINDDEVICERESULT, *LPD3DFINDDEVICERESULT;
|
||||
|
||||
/*
|
||||
* Description of execute buffer.
|
||||
*/
|
||||
typedef struct _D3DExecuteBufferDesc {
|
||||
DWORD dwSize; /* size of this structure */
|
||||
DWORD dwFlags; /* flags indicating which fields are valid */
|
||||
DWORD dwCaps; /* capabilities of execute buffer */
|
||||
DWORD dwBufferSize; /* size of execute buffer data */
|
||||
LPVOID lpData; /* pointer to actual data */
|
||||
} D3DEXECUTEBUFFERDESC, *LPD3DEXECUTEBUFFERDESC;
|
||||
|
||||
/* D3DEXECUTEBUFFER dwFlags indicating valid fields */
|
||||
|
||||
#define D3DDEB_BUFSIZE 0x00000001l /* buffer size valid */
|
||||
#define D3DDEB_CAPS 0x00000002l /* caps valid */
|
||||
#define D3DDEB_LPDATA 0x00000004l /* lpData valid */
|
||||
|
||||
/* D3DEXECUTEBUFFER dwCaps */
|
||||
|
||||
#define D3DDEBCAPS_SYSTEMMEMORY 0x00000001l /* buffer in system memory */
|
||||
#define D3DDEBCAPS_VIDEOMEMORY 0x00000002l /* buffer in device memory */
|
||||
#define D3DDEBCAPS_MEM (D3DDEBCAPS_SYSTEMMEMORY|D3DDEBCAPS_VIDEOMEMORY)
|
||||
|
||||
#pragma pack()
|
||||
|
||||
#endif /* _D3DCAPS_H_ */
|
||||
134
WinQuake/dxsdk/SDK/INC/D3DRM.H
Normal file
134
WinQuake/dxsdk/SDK/INC/D3DRM.H
Normal file
@@ -0,0 +1,134 @@
|
||||
/*==========================================================================;
|
||||
*
|
||||
* Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved.
|
||||
*
|
||||
* File: d3drm.h
|
||||
* Content: Direct3DRM include file
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef __D3DRM_H__
|
||||
#define __D3DRM_H__
|
||||
|
||||
#include "d3drmobj.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
struct IDirect3DRM;
|
||||
#endif
|
||||
|
||||
|
||||
typedef void (*D3DRMDEVICEPALETTECALLBACK)
|
||||
(LPDIRECT3DRMDEVICE lpDirect3DRMDev, LPVOID lpArg, DWORD dwIndex, LONG red, LONG green, LONG blue);
|
||||
|
||||
DEFINE_GUID(IID_IDirect3DRM, 0x2bc49361, 0x8327, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
WIN_TYPES(IDirect3DRM, DIRECT3DRM);
|
||||
|
||||
|
||||
/* Create a Direct3DRM API */
|
||||
STDAPI Direct3DRMCreate(LPDIRECT3DRM FAR *lplpDirect3DRM);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRM
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRM, IUnknown)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
|
||||
STDMETHOD(CreateObject)
|
||||
(THIS_ REFCLSID rclsid, LPUNKNOWN pUnkOuter, REFIID riid, LPVOID FAR* ppv) PURE;
|
||||
STDMETHOD(CreateFrame) (THIS_ LPDIRECT3DRMFRAME, LPDIRECT3DRMFRAME *) PURE;
|
||||
STDMETHOD(CreateMesh) (THIS_ LPDIRECT3DRMMESH *) PURE;
|
||||
STDMETHOD(CreateMeshBuilder)(THIS_ LPDIRECT3DRMMESHBUILDER *) PURE;
|
||||
STDMETHOD(CreateFace) (THIS_ LPDIRECT3DRMFACE *) PURE;
|
||||
STDMETHOD(CreateAnimation) (THIS_ LPDIRECT3DRMANIMATION *) PURE;
|
||||
STDMETHOD(CreateAnimationSet)(THIS_ LPDIRECT3DRMANIMATIONSET *) PURE;
|
||||
STDMETHOD(CreateTexture) (THIS_ LPD3DRMIMAGE, LPDIRECT3DRMTEXTURE *) PURE;
|
||||
STDMETHOD(CreateLight) (THIS_ D3DRMLIGHTTYPE, D3DCOLOR, LPDIRECT3DRMLIGHT *) PURE;
|
||||
STDMETHOD(CreateLightRGB)
|
||||
(THIS_ D3DRMLIGHTTYPE, D3DVALUE, D3DVALUE, D3DVALUE, LPDIRECT3DRMLIGHT *) PURE;
|
||||
STDMETHOD(CreateMaterial) (THIS_ D3DVALUE, LPDIRECT3DRMMATERIAL *) PURE;
|
||||
STDMETHOD(CreateDevice) (THIS_ DWORD, DWORD, LPDIRECT3DRMDEVICE *) PURE;
|
||||
|
||||
/* Create a Windows Device using DirectDraw surfaces */
|
||||
STDMETHOD(CreateDeviceFromSurface)
|
||||
( THIS_ LPGUID lpGUID, LPDIRECTDRAW lpDD,
|
||||
LPDIRECTDRAWSURFACE lpDDSBack, LPDIRECT3DRMDEVICE *
|
||||
) PURE;
|
||||
|
||||
/* Create a Windows Device using D3D objects */
|
||||
STDMETHOD(CreateDeviceFromD3D)
|
||||
( THIS_ LPDIRECT3D lpD3D, LPDIRECT3DDEVICE lpD3DDev,
|
||||
LPDIRECT3DRMDEVICE *
|
||||
) PURE;
|
||||
|
||||
STDMETHOD(CreateDeviceFromClipper)
|
||||
( THIS_ LPDIRECTDRAWCLIPPER lpDDClipper, LPGUID lpGUID,
|
||||
int width, int height, LPDIRECT3DRMDEVICE *) PURE;
|
||||
|
||||
STDMETHOD(CreateTextureFromSurface)(THIS_ LPDIRECTDRAWSURFACE lpDDS, LPDIRECT3DRMTEXTURE *) PURE;
|
||||
|
||||
STDMETHOD(CreateShadow)
|
||||
( THIS_ LPDIRECT3DRMVISUAL, LPDIRECT3DRMLIGHT,
|
||||
D3DVALUE px, D3DVALUE py, D3DVALUE pz,
|
||||
D3DVALUE nx, D3DVALUE ny, D3DVALUE nz,
|
||||
LPDIRECT3DRMVISUAL *
|
||||
) PURE;
|
||||
STDMETHOD(CreateViewport)
|
||||
( THIS_ LPDIRECT3DRMDEVICE, LPDIRECT3DRMFRAME, DWORD, DWORD,
|
||||
DWORD, DWORD, LPDIRECT3DRMVIEWPORT *
|
||||
) PURE;
|
||||
STDMETHOD(CreateWrap)
|
||||
( THIS_ D3DRMWRAPTYPE, LPDIRECT3DRMFRAME,
|
||||
D3DVALUE ox, D3DVALUE oy, D3DVALUE oz,
|
||||
D3DVALUE dx, D3DVALUE dy, D3DVALUE dz,
|
||||
D3DVALUE ux, D3DVALUE uy, D3DVALUE uz,
|
||||
D3DVALUE ou, D3DVALUE ov,
|
||||
D3DVALUE su, D3DVALUE sv,
|
||||
LPDIRECT3DRMWRAP *
|
||||
) PURE;
|
||||
STDMETHOD(CreateUserVisual) (THIS_ D3DRMUSERVISUALCALLBACK, LPVOID lPArg, LPDIRECT3DRMUSERVISUAL *) PURE;
|
||||
STDMETHOD(LoadTexture) (THIS_ const char *, LPDIRECT3DRMTEXTURE *) PURE;
|
||||
STDMETHOD(LoadTextureFromResource) (THIS_ HRSRC rs, LPDIRECT3DRMTEXTURE *) PURE;
|
||||
|
||||
STDMETHOD(SetSearchPath) (THIS_ LPCSTR) PURE;
|
||||
STDMETHOD(AddSearchPath) (THIS_ LPCSTR) PURE;
|
||||
STDMETHOD(GetSearchPath) (THIS_ DWORD *size_return, LPSTR path_return);
|
||||
//STDMETHOD(GetSearchPath) (THIS_ int *return_count, char ***return_path) PURE;
|
||||
STDMETHOD(SetDefaultTextureColors)(THIS_ DWORD) PURE;
|
||||
STDMETHOD(SetDefaultTextureShades)(THIS_ DWORD) PURE;
|
||||
|
||||
STDMETHOD(GetDevices) (THIS_ LPDIRECT3DRMDEVICEARRAY *) PURE;
|
||||
STDMETHOD(GetNamedObject) (THIS_ const char *, LPDIRECT3DRMOBJECT *) PURE;
|
||||
|
||||
STDMETHOD(EnumerateObjects) (THIS_ D3DRMOBJECTCALLBACK, LPVOID) PURE;
|
||||
|
||||
STDMETHOD(Load)
|
||||
( THIS_ LPVOID, LPVOID, LPIID *, DWORD, D3DRMLOADOPTIONS,
|
||||
D3DRMLOADCALLBACK, LPVOID, D3DRMLOADTEXTURECALLBACK, LPVOID,
|
||||
LPDIRECT3DRMFRAME
|
||||
) PURE;
|
||||
STDMETHOD(Tick) (THIS_ D3DVALUE) PURE;
|
||||
};
|
||||
|
||||
#define D3DRM_OK DD_OK
|
||||
#define D3DRMERR_BADOBJECT MAKE_DDHRESULT(781)
|
||||
#define D3DRMERR_BADTYPE MAKE_DDHRESULT(782)
|
||||
#define D3DRMERR_BADALLOC MAKE_DDHRESULT(783)
|
||||
#define D3DRMERR_FACEUSED MAKE_DDHRESULT(784)
|
||||
#define D3DRMERR_NOTFOUND MAKE_DDHRESULT(785)
|
||||
#define D3DRMERR_NOTDONEYET MAKE_DDHRESULT(786)
|
||||
#define D3DRMERR_FILENOTFOUND MAKE_DDHRESULT(787)
|
||||
#define D3DRMERR_BADFILE MAKE_DDHRESULT(788)
|
||||
#define D3DRMERR_BADDEVICE MAKE_DDHRESULT(789)
|
||||
#define D3DRMERR_BADVALUE MAKE_DDHRESULT(790)
|
||||
#define D3DRMERR_BADMAJORVERSION MAKE_DDHRESULT(791)
|
||||
#define D3DRMERR_BADMINORVERSION MAKE_DDHRESULT(792)
|
||||
#define D3DRMERR_UNABLETOEXECUTE MAKE_DDHRESULT(793)
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif /* _D3DRMAPI_H_ */
|
||||
|
||||
402
WinQuake/dxsdk/SDK/INC/D3DRMDEF.H
Normal file
402
WinQuake/dxsdk/SDK/INC/D3DRMDEF.H
Normal file
@@ -0,0 +1,402 @@
|
||||
/*==========================================================================;
|
||||
*
|
||||
* Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved.
|
||||
*
|
||||
* File: d3drm.h
|
||||
* Content: Direct3DRM include file
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef __D3DRMDEFS_H__
|
||||
#define __D3DRMDEFS_H__
|
||||
|
||||
#include <stddef.h>
|
||||
#include "d3dtypes.h"
|
||||
|
||||
#ifdef WIN32
|
||||
#define D3DRMAPI __stdcall
|
||||
#else
|
||||
#define D3DRMAPI
|
||||
#endif
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef TRUE
|
||||
#define FALSE 0
|
||||
#define TRUE 1
|
||||
#endif
|
||||
|
||||
typedef struct _D3DRMVECTOR4D
|
||||
{ D3DVALUE x, y, z, w;
|
||||
} D3DRMVECTOR4D, *LPD3DRMVECTOR4D;
|
||||
|
||||
typedef D3DVALUE D3DRMMATRIX4D[4][4];
|
||||
|
||||
typedef struct _D3DRMQUATERNION
|
||||
{ D3DVALUE s;
|
||||
D3DVECTOR v;
|
||||
} D3DRMQUATERNION, *LPD3DRMQUATERNION;
|
||||
|
||||
typedef struct _D3DRMBOX
|
||||
{ D3DVECTOR min, max;
|
||||
} D3DRMBOX, *LPD3DRMBOX;
|
||||
|
||||
typedef void (*D3DRMWRAPCALLBACK)
|
||||
(LPD3DVECTOR, int* u, int* v, LPD3DVECTOR a, LPD3DVECTOR b, LPVOID);
|
||||
|
||||
typedef enum _D3DRMLIGHTTYPE
|
||||
{ D3DRMLIGHT_AMBIENT,
|
||||
D3DRMLIGHT_POINT,
|
||||
D3DRMLIGHT_SPOT,
|
||||
D3DRMLIGHT_DIRECTIONAL,
|
||||
D3DRMLIGHT_PARALLELPOINT
|
||||
} D3DRMLIGHTTYPE, *LPD3DRMLIGHTTYPE;
|
||||
|
||||
typedef enum _D3DRMSHADEMODE {
|
||||
D3DRMSHADE_FLAT = 0,
|
||||
D3DRMSHADE_GOURAUD = 1,
|
||||
D3DRMSHADE_PHONG = 2,
|
||||
|
||||
D3DRMSHADE_MASK = 7,
|
||||
D3DRMSHADE_MAX = 8
|
||||
} D3DRMSHADEMODE, *LPD3DRMSHADEMODE;
|
||||
|
||||
typedef enum _D3DRMLIGHTMODE {
|
||||
D3DRMLIGHT_OFF = 0 * D3DRMSHADE_MAX,
|
||||
D3DRMLIGHT_ON = 1 * D3DRMSHADE_MAX,
|
||||
|
||||
D3DRMLIGHT_MASK = 7 * D3DRMSHADE_MAX,
|
||||
D3DRMLIGHT_MAX = 8 * D3DRMSHADE_MAX
|
||||
} D3DRMLIGHTMODE, *LPD3DRMLIGHTMODE;
|
||||
|
||||
typedef enum _D3DRMFILLMODE {
|
||||
D3DRMFILL_POINTS = 0 * D3DRMLIGHT_MAX,
|
||||
D3DRMFILL_WIREFRAME = 1 * D3DRMLIGHT_MAX,
|
||||
D3DRMFILL_SOLID = 2 * D3DRMLIGHT_MAX,
|
||||
|
||||
D3DRMFILL_MASK = 7 * D3DRMLIGHT_MAX,
|
||||
D3DRMFILL_MAX = 8 * D3DRMLIGHT_MAX
|
||||
} D3DRMFILLMODE, *LPD3DRMFILLMODE;
|
||||
|
||||
typedef DWORD D3DRMRENDERQUALITY, *LPD3DRMRENDERQUALITY;
|
||||
|
||||
#define D3DRMRENDER_WIREFRAME (D3DRMSHADE_FLAT+D3DRMLIGHT_OFF+D3DRMFILL_WIREFRAME)
|
||||
#define D3DRMRENDER_UNLITFLAT (D3DRMSHADE_FLAT+D3DRMLIGHT_OFF+D3DRMFILL_SOLID)
|
||||
#define D3DRMRENDER_FLAT (D3DRMSHADE_FLAT+D3DRMLIGHT_ON+D3DRMFILL_SOLID)
|
||||
#define D3DRMRENDER_GOURAUD (D3DRMSHADE_GOURAUD+D3DRMLIGHT_ON+D3DRMFILL_SOLID)
|
||||
#define D3DRMRENDER_PHONG (D3DRMSHADE_PHONG+D3DRMLIGHT_ON+D3DRMFILL_SOLID)
|
||||
|
||||
typedef enum _D3DRMTEXTUREQUALITY
|
||||
{ D3DRMTEXTURE_NEAREST, /* choose nearest texel */
|
||||
D3DRMTEXTURE_LINEAR, /* interpolate 4 texels */
|
||||
D3DRMTEXTURE_MIPNEAREST, /* nearest texel in nearest mipmap */
|
||||
D3DRMTEXTURE_MIPLINEAR, /* interpolate 2 texels from 2 mipmaps */
|
||||
D3DRMTEXTURE_LINEARMIPNEAREST, /* interpolate 4 texels in nearest mipmap */
|
||||
D3DRMTEXTURE_LINEARMIPLINEAR /* interpolate 8 texels from 2 mipmaps */
|
||||
} D3DRMTEXTUREQUALITY, *LPD3DRMTEXTUREQUALITY;
|
||||
|
||||
typedef enum _D3DRMCOMBINETYPE
|
||||
{ D3DRMCOMBINE_REPLACE,
|
||||
D3DRMCOMBINE_BEFORE,
|
||||
D3DRMCOMBINE_AFTER
|
||||
} D3DRMCOMBINETYPE, *LPD3DRMCOMBINETYPE;
|
||||
|
||||
typedef D3DCOLORMODEL D3DRMCOLORMODEL, *LPD3DRMCOLORMODEL;
|
||||
|
||||
typedef enum _D3DRMPALETTEFLAGS
|
||||
{ D3DRMPALETTE_FREE, /* renderer may use this entry freely */
|
||||
D3DRMPALETTE_READONLY, /* fixed but may be used by renderer */
|
||||
D3DRMPALETTE_RESERVED /* may not be used by renderer */
|
||||
} D3DRMPALETTEFLAGS, *LPD3DRMPALETTEFLAGS;
|
||||
|
||||
typedef struct _D3DRMPALETTEENTRY
|
||||
{ unsigned char red; /* 0 .. 255 */
|
||||
unsigned char green; /* 0 .. 255 */
|
||||
unsigned char blue; /* 0 .. 255 */
|
||||
unsigned char flags; /* one of D3DRMPALETTEFLAGS */
|
||||
} D3DRMPALETTEENTRY, *LPD3DRMPALETTEENTRY;
|
||||
|
||||
typedef struct _D3DRMIMAGE
|
||||
{ int width, height; /* width and height in pixels */
|
||||
int aspectx, aspecty; /* aspect ratio for non-square pixels */
|
||||
int depth; /* bits per pixel */
|
||||
int rgb; /* if false, pixels are indices into a
|
||||
palette otherwise, pixels encode
|
||||
RGB values. */
|
||||
int bytes_per_line; /* number of bytes of memory for a
|
||||
scanline. This must be a multiple
|
||||
of 4. */
|
||||
void* buffer1; /* memory to render into (first buffer). */
|
||||
void* buffer2; /* second rendering buffer for double
|
||||
buffering, set to NULL for single
|
||||
buffering. */
|
||||
unsigned long red_mask;
|
||||
unsigned long green_mask;
|
||||
unsigned long blue_mask;
|
||||
unsigned long alpha_mask; /* if rgb is true, these are masks for
|
||||
the red, green and blue parts of a
|
||||
pixel. Otherwise, these are masks
|
||||
for the significant bits of the
|
||||
red, green and blue elements in the
|
||||
palette. For instance, most SVGA
|
||||
displays use 64 intensities of red,
|
||||
green and blue, so the masks should
|
||||
all be set to 0xfc. */
|
||||
int palette_size; /* number of entries in palette */
|
||||
D3DRMPALETTEENTRY* palette; /* description of the palette (only if
|
||||
rgb is false). Must be (1<<depth)
|
||||
elements. */
|
||||
} D3DRMIMAGE, *LPD3DRMIMAGE;
|
||||
|
||||
typedef enum _D3DRMWRAPTYPE
|
||||
{ D3DRMWRAP_FLAT,
|
||||
D3DRMWRAP_CYLINDER,
|
||||
D3DRMWRAP_SPHERE,
|
||||
D3DRMWRAP_CHROME
|
||||
} D3DRMWRAPTYPE, *LPD3DRMWRAPTYPE;
|
||||
|
||||
#define D3DRMWIREFRAME_CULL 1 /* cull backfaces */
|
||||
#define D3DRMWIREFRAME_HIDDENLINE 2 /* lines are obscured by closer objects */
|
||||
|
||||
typedef enum _D3DRMPROJECTIONTYPE
|
||||
{ D3DRMPROJECT_PERSPECTIVE,
|
||||
D3DRMPROJECT_ORTHOGRAPHIC
|
||||
} D3DRMPROJECTIONTYPE, *LPD3DRMPROJECTIONTYPE;
|
||||
|
||||
typedef enum _D3DRMXOFFORMAT
|
||||
{ D3DRMXOF_BINARY,
|
||||
D3DRMXOF_COMPRESSED,
|
||||
D3DRMXOF_TEXT
|
||||
} D3DRMXOFFORMAT, *LPD3DRMXOFFORMAT;
|
||||
|
||||
typedef DWORD D3DRMSAVEOPTIONS;
|
||||
#define D3DRMXOFSAVE_NORMALS 1
|
||||
#define D3DRMXOFSAVE_TEXTURECOORDINATES 2
|
||||
#define D3DRMXOFSAVE_MATERIALS 4
|
||||
#define D3DRMXOFSAVE_TEXTURENAMES 8
|
||||
#define D3DRMXOFSAVE_ALL 15
|
||||
|
||||
typedef enum _D3DRMCOLORSOURCE
|
||||
{ D3DRMCOLOR_FROMFACE,
|
||||
D3DRMCOLOR_FROMVERTEX
|
||||
} D3DRMCOLORSOURCE, *LPD3DRMCOLORSOURCE;
|
||||
|
||||
typedef enum _D3DRMFRAMECONSTRAINT
|
||||
{ D3DRMCONSTRAIN_Z, /* use only X and Y rotations */
|
||||
D3DRMCONSTRAIN_Y, /* use only X and Z rotations */
|
||||
D3DRMCONSTRAIN_X /* use only Y and Z rotations */
|
||||
} D3DRMFRAMECONSTRAINT, *LPD3DRMFRAMECONSTRAINT;
|
||||
|
||||
typedef enum _D3DRMMATERIALMODE
|
||||
{ D3DRMMATERIAL_FROMMESH,
|
||||
D3DRMMATERIAL_FROMPARENT,
|
||||
D3DRMMATERIAL_FROMFRAME
|
||||
} D3DRMMATERIALMODE, *LPD3DRMMATERIALMODE;
|
||||
|
||||
typedef enum _D3DRMFOGMODE
|
||||
{ D3DRMFOG_LINEAR, /* linear between start and end */
|
||||
D3DRMFOG_EXPONENTIAL, /* density * exp(-distance) */
|
||||
D3DRMFOG_EXPONENTIALSQUARED /* density * exp(-distance*distance) */
|
||||
} D3DRMFOGMODE, *LPD3DRMFOGMODE;
|
||||
|
||||
typedef enum _D3DRMZBUFFERMODE {
|
||||
D3DRMZBUFFER_FROMPARENT, /* default */
|
||||
D3DRMZBUFFER_ENABLE, /* enable zbuffering */
|
||||
D3DRMZBUFFER_DISABLE /* disable zbuffering */
|
||||
} D3DRMZBUFFERMODE, *LPD3DRMZBUFFERMODE;
|
||||
|
||||
typedef enum _D3DRMSORTMODE {
|
||||
D3DRMSORT_FROMPARENT, /* default */
|
||||
D3DRMSORT_NONE, /* don't sort child frames */
|
||||
D3DRMSORT_FRONTTOBACK, /* sort child frames front-to-back */
|
||||
D3DRMSORT_BACKTOFRONT /* sort child frames back-to-front */
|
||||
} D3DRMSORTMODE, *LPD3DRMSORTMODE;
|
||||
|
||||
typedef DWORD D3DRMANIMATIONOPTIONS;
|
||||
#define D3DRMANIMATION_OPEN 0x01L
|
||||
#define D3DRMANIMATION_CLOSED 0x02L
|
||||
#define D3DRMANIMATION_LINEARPOSITION 0x04L
|
||||
#define D3DRMANIMATION_SPLINEPOSITION 0x08L
|
||||
#define D3DRMANIMATION_SCALEANDROTATION 0x00000010L
|
||||
#define D3DRMANIMATION_POSITION 0x00000020L
|
||||
|
||||
typedef DWORD D3DRMLOADOPTIONS;
|
||||
|
||||
#define D3DRMLOAD_FROMFILE 0x00L
|
||||
#define D3DRMLOAD_FROMRESOURCE 0x01L
|
||||
#define D3DRMLOAD_FROMMEMORY 0x02L
|
||||
#define D3DRMLOAD_FROMSTREAM 0x04L
|
||||
|
||||
#define D3DRMLOAD_BYNAME 0x10L
|
||||
#define D3DRMLOAD_BYPOSITION 0x20L
|
||||
#define D3DRMLOAD_BYGUID 0x40L
|
||||
#define D3DRMLOAD_FIRST 0x80L
|
||||
|
||||
#define D3DRMLOAD_INSTANCEBYREFERENCE 0x100L
|
||||
#define D3DRMLOAD_INSTANCEBYCOPYING 0x200L
|
||||
|
||||
typedef struct _D3DRMLOADRESOURCE {
|
||||
HMODULE hModule;
|
||||
LPCTSTR lpName;
|
||||
LPCTSTR lpType;
|
||||
} D3DRMLOADRESOURCE, *LPD3DRMLOADRESOURCE;
|
||||
|
||||
typedef struct _D3DRMLOADMEMORY {
|
||||
LPVOID lpMemory;
|
||||
DWORD dSize;
|
||||
} D3DRMLOADMEMORY, *LPD3DRMLOADMEMORY;
|
||||
|
||||
typedef enum _D3DRMUSERVISUALREASON {
|
||||
D3DRMUSERVISUAL_CANSEE,
|
||||
D3DRMUSERVISUAL_RENDER
|
||||
} D3DRMUSERVISUALREASON, *LPD3DRMUSERVISUALREASON;
|
||||
|
||||
|
||||
typedef DWORD D3DRMMAPPING, D3DRMMAPPINGFLAG, *LPD3DRMMAPPING;
|
||||
static const D3DRMMAPPINGFLAG D3DRMMAP_WRAPU = 1;
|
||||
static const D3DRMMAPPINGFLAG D3DRMMAP_WRAPV = 2;
|
||||
static const D3DRMMAPPINGFLAG D3DRMMAP_PERSPCORRECT = 4;
|
||||
|
||||
typedef struct _D3DRMVERTEX
|
||||
{ D3DVECTOR position;
|
||||
D3DVECTOR normal;
|
||||
D3DVALUE tu, tv;
|
||||
D3DCOLOR color;
|
||||
} D3DRMVERTEX, *LPD3DRMVERTEX;
|
||||
|
||||
typedef LONG D3DRMGROUPINDEX; /* group indexes begin a 0 */
|
||||
static const D3DRMGROUPINDEX D3DRMGROUP_ALLGROUPS = -1;
|
||||
|
||||
/*
|
||||
* Create a color from three components in the range 0-1 inclusive.
|
||||
*/
|
||||
extern D3DCOLOR D3DRMAPI D3DRMCreateColorRGB(D3DVALUE red,
|
||||
D3DVALUE green,
|
||||
D3DVALUE blue);
|
||||
|
||||
/*
|
||||
* Create a color from four components in the range 0-1 inclusive.
|
||||
*/
|
||||
extern D3DCOLOR D3DRMAPI D3DRMCreateColorRGBA(D3DVALUE red,
|
||||
D3DVALUE green,
|
||||
D3DVALUE blue,
|
||||
D3DVALUE alpha);
|
||||
|
||||
/*
|
||||
* Get the red component of a color.
|
||||
*/
|
||||
extern D3DVALUE D3DRMAPI D3DRMColorGetRed(D3DCOLOR);
|
||||
|
||||
/*
|
||||
* Get the green component of a color.
|
||||
*/
|
||||
extern D3DVALUE D3DRMAPI D3DRMColorGetGreen(D3DCOLOR);
|
||||
|
||||
/*
|
||||
* Get the blue component of a color.
|
||||
*/
|
||||
extern D3DVALUE D3DRMAPI D3DRMColorGetBlue(D3DCOLOR);
|
||||
|
||||
/*
|
||||
* Get the alpha component of a color.
|
||||
*/
|
||||
extern D3DVALUE D3DRMAPI D3DRMColorGetAlpha(D3DCOLOR);
|
||||
|
||||
/*
|
||||
* Add two vectors. Returns its first argument.
|
||||
*/
|
||||
extern LPD3DVECTOR D3DRMAPI D3DRMVectorAdd(LPD3DVECTOR d,
|
||||
LPD3DVECTOR s1,
|
||||
LPD3DVECTOR s2);
|
||||
|
||||
/*
|
||||
* Subtract two vectors. Returns its first argument.
|
||||
*/
|
||||
extern LPD3DVECTOR D3DRMAPI D3DRMVectorSubtract(LPD3DVECTOR d,
|
||||
LPD3DVECTOR s1,
|
||||
LPD3DVECTOR s2);
|
||||
/*
|
||||
* Reflect a ray about a given normal. Returns its first argument.
|
||||
*/
|
||||
extern LPD3DVECTOR D3DRMAPI D3DRMVectorReflect(LPD3DVECTOR d,
|
||||
LPD3DVECTOR ray,
|
||||
LPD3DVECTOR norm);
|
||||
|
||||
/*
|
||||
* Calculate the vector cross product. Returns its first argument.
|
||||
*/
|
||||
extern LPD3DVECTOR D3DRMAPI D3DRMVectorCrossProduct(LPD3DVECTOR d,
|
||||
LPD3DVECTOR s1,
|
||||
LPD3DVECTOR s2);
|
||||
/*
|
||||
* Return the vector dot product.
|
||||
*/
|
||||
extern D3DVALUE D3DRMAPI D3DRMVectorDotProduct(LPD3DVECTOR s1,
|
||||
LPD3DVECTOR s2);
|
||||
|
||||
/*
|
||||
* Scale a vector so that its modulus is 1. Returns its argument or
|
||||
* NULL if there was an error (e.g. a zero vector was passed).
|
||||
*/
|
||||
extern LPD3DVECTOR D3DRMAPI D3DRMVectorNormalize(LPD3DVECTOR);
|
||||
#define D3DRMVectorNormalise D3DRMVectorNormalize
|
||||
|
||||
/*
|
||||
* Return the length of a vector (e.g. sqrt(x*x + y*y + z*z)).
|
||||
*/
|
||||
extern D3DVALUE D3DRMAPI D3DRMVectorModulus(LPD3DVECTOR v);
|
||||
|
||||
/*
|
||||
* Set the rotation part of a matrix to be a rotation of theta radians
|
||||
* around the given axis.
|
||||
*/
|
||||
|
||||
extern LPD3DVECTOR D3DRMAPI D3DRMVectorRotate(LPD3DVECTOR r, LPD3DVECTOR v, LPD3DVECTOR axis, D3DVALUE theta);
|
||||
|
||||
/*
|
||||
* Scale a vector uniformly in all three axes
|
||||
*/
|
||||
extern LPD3DVECTOR D3DRMAPI D3DRMVectorScale(LPD3DVECTOR d, LPD3DVECTOR s, D3DVALUE factor);
|
||||
|
||||
/*
|
||||
* Return a random unit vector
|
||||
*/
|
||||
extern LPD3DVECTOR D3DRMAPI D3DRMVectorRandom(LPD3DVECTOR d);
|
||||
|
||||
/*
|
||||
* Returns a unit quaternion that represents a rotation of theta radians
|
||||
* around the given axis.
|
||||
*/
|
||||
|
||||
extern LPD3DRMQUATERNION D3DRMAPI D3DRMQuaternionFromRotation(LPD3DRMQUATERNION quat,
|
||||
LPD3DVECTOR v,
|
||||
D3DVALUE theta);
|
||||
|
||||
/*
|
||||
* Calculate the product of two quaternions
|
||||
*/
|
||||
extern LPD3DRMQUATERNION D3DRMAPI D3DRMQuaternionMultiply(LPD3DRMQUATERNION q,
|
||||
LPD3DRMQUATERNION a,
|
||||
LPD3DRMQUATERNION b);
|
||||
|
||||
/*
|
||||
* Interpolate between two quaternions
|
||||
*/
|
||||
extern LPD3DRMQUATERNION D3DRMAPI D3DRMQuaternionSlerp(LPD3DRMQUATERNION q,
|
||||
LPD3DRMQUATERNION a,
|
||||
LPD3DRMQUATERNION b,
|
||||
D3DVALUE alpha);
|
||||
|
||||
/*
|
||||
* Calculate the matrix for the rotation that a unit quaternion represents
|
||||
*/
|
||||
extern void D3DRMAPI D3DRMMatrixFromQuaternion(D3DRMMATRIX4D dmMat, LPD3DRMQUATERNION lpDqQuat);
|
||||
|
||||
|
||||
#if defined(__cplusplus)
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
||||
727
WinQuake/dxsdk/SDK/INC/D3DRMOBJ.H
Normal file
727
WinQuake/dxsdk/SDK/INC/D3DRMOBJ.H
Normal file
@@ -0,0 +1,727 @@
|
||||
/*==========================================================================;
|
||||
*
|
||||
* Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved.
|
||||
*
|
||||
* File: d3drm.h
|
||||
* Content: Direct3DRM include file
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef _D3DRMOBJ_H_
|
||||
#define _D3DRMOBJ_H_
|
||||
|
||||
#include <objbase.h> /* Use Windows header files */
|
||||
#define VIRTUAL
|
||||
|
||||
#include "d3drmdef.h"
|
||||
#include "d3d.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The methods for IUnknown
|
||||
*/
|
||||
#define IUNKNOWN_METHODS(kind) \
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID *ppvObj) kind; \
|
||||
STDMETHOD_(ULONG, AddRef) (THIS) kind; \
|
||||
STDMETHOD_(ULONG, Release) (THIS) kind
|
||||
|
||||
/*
|
||||
* The methods for IDirect3DRMObject
|
||||
*/
|
||||
#define IDIRECT3DRMOBJECT_METHODS(kind) \
|
||||
STDMETHOD(Clone) (THIS_ LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObj) kind; \
|
||||
STDMETHOD(AddDestroyCallback) (THIS_ D3DRMOBJECTCALLBACK, LPVOID argument) kind; \
|
||||
STDMETHOD(DeleteDestroyCallback) (THIS_ D3DRMOBJECTCALLBACK, LPVOID argument) kind; \
|
||||
STDMETHOD(SetAppData) (THIS_ DWORD data) kind; \
|
||||
STDMETHOD_(DWORD, GetAppData) (THIS) kind; \
|
||||
STDMETHOD(SetName) (THIS_ LPCSTR) kind; \
|
||||
STDMETHOD(GetName) (THIS_ LPDWORD lpdwSize, LPSTR lpName) kind; \
|
||||
STDMETHOD(GetClassName) (THIS_ LPDWORD lpdwSize, LPSTR lpName) kind
|
||||
|
||||
|
||||
#define WIN_TYPES(itype, ptype) \
|
||||
typedef interface itype FAR *LP##ptype, FAR **LPLP##ptype
|
||||
|
||||
WIN_TYPES(IDirect3DRMObject, DIRECT3DRMOBJECT);
|
||||
WIN_TYPES(IDirect3DRMDevice, DIRECT3DRMDEVICE);
|
||||
WIN_TYPES(IDirect3DRMViewport, DIRECT3DRMVIEWPORT);
|
||||
WIN_TYPES(IDirect3DRMFrame, DIRECT3DRMFRAME);
|
||||
WIN_TYPES(IDirect3DRMVisual, DIRECT3DRMVISUAL);
|
||||
WIN_TYPES(IDirect3DRMMesh, DIRECT3DRMMESH);
|
||||
WIN_TYPES(IDirect3DRMMeshBuilder, DIRECT3DRMMESHBUILDER);
|
||||
WIN_TYPES(IDirect3DRMFace, DIRECT3DRMFACE);
|
||||
WIN_TYPES(IDirect3DRMLight, DIRECT3DRMLIGHT);
|
||||
WIN_TYPES(IDirect3DRMTexture, DIRECT3DRMTEXTURE);
|
||||
WIN_TYPES(IDirect3DRMWrap, DIRECT3DRMWRAP);
|
||||
WIN_TYPES(IDirect3DRMMaterial, DIRECT3DRMMATERIAL);
|
||||
WIN_TYPES(IDirect3DRMAnimation, DIRECT3DRMANIMATION);
|
||||
WIN_TYPES(IDirect3DRMAnimationSet, DIRECT3DRMANIMATIONSET);
|
||||
WIN_TYPES(IDirect3DRMUserVisual, DIRECT3DRMUSERVISUAL);
|
||||
WIN_TYPES(IDirect3DRMShadow, DIRECT3DRMSHADOW);
|
||||
WIN_TYPES(IDirect3DRMArray, DIRECT3DRMOBJECTARRAY);
|
||||
WIN_TYPES(IDirect3DRMDeviceArray, DIRECT3DRMDEVICEARRAY);
|
||||
WIN_TYPES(IDirect3DRMFaceArray, DIRECT3DRMFACEARRAY);
|
||||
WIN_TYPES(IDirect3DRMViewportArray, DIRECT3DRMVIEWPORTARRAY);
|
||||
WIN_TYPES(IDirect3DRMFrameArray, DIRECT3DRMFRAMEARRAY);
|
||||
WIN_TYPES(IDirect3DRMVisualArray, DIRECT3DRMVISUALARRAY);
|
||||
WIN_TYPES(IDirect3DRMPickedArray, DIRECT3DRMPICKEDARRAY);
|
||||
WIN_TYPES(IDirect3DRMLightArray, DIRECT3DRMLIGHTARRAY);
|
||||
|
||||
/*
|
||||
* Direct3DRM Object classes
|
||||
*/
|
||||
DEFINE_GUID(CLSID_CDirect3DRMDevice, 0x4fa3568e, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(CLSID_CDirect3DRMViewport, 0x4fa3568f, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(CLSID_CDirect3DRMFrame, 0x4fa35690, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(CLSID_CDirect3DRMMesh, 0x4fa35691, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(CLSID_CDirect3DRMMeshBuilder, 0x4fa35692, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(CLSID_CDirect3DRMFace, 0x4fa35693, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(CLSID_CDirect3DRMLight, 0x4fa35694, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(CLSID_CDirect3DRMTexture, 0x4fa35695, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(CLSID_CDirect3DRMWrap, 0x4fa35696, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(CLSID_CDirect3DRMMaterial, 0x4fa35697, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(CLSID_CDirect3DRMAnimation, 0x4fa35698, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(CLSID_CDirect3DRMAnimationSet, 0x4fa35699, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(CLSID_CDirect3DRMUserVisual, 0x4fa3569a, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(CLSID_CDirect3DRMShadow, 0x4fa3569b, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
|
||||
/*
|
||||
* Direct3DRM Object interfaces
|
||||
*/
|
||||
DEFINE_GUID(IID_IDirect3DRMObject, 0xeb16cb00, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(IID_IDirect3DRMDevice, 0xe9e19280, 0x6e05, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(IID_IDirect3DRMViewport, 0xeb16cb02, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(IID_IDirect3DRMFrame, 0xeb16cb03, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(IID_IDirect3DRMVisual, 0xeb16cb04, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(IID_IDirect3DRMMesh, 0xa3a80d01, 0x6e12, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(IID_IDirect3DRMMeshBuilder, 0xa3a80d02, 0x6e12, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(IID_IDirect3DRMFace, 0xeb16cb07, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(IID_IDirect3DRMLight, 0xeb16cb08, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(IID_IDirect3DRMTexture, 0xeb16cb09, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(IID_IDirect3DRMWrap, 0xeb16cb0a, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(IID_IDirect3DRMMaterial, 0xeb16cb0b, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(IID_IDirect3DRMAnimation, 0xeb16cb0d, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(IID_IDirect3DRMAnimationSet, 0xeb16cb0e, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(IID_IDirect3DRMDeviceArray, 0xeb16cb10, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(IID_IDirect3DRMViewportArray, 0xeb16cb11, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(IID_IDirect3DRMFrameArray, 0xeb16cb12, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(IID_IDirect3DRMVisualArray, 0xeb16cb13, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(IID_IDirect3DRMLightArray, 0xeb16cb14, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(IID_IDirect3DRMPickedArray, 0xeb16cb16, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(IID_IDirect3DRMFaceArray, 0xeb16cb17, 0xd271, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(IID_IDirect3DRMUserVisual, 0x59163de0, 0x6d43, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
DEFINE_GUID(IID_IDirect3DRMShadow, 0xaf359780, 0x6ba3, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
|
||||
typedef void (*D3DRMOBJECTCALLBACK)(LPDIRECT3DRMOBJECT obj, LPVOID arg);
|
||||
typedef void (*D3DRMFRAMEMOVECALLBACK)(LPDIRECT3DRMFRAME obj, LPVOID arg, D3DVALUE delta);
|
||||
typedef void (*D3DRMUPDATECALLBACK)(LPDIRECT3DRMDEVICE obj, LPVOID arg, int, LPD3DRECT);
|
||||
typedef int (*D3DRMUSERVISUALCALLBACK)(LPDIRECT3DRMUSERVISUAL obj, LPVOID arg,
|
||||
D3DRMUSERVISUALREASON reason,
|
||||
LPDIRECT3DRMDEVICE dev,
|
||||
LPDIRECT3DRMVIEWPORT view);
|
||||
typedef HRESULT (*D3DRMLOADTEXTURECALLBACK)
|
||||
(char *tex_name, void *arg, LPDIRECT3DRMTEXTURE *);
|
||||
typedef void (*D3DRMLOADCALLBACK)
|
||||
(LPDIRECT3DRMOBJECT object, REFIID objectguid, LPVOID arg);
|
||||
|
||||
|
||||
|
||||
typedef struct _D3DRMPICKDESC
|
||||
{
|
||||
ULONG ulFaceIdx;
|
||||
LONG lGroupIdx;
|
||||
D3DVECTOR vPosition;
|
||||
|
||||
} D3DRMPICKDESC, *LPD3DRMPICKDESC;
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMObject
|
||||
|
||||
/*
|
||||
* Base class
|
||||
*/
|
||||
DECLARE_INTERFACE_(IDirect3DRMObject, IUnknown)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
IDIRECT3DRMOBJECT_METHODS(PURE);
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMVisual
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMVisual, IDirect3DRMObject)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
IDIRECT3DRMOBJECT_METHODS(PURE);
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMDevice
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMDevice, IDirect3DRMObject)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
IDIRECT3DRMOBJECT_METHODS(PURE);
|
||||
|
||||
/*
|
||||
* IDirect3DRMDevice methods
|
||||
*/
|
||||
STDMETHOD(Init)(THIS_ ULONG width, ULONG height) PURE;
|
||||
STDMETHOD(InitFromD3D)(THIS_ LPDIRECT3D lpD3D, LPDIRECT3DDEVICE lpD3DDev) PURE;
|
||||
STDMETHOD(InitFromClipper)(THIS_ LPDIRECTDRAWCLIPPER lpDDClipper, LPGUID lpGUID, int width, int height) PURE;
|
||||
|
||||
STDMETHOD(Update)(THIS) PURE;
|
||||
STDMETHOD(AddUpdateCallback)(THIS_ D3DRMUPDATECALLBACK, LPVOID arg) PURE;
|
||||
STDMETHOD(DeleteUpdateCallback)(THIS_ D3DRMUPDATECALLBACK, LPVOID arg) PURE;
|
||||
STDMETHOD(SetBufferCount)(THIS_ DWORD) PURE;
|
||||
STDMETHOD_(DWORD, GetBufferCount)(THIS) PURE;
|
||||
|
||||
STDMETHOD(SetDither)(THIS_ BOOL) PURE;
|
||||
STDMETHOD(SetShades)(THIS_ DWORD) PURE;
|
||||
STDMETHOD(SetQuality)(THIS_ D3DRMRENDERQUALITY) PURE;
|
||||
STDMETHOD(SetTextureQuality)(THIS_ D3DRMTEXTUREQUALITY) PURE;
|
||||
|
||||
STDMETHOD(GetViewports)(THIS_ LPDIRECT3DRMVIEWPORTARRAY *return_views) PURE;
|
||||
|
||||
STDMETHOD_(BOOL, GetDither)(THIS) PURE;
|
||||
STDMETHOD_(DWORD, GetShades)(THIS) PURE;
|
||||
STDMETHOD_(DWORD, GetHeight)(THIS) PURE;
|
||||
STDMETHOD_(DWORD, GetWidth)(THIS) PURE;
|
||||
STDMETHOD_(DWORD, GetTrianglesDrawn)(THIS) PURE;
|
||||
STDMETHOD_(DWORD, GetWireframeOptions)(THIS) PURE;
|
||||
STDMETHOD_(D3DRMRENDERQUALITY, GetQuality)(THIS) PURE;
|
||||
STDMETHOD_(D3DCOLORMODEL, GetColorModel)(THIS) PURE;
|
||||
STDMETHOD_(D3DRMTEXTUREQUALITY, GetTextureQuality)(THIS) PURE;
|
||||
STDMETHOD(GetDirect3DDevice)(THIS_ LPDIRECT3DDEVICE *) PURE;
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMViewport
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMViewport, IDirect3DRMObject)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
IDIRECT3DRMOBJECT_METHODS(PURE);
|
||||
|
||||
/*
|
||||
* IDirect3DRMViewport methods
|
||||
*/
|
||||
STDMETHOD(Init)
|
||||
( THIS_ LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMFRAME camera,
|
||||
DWORD xpos, DWORD ypos, DWORD width, DWORD height
|
||||
) PURE;
|
||||
STDMETHOD(Clear)(THIS) PURE;
|
||||
STDMETHOD(Render)(THIS_ LPDIRECT3DRMFRAME) PURE;
|
||||
|
||||
STDMETHOD(SetFront)(THIS_ D3DVALUE) PURE;
|
||||
STDMETHOD(SetBack)(THIS_ D3DVALUE) PURE;
|
||||
STDMETHOD(SetField)(THIS_ D3DVALUE) PURE;
|
||||
STDMETHOD(SetUniformScaling)(THIS_ BOOL) PURE;
|
||||
STDMETHOD(SetCamera)(THIS_ LPDIRECT3DRMFRAME) PURE;
|
||||
STDMETHOD(SetProjection)(THIS_ D3DRMPROJECTIONTYPE) PURE;
|
||||
STDMETHOD(Transform)(THIS_ D3DRMVECTOR4D *d, D3DVECTOR *s) PURE;
|
||||
STDMETHOD(InverseTransform)(THIS_ D3DVECTOR *d, D3DRMVECTOR4D *s) PURE;
|
||||
STDMETHOD(Configure)(THIS_ LONG x, LONG y, DWORD width, DWORD height) PURE;
|
||||
STDMETHOD(ForceUpdate)(THIS_ DWORD x1, DWORD y1, DWORD x2, DWORD y2) PURE;
|
||||
STDMETHOD(SetPlane)(THIS_ D3DVALUE left, D3DVALUE right, D3DVALUE bottom, D3DVALUE top) PURE;
|
||||
|
||||
STDMETHOD(GetCamera)(THIS_ LPDIRECT3DRMFRAME *) PURE;
|
||||
STDMETHOD(GetDevice)(THIS_ LPDIRECT3DRMDEVICE *) PURE;
|
||||
STDMETHOD(GetPlane)(THIS_ D3DVALUE *left, D3DVALUE *right, D3DVALUE *bottom, D3DVALUE *top) PURE;
|
||||
STDMETHOD(Pick)(THIS_ LONG x, LONG y, LPDIRECT3DRMPICKEDARRAY *return_visuals) PURE;
|
||||
|
||||
STDMETHOD_(BOOL, GetUniformScaling)(THIS) PURE;
|
||||
STDMETHOD_(LONG, GetX)(THIS) PURE;
|
||||
STDMETHOD_(LONG, GetY)(THIS) PURE;
|
||||
STDMETHOD_(DWORD, GetWidth)(THIS) PURE;
|
||||
STDMETHOD_(DWORD, GetHeight)(THIS) PURE;
|
||||
STDMETHOD_(D3DVALUE, GetField)(THIS) PURE;
|
||||
STDMETHOD_(D3DVALUE, GetBack)(THIS) PURE;
|
||||
STDMETHOD_(D3DVALUE, GetFront)(THIS) PURE;
|
||||
STDMETHOD_(D3DRMPROJECTIONTYPE, GetProjection)(THIS) PURE;
|
||||
STDMETHOD(GetDirect3DViewport)(THIS_ LPDIRECT3DVIEWPORT *) PURE;
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMFrame
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMFrame, IDirect3DRMVisual)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
IDIRECT3DRMOBJECT_METHODS(PURE);
|
||||
|
||||
/*
|
||||
* IDirect3DRMFrame methods
|
||||
*/
|
||||
STDMETHOD(AddChild)(THIS_ LPDIRECT3DRMFRAME child) PURE;
|
||||
STDMETHOD(AddLight)(THIS_ LPDIRECT3DRMLIGHT) PURE;
|
||||
STDMETHOD(AddMoveCallback)(THIS_ D3DRMFRAMEMOVECALLBACK, VOID *arg) PURE;
|
||||
STDMETHOD(AddTransform)(THIS_ D3DRMCOMBINETYPE, D3DRMMATRIX4D) PURE;
|
||||
STDMETHOD(AddTranslation)(THIS_ D3DRMCOMBINETYPE, D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE;
|
||||
STDMETHOD(AddScale)(THIS_ D3DRMCOMBINETYPE, D3DVALUE sx, D3DVALUE sy, D3DVALUE sz) PURE;
|
||||
STDMETHOD(AddRotation)(THIS_ D3DRMCOMBINETYPE, D3DVALUE x, D3DVALUE y, D3DVALUE z, D3DVALUE theta) PURE;
|
||||
STDMETHOD(AddVisual)(THIS_ LPDIRECT3DRMVISUAL) PURE;
|
||||
STDMETHOD(GetChildren)(THIS_ LPDIRECT3DRMFRAMEARRAY *children) PURE;
|
||||
STDMETHOD_(D3DCOLOR, GetColor)(THIS) PURE;
|
||||
STDMETHOD(GetLights)(THIS_ LPDIRECT3DRMLIGHTARRAY *lights) PURE;
|
||||
STDMETHOD_(D3DRMMATERIALMODE, GetMaterialMode)(THIS) PURE;
|
||||
STDMETHOD(GetParent)(THIS_ LPDIRECT3DRMFRAME *) PURE;
|
||||
STDMETHOD(GetPosition)(THIS_ LPDIRECT3DRMFRAME reference, LPD3DVECTOR return_position) PURE;
|
||||
STDMETHOD(GetRotation)(THIS_ LPDIRECT3DRMFRAME reference, LPD3DVECTOR axis, LPD3DVALUE return_theta) PURE;
|
||||
STDMETHOD(GetScene)(THIS_ LPDIRECT3DRMFRAME *) PURE;
|
||||
STDMETHOD_(D3DRMSORTMODE, GetSortMode)(THIS) PURE;
|
||||
STDMETHOD(GetTexture)(THIS_ LPDIRECT3DRMTEXTURE *) PURE;
|
||||
STDMETHOD(GetTransform)(THIS_ D3DRMMATRIX4D return_matrix) PURE;
|
||||
STDMETHOD(GetVelocity)(THIS_ LPDIRECT3DRMFRAME reference, LPD3DVECTOR return_velocity, BOOL with_rotation) PURE;
|
||||
STDMETHOD(GetOrientation)(THIS_ LPDIRECT3DRMFRAME reference, LPD3DVECTOR dir, LPD3DVECTOR up) PURE;
|
||||
STDMETHOD(GetVisuals)(THIS_ LPDIRECT3DRMVISUALARRAY *visuals) PURE;
|
||||
STDMETHOD(GetTextureTopology)(THIS_ BOOL *wrap_u, BOOL *wrap_v) PURE;
|
||||
STDMETHOD(InverseTransform)(THIS_ D3DVECTOR *d, D3DVECTOR *s) PURE;
|
||||
STDMETHOD(Load)(THIS_ LPVOID filename, LPVOID name, D3DRMLOADOPTIONS loadflags, D3DRMLOADTEXTURECALLBACK, LPVOID lpArg)PURE;
|
||||
STDMETHOD(LookAt)(THIS_ LPDIRECT3DRMFRAME target, LPDIRECT3DRMFRAME reference, D3DRMFRAMECONSTRAINT) PURE;
|
||||
STDMETHOD(Move)(THIS_ D3DVALUE delta) PURE;
|
||||
STDMETHOD(DeleteChild)(THIS_ LPDIRECT3DRMFRAME) PURE;
|
||||
STDMETHOD(DeleteLight)(THIS_ LPDIRECT3DRMLIGHT) PURE;
|
||||
STDMETHOD(DeleteMoveCallback)(THIS_ D3DRMFRAMEMOVECALLBACK, VOID *arg) PURE;
|
||||
STDMETHOD(DeleteVisual)(THIS_ LPDIRECT3DRMVISUAL) PURE;
|
||||
STDMETHOD_(D3DCOLOR, GetSceneBackground)(THIS) PURE;
|
||||
STDMETHOD(GetSceneBackgroundDepth)(THIS_ LPDIRECTDRAWSURFACE *) PURE;
|
||||
STDMETHOD_(D3DCOLOR, GetSceneFogColor)(THIS) PURE;
|
||||
STDMETHOD_(BOOL, GetSceneFogEnable)(THIS) PURE;
|
||||
STDMETHOD_(D3DRMFOGMODE, GetSceneFogMode)(THIS) PURE;
|
||||
STDMETHOD(GetSceneFogParams)(THIS_ D3DVALUE *return_start, D3DVALUE *return_end, D3DVALUE *return_density) PURE;
|
||||
STDMETHOD(SetSceneBackground)(THIS_ D3DCOLOR) PURE;
|
||||
STDMETHOD(SetSceneBackgroundRGB)(THIS_ D3DVALUE red, D3DVALUE green, D3DVALUE blue) PURE;
|
||||
STDMETHOD(SetSceneBackgroundDepth)(THIS_ LPDIRECTDRAWSURFACE) PURE;
|
||||
STDMETHOD(SetSceneBackgroundImage)(THIS_ LPDIRECT3DRMTEXTURE) PURE;
|
||||
STDMETHOD(SetSceneFogEnable)(THIS_ BOOL) PURE;
|
||||
STDMETHOD(SetSceneFogColor)(THIS_ D3DCOLOR) PURE;
|
||||
STDMETHOD(SetSceneFogMode)(THIS_ D3DRMFOGMODE) PURE;
|
||||
STDMETHOD(SetSceneFogParams)(THIS_ D3DVALUE start, D3DVALUE end, D3DVALUE density) PURE;
|
||||
STDMETHOD(SetColor)(THIS_ D3DCOLOR) PURE;
|
||||
STDMETHOD(SetColorRGB)(THIS_ D3DVALUE red, D3DVALUE green, D3DVALUE blue) PURE;
|
||||
STDMETHOD_(D3DRMZBUFFERMODE, GetZbufferMode)(THIS) PURE;
|
||||
STDMETHOD(SetMaterialMode)(THIS_ D3DRMMATERIALMODE) PURE;
|
||||
STDMETHOD(SetOrientation)
|
||||
( THIS_ LPDIRECT3DRMFRAME reference,
|
||||
D3DVALUE dx, D3DVALUE dy, D3DVALUE dz,
|
||||
D3DVALUE ux, D3DVALUE uy, D3DVALUE uz
|
||||
) PURE;
|
||||
STDMETHOD(SetPosition)(THIS_ LPDIRECT3DRMFRAME reference, D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE;
|
||||
STDMETHOD(SetRotation)(THIS_ LPDIRECT3DRMFRAME reference, D3DVALUE x, D3DVALUE y, D3DVALUE z, D3DVALUE theta) PURE;
|
||||
STDMETHOD(SetSortMode)(THIS_ D3DRMSORTMODE) PURE;
|
||||
STDMETHOD(SetTexture)(THIS_ LPDIRECT3DRMTEXTURE) PURE;
|
||||
STDMETHOD(SetTextureTopology)(THIS_ BOOL wrap_u, BOOL wrap_v) PURE;
|
||||
STDMETHOD(SetVelocity)(THIS_ LPDIRECT3DRMFRAME reference, D3DVALUE x, D3DVALUE y, D3DVALUE z, BOOL with_rotation) PURE;
|
||||
STDMETHOD(SetZbufferMode)(THIS_ D3DRMZBUFFERMODE) PURE;
|
||||
STDMETHOD(Transform)(THIS_ D3DVECTOR *d, D3DVECTOR *s) PURE;
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMMesh
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMMesh, IDirect3DRMVisual)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
IDIRECT3DRMOBJECT_METHODS(PURE);
|
||||
|
||||
/*
|
||||
* IDirect3DRMMesh methods
|
||||
*/
|
||||
STDMETHOD(Scale)(THIS_ D3DVALUE sx, D3DVALUE sy, D3DVALUE sz) PURE;
|
||||
STDMETHOD(Translate)(THIS_ D3DVALUE tx, D3DVALUE ty, D3DVALUE tz) PURE;
|
||||
STDMETHOD(GetBox)(THIS_ D3DRMBOX *) PURE;
|
||||
STDMETHOD(AddGroup)(THIS_ unsigned vCount, unsigned fCount, unsigned vPerFace, unsigned *fData, D3DRMGROUPINDEX *returnId) PURE;
|
||||
STDMETHOD(SetVertices)(THIS_ D3DRMGROUPINDEX id, unsigned index, unsigned count, D3DRMVERTEX *values) PURE;
|
||||
STDMETHOD(SetGroupColor)(THIS_ D3DRMGROUPINDEX id, D3DCOLOR value) PURE;
|
||||
STDMETHOD(SetGroupColorRGB)(THIS_ D3DRMGROUPINDEX id, D3DVALUE red, D3DVALUE green, D3DVALUE blue) PURE;
|
||||
STDMETHOD(SetGroupMapping)(THIS_ D3DRMGROUPINDEX id, D3DRMMAPPING value) PURE;
|
||||
STDMETHOD(SetGroupQuality)(THIS_ D3DRMGROUPINDEX id, D3DRMRENDERQUALITY value) PURE;
|
||||
STDMETHOD(SetGroupMaterial)(THIS_ D3DRMGROUPINDEX id, LPDIRECT3DRMMATERIAL value) PURE;
|
||||
STDMETHOD(SetGroupTexture)(THIS_ D3DRMGROUPINDEX id, LPDIRECT3DRMTEXTURE value) PURE;
|
||||
|
||||
STDMETHOD_(unsigned, GetGroupCount)(THIS) PURE;
|
||||
STDMETHOD(GetGroup)(THIS_ D3DRMGROUPINDEX id, unsigned *vCount, unsigned *fCount, unsigned *vPerFace, DWORD *fDataSize, unsigned *fData) PURE;
|
||||
STDMETHOD(GetVertices)(THIS_ D3DRMGROUPINDEX id, DWORD index, DWORD count, D3DRMVERTEX *returnPtr) PURE;
|
||||
STDMETHOD_(D3DCOLOR, GetGroupColor)(THIS_ D3DRMGROUPINDEX id) PURE;
|
||||
STDMETHOD_(D3DRMMAPPING, GetGroupMapping)(THIS_ D3DRMGROUPINDEX id) PURE;
|
||||
STDMETHOD_(D3DRMRENDERQUALITY, GetGroupQuality)(THIS_ D3DRMGROUPINDEX id) PURE;
|
||||
STDMETHOD(GetGroupMaterial)(THIS_ D3DRMGROUPINDEX id, LPDIRECT3DRMMATERIAL *returnPtr) PURE;
|
||||
STDMETHOD(GetGroupTexture)(THIS_ D3DRMGROUPINDEX id, LPDIRECT3DRMTEXTURE *returnPtr) PURE;
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMShadow
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMShadow, IDirect3DRMVisual)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
IDIRECT3DRMOBJECT_METHODS(PURE);
|
||||
|
||||
/*
|
||||
* IDirect3DRMShadow methods
|
||||
*/
|
||||
STDMETHOD(Init)
|
||||
( THIS_ LPDIRECT3DRMVISUAL visual, LPDIRECT3DRMLIGHT light,
|
||||
D3DVALUE px, D3DVALUE py, D3DVALUE pz,
|
||||
D3DVALUE nx, D3DVALUE ny, D3DVALUE nz
|
||||
) PURE;
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMFace
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMFace, IDirect3DRMObject)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
IDIRECT3DRMOBJECT_METHODS(PURE);
|
||||
|
||||
/*
|
||||
* IDirect3DRMFace methods
|
||||
*/
|
||||
STDMETHOD(AddVertex)(THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE;
|
||||
STDMETHOD(AddVertexAndNormalIndexed)(THIS_ DWORD vertex, DWORD normal) PURE;
|
||||
STDMETHOD(SetColorRGB)(THIS_ D3DVALUE, D3DVALUE, D3DVALUE) PURE;
|
||||
STDMETHOD(SetColor)(THIS_ D3DCOLOR) PURE;
|
||||
STDMETHOD(SetTexture)(THIS_ LPDIRECT3DRMTEXTURE) PURE;
|
||||
STDMETHOD(SetTextureCoordinates)(THIS_ DWORD vertex, D3DVALUE u, D3DVALUE v) PURE;
|
||||
STDMETHOD(SetMaterial)(THIS_ LPDIRECT3DRMMATERIAL) PURE;
|
||||
STDMETHOD(SetTextureTopology)(THIS_ BOOL wrap_u, BOOL wrap_v) PURE;
|
||||
|
||||
STDMETHOD(GetVertex)(THIS_ DWORD index, D3DVECTOR *vertex, D3DVECTOR *normal) PURE;
|
||||
STDMETHOD(GetVertices)(THIS_ DWORD *vertex_count, D3DVECTOR *coords, D3DVECTOR *normals);
|
||||
STDMETHOD(GetTextureCoordinates)(THIS_ DWORD vertex, D3DVALUE *u, D3DVALUE *v) PURE;
|
||||
STDMETHOD(GetTextureTopology)(THIS_ BOOL *wrap_u, BOOL *wrap_v) PURE;
|
||||
STDMETHOD(GetNormal)(THIS_ D3DVECTOR *) PURE;
|
||||
STDMETHOD(GetTexture)(THIS_ LPDIRECT3DRMTEXTURE *) PURE;
|
||||
STDMETHOD(GetMaterial)(THIS_ LPDIRECT3DRMMATERIAL *) PURE;
|
||||
|
||||
STDMETHOD_(int, GetVertexCount)(THIS) PURE;
|
||||
STDMETHOD_(int, GetVertexIndex)(THIS_ DWORD which) PURE;
|
||||
STDMETHOD_(int, GetTextureCoordinateIndex)(THIS_ DWORD which) PURE;
|
||||
STDMETHOD_(D3DCOLOR, GetColor)(THIS) PURE;
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMMeshBuilder
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMMeshBuilder, IDirect3DRMVisual)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
IDIRECT3DRMOBJECT_METHODS(PURE);
|
||||
|
||||
/*
|
||||
* IDirect3DRMMeshBuilder methods
|
||||
*/
|
||||
STDMETHOD(Load)(THIS_ LPVOID filename, LPVOID name, D3DRMLOADOPTIONS loadflags, D3DRMLOADTEXTURECALLBACK, LPVOID lpArg) PURE;
|
||||
STDMETHOD(Save)(THIS_ const char *filename, D3DRMXOFFORMAT, D3DRMSAVEOPTIONS save) PURE;
|
||||
STDMETHOD(Scale)(THIS_ D3DVALUE sx, D3DVALUE sy, D3DVALUE sz) PURE;
|
||||
STDMETHOD(Translate)(THIS_ D3DVALUE tx, D3DVALUE ty, D3DVALUE tz) PURE;
|
||||
STDMETHOD(SetColorSource)(THIS_ D3DRMCOLORSOURCE) PURE;
|
||||
STDMETHOD(GetBox)(THIS_ D3DRMBOX *) PURE;
|
||||
STDMETHOD(GenerateNormals)(THIS) PURE;
|
||||
STDMETHOD_(D3DRMCOLORSOURCE, GetColorSource)(THIS) PURE;
|
||||
|
||||
STDMETHOD(AddMesh)(THIS_ LPDIRECT3DRMMESH) PURE;
|
||||
STDMETHOD(AddMeshBuilder)(THIS_ LPDIRECT3DRMMESHBUILDER) PURE;
|
||||
STDMETHOD(AddFrame)(THIS_ LPDIRECT3DRMFRAME) PURE;
|
||||
STDMETHOD(AddFace)(THIS_ LPDIRECT3DRMFACE) PURE;
|
||||
STDMETHOD(AddFaces)
|
||||
( THIS_ DWORD vcount, D3DVECTOR *vertices, DWORD ncount, D3DVECTOR *normals,
|
||||
DWORD *data, LPDIRECT3DRMFACEARRAY*
|
||||
) PURE;
|
||||
STDMETHOD(ReserveSpace)(THIS_ DWORD vertex_Count, DWORD normal_count, DWORD face_count) PURE;
|
||||
STDMETHOD(SetColorRGB)(THIS_ D3DVALUE red, D3DVALUE green, D3DVALUE blue) PURE;
|
||||
STDMETHOD(SetColor)(THIS_ D3DCOLOR) PURE;
|
||||
STDMETHOD(SetTexture)(THIS_ LPDIRECT3DRMTEXTURE) PURE;
|
||||
STDMETHOD(SetMaterial)(THIS_ LPDIRECT3DRMMATERIAL) PURE;
|
||||
STDMETHOD(SetTextureTopology)(THIS_ BOOL wrap_u, BOOL wrap_v) PURE;
|
||||
STDMETHOD(SetQuality)(THIS_ D3DRMRENDERQUALITY) PURE;
|
||||
STDMETHOD(SetPerspective)(THIS_ BOOL) PURE;
|
||||
STDMETHOD(SetVertex)(THIS_ DWORD index, D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE;
|
||||
STDMETHOD(SetNormal)(THIS_ DWORD index, D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE;
|
||||
STDMETHOD(SetTextureCoordinates)(THIS_ DWORD index, D3DVALUE u, D3DVALUE v) PURE;
|
||||
STDMETHOD(SetVertexColor)(THIS_ DWORD index, D3DCOLOR) PURE;
|
||||
STDMETHOD(SetVertexColorRGB)(THIS_ DWORD index, D3DVALUE red, D3DVALUE green, D3DVALUE blue) PURE;
|
||||
|
||||
STDMETHOD(GetFaces)(THIS_ LPDIRECT3DRMFACEARRAY*) PURE;
|
||||
STDMETHOD(GetVertices)
|
||||
( THIS_ DWORD *vcount, D3DVECTOR *vertices, DWORD *ncount, D3DVECTOR *normals, DWORD *face_data_size, DWORD *face_data
|
||||
) PURE;
|
||||
STDMETHOD(GetTextureCoordinates)(THIS_ DWORD index, D3DVALUE *u, D3DVALUE *v) PURE;
|
||||
|
||||
STDMETHOD_(int, AddVertex)(THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE;
|
||||
STDMETHOD_(int, AddNormal)(THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE;
|
||||
STDMETHOD(CreateFace)(THIS_ LPDIRECT3DRMFACE*) PURE;
|
||||
STDMETHOD_(D3DRMRENDERQUALITY, GetQuality)(THIS) PURE;
|
||||
STDMETHOD_(BOOL, GetPerspective)(THIS) PURE;
|
||||
STDMETHOD_(int, GetFaceCount)(THIS) PURE;
|
||||
STDMETHOD_(int, GetVertexCount)(THIS) PURE;
|
||||
STDMETHOD_(D3DCOLOR, GetVertexColor)(THIS_ DWORD index) PURE;
|
||||
|
||||
STDMETHOD(CreateMesh)(THIS_ LPDIRECT3DRMMESH*) PURE;
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMLight
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMLight, IDirect3DRMObject)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
IDIRECT3DRMOBJECT_METHODS(PURE);
|
||||
|
||||
/*
|
||||
* IDirect3DRMLight methods
|
||||
*/
|
||||
STDMETHOD(SetType)(THIS_ D3DRMLIGHTTYPE) PURE;
|
||||
STDMETHOD(SetColor)(THIS_ D3DCOLOR) PURE;
|
||||
STDMETHOD(SetColorRGB)(THIS_ D3DVALUE red, D3DVALUE green, D3DVALUE blue) PURE;
|
||||
STDMETHOD(SetRange)(THIS_ D3DVALUE) PURE;
|
||||
STDMETHOD(SetUmbra)(THIS_ D3DVALUE) PURE;
|
||||
STDMETHOD(SetPenumbra)(THIS_ D3DVALUE) PURE;
|
||||
STDMETHOD(SetConstantAttenuation)(THIS_ D3DVALUE) PURE;
|
||||
STDMETHOD(SetLinearAttenuation)(THIS_ D3DVALUE) PURE;
|
||||
STDMETHOD(SetQuadraticAttenuation)(THIS_ D3DVALUE) PURE;
|
||||
|
||||
STDMETHOD_(D3DVALUE, GetRange)(THIS) PURE;
|
||||
STDMETHOD_(D3DVALUE, GetUmbra)(THIS) PURE;
|
||||
STDMETHOD_(D3DVALUE, GetPenumbra)(THIS) PURE;
|
||||
STDMETHOD_(D3DVALUE, GetConstantAttenuation)(THIS) PURE;
|
||||
STDMETHOD_(D3DVALUE, GetLinearAttenuation)(THIS) PURE;
|
||||
STDMETHOD_(D3DVALUE, GetQuadraticAttenuation)(THIS) PURE;
|
||||
STDMETHOD_(D3DCOLOR, GetColor)(THIS) PURE;
|
||||
STDMETHOD_(D3DRMLIGHTTYPE, GetType)(THIS) PURE;
|
||||
|
||||
STDMETHOD(SetEnableFrame)(THIS_ LPDIRECT3DRMFRAME) PURE;
|
||||
STDMETHOD(GetEnableFrame)(THIS_ LPDIRECT3DRMFRAME*) PURE;
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMTexture
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMTexture, IDirect3DRMVisual)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
IDIRECT3DRMOBJECT_METHODS(PURE);
|
||||
|
||||
/*
|
||||
* IDirect3DRMTexture methods
|
||||
*/
|
||||
STDMETHOD(InitFromFile)(THIS_ const char *filename) PURE;
|
||||
STDMETHOD(InitFromSurface)(THIS_ LPDIRECTDRAWSURFACE lpDDS) PURE;
|
||||
STDMETHOD(InitFromResource)(THIS_ HRSRC) PURE;
|
||||
STDMETHOD(Changed)(THIS_ BOOL pixels, BOOL palette) PURE;
|
||||
|
||||
STDMETHOD(SetColors)(THIS_ DWORD) PURE;
|
||||
STDMETHOD(SetShades)(THIS_ DWORD) PURE;
|
||||
STDMETHOD(SetDecalSize)(THIS_ D3DVALUE width, D3DVALUE height) PURE;
|
||||
STDMETHOD(SetDecalOrigin)(THIS_ LONG x, LONG y) PURE;
|
||||
STDMETHOD(SetDecalScale)(THIS_ DWORD) PURE;
|
||||
STDMETHOD(SetDecalTransparency)(THIS_ BOOL) PURE;
|
||||
STDMETHOD(SetDecalTransparentColor)(THIS_ D3DCOLOR) PURE;
|
||||
|
||||
STDMETHOD(GetDecalSize)(THIS_ D3DVALUE *width_return, D3DVALUE *height_return) PURE;
|
||||
STDMETHOD(GetDecalOrigin)(THIS_ LONG *x_return, LONG *y_return) PURE;
|
||||
|
||||
STDMETHOD_(D3DRMIMAGE *, GetImage)(THIS) PURE;
|
||||
STDMETHOD_(DWORD, GetShades)(THIS) PURE;
|
||||
STDMETHOD_(DWORD, GetColors)(THIS) PURE;
|
||||
STDMETHOD_(DWORD, GetDecalScale)(THIS) PURE;
|
||||
STDMETHOD_(BOOL, GetDecalTransparency)(THIS) PURE;
|
||||
STDMETHOD_(D3DCOLOR, GetDecalTransparentColor)(THIS) PURE;
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMWrap
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMWrap, IDirect3DRMObject)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
IDIRECT3DRMOBJECT_METHODS(PURE);
|
||||
|
||||
/*
|
||||
* IDirect3DRMWrap methods
|
||||
*/
|
||||
STDMETHOD(Init)
|
||||
( THIS_ D3DRMWRAPTYPE, LPDIRECT3DRMFRAME ref,
|
||||
D3DVALUE ox, D3DVALUE oy, D3DVALUE oz,
|
||||
D3DVALUE dx, D3DVALUE dy, D3DVALUE dz,
|
||||
D3DVALUE ux, D3DVALUE uy, D3DVALUE uz,
|
||||
D3DVALUE ou, D3DVALUE ov,
|
||||
D3DVALUE su, D3DVALUE sv
|
||||
) PURE;
|
||||
STDMETHOD(Apply)(THIS_ LPDIRECT3DRMOBJECT) PURE;
|
||||
STDMETHOD(ApplyRelative)(THIS_ LPDIRECT3DRMFRAME frame, LPDIRECT3DRMOBJECT) PURE;
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMMaterial
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMMaterial, IDirect3DRMObject)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
IDIRECT3DRMOBJECT_METHODS(PURE);
|
||||
|
||||
/*
|
||||
* IDirect3DRMMaterial methods
|
||||
*/
|
||||
STDMETHOD(SetPower)(THIS_ D3DVALUE power) PURE;
|
||||
STDMETHOD(SetSpecular)(THIS_ D3DVALUE r, D3DVALUE g, D3DVALUE b) PURE;
|
||||
STDMETHOD(SetEmissive)(THIS_ D3DVALUE r, D3DVALUE g, D3DVALUE b) PURE;
|
||||
|
||||
STDMETHOD_(D3DVALUE, GetPower)(THIS) PURE;
|
||||
STDMETHOD(GetSpecular)(THIS_ D3DVALUE* r, D3DVALUE* g, D3DVALUE* b) PURE;
|
||||
STDMETHOD(GetEmissive)(THIS_ D3DVALUE* r, D3DVALUE* g, D3DVALUE* b) PURE;
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMAnimation
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMAnimation, IDirect3DRMObject)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
IDIRECT3DRMOBJECT_METHODS(PURE);
|
||||
|
||||
/*
|
||||
* IDirect3DRMAnimation methods
|
||||
*/
|
||||
STDMETHOD(SetOptions)(THIS_ D3DRMANIMATIONOPTIONS flags) PURE;
|
||||
STDMETHOD(AddRotateKey)(THIS_ D3DVALUE time, D3DRMQUATERNION *q) PURE;
|
||||
STDMETHOD(AddPositionKey)(THIS_ D3DVALUE time, D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE;
|
||||
STDMETHOD(AddScaleKey)(THIS_ D3DVALUE time, D3DVALUE x, D3DVALUE y, D3DVALUE z) PURE;
|
||||
STDMETHOD(DeleteKey)(THIS_ D3DVALUE time) PURE;
|
||||
STDMETHOD(SetFrame)(THIS_ LPDIRECT3DRMFRAME frame) PURE;
|
||||
STDMETHOD(SetTime)(THIS_ D3DVALUE time) PURE;
|
||||
|
||||
STDMETHOD_(D3DRMANIMATIONOPTIONS, GetOptions)(THIS) PURE;
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMAnimationSet
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMAnimationSet, IDirect3DRMObject)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
IDIRECT3DRMOBJECT_METHODS(PURE);
|
||||
|
||||
/*
|
||||
* IDirect3DRMAnimationSet methods
|
||||
*/
|
||||
STDMETHOD(AddAnimation)(THIS_ LPDIRECT3DRMANIMATION aid) PURE;
|
||||
STDMETHOD(Load)(THIS_ LPVOID filename, LPVOID name, D3DRMLOADOPTIONS loadflags, D3DRMLOADTEXTURECALLBACK, LPVOID lpArg, LPDIRECT3DRMFRAME parent)PURE;
|
||||
STDMETHOD(DeleteAnimation)(THIS_ LPDIRECT3DRMANIMATION aid) PURE;
|
||||
STDMETHOD(SetTime)(THIS_ D3DVALUE time) PURE;
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMUserVisual
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMUserVisual, IDirect3DRMVisual)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
IDIRECT3DRMOBJECT_METHODS(PURE);
|
||||
|
||||
/*
|
||||
* IDirect3DRMUserVisual methods
|
||||
*/
|
||||
STDMETHOD(Init)(THIS_ D3DRMUSERVISUALCALLBACK fn, void *arg) PURE;
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMArray
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMArray, IUnknown)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
|
||||
STDMETHOD_(DWORD, GetSize)(THIS) PURE;
|
||||
/* No GetElement method as it would get overloaded
|
||||
* in derived classes, and overloading is
|
||||
* a no-no in COM
|
||||
*/
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMDeviceArray
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMDeviceArray, IDirect3DRMArray)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
|
||||
STDMETHOD_(DWORD, GetSize)(THIS) PURE;
|
||||
STDMETHOD(GetElement)(THIS_ DWORD index, LPDIRECT3DRMDEVICE *) PURE;
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMFrameArray
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMFrameArray, IDirect3DRMArray)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
|
||||
STDMETHOD_(DWORD, GetSize)(THIS) PURE;
|
||||
STDMETHOD(GetElement)(THIS_ DWORD index, LPDIRECT3DRMFRAME *) PURE;
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMViewportArray
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMViewportArray, IDirect3DRMArray)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
|
||||
STDMETHOD_(DWORD, GetSize)(THIS) PURE;
|
||||
STDMETHOD(GetElement)(THIS_ DWORD index, LPDIRECT3DRMVIEWPORT *) PURE;
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMVisualArray
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMVisualArray, IDirect3DRMArray)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
|
||||
STDMETHOD_(DWORD, GetSize)(THIS) PURE;
|
||||
STDMETHOD(GetElement)(THIS_ DWORD index, LPDIRECT3DRMVISUAL *) PURE;
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMPickedArray
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMPickedArray, IDirect3DRMArray)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
|
||||
STDMETHOD_(DWORD, GetSize)(THIS) PURE;
|
||||
STDMETHOD(GetPick)(THIS_ DWORD index, LPDIRECT3DRMVISUAL *, LPDIRECT3DRMFRAMEARRAY *, LPD3DRMPICKDESC) PURE;
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMLightArray
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMLightArray, IDirect3DRMArray)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
|
||||
STDMETHOD_(DWORD, GetSize)(THIS) PURE;
|
||||
STDMETHOD(GetElement)(THIS_ DWORD index, LPDIRECT3DRMLIGHT *) PURE;
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMFaceArray
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMFaceArray, IDirect3DRMArray)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
|
||||
STDMETHOD_(DWORD, GetSize)(THIS) PURE;
|
||||
STDMETHOD(GetElement)(THIS_ DWORD index, LPDIRECT3DRMFACE *) PURE;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif
|
||||
#endif /* _D3DRMOBJ_H_ */
|
||||
48
WinQuake/dxsdk/SDK/INC/D3DRMWIN.H
Normal file
48
WinQuake/dxsdk/SDK/INC/D3DRMWIN.H
Normal file
@@ -0,0 +1,48 @@
|
||||
/*==========================================================================;
|
||||
*
|
||||
* Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved.
|
||||
*
|
||||
* File: d3drm.h
|
||||
* Content: Direct3DRM include file
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef __D3DRMWIN_H__
|
||||
#define __D3DRMWIN_H__
|
||||
|
||||
#ifndef WIN32
|
||||
#define WIN32
|
||||
#endif
|
||||
|
||||
#include "d3drm.h"
|
||||
#include "ddraw.h"
|
||||
#include "d3d.h"
|
||||
|
||||
/*
|
||||
* GUIDS used by Direct3DRM Windows interface
|
||||
*/
|
||||
DEFINE_GUID(IID_IDirect3DRMWinDevice, 0xc5016cc0, 0xd273, 0x11ce, 0xac, 0x48, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
|
||||
|
||||
WIN_TYPES(IDirect3DRMWinDevice, DIRECT3DRMWINDEVICE);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirect3DRMWinDevice
|
||||
|
||||
DECLARE_INTERFACE_(IDirect3DRMWinDevice, IDirect3DRMObject)
|
||||
{
|
||||
IUNKNOWN_METHODS(PURE);
|
||||
IDIRECT3DRMOBJECT_METHODS(PURE);
|
||||
|
||||
/*
|
||||
* IDirect3DRMWinDevice methods
|
||||
*/
|
||||
|
||||
/* Repaint the window with the last frame which was rendered. */
|
||||
STDMETHOD(HandlePaint)(THIS_ HDC hdc) PURE;
|
||||
|
||||
/* Respond to a WM_ACTIVATE message. */
|
||||
STDMETHOD(HandleActivate)(THIS_ WORD wparam) PURE;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
956
WinQuake/dxsdk/SDK/INC/D3DTYPES.H
Normal file
956
WinQuake/dxsdk/SDK/INC/D3DTYPES.H
Normal file
@@ -0,0 +1,956 @@
|
||||
/*==========================================================================;
|
||||
*
|
||||
* Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved.
|
||||
*
|
||||
* File: d3dtypes.h
|
||||
* Content: Direct3D types include file
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef _D3DTYPES_H_
|
||||
#define _D3DTYPES_H_
|
||||
|
||||
#ifndef WIN32
|
||||
#include "subwtype.h"
|
||||
#else
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#include <ddraw.h>
|
||||
|
||||
#pragma pack(4)
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
/* D3DVALUE is the fundamental Direct3D fractional data type */
|
||||
|
||||
#define D3DVALP(val, prec) ((float)(val))
|
||||
#define D3DVAL(val) ((float)(val))
|
||||
typedef float D3DVALUE, *LPD3DVALUE;
|
||||
#define D3DDivide(a, b) (float)((double) (a) / (double) (b))
|
||||
#define D3DMultiply(a, b) ((a) * (b))
|
||||
|
||||
typedef LONG D3DFIXED;
|
||||
|
||||
#ifndef RGB_MAKE
|
||||
/*
|
||||
* Format of CI colors is
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
* | alpha | color index | fraction |
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
*/
|
||||
#define CI_GETALPHA(ci) ((ci) >> 24)
|
||||
#define CI_GETINDEX(ci) (((ci) >> 8) & 0xffff)
|
||||
#define CI_GETFRACTION(ci) ((ci) & 0xff)
|
||||
#define CI_ROUNDINDEX(ci) CI_GETINDEX((ci) + 0x80)
|
||||
#define CI_MASKALPHA(ci) ((ci) & 0xffffff)
|
||||
#define CI_MAKE(a, i, f) (((a) << 24) | ((i) << 8) | (f))
|
||||
|
||||
/*
|
||||
* Format of RGBA colors is
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
* | alpha | red | green | blue |
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
*/
|
||||
#define RGBA_GETALPHA(rgb) ((rgb) >> 24)
|
||||
#define RGBA_GETRED(rgb) (((rgb) >> 16) & 0xff)
|
||||
#define RGBA_GETGREEN(rgb) (((rgb) >> 8) & 0xff)
|
||||
#define RGBA_GETBLUE(rgb) ((rgb) & 0xff)
|
||||
#define RGBA_MAKE(r, g, b, a) ((D3DCOLOR) (((a) << 24) | ((r) << 16) | ((g) << 8) | (b)))
|
||||
|
||||
/* D3DRGB and D3DRGBA may be used as initialisers for D3DCOLORs
|
||||
* The float values must be in the range 0..1
|
||||
*/
|
||||
#define D3DRGB(r, g, b) \
|
||||
(0xff000000L | ( ((long)((r) * 255)) << 16) | (((long)((g) * 255)) << 8) | (long)((b) * 255))
|
||||
#define D3DRGBA(r, g, b, a) \
|
||||
( (((long)((a) * 255)) << 24) | (((long)((r) * 255)) << 16) \
|
||||
| (((long)((g) * 255)) << 8) | (long)((b) * 255) \
|
||||
)
|
||||
|
||||
/*
|
||||
* Format of RGB colors is
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
* | ignored | red | green | blue |
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
*/
|
||||
#define RGB_GETRED(rgb) (((rgb) >> 16) & 0xff)
|
||||
#define RGB_GETGREEN(rgb) (((rgb) >> 8) & 0xff)
|
||||
#define RGB_GETBLUE(rgb) ((rgb) & 0xff)
|
||||
#define RGBA_SETALPHA(rgba, x) (((x) << 24) | ((rgba) & 0x00ffffff))
|
||||
#define RGB_MAKE(r, g, b) ((D3DCOLOR) (((r) << 16) | ((g) << 8) | (b)))
|
||||
#define RGBA_TORGB(rgba) ((D3DCOLOR) ((rgba) & 0xffffff))
|
||||
#define RGB_TORGBA(rgb) ((D3DCOLOR) ((rgb) | 0xff000000))
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Flags for Enumerate functions
|
||||
*/
|
||||
|
||||
/*
|
||||
* Stop the enumeration
|
||||
*/
|
||||
#define D3DENUMRET_CANCEL DDENUMRET_CANCEL
|
||||
|
||||
/*
|
||||
* Continue the enumeration
|
||||
*/
|
||||
#define D3DENUMRET_OK DDENUMRET_OK
|
||||
|
||||
typedef HRESULT (WINAPI* LPD3DVALIDATECALLBACK)(LPVOID lpUserArg, DWORD dwOffset);
|
||||
typedef HRESULT (WINAPI* LPD3DENUMTEXTUREFORMATSCALLBACK)(LPDDSURFACEDESC lpDdsd, LPVOID lpContext);
|
||||
|
||||
typedef DWORD D3DCOLOR, D3DCOLOR, *LPD3DCOLOR;
|
||||
|
||||
typedef DWORD D3DMATERIALHANDLE, *LPD3DMATERIALHANDLE;
|
||||
typedef DWORD D3DTEXTUREHANDLE, *LPD3DTEXTUREHANDLE;
|
||||
typedef DWORD D3DMATRIXHANDLE, *LPD3DMATRIXHANDLE;
|
||||
|
||||
typedef struct _D3DCOLORVALUE {
|
||||
union {
|
||||
D3DVALUE r;
|
||||
D3DVALUE dvR;
|
||||
};
|
||||
union {
|
||||
D3DVALUE g;
|
||||
D3DVALUE dvG;
|
||||
};
|
||||
union {
|
||||
D3DVALUE b;
|
||||
D3DVALUE dvB;
|
||||
};
|
||||
union {
|
||||
D3DVALUE a;
|
||||
D3DVALUE dvA;
|
||||
};
|
||||
} D3DCOLORVALUE;
|
||||
|
||||
typedef struct _D3DRECT {
|
||||
union {
|
||||
LONG x1;
|
||||
LONG lX1;
|
||||
};
|
||||
union {
|
||||
LONG y1;
|
||||
LONG lY1;
|
||||
};
|
||||
union {
|
||||
LONG x2;
|
||||
LONG lX2;
|
||||
};
|
||||
union {
|
||||
LONG y2;
|
||||
LONG lY2;
|
||||
};
|
||||
} D3DRECT, *LPD3DRECT;
|
||||
|
||||
typedef struct _D3DVECTOR {
|
||||
union {
|
||||
D3DVALUE x;
|
||||
D3DVALUE dvX;
|
||||
};
|
||||
union {
|
||||
D3DVALUE y;
|
||||
D3DVALUE dvY;
|
||||
};
|
||||
union {
|
||||
D3DVALUE z;
|
||||
D3DVALUE dvZ;
|
||||
};
|
||||
} D3DVECTOR, *LPD3DVECTOR;
|
||||
|
||||
|
||||
/*
|
||||
* Vertex data types supported in an ExecuteBuffer.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Homogeneous vertices
|
||||
*/
|
||||
|
||||
typedef struct _D3DHVERTEX {
|
||||
DWORD dwFlags; /* Homogeneous clipping flags */
|
||||
union {
|
||||
D3DVALUE hx;
|
||||
D3DVALUE dvHX;
|
||||
};
|
||||
union {
|
||||
D3DVALUE hy;
|
||||
D3DVALUE dvHY;
|
||||
};
|
||||
union {
|
||||
D3DVALUE hz;
|
||||
D3DVALUE dvHZ;
|
||||
};
|
||||
} D3DHVERTEX, *LPD3DHVERTEX;
|
||||
|
||||
/*
|
||||
* Transformed/lit vertices
|
||||
*/
|
||||
typedef struct _D3DTLVERTEX {
|
||||
union {
|
||||
D3DVALUE sx; /* Screen coordinates */
|
||||
D3DVALUE dvSX;
|
||||
};
|
||||
union {
|
||||
D3DVALUE sy;
|
||||
D3DVALUE dvSY;
|
||||
};
|
||||
union {
|
||||
D3DVALUE sz;
|
||||
D3DVALUE dvSZ;
|
||||
};
|
||||
union {
|
||||
D3DVALUE rhw; /* Reciprocal of homogeneous w */
|
||||
D3DVALUE dvRHW;
|
||||
};
|
||||
union {
|
||||
D3DCOLOR color; /* Vertex color */
|
||||
D3DCOLOR dcColor;
|
||||
};
|
||||
union {
|
||||
D3DCOLOR specular; /* Specular component of vertex */
|
||||
D3DCOLOR dcSpecular;
|
||||
};
|
||||
union {
|
||||
D3DVALUE tu; /* Texture coordinates */
|
||||
D3DVALUE dvTU;
|
||||
};
|
||||
union {
|
||||
D3DVALUE tv;
|
||||
D3DVALUE dvTV;
|
||||
};
|
||||
} D3DTLVERTEX, *LPD3DTLVERTEX;
|
||||
|
||||
/*
|
||||
* Untransformed/lit vertices
|
||||
*/
|
||||
typedef struct _D3DLVERTEX {
|
||||
union {
|
||||
D3DVALUE x; /* Homogeneous coordinates */
|
||||
D3DVALUE dvX;
|
||||
};
|
||||
union {
|
||||
D3DVALUE y;
|
||||
D3DVALUE dvY;
|
||||
};
|
||||
union {
|
||||
D3DVALUE z;
|
||||
D3DVALUE dvZ;
|
||||
};
|
||||
DWORD dwReserved;
|
||||
union {
|
||||
D3DCOLOR color; /* Vertex color */
|
||||
D3DCOLOR dcColor;
|
||||
};
|
||||
union {
|
||||
D3DCOLOR specular; /* Specular component of vertex */
|
||||
D3DCOLOR dcSpecular;
|
||||
};
|
||||
union {
|
||||
D3DVALUE tu; /* Texture coordinates */
|
||||
D3DVALUE dvTU;
|
||||
};
|
||||
union {
|
||||
D3DVALUE tv;
|
||||
D3DVALUE dvTV;
|
||||
};
|
||||
} D3DLVERTEX, *LPD3DLVERTEX;
|
||||
|
||||
/*
|
||||
* Untransformed/unlit vertices
|
||||
*/
|
||||
|
||||
typedef struct _D3DVERTEX {
|
||||
union {
|
||||
D3DVALUE x; /* Homogeneous coordinates */
|
||||
D3DVALUE dvX;
|
||||
};
|
||||
union {
|
||||
D3DVALUE y;
|
||||
D3DVALUE dvY;
|
||||
};
|
||||
union {
|
||||
D3DVALUE z;
|
||||
D3DVALUE dvZ;
|
||||
};
|
||||
union {
|
||||
D3DVALUE nx; /* Normal */
|
||||
D3DVALUE dvNX;
|
||||
};
|
||||
union {
|
||||
D3DVALUE ny;
|
||||
D3DVALUE dvNY;
|
||||
};
|
||||
union {
|
||||
D3DVALUE nz;
|
||||
D3DVALUE dvNZ;
|
||||
};
|
||||
union {
|
||||
D3DVALUE tu; /* Texture coordinates */
|
||||
D3DVALUE dvTU;
|
||||
};
|
||||
union {
|
||||
D3DVALUE tv;
|
||||
D3DVALUE dvTV;
|
||||
};
|
||||
} D3DVERTEX, *LPD3DVERTEX;
|
||||
|
||||
/*
|
||||
* Matrix, viewport, and tranformation structures and definitions.
|
||||
*/
|
||||
|
||||
typedef struct _D3DMATRIX {
|
||||
D3DVALUE _11, _12, _13, _14;
|
||||
D3DVALUE _21, _22, _23, _24;
|
||||
D3DVALUE _31, _32, _33, _34;
|
||||
D3DVALUE _41, _42, _43, _44;
|
||||
} D3DMATRIX, *LPD3DMATRIX;
|
||||
|
||||
typedef struct _D3DVIEWPORT {
|
||||
DWORD dwSize;
|
||||
DWORD dwX;
|
||||
DWORD dwY; /* Top left */
|
||||
DWORD dwWidth;
|
||||
DWORD dwHeight; /* Dimensions */
|
||||
D3DVALUE dvScaleX; /* Scale homogeneous to screen */
|
||||
D3DVALUE dvScaleY; /* Scale homogeneous to screen */
|
||||
D3DVALUE dvMaxX; /* Min/max homogeneous x coord */
|
||||
D3DVALUE dvMaxY; /* Min/max homogeneous y coord */
|
||||
D3DVALUE dvMinZ;
|
||||
D3DVALUE dvMaxZ; /* Min/max homogeneous z coord */
|
||||
} D3DVIEWPORT, *LPD3DVIEWPORT;
|
||||
|
||||
/*
|
||||
* Values for clip fields.
|
||||
*/
|
||||
#define D3DCLIP_LEFT 0x00000001L
|
||||
#define D3DCLIP_RIGHT 0x00000002L
|
||||
#define D3DCLIP_TOP 0x00000004L
|
||||
#define D3DCLIP_BOTTOM 0x00000008L
|
||||
#define D3DCLIP_FRONT 0x00000010L
|
||||
#define D3DCLIP_BACK 0x00000020L
|
||||
#define D3DCLIP_GEN0 0x00000040L
|
||||
#define D3DCLIP_GEN1 0x00000080L
|
||||
#define D3DCLIP_GEN2 0x00000100L
|
||||
#define D3DCLIP_GEN3 0x00000200L
|
||||
#define D3DCLIP_GEN4 0x00000400L
|
||||
#define D3DCLIP_GEN5 0x00000800L
|
||||
|
||||
/*
|
||||
* Values for d3d status.
|
||||
*/
|
||||
#define D3DSTATUS_CLIPUNIONLEFT D3DCLIP_LEFT
|
||||
#define D3DSTATUS_CLIPUNIONRIGHT D3DCLIP_RIGHT
|
||||
#define D3DSTATUS_CLIPUNIONTOP D3DCLIP_TOP
|
||||
#define D3DSTATUS_CLIPUNIONBOTTOM D3DCLIP_BOTTOM
|
||||
#define D3DSTATUS_CLIPUNIONFRONT D3DCLIP_FRONT
|
||||
#define D3DSTATUS_CLIPUNIONBACK D3DCLIP_BACK
|
||||
#define D3DSTATUS_CLIPUNIONGEN0 D3DCLIP_GEN0
|
||||
#define D3DSTATUS_CLIPUNIONGEN1 D3DCLIP_GEN1
|
||||
#define D3DSTATUS_CLIPUNIONGEN2 D3DCLIP_GEN2
|
||||
#define D3DSTATUS_CLIPUNIONGEN3 D3DCLIP_GEN3
|
||||
#define D3DSTATUS_CLIPUNIONGEN4 D3DCLIP_GEN4
|
||||
#define D3DSTATUS_CLIPUNIONGEN5 D3DCLIP_GEN5
|
||||
|
||||
#define D3DSTATUS_CLIPINTERSECTIONLEFT 0x00001000L
|
||||
#define D3DSTATUS_CLIPINTERSECTIONRIGHT 0x00002000L
|
||||
#define D3DSTATUS_CLIPINTERSECTIONTOP 0x00004000L
|
||||
#define D3DSTATUS_CLIPINTERSECTIONBOTTOM 0x00008000L
|
||||
#define D3DSTATUS_CLIPINTERSECTIONFRONT 0x00010000L
|
||||
#define D3DSTATUS_CLIPINTERSECTIONBACK 0x00020000L
|
||||
#define D3DSTATUS_CLIPINTERSECTIONGEN0 0x00040000L
|
||||
#define D3DSTATUS_CLIPINTERSECTIONGEN1 0x00080000L
|
||||
#define D3DSTATUS_CLIPINTERSECTIONGEN2 0x00100000L
|
||||
#define D3DSTATUS_CLIPINTERSECTIONGEN3 0x00200000L
|
||||
#define D3DSTATUS_CLIPINTERSECTIONGEN4 0x00400000L
|
||||
#define D3DSTATUS_CLIPINTERSECTIONGEN5 0x00800000L
|
||||
#define D3DSTATUS_ZNOTVISIBLE 0x01000000L
|
||||
|
||||
#define D3DSTATUS_CLIPUNIONALL ( \
|
||||
D3DSTATUS_CLIPUNIONLEFT | \
|
||||
D3DSTATUS_CLIPUNIONRIGHT | \
|
||||
D3DSTATUS_CLIPUNIONTOP | \
|
||||
D3DSTATUS_CLIPUNIONBOTTOM | \
|
||||
D3DSTATUS_CLIPUNIONFRONT | \
|
||||
D3DSTATUS_CLIPUNIONBACK | \
|
||||
D3DSTATUS_CLIPUNIONGEN0 | \
|
||||
D3DSTATUS_CLIPUNIONGEN1 | \
|
||||
D3DSTATUS_CLIPUNIONGEN2 | \
|
||||
D3DSTATUS_CLIPUNIONGEN3 | \
|
||||
D3DSTATUS_CLIPUNIONGEN4 | \
|
||||
D3DSTATUS_CLIPUNIONGEN5 \
|
||||
)
|
||||
|
||||
#define D3DSTATUS_CLIPINTERSECTIONALL ( \
|
||||
D3DSTATUS_CLIPINTERSECTIONLEFT | \
|
||||
D3DSTATUS_CLIPINTERSECTIONRIGHT | \
|
||||
D3DSTATUS_CLIPINTERSECTIONTOP | \
|
||||
D3DSTATUS_CLIPINTERSECTIONBOTTOM | \
|
||||
D3DSTATUS_CLIPINTERSECTIONFRONT | \
|
||||
D3DSTATUS_CLIPINTERSECTIONBACK | \
|
||||
D3DSTATUS_CLIPINTERSECTIONGEN0 | \
|
||||
D3DSTATUS_CLIPINTERSECTIONGEN1 | \
|
||||
D3DSTATUS_CLIPINTERSECTIONGEN2 | \
|
||||
D3DSTATUS_CLIPINTERSECTIONGEN3 | \
|
||||
D3DSTATUS_CLIPINTERSECTIONGEN4 | \
|
||||
D3DSTATUS_CLIPINTERSECTIONGEN5 \
|
||||
)
|
||||
|
||||
#define D3DSTATUS_DEFAULT ( \
|
||||
D3DSTATUS_CLIPINTERSECTIONALL | \
|
||||
D3DSTATUS_ZNOTVISIBLE)
|
||||
|
||||
|
||||
/*
|
||||
* Options for direct transform calls
|
||||
*/
|
||||
#define D3DTRANSFORM_CLIPPED 0x00000001l
|
||||
#define D3DTRANSFORM_UNCLIPPED 0x00000002l
|
||||
|
||||
typedef struct _D3DTRANSFORMDATA {
|
||||
DWORD dwSize;
|
||||
LPVOID lpIn; /* Input vertices */
|
||||
DWORD dwInSize; /* Stride of input vertices */
|
||||
LPVOID lpOut; /* Output vertices */
|
||||
DWORD dwOutSize; /* Stride of output vertices */
|
||||
LPD3DHVERTEX lpHOut; /* Output homogeneous vertices */
|
||||
DWORD dwClip; /* Clipping hint */
|
||||
DWORD dwClipIntersection;
|
||||
DWORD dwClipUnion; /* Union of all clip flags */
|
||||
D3DRECT drExtent; /* Extent of transformed vertices */
|
||||
} D3DTRANSFORMDATA, *LPD3DTRANSFORMDATA;
|
||||
|
||||
/*
|
||||
* Structure defining position and direction properties for lighting.
|
||||
*/
|
||||
typedef struct _D3DLIGHTINGELEMENT {
|
||||
D3DVECTOR dvPosition; /* Lightable point in model space */
|
||||
D3DVECTOR dvNormal; /* Normalised unit vector */
|
||||
} D3DLIGHTINGELEMENT, *LPD3DLIGHTINGELEMENT;
|
||||
|
||||
/*
|
||||
* Structure defining material properties for lighting.
|
||||
*/
|
||||
typedef struct _D3DMATERIAL {
|
||||
DWORD dwSize;
|
||||
union {
|
||||
D3DCOLORVALUE diffuse; /* Diffuse color RGBA */
|
||||
D3DCOLORVALUE dcvDiffuse;
|
||||
};
|
||||
union {
|
||||
D3DCOLORVALUE ambient; /* Ambient color RGB */
|
||||
D3DCOLORVALUE dcvAmbient;
|
||||
};
|
||||
union {
|
||||
D3DCOLORVALUE specular; /* Specular 'shininess' */
|
||||
D3DCOLORVALUE dcvSpecular;
|
||||
};
|
||||
union {
|
||||
D3DCOLORVALUE emissive; /* Emissive color RGB */
|
||||
D3DCOLORVALUE dcvEmissive;
|
||||
};
|
||||
union {
|
||||
D3DVALUE power; /* Sharpness if specular highlight */
|
||||
D3DVALUE dvPower;
|
||||
};
|
||||
D3DTEXTUREHANDLE hTexture; /* Handle to texture map */
|
||||
DWORD dwRampSize;
|
||||
} D3DMATERIAL, *LPD3DMATERIAL;
|
||||
|
||||
typedef enum _D3DLIGHTTYPE {
|
||||
D3DLIGHT_POINT = 1,
|
||||
D3DLIGHT_SPOT = 2,
|
||||
D3DLIGHT_DIRECTIONAL = 3,
|
||||
D3DLIGHT_PARALLELPOINT = 4,
|
||||
D3DLIGHT_GLSPOT = 5,
|
||||
} D3DLIGHTTYPE;
|
||||
|
||||
/*
|
||||
* Structure defining a light source and its properties.
|
||||
*/
|
||||
typedef struct _D3DLIGHT {
|
||||
DWORD dwSize;
|
||||
D3DLIGHTTYPE dltType; /* Type of light source */
|
||||
D3DCOLORVALUE dcvColor; /* Color of light */
|
||||
D3DVECTOR dvPosition; /* Position in world space */
|
||||
D3DVECTOR dvDirection; /* Direction in world space */
|
||||
D3DVALUE dvRange; /* Cutoff range */
|
||||
D3DVALUE dvFalloff; /* Falloff */
|
||||
D3DVALUE dvAttenuation0; /* Constant attenuation */
|
||||
D3DVALUE dvAttenuation1; /* Linear attenuation */
|
||||
D3DVALUE dvAttenuation2; /* Quadratic attenuation */
|
||||
D3DVALUE dvTheta; /* Inner angle of spotlight cone */
|
||||
D3DVALUE dvPhi; /* Outer angle of spotlight cone */
|
||||
} D3DLIGHT, *LPD3DLIGHT;
|
||||
|
||||
typedef struct _D3DLIGHTDATA {
|
||||
DWORD dwSize;
|
||||
LPD3DLIGHTINGELEMENT lpIn; /* Input positions and normals */
|
||||
DWORD dwInSize; /* Stride of input elements */
|
||||
LPD3DTLVERTEX lpOut; /* Output colors */
|
||||
DWORD dwOutSize; /* Stride of output colors */
|
||||
} D3DLIGHTDATA, *LPD3DLIGHTDATA;
|
||||
|
||||
typedef enum _D3DCOLORMODEL {
|
||||
D3DCOLOR_MONO = 1,
|
||||
D3DCOLOR_RGB = 2,
|
||||
} D3DCOLORMODEL;
|
||||
|
||||
/*
|
||||
* Options for clearing
|
||||
*/
|
||||
#define D3DCLEAR_TARGET 0x00000001l /* Clear target surface */
|
||||
#define D3DCLEAR_ZBUFFER 0x00000002l /* Clear target z buffer */
|
||||
|
||||
/*
|
||||
* Execute buffers are allocated via Direct3D. These buffers may then
|
||||
* be filled by the application with instructions to execute along with
|
||||
* vertex data.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Supported op codes for execute instructions.
|
||||
*/
|
||||
typedef enum _D3DOPCODE {
|
||||
D3DOP_POINT = 1,
|
||||
D3DOP_LINE = 2,
|
||||
D3DOP_TRIANGLE = 3,
|
||||
D3DOP_MATRIXLOAD = 4,
|
||||
D3DOP_MATRIXMULTIPLY = 5,
|
||||
D3DOP_STATETRANSFORM = 6,
|
||||
D3DOP_STATELIGHT = 7,
|
||||
D3DOP_STATERENDER = 8,
|
||||
D3DOP_PROCESSVERTICES = 9,
|
||||
D3DOP_TEXTURELOAD = 10,
|
||||
D3DOP_EXIT = 11,
|
||||
D3DOP_BRANCHFORWARD = 12,
|
||||
D3DOP_SPAN = 13,
|
||||
D3DOP_SETSTATUS = 14,
|
||||
} D3DOPCODE;
|
||||
|
||||
typedef struct _D3DINSTRUCTION {
|
||||
BYTE bOpcode; /* Instruction opcode */
|
||||
BYTE bSize; /* Size of each instruction data unit */
|
||||
WORD wCount; /* Count of instruction data units to follow */
|
||||
} D3DINSTRUCTION, *LPD3DINSTRUCTION;
|
||||
|
||||
/*
|
||||
* Structure for texture loads
|
||||
*/
|
||||
typedef struct _D3DTEXTURELOAD {
|
||||
D3DTEXTUREHANDLE hDestTexture;
|
||||
D3DTEXTUREHANDLE hSrcTexture;
|
||||
} D3DTEXTURELOAD, *LPD3DTEXTURELOAD;
|
||||
|
||||
/*
|
||||
* Structure for picking
|
||||
*/
|
||||
typedef struct _D3DPICKRECORD {
|
||||
BYTE bOpcode;
|
||||
BYTE bPad;
|
||||
DWORD dwOffset;
|
||||
D3DVALUE dvZ;
|
||||
} D3DPICKRECORD, *LPD3DPICKRECORD;
|
||||
|
||||
/*
|
||||
* The following defines the rendering states which can be set in the
|
||||
* execute buffer.
|
||||
*/
|
||||
|
||||
typedef enum _D3DSHADEMODE {
|
||||
D3DSHADE_FLAT = 1,
|
||||
D3DSHADE_GOURAUD = 2,
|
||||
D3DSHADE_PHONG = 3,
|
||||
} D3DSHADEMODE;
|
||||
|
||||
typedef enum _D3DFILLMODE {
|
||||
D3DFILL_POINT = 1,
|
||||
D3DFILL_WIREFRAME = 2,
|
||||
D3DFILL_SOLID = 3,
|
||||
} D3DFILLMODE;
|
||||
|
||||
typedef struct _D3DLINEPATTERN {
|
||||
WORD wRepeatFactor;
|
||||
WORD wLinePattern;
|
||||
} D3DLINEPATTERN;
|
||||
|
||||
typedef enum _D3DTEXTUREFILTER {
|
||||
D3DFILTER_NEAREST = 1,
|
||||
D3DFILTER_LINEAR = 2,
|
||||
D3DFILTER_MIPNEAREST = 3,
|
||||
D3DFILTER_MIPLINEAR = 4,
|
||||
D3DFILTER_LINEARMIPNEAREST = 5,
|
||||
D3DFILTER_LINEARMIPLINEAR = 6,
|
||||
} D3DTEXTUREFILTER;
|
||||
|
||||
typedef enum _D3DBLEND {
|
||||
D3DBLEND_ZERO = 1,
|
||||
D3DBLEND_ONE = 2,
|
||||
D3DBLEND_SRCCOLOR = 3,
|
||||
D3DBLEND_INVSRCCOLOR = 4,
|
||||
D3DBLEND_SRCALPHA = 5,
|
||||
D3DBLEND_INVSRCALPHA = 6,
|
||||
D3DBLEND_DESTALPHA = 7,
|
||||
D3DBLEND_INVDESTALPHA = 8,
|
||||
D3DBLEND_DESTCOLOR = 9,
|
||||
D3DBLEND_INVDESTCOLOR = 10,
|
||||
D3DBLEND_SRCALPHASAT = 11,
|
||||
D3DBLEND_BOTHSRCALPHA = 12,
|
||||
D3DBLEND_BOTHINVSRCALPHA = 13,
|
||||
} D3DBLEND;
|
||||
|
||||
typedef enum _D3DTEXTUREBLEND {
|
||||
D3DTBLEND_DECAL = 1,
|
||||
D3DTBLEND_MODULATE = 2,
|
||||
D3DTBLEND_DECALALPHA = 3,
|
||||
D3DTBLEND_MODULATEALPHA = 4,
|
||||
D3DTBLEND_DECALMASK = 5,
|
||||
D3DTBLEND_MODULATEMASK = 6,
|
||||
D3DTBLEND_COPY = 7,
|
||||
} D3DTEXTUREBLEND;
|
||||
|
||||
typedef enum _D3DTEXTUREADDRESS {
|
||||
D3DTADDRESS_WRAP = 1,
|
||||
D3DTADDRESS_MIRROR = 2,
|
||||
D3DTADDRESS_CLAMP = 3,
|
||||
} D3DTEXTUREADDRESS;
|
||||
|
||||
typedef enum _D3DCULL {
|
||||
D3DCULL_NONE = 1,
|
||||
D3DCULL_CW = 2,
|
||||
D3DCULL_CCW = 3,
|
||||
} D3DCULL;
|
||||
|
||||
typedef enum _D3DCMPFUNC {
|
||||
D3DCMP_NEVER = 1,
|
||||
D3DCMP_LESS = 2,
|
||||
D3DCMP_EQUAL = 3,
|
||||
D3DCMP_LESSEQUAL = 4,
|
||||
D3DCMP_GREATER = 5,
|
||||
D3DCMP_NOTEQUAL = 6,
|
||||
D3DCMP_GREATEREQUAL = 7,
|
||||
D3DCMP_ALWAYS = 8,
|
||||
} D3DCMPFUNC;
|
||||
|
||||
typedef enum _D3DFOGMODE {
|
||||
D3DFOG_NONE = 0,
|
||||
D3DFOG_EXP = 1,
|
||||
D3DFOG_EXP2 = 2,
|
||||
D3DFOG_LINEAR = 3
|
||||
} D3DFOGMODE;
|
||||
|
||||
/*
|
||||
* Amount to add to a state to generate the override for that state.
|
||||
*/
|
||||
#define D3DSTATE_OVERRIDE_BIAS 256
|
||||
|
||||
/*
|
||||
* A state which sets the override flag for the specified state type.
|
||||
*/
|
||||
#define D3DSTATE_OVERRIDE(type) ((DWORD) (type) + D3DSTATE_OVERRIDE_BIAS)
|
||||
|
||||
typedef enum _D3DTRANSFORMSTATETYPE {
|
||||
D3DTRANSFORMSTATE_WORLD = 1,
|
||||
D3DTRANSFORMSTATE_VIEW = 2,
|
||||
D3DTRANSFORMSTATE_PROJECTION = 3,
|
||||
} D3DTRANSFORMSTATETYPE;
|
||||
|
||||
typedef enum _D3DLIGHTSTATETYPE {
|
||||
D3DLIGHTSTATE_MATERIAL = 1,
|
||||
D3DLIGHTSTATE_AMBIENT = 2,
|
||||
D3DLIGHTSTATE_COLORMODEL = 3,
|
||||
D3DLIGHTSTATE_FOGMODE = 4,
|
||||
D3DLIGHTSTATE_FOGSTART = 5,
|
||||
D3DLIGHTSTATE_FOGEND = 6,
|
||||
D3DLIGHTSTATE_FOGDENSITY = 7,
|
||||
} D3DLIGHTSTATETYPE;
|
||||
|
||||
typedef enum _D3DRENDERSTATETYPE {
|
||||
D3DRENDERSTATE_TEXTUREHANDLE = 1, /* Texture handle */
|
||||
D3DRENDERSTATE_ANTIALIAS = 2, /* Antialiasing prim edges */
|
||||
D3DRENDERSTATE_TEXTUREADDRESS = 3, /* D3DTEXTUREADDRESS */
|
||||
D3DRENDERSTATE_TEXTUREPERSPECTIVE = 4, /* TRUE for perspective correction */
|
||||
D3DRENDERSTATE_WRAPU = 5, /* TRUE for wrapping in u */
|
||||
D3DRENDERSTATE_WRAPV = 6, /* TRUE for wrapping in v */
|
||||
D3DRENDERSTATE_ZENABLE = 7, /* TRUE to enable z test */
|
||||
D3DRENDERSTATE_FILLMODE = 8, /* D3DFILL_MODE */
|
||||
D3DRENDERSTATE_SHADEMODE = 9, /* D3DSHADEMODE */
|
||||
D3DRENDERSTATE_LINEPATTERN = 10, /* D3DLINEPATTERN */
|
||||
D3DRENDERSTATE_MONOENABLE = 11, /* TRUE to enable mono rasterization */
|
||||
D3DRENDERSTATE_ROP2 = 12, /* ROP2 */
|
||||
D3DRENDERSTATE_PLANEMASK = 13, /* DWORD physical plane mask */
|
||||
D3DRENDERSTATE_ZWRITEENABLE = 14, /* TRUE to enable z writes */
|
||||
D3DRENDERSTATE_ALPHATESTENABLE = 15, /* TRUE to enable alpha tests */
|
||||
D3DRENDERSTATE_LASTPIXEL = 16, /* TRUE for last-pixel on lines */
|
||||
D3DRENDERSTATE_TEXTUREMAG = 17, /* D3DTEXTUREFILTER */
|
||||
D3DRENDERSTATE_TEXTUREMIN = 18, /* D3DTEXTUREFILTER */
|
||||
D3DRENDERSTATE_SRCBLEND = 19, /* D3DBLEND */
|
||||
D3DRENDERSTATE_DESTBLEND = 20, /* D3DBLEND */
|
||||
D3DRENDERSTATE_TEXTUREMAPBLEND = 21, /* D3DTEXTUREBLEND */
|
||||
D3DRENDERSTATE_CULLMODE = 22, /* D3DCULL */
|
||||
D3DRENDERSTATE_ZFUNC = 23, /* D3DCMPFUNC */
|
||||
D3DRENDERSTATE_ALPHAREF = 24, /* D3DFIXED */
|
||||
D3DRENDERSTATE_ALPHAFUNC = 25, /* D3DCMPFUNC */
|
||||
D3DRENDERSTATE_DITHERENABLE = 26, /* TRUE to enable dithering */
|
||||
D3DRENDERSTATE_BLENDENABLE = 27, /* TRUE to enable alpha blending */
|
||||
D3DRENDERSTATE_FOGENABLE = 28, /* TRUE to enable fog */
|
||||
D3DRENDERSTATE_SPECULARENABLE = 29, /* TRUE to enable specular */
|
||||
D3DRENDERSTATE_ZVISIBLE = 30, /* TRUE to enable z checking */
|
||||
D3DRENDERSTATE_SUBPIXEL = 31, /* TRUE to enable subpixel correction */
|
||||
D3DRENDERSTATE_SUBPIXELX = 32, /* TRUE to enable correction in X only */
|
||||
D3DRENDERSTATE_STIPPLEDALPHA = 33, /* TRUE to enable stippled alpha */
|
||||
D3DRENDERSTATE_FOGCOLOR = 34, /* D3DCOLOR */
|
||||
D3DRENDERSTATE_FOGTABLEMODE = 35, /* D3DFOGMODE */
|
||||
D3DRENDERSTATE_FOGTABLESTART = 36, /* Fog table start */
|
||||
D3DRENDERSTATE_FOGTABLEEND = 37, /* Fog table end */
|
||||
D3DRENDERSTATE_FOGTABLEDENSITY = 38, /* Fog table density */
|
||||
D3DRENDERSTATE_STIPPLEENABLE = 39, /* TRUE to enable stippling */
|
||||
D3DRENDERSTATE_STIPPLEPATTERN00 = 64, /* Stipple pattern 01... */
|
||||
D3DRENDERSTATE_STIPPLEPATTERN01 = 65,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN02 = 66,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN03 = 67,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN04 = 68,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN05 = 69,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN06 = 70,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN07 = 71,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN08 = 72,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN09 = 73,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN10 = 74,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN11 = 75,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN12 = 76,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN13 = 77,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN14 = 78,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN15 = 79,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN16 = 80,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN17 = 81,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN18 = 82,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN19 = 83,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN20 = 84,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN21 = 85,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN22 = 86,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN23 = 87,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN24 = 88,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN25 = 89,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN26 = 90,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN27 = 91,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN28 = 92,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN29 = 93,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN30 = 94,
|
||||
D3DRENDERSTATE_STIPPLEPATTERN31 = 95,
|
||||
} D3DRENDERSTATETYPE;
|
||||
|
||||
#define D3DRENDERSTATE_STIPPLEPATTERN(y) (D3DRENDERSTATE_STIPPLEPATTERN00 + (y))
|
||||
|
||||
typedef struct _D3DSTATE {
|
||||
union {
|
||||
D3DTRANSFORMSTATETYPE dtstTransformStateType;
|
||||
D3DLIGHTSTATETYPE dlstLightStateType;
|
||||
D3DRENDERSTATETYPE drstRenderStateType;
|
||||
};
|
||||
union {
|
||||
DWORD dwArg[1];
|
||||
D3DVALUE dvArg[1];
|
||||
};
|
||||
} D3DSTATE, *LPD3DSTATE;
|
||||
|
||||
/*
|
||||
* Operation used to load matrices
|
||||
* hDstMat = hSrcMat
|
||||
*/
|
||||
typedef struct _D3DMATRIXLOAD {
|
||||
D3DMATRIXHANDLE hDestMatrix; /* Destination matrix */
|
||||
D3DMATRIXHANDLE hSrcMatrix; /* Source matrix */
|
||||
} D3DMATRIXLOAD, *LPD3DMATRIXLOAD;
|
||||
|
||||
/*
|
||||
* Operation used to multiply matrices
|
||||
* hDstMat = hSrcMat1 * hSrcMat2
|
||||
*/
|
||||
typedef struct _D3DMATRIXMULTIPLY {
|
||||
D3DMATRIXHANDLE hDestMatrix; /* Destination matrix */
|
||||
D3DMATRIXHANDLE hSrcMatrix1; /* First source matrix */
|
||||
D3DMATRIXHANDLE hSrcMatrix2; /* Second source matrix */
|
||||
} D3DMATRIXMULTIPLY, *LPD3DMATRIXMULTIPLY;
|
||||
|
||||
/*
|
||||
* Operation used to transform and light vertices.
|
||||
*/
|
||||
typedef struct _D3DPROCESSVERTICES {
|
||||
DWORD dwFlags; /* Do we transform or light or just copy? */
|
||||
WORD wStart; /* Index to first vertex in source */
|
||||
WORD wDest; /* Index to first vertex in local buffer */
|
||||
DWORD dwCount; /* Number of vertices to be processed */
|
||||
DWORD dwReserved; /* Must be zero */
|
||||
} D3DPROCESSVERTICES, *LPD3DPROCESSVERTICES;
|
||||
|
||||
#define D3DPROCESSVERTICES_TRANSFORMLIGHT 0x00000000L
|
||||
#define D3DPROCESSVERTICES_TRANSFORM 0x00000001L
|
||||
#define D3DPROCESSVERTICES_COPY 0x00000002L
|
||||
#define D3DPROCESSVERTICES_OPMASK 0x00000007L
|
||||
|
||||
#define D3DPROCESSVERTICES_UPDATEEXTENTS 0x00000008L
|
||||
#define D3DPROCESSVERTICES_NOCOLOR 0x00000010L
|
||||
|
||||
|
||||
/*
|
||||
* Triangle flags
|
||||
*/
|
||||
|
||||
/*
|
||||
* Tri strip and fan flags.
|
||||
* START loads all three vertices
|
||||
* EVEN and ODD load just v3 with even or odd culling
|
||||
* START_FLAT contains a count from 0 to 29 that allows the
|
||||
* whole strip or fan to be culled in one hit.
|
||||
* e.g. for a quad len = 1
|
||||
*/
|
||||
#define D3DTRIFLAG_START 0x00000000L
|
||||
#define D3DTRIFLAG_STARTFLAT(len) (len) /* 0 < len < 30 */
|
||||
#define D3DTRIFLAG_ODD 0x0000001eL
|
||||
#define D3DTRIFLAG_EVEN 0x0000001fL
|
||||
|
||||
/*
|
||||
* Triangle edge flags
|
||||
* enable edges for wireframe or antialiasing
|
||||
*/
|
||||
#define D3DTRIFLAG_EDGEENABLE1 0x00000100L /* v0-v1 edge */
|
||||
#define D3DTRIFLAG_EDGEENABLE2 0x00000200L /* v1-v2 edge */
|
||||
#define D3DTRIFLAG_EDGEENABLE3 0x00000400L /* v2-v0 edge */
|
||||
#define D3DTRIFLAG_EDGEENABLETRIANGLE \
|
||||
(D3DTRIFLAG_EDGEENABLE1 | D3DTRIFLAG_EDGEENABLE2 | D3DTRIFLAG_EDGEENABLE3)
|
||||
|
||||
/*
|
||||
* Primitive structures and related defines. Vertex offsets are to types
|
||||
* D3DVERTEX, D3DLVERTEX, or D3DTLVERTEX.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Triangle list primitive structure
|
||||
*/
|
||||
typedef struct _D3DTRIANGLE {
|
||||
union {
|
||||
WORD v1; /* Vertex indices */
|
||||
WORD wV1;
|
||||
};
|
||||
union {
|
||||
WORD v2;
|
||||
WORD wV2;
|
||||
};
|
||||
union {
|
||||
WORD v3;
|
||||
WORD wV3;
|
||||
};
|
||||
WORD wFlags; /* Edge (and other) flags */
|
||||
} D3DTRIANGLE, *LPD3DTRIANGLE;
|
||||
|
||||
/*
|
||||
* Line strip structure.
|
||||
* The instruction count - 1 defines the number of line segments.
|
||||
*/
|
||||
typedef struct _D3DLINE {
|
||||
union {
|
||||
WORD v1; /* Vertex indices */
|
||||
WORD wV1;
|
||||
};
|
||||
union {
|
||||
WORD v2;
|
||||
WORD wV2;
|
||||
};
|
||||
} D3DLINE, *LPD3DLINE;
|
||||
|
||||
/*
|
||||
* Span structure
|
||||
* Spans join a list of points with the same y value.
|
||||
* If the y value changes, a new span is started.
|
||||
*/
|
||||
typedef struct _D3DSPAN {
|
||||
WORD wCount; /* Number of spans */
|
||||
WORD wFirst; /* Index to first vertex */
|
||||
} D3DSPAN, *LPD3DSPAN;
|
||||
|
||||
/*
|
||||
* Point structure
|
||||
*/
|
||||
typedef struct _D3DPOINT {
|
||||
WORD wCount; /* number of points */
|
||||
WORD wFirst; /* index to first vertex */
|
||||
} D3DPOINT, *LPD3DPOINT;
|
||||
|
||||
|
||||
/*
|
||||
* Forward branch structure.
|
||||
* Mask is logically anded with the driver status mask
|
||||
* if the result equals 'value', the branch is taken.
|
||||
*/
|
||||
typedef struct _D3DBRANCH {
|
||||
DWORD dwMask; /* Bitmask against D3D status */
|
||||
DWORD dwValue;
|
||||
BOOL bNegate; /* TRUE to negate comparison */
|
||||
DWORD dwOffset; /* How far to branch forward (0 for exit)*/
|
||||
} D3DBRANCH, *LPD3DBRANCH;
|
||||
|
||||
/*
|
||||
* Status used for set status instruction.
|
||||
* The D3D status is initialised on device creation
|
||||
* and is modified by all execute calls.
|
||||
*/
|
||||
typedef struct _D3DSTATUS {
|
||||
DWORD dwFlags; /* Do we set extents or status */
|
||||
DWORD dwStatus; /* D3D status */
|
||||
D3DRECT drExtent;
|
||||
} D3DSTATUS, *LPD3DSTATUS;
|
||||
|
||||
#define D3DSETSTATUS_STATUS 0x00000001L
|
||||
#define D3DSETSTATUS_EXTENTS 0x00000002L
|
||||
#define D3DSETSTATUS_ALL (D3DSETSTATUS_STATUS | D3DSETSTATUS_EXTENTS)
|
||||
|
||||
/*
|
||||
* Statistics structure
|
||||
*/
|
||||
typedef struct _D3DSTATS {
|
||||
DWORD dwSize;
|
||||
DWORD dwTrianglesDrawn;
|
||||
DWORD dwLinesDrawn;
|
||||
DWORD dwPointsDrawn;
|
||||
DWORD dwSpansDrawn;
|
||||
DWORD dwVerticesProcessed;
|
||||
} D3DSTATS, *LPD3DSTATS;
|
||||
|
||||
/*
|
||||
* Execute options.
|
||||
* When calling using D3DEXECUTE_UNCLIPPED all the primitives
|
||||
* inside the buffer must be contained within the viewport.
|
||||
*/
|
||||
#define D3DEXECUTE_CLIPPED 0x00000001l
|
||||
#define D3DEXECUTE_UNCLIPPED 0x00000002l
|
||||
|
||||
typedef struct _D3DEXECUTEDATA {
|
||||
DWORD dwSize;
|
||||
DWORD dwVertexOffset;
|
||||
DWORD dwVertexCount;
|
||||
DWORD dwInstructionOffset;
|
||||
DWORD dwInstructionLength;
|
||||
DWORD dwHVertexOffset;
|
||||
D3DSTATUS dsStatus; /* Status after execute */
|
||||
} D3DEXECUTEDATA, *LPD3DEXECUTEDATA;
|
||||
|
||||
/*
|
||||
* Palette flags.
|
||||
* This are or'ed with the peFlags in the PALETTEENTRYs passed to DirectDraw.
|
||||
*/
|
||||
#define D3DPAL_FREE 0x00 /* Renderer may use this entry freely */
|
||||
#define D3DPAL_READONLY 0x40 /* Renderer may not set this entry */
|
||||
#define D3DPAL_RESERVED 0x80 /* Renderer may not use this entry */
|
||||
|
||||
#if defined(__cplusplus)
|
||||
};
|
||||
#endif
|
||||
|
||||
#pragma pack()
|
||||
|
||||
#endif /* _D3DTYPES_H_ */
|
||||
3102
WinQuake/dxsdk/SDK/INC/DDRAW.H
Normal file
3102
WinQuake/dxsdk/SDK/INC/DDRAW.H
Normal file
File diff suppressed because it is too large
Load Diff
873
WinQuake/dxsdk/SDK/INC/DINPUT.H
Normal file
873
WinQuake/dxsdk/SDK/INC/DINPUT.H
Normal file
@@ -0,0 +1,873 @@
|
||||
/****************************************************************************
|
||||
*
|
||||
* Copyright (C) 1996 Microsoft Corporation. All Rights Reserved.
|
||||
*
|
||||
* File: dinput.h
|
||||
* Content: DirectInput include file
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __DINPUT_INCLUDED__
|
||||
#define __DINPUT_INCLUDED__
|
||||
|
||||
#ifdef _WIN32
|
||||
#define COM_NO_WINDOWS_H
|
||||
#include <objbase.h>
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define DIRECTINPUT_VERSION 0x0300
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* Class IDs
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
DEFINE_GUID(CLSID_DirectInput, 0x25E609E0,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
|
||||
DEFINE_GUID(CLSID_DirectInputDevice,0x25E609E1,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* Interfaces
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
DEFINE_GUID(IID_IDirectInputA, 0x89521360,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
|
||||
DEFINE_GUID(IID_IDirectInputW, 0x89521361,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
|
||||
|
||||
DEFINE_GUID(IID_IDirectInputDeviceA,0x5944E680,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
|
||||
DEFINE_GUID(IID_IDirectInputDeviceW,0x5944E681,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* Predefined object types
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
DEFINE_GUID(GUID_XAxis, 0xA36D02E0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
|
||||
DEFINE_GUID(GUID_YAxis, 0xA36D02E1,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
|
||||
DEFINE_GUID(GUID_ZAxis, 0xA36D02E2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
|
||||
DEFINE_GUID(GUID_RAxis, 0xA36D02E3,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
|
||||
DEFINE_GUID(GUID_UAxis, 0xA36D02E4,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
|
||||
DEFINE_GUID(GUID_VAxis, 0xA36D02E5,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
|
||||
|
||||
DEFINE_GUID(GUID_Button, 0xA36D02F0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
|
||||
DEFINE_GUID(GUID_Key, 0x55728220,0xD33C,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
|
||||
|
||||
DEFINE_GUID(GUID_POV, 0xA36D02F2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* Predefined product GUIDs
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
DEFINE_GUID(GUID_SysMouse, 0x6F1D2B60,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
|
||||
DEFINE_GUID(GUID_SysKeyboard,0x6F1D2B61,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* Interfaces and Structures...
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* IDirectInputDevice
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#define DIDEVTYPE_DEVICE 1
|
||||
#define DIDEVTYPE_MOUSE 2
|
||||
#define DIDEVTYPE_KEYBOARD 3
|
||||
#define DIDEVTYPE_JOYSTICK 4
|
||||
|
||||
#define DIDEVTYPEMOUSE_UNKNOWN 1
|
||||
#define DIDEVTYPEMOUSE_TRADITIONAL 2
|
||||
#define DIDEVTYPEMOUSE_FINGERSTICK 3
|
||||
#define DIDEVTYPEMOUSE_TOUCHPAD 4
|
||||
#define DIDEVTYPEMOUSE_TRACKBALL 5
|
||||
|
||||
#define DIDEVTYPEKEYBOARD_PCXT 1
|
||||
#define DIDEVTYPEKEYBOARD_OLIVETTI 2
|
||||
#define DIDEVTYPEKEYBOARD_PCAT 3
|
||||
#define DIDEVTYPEKEYBOARD_PCENH 4
|
||||
#define DIDEVTYPEKEYBOARD_NOKIA1050 5
|
||||
#define DIDEVTYPEKEYBOARD_NOKIA9140 6
|
||||
#define DIDEVTYPEKEYBOARD_NEC98 7
|
||||
#define DIDEVTYPEKEYBOARD_NEC98LAPTOP 8
|
||||
#define DIDEVTYPEKEYBOARD_NEC98106 9
|
||||
#define DIDEVTYPEKEYBOARD_JAPAN106 10
|
||||
#define DIDEVTYPEKEYBOARD_JAPANAX 11
|
||||
#define DIDEVTYPEKEYBOARD_J3100 12
|
||||
|
||||
#define GET_DIDEVICE_TYPE(dwDevType) LOBYTE(dwDevType)
|
||||
#define GET_DIDEVICE_SUBTYPE(dwDevType) HIBYTE(dwDevType)
|
||||
|
||||
typedef struct _DIDEVCAPS {
|
||||
DWORD dwSize;
|
||||
DWORD dwFlags;
|
||||
DWORD dwDevType;
|
||||
DWORD dwAxes;
|
||||
DWORD dwButtons;
|
||||
DWORD dwPOVs;
|
||||
} DIDEVCAPS, *LPDIDEVCAPS;
|
||||
|
||||
#define DIDC_ATTACHED 0x00000001
|
||||
#define DIDC_POLLEDDEVICE 0x00000002
|
||||
|
||||
#define DIDFT_ALL 0x00000000
|
||||
|
||||
#define DIDFT_RELAXIS 0x00000001
|
||||
#define DIDFT_ABSAXIS 0x00000002
|
||||
#define DIDFT_AXIS 0x00000003
|
||||
|
||||
#define DIDFT_PSHBUTTON 0x00000004
|
||||
#define DIDFT_TGLBUTTON 0x00000008
|
||||
#define DIDFT_BUTTON 0x0000000C
|
||||
|
||||
#define DIDFT_POV 0x00000010
|
||||
|
||||
#define DIDFT_ANYINSTANCE 0x0000FF00
|
||||
#define DIDFT_MAKEINSTANCE(n) ((BYTE)(n) << 8)
|
||||
#define DIDFT_GETTYPE(n) LOBYTE(n)
|
||||
#define DIDFT_GETINSTANCE(n) HIBYTE(n)
|
||||
|
||||
typedef struct _DIOBJECTDATAFORMAT {
|
||||
const GUID *pguid;
|
||||
DWORD dwOfs;
|
||||
DWORD dwType;
|
||||
DWORD dwFlags;
|
||||
} DIOBJECTDATAFORMAT, *LPDIOBJECTDATAFORMAT;
|
||||
typedef const DIOBJECTDATAFORMAT *LPCDIOBJECTDATAFORMAT;
|
||||
|
||||
typedef struct _DIDATAFORMAT {
|
||||
DWORD dwSize;
|
||||
DWORD dwObjSize;
|
||||
DWORD dwFlags;
|
||||
DWORD dwDataSize;
|
||||
DWORD dwNumObjs;
|
||||
LPDIOBJECTDATAFORMAT rgodf;
|
||||
} DIDATAFORMAT, *LPDIDATAFORMAT;
|
||||
typedef const DIDATAFORMAT *LPCDIDATAFORMAT;
|
||||
|
||||
#define DIDF_ABSAXIS 0x00000001
|
||||
#define DIDF_RELAXIS 0x00000002
|
||||
|
||||
extern const DIDATAFORMAT c_dfDIMouse;
|
||||
extern const DIDATAFORMAT c_dfDIKeyboard;
|
||||
|
||||
typedef struct DIDEVICEOBJECTINSTANCEA {
|
||||
DWORD dwSize;
|
||||
GUID guidType;
|
||||
DWORD dwOfs;
|
||||
DWORD dwType;
|
||||
DWORD dwFlags;
|
||||
CHAR tszName[MAX_PATH];
|
||||
} DIDEVICEOBJECTINSTANCEA, *LPDIDEVICEOBJECTINSTANCEA;
|
||||
typedef struct DIDEVICEOBJECTINSTANCEW {
|
||||
DWORD dwSize;
|
||||
GUID guidType;
|
||||
DWORD dwOfs;
|
||||
DWORD dwType;
|
||||
DWORD dwFlags;
|
||||
WCHAR tszName[MAX_PATH];
|
||||
} DIDEVICEOBJECTINSTANCEW, *LPDIDEVICEOBJECTINSTANCEW;
|
||||
#ifdef UNICODE
|
||||
typedef DIDEVICEOBJECTINSTANCEW DIDEVICEOBJECTINSTANCE;
|
||||
typedef LPDIDEVICEOBJECTINSTANCEW LPDIDEVICEOBJECTINSTANCE;
|
||||
#else
|
||||
typedef DIDEVICEOBJECTINSTANCEA DIDEVICEOBJECTINSTANCE;
|
||||
typedef LPDIDEVICEOBJECTINSTANCEA LPDIDEVICEOBJECTINSTANCE;
|
||||
#endif // UNICODE
|
||||
typedef const DIDEVICEOBJECTINSTANCEA *LPCDIDEVICEOBJECTINSTANCEA;
|
||||
typedef const DIDEVICEOBJECTINSTANCEW *LPCDIDEVICEOBJECTINSTANCEW;
|
||||
typedef const DIDEVICEOBJECTINSTANCE *LPCDIDEVICEOBJECTINSTANCE;
|
||||
|
||||
typedef BOOL (FAR PASCAL * LPDIENUMDEVICEOBJECTSCALLBACKA)(LPCDIDEVICEOBJECTINSTANCEA, LPVOID);
|
||||
typedef BOOL (FAR PASCAL * LPDIENUMDEVICEOBJECTSCALLBACKW)(LPCDIDEVICEOBJECTINSTANCEW, LPVOID);
|
||||
#ifdef UNICODE
|
||||
#define LPDIENUMDEVICEOBJECTSCALLBACK LPDIENUMDEVICEOBJECTSCALLBACKW
|
||||
#else
|
||||
#define LPDIENUMDEVICEOBJECTSCALLBACK LPDIENUMDEVICEOBJECTSCALLBACKA
|
||||
#endif // !UNICODE
|
||||
|
||||
typedef struct DIPROPHEADER {
|
||||
DWORD dwSize;
|
||||
DWORD dwHeaderSize;
|
||||
DWORD dwObj;
|
||||
DWORD dwHow;
|
||||
} DIPROPHEADER, *LPDIPROPHEADER;
|
||||
typedef const DIPROPHEADER *LPCDIPROPHEADER;
|
||||
|
||||
#define DIPH_DEVICE 0
|
||||
#define DIPH_BYOFFSET 1
|
||||
#define DIPH_BYID 2
|
||||
|
||||
typedef struct DIPROPDWORD {
|
||||
DIPROPHEADER diph;
|
||||
DWORD dwData;
|
||||
} DIPROPDWORD, *LPDIPROPDWORD;
|
||||
typedef const DIPROPDWORD *LPCDIPROPDWORD;
|
||||
|
||||
typedef struct DIPROPRANGE {
|
||||
DIPROPHEADER diph;
|
||||
LONG lMin;
|
||||
LONG lMax;
|
||||
} DIPROPRANGE, *LPDIPROPRANGE;
|
||||
typedef const DIPROPRANGE *LPCDIPROPRANGE;
|
||||
|
||||
#define DIPROPRANGE_NOMIN ((LONG)0x80000000)
|
||||
#define DIPROPRANGE_NOMAX ((LONG)0x7FFFFFFF)
|
||||
|
||||
#ifdef __cplusplus
|
||||
#define MAKEDIPROP(prop) (*(const GUID *)(prop))
|
||||
#else
|
||||
#define MAKEDIPROP(prop) ((REFGUID)(prop))
|
||||
#endif
|
||||
|
||||
#define DIPROP_BUFFERSIZE MAKEDIPROP(1)
|
||||
|
||||
#define DIPROP_AXISMODE MAKEDIPROP(2)
|
||||
|
||||
#define DIPROPAXISMODE_ABS 0
|
||||
#define DIPROPAXISMODE_REL 1
|
||||
|
||||
#define DIPROP_GRANULARITY MAKEDIPROP(3)
|
||||
|
||||
#define DIPROP_RANGE MAKEDIPROP(4)
|
||||
|
||||
typedef struct DIDEVICEOBJECTDATA {
|
||||
DWORD dwOfs;
|
||||
DWORD dwData;
|
||||
DWORD dwTimeStamp;
|
||||
DWORD dwSequence;
|
||||
} DIDEVICEOBJECTDATA, *LPDIDEVICEOBJECTDATA;
|
||||
|
||||
#define DIGDD_PEEK 0x00000001
|
||||
|
||||
#define DISEQUENCE_COMPARE(dwSequence1, cmp, dwSequence2) \
|
||||
((int)((dwSequence1) - (dwSequence2)) cmp 0)
|
||||
|
||||
#define DISCL_EXCLUSIVE 0x00000001
|
||||
#define DISCL_NONEXCLUSIVE 0x00000002
|
||||
#define DISCL_FOREGROUND 0x00000004
|
||||
#define DISCL_BACKGROUND 0x00000008
|
||||
|
||||
typedef struct DIDEVICEINSTANCEA {
|
||||
DWORD dwSize;
|
||||
GUID guidInstance;
|
||||
GUID guidProduct;
|
||||
DWORD dwDevType;
|
||||
CHAR tszInstanceName[MAX_PATH];
|
||||
CHAR tszProductName[MAX_PATH];
|
||||
} DIDEVICEINSTANCEA, *LPDIDEVICEINSTANCEA;
|
||||
typedef struct DIDEVICEINSTANCEW {
|
||||
DWORD dwSize;
|
||||
GUID guidInstance;
|
||||
GUID guidProduct;
|
||||
DWORD dwDevType;
|
||||
WCHAR tszInstanceName[MAX_PATH];
|
||||
WCHAR tszProductName[MAX_PATH];
|
||||
} DIDEVICEINSTANCEW, *LPDIDEVICEINSTANCEW;
|
||||
#ifdef UNICODE
|
||||
typedef DIDEVICEINSTANCEW DIDEVICEINSTANCE;
|
||||
typedef LPDIDEVICEINSTANCEW LPDIDEVICEINSTANCE;
|
||||
#else
|
||||
typedef DIDEVICEINSTANCEA DIDEVICEINSTANCE;
|
||||
typedef LPDIDEVICEINSTANCEA LPDIDEVICEINSTANCE;
|
||||
#endif // UNICODE
|
||||
typedef const DIDEVICEINSTANCEA *LPCDIDEVICEINSTANCEA;
|
||||
typedef const DIDEVICEINSTANCEW *LPCDIDEVICEINSTANCEW;
|
||||
typedef const DIDEVICEINSTANCE *LPCDIDEVICEINSTANCE;
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirectInputDeviceW
|
||||
|
||||
DECLARE_INTERFACE_(IDirectInputDeviceW, IUnknown)
|
||||
{
|
||||
/*** IUnknown methods ***/
|
||||
STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
|
||||
STDMETHOD_(ULONG,AddRef)(THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release)(THIS) PURE;
|
||||
|
||||
/*** IDirectInputDeviceW methods ***/
|
||||
STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS) PURE;
|
||||
STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW,LPVOID,DWORD) PURE;
|
||||
STDMETHOD(GetProperty)(THIS_ REFGUID,LPDIPROPHEADER) PURE;
|
||||
STDMETHOD(SetProperty)(THIS_ REFGUID,LPCDIPROPHEADER) PURE;
|
||||
STDMETHOD(Acquire)(THIS) PURE;
|
||||
STDMETHOD(Unacquire)(THIS) PURE;
|
||||
STDMETHOD(GetDeviceState)(THIS_ DWORD,LPVOID) PURE;
|
||||
STDMETHOD(GetDeviceData)(THIS_ DWORD,LPDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE;
|
||||
STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT) PURE;
|
||||
STDMETHOD(SetEventNotification)(THIS_ HANDLE) PURE;
|
||||
STDMETHOD(SetCooperativeLevel)(THIS_ HWND,DWORD) PURE;
|
||||
STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEW,DWORD,DWORD) PURE;
|
||||
STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEW) PURE;
|
||||
STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
|
||||
STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD,REFGUID) PURE;
|
||||
};
|
||||
|
||||
typedef struct IDirectInputDeviceW *LPDIRECTINPUTDEVICEW;
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirectInputDeviceA
|
||||
|
||||
DECLARE_INTERFACE_(IDirectInputDeviceA, IUnknown)
|
||||
{
|
||||
/*** IUnknown methods ***/
|
||||
STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
|
||||
STDMETHOD_(ULONG,AddRef)(THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release)(THIS) PURE;
|
||||
|
||||
/*** IDirectInputDeviceA methods ***/
|
||||
STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS) PURE;
|
||||
STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA,LPVOID,DWORD) PURE;
|
||||
STDMETHOD(GetProperty)(THIS_ REFGUID,LPDIPROPHEADER) PURE;
|
||||
STDMETHOD(SetProperty)(THIS_ REFGUID,LPCDIPROPHEADER) PURE;
|
||||
STDMETHOD(Acquire)(THIS) PURE;
|
||||
STDMETHOD(Unacquire)(THIS) PURE;
|
||||
STDMETHOD(GetDeviceState)(THIS_ DWORD,LPVOID) PURE;
|
||||
STDMETHOD(GetDeviceData)(THIS_ DWORD,LPDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE;
|
||||
STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT) PURE;
|
||||
STDMETHOD(SetEventNotification)(THIS_ HANDLE) PURE;
|
||||
STDMETHOD(SetCooperativeLevel)(THIS_ HWND,DWORD) PURE;
|
||||
STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEA,DWORD,DWORD) PURE;
|
||||
STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEA) PURE;
|
||||
STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
|
||||
STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD,REFGUID) PURE;
|
||||
};
|
||||
|
||||
typedef struct IDirectInputDeviceA *LPDIRECTINPUTDEVICEA;
|
||||
|
||||
#ifdef UNICODE
|
||||
#define IID_IDirectInputDevice IID_IDirectInputDeviceW
|
||||
#define IDirectInputDevice IDirectInputDeviceW
|
||||
#define IDirectInputDeviceVtbl IDirectInputDeviceWVtbl
|
||||
#else
|
||||
#define IID_IDirectInputDevice IID_IDirectInputDeviceA
|
||||
#define IDirectInputDevice IDirectInputDeviceA
|
||||
#define IDirectInputDeviceVtbl IDirectInputDeviceAVtbl
|
||||
#endif
|
||||
typedef struct IDirectInputDevice *LPDIRECTINPUTDEVICE;
|
||||
|
||||
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirectInputDevice_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
|
||||
#define IDirectInputDevice_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||
#define IDirectInputDevice_Release(p) (p)->lpVtbl->Release(p)
|
||||
#define IDirectInputDevice_GetCapabilities(p,a) (p)->lpVtbl->GetCapabilities(p,a)
|
||||
#define IDirectInputDevice_EnumObjects(p,a,b,c) (p)->lpVtbl->EnumObjects(p,a,b,c)
|
||||
#define IDirectInputDevice_GetProperty(p,a,b) (p)->lpVtbl->GetProperty(p,a,b)
|
||||
#define IDirectInputDevice_SetProperty(p,a,b) (p)->lpVtbl->SetProperty(p,a,b)
|
||||
#define IDirectInputDevice_Acquire(p) (p)->lpVtbl->Acquire(p)
|
||||
#define IDirectInputDevice_Unacquire(p) (p)->lpVtbl->Unacquire(p)
|
||||
#define IDirectInputDevice_GetDeviceState(p,a,b) (p)->lpVtbl->GetDeviceState(p,a,b)
|
||||
#define IDirectInputDevice_GetDeviceData(p,a,b,c,d) (p)->lpVtbl->GetDeviceData(p,a,b,c,d)
|
||||
#define IDirectInputDevice_SetDataFormat(p,a) (p)->lpVtbl->SetDataFormat(p,a)
|
||||
#define IDirectInputDevice_SetEventNotification(p,a) (p)->lpVtbl->SetEventNotification(p,a)
|
||||
#define IDirectInputDevice_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b)
|
||||
#define IDirectInputDevice_GetObjectInfo(p,a,b,c) (p)->lpVtbl->GetObjectInfo(p,a,b,c)
|
||||
#define IDirectInputDevice_GetDeviceInfo(p,a) (p)->lpVtbl->GetDeviceInfo(p,a)
|
||||
#define IDirectInputDevice_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b)
|
||||
#define IDirectInputDevice_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c)
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* Mouse
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
typedef struct _DIMOUSESTATE {
|
||||
LONG lX;
|
||||
LONG lY;
|
||||
LONG lZ;
|
||||
BYTE rgbButtons[4];
|
||||
} DIMOUSESTATE, *LPDIMOUSESTATE;
|
||||
|
||||
#define DIMOFS_X FIELD_OFFSET(DIMOUSESTATE, lX)
|
||||
#define DIMOFS_Y FIELD_OFFSET(DIMOUSESTATE, lY)
|
||||
#define DIMOFS_Z FIELD_OFFSET(DIMOUSESTATE, lZ)
|
||||
#define DIMOFS_BUTTON0 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 0)
|
||||
#define DIMOFS_BUTTON1 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 1)
|
||||
#define DIMOFS_BUTTON2 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 2)
|
||||
#define DIMOFS_BUTTON3 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 3)
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* Keyboard
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* DirectInput keyboard scan codes
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#define DIK_ESCAPE 0x01
|
||||
#define DIK_1 0x02
|
||||
#define DIK_2 0x03
|
||||
#define DIK_3 0x04
|
||||
#define DIK_4 0x05
|
||||
#define DIK_5 0x06
|
||||
#define DIK_6 0x07
|
||||
#define DIK_7 0x08
|
||||
#define DIK_8 0x09
|
||||
#define DIK_9 0x0A
|
||||
#define DIK_0 0x0B
|
||||
#define DIK_MINUS 0x0C /* - on main keyboard */
|
||||
#define DIK_EQUALS 0x0D
|
||||
#define DIK_BACK 0x0E /* backspace */
|
||||
#define DIK_TAB 0x0F
|
||||
#define DIK_Q 0x10
|
||||
#define DIK_W 0x11
|
||||
#define DIK_E 0x12
|
||||
#define DIK_R 0x13
|
||||
#define DIK_T 0x14
|
||||
#define DIK_Y 0x15
|
||||
#define DIK_U 0x16
|
||||
#define DIK_I 0x17
|
||||
#define DIK_O 0x18
|
||||
#define DIK_P 0x19
|
||||
#define DIK_LBRACKET 0x1A
|
||||
#define DIK_RBRACKET 0x1B
|
||||
#define DIK_RETURN 0x1C /* Enter on main keyboard */
|
||||
#define DIK_LCONTROL 0x1D
|
||||
#define DIK_A 0x1E
|
||||
#define DIK_S 0x1F
|
||||
#define DIK_D 0x20
|
||||
#define DIK_F 0x21
|
||||
#define DIK_G 0x22
|
||||
#define DIK_H 0x23
|
||||
#define DIK_J 0x24
|
||||
#define DIK_K 0x25
|
||||
#define DIK_L 0x26
|
||||
#define DIK_SEMICOLON 0x27
|
||||
#define DIK_APOSTROPHE 0x28
|
||||
#define DIK_GRAVE 0x29 /* accent grave */
|
||||
#define DIK_LSHIFT 0x2A
|
||||
#define DIK_BACKSLASH 0x2B
|
||||
#define DIK_Z 0x2C
|
||||
#define DIK_X 0x2D
|
||||
#define DIK_C 0x2E
|
||||
#define DIK_V 0x2F
|
||||
#define DIK_B 0x30
|
||||
#define DIK_N 0x31
|
||||
#define DIK_M 0x32
|
||||
#define DIK_COMMA 0x33
|
||||
#define DIK_PERIOD 0x34 /* . on main keyboard */
|
||||
#define DIK_SLASH 0x35 /* / on main keyboard */
|
||||
#define DIK_RSHIFT 0x36
|
||||
#define DIK_MULTIPLY 0x37 /* * on numeric keypad */
|
||||
#define DIK_LMENU 0x38 /* left Alt */
|
||||
#define DIK_SPACE 0x39
|
||||
#define DIK_CAPITAL 0x3A
|
||||
#define DIK_F1 0x3B
|
||||
#define DIK_F2 0x3C
|
||||
#define DIK_F3 0x3D
|
||||
#define DIK_F4 0x3E
|
||||
#define DIK_F5 0x3F
|
||||
#define DIK_F6 0x40
|
||||
#define DIK_F7 0x41
|
||||
#define DIK_F8 0x42
|
||||
#define DIK_F9 0x43
|
||||
#define DIK_F10 0x44
|
||||
#define DIK_NUMLOCK 0x45
|
||||
#define DIK_SCROLL 0x46 /* Scroll Lock */
|
||||
#define DIK_NUMPAD7 0x47
|
||||
#define DIK_NUMPAD8 0x48
|
||||
#define DIK_NUMPAD9 0x49
|
||||
#define DIK_SUBTRACT 0x4A /* - on numeric keypad */
|
||||
#define DIK_NUMPAD4 0x4B
|
||||
#define DIK_NUMPAD5 0x4C
|
||||
#define DIK_NUMPAD6 0x4D
|
||||
#define DIK_ADD 0x4E /* + on numeric keypad */
|
||||
#define DIK_NUMPAD1 0x4F
|
||||
#define DIK_NUMPAD2 0x50
|
||||
#define DIK_NUMPAD3 0x51
|
||||
#define DIK_NUMPAD0 0x52
|
||||
#define DIK_DECIMAL 0x53 /* . on numeric keypad */
|
||||
#define DIK_F11 0x57
|
||||
#define DIK_F12 0x58
|
||||
|
||||
#define DIK_F13 0x64 /* (NEC PC98) */
|
||||
#define DIK_F14 0x65 /* (NEC PC98) */
|
||||
#define DIK_F15 0x66 /* (NEC PC98) */
|
||||
|
||||
#define DIK_KANA 0x70 /* (Japanese keyboard) */
|
||||
#define DIK_CONVERT 0x79 /* (Japanese keyboard) */
|
||||
#define DIK_NOCONVERT 0x7B /* (Japanese keyboard) */
|
||||
#define DIK_YEN 0x7D /* (Japanese keyboard) */
|
||||
#define DIK_NUMPADEQUALS 0x8D /* = on numeric keypad (NEC PC98) */
|
||||
#define DIK_CIRCUMFLEX 0x90 /* (Japanese keyboard) */
|
||||
#define DIK_AT 0x91 /* (NEC PC98) */
|
||||
#define DIK_COLON 0x92 /* (NEC PC98) */
|
||||
#define DIK_UNDERLINE 0x93 /* (NEC PC98) */
|
||||
#define DIK_KANJI 0x94 /* (Japanese keyboard) */
|
||||
#define DIK_STOP 0x95 /* (NEC PC98) */
|
||||
#define DIK_AX 0x96 /* (Japan AX) */
|
||||
#define DIK_UNLABELED 0x97 /* (J3100) */
|
||||
#define DIK_NUMPADENTER 0x9C /* Enter on numeric keypad */
|
||||
#define DIK_RCONTROL 0x9D
|
||||
#define DIK_NUMPADCOMMA 0xB3 /* , on numeric keypad (NEC PC98) */
|
||||
#define DIK_DIVIDE 0xB5 /* / on numeric keypad */
|
||||
#define DIK_SYSRQ 0xB7
|
||||
#define DIK_RMENU 0xB8 /* right Alt */
|
||||
#define DIK_HOME 0xC7 /* Home on arrow keypad */
|
||||
#define DIK_UP 0xC8 /* UpArrow on arrow keypad */
|
||||
#define DIK_PRIOR 0xC9 /* PgUp on arrow keypad */
|
||||
#define DIK_LEFT 0xCB /* LeftArrow on arrow keypad */
|
||||
#define DIK_RIGHT 0xCD /* RightArrow on arrow keypad */
|
||||
#define DIK_END 0xCF /* End on arrow keypad */
|
||||
#define DIK_DOWN 0xD0 /* DownArrow on arrow keypad */
|
||||
#define DIK_NEXT 0xD1 /* PgDn on arrow keypad */
|
||||
#define DIK_INSERT 0xD2 /* Insert on arrow keypad */
|
||||
#define DIK_DELETE 0xD3 /* Delete on arrow keypad */
|
||||
#define DIK_LWIN 0xDB /* Left Windows key */
|
||||
#define DIK_RWIN 0xDC /* Right Windows key */
|
||||
#define DIK_APPS 0xDD /* AppMenu key */
|
||||
|
||||
/*
|
||||
* Alternate names for keys, to facilitate transition from DOS.
|
||||
*/
|
||||
#define DIK_BACKSPACE DIK_BACK /* backspace */
|
||||
#define DIK_NUMPADSTAR DIK_MULTIPLY /* * on numeric keypad */
|
||||
#define DIK_LALT DIK_LMENU /* left Alt */
|
||||
#define DIK_CAPSLOCK DIK_CAPITAL /* CapsLock */
|
||||
#define DIK_NUMPADMINUS DIK_SUBTRACT /* - on numeric keypad */
|
||||
#define DIK_NUMPADPLUS DIK_ADD /* + on numeric keypad */
|
||||
#define DIK_NUMPADPERIOD DIK_DECIMAL /* . on numeric keypad */
|
||||
#define DIK_NUMPADSLASH DIK_DIVIDE /* / on numeric keypad */
|
||||
#define DIK_RALT DIK_RMENU /* right Alt */
|
||||
#define DIK_UPARROW DIK_UP /* UpArrow on arrow keypad */
|
||||
#define DIK_PGUP DIK_PRIOR /* PgUp on arrow keypad */
|
||||
#define DIK_LEFTARROW DIK_LEFT /* LeftArrow on arrow keypad */
|
||||
#define DIK_RIGHTARROW DIK_RIGHT /* RightArrow on arrow keypad */
|
||||
#define DIK_DOWNARROW DIK_DOWN /* DownArrow on arrow keypad */
|
||||
#define DIK_PGDN DIK_NEXT /* PgDn on arrow keypad */
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* IDirectInput
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#define DIENUM_STOP 0
|
||||
#define DIENUM_CONTINUE 1
|
||||
|
||||
typedef BOOL (FAR PASCAL * LPDIENUMDEVICESCALLBACKA)(LPCDIDEVICEINSTANCEA, LPVOID);
|
||||
typedef BOOL (FAR PASCAL * LPDIENUMDEVICESCALLBACKW)(LPCDIDEVICEINSTANCEW, LPVOID);
|
||||
#ifdef UNICODE
|
||||
#define LPDIENUMDEVICESCALLBACK LPDIENUMDEVICESCALLBACKW
|
||||
#else
|
||||
#define LPDIENUMDEVICESCALLBACK LPDIENUMDEVICESCALLBACKA
|
||||
#endif // !UNICODE
|
||||
|
||||
#define DIEDFL_ALLDEVICES 0x00000000
|
||||
#define DIEDFL_ATTACHEDONLY 0x00000001
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirectInputW
|
||||
|
||||
DECLARE_INTERFACE_(IDirectInputW, IUnknown)
|
||||
{
|
||||
/*** IUnknown methods ***/
|
||||
STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
|
||||
STDMETHOD_(ULONG,AddRef)(THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release)(THIS) PURE;
|
||||
|
||||
/*** IDirectInputW methods ***/
|
||||
STDMETHOD(CreateDevice)(THIS_ REFGUID,LPDIRECTINPUTDEVICEW *,LPUNKNOWN) PURE;
|
||||
STDMETHOD(EnumDevices)(THIS_ DWORD,LPDIENUMDEVICESCALLBACKW,LPVOID,DWORD) PURE;
|
||||
STDMETHOD(GetDeviceStatus)(THIS_ REFGUID) PURE;
|
||||
STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
|
||||
STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD) PURE;
|
||||
};
|
||||
|
||||
typedef struct IDirectInputW *LPDIRECTINPUTW;
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirectInputA
|
||||
|
||||
DECLARE_INTERFACE_(IDirectInputA, IUnknown)
|
||||
{
|
||||
/*** IUnknown methods ***/
|
||||
STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
|
||||
STDMETHOD_(ULONG,AddRef)(THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release)(THIS) PURE;
|
||||
|
||||
/*** IDirectInputA methods ***/
|
||||
STDMETHOD(CreateDevice)(THIS_ REFGUID,LPDIRECTINPUTDEVICEA *,LPUNKNOWN) PURE;
|
||||
STDMETHOD(EnumDevices)(THIS_ DWORD,LPDIENUMDEVICESCALLBACKA,LPVOID,DWORD) PURE;
|
||||
STDMETHOD(GetDeviceStatus)(THIS_ REFGUID) PURE;
|
||||
STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
|
||||
STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD) PURE;
|
||||
};
|
||||
|
||||
typedef struct IDirectInputA *LPDIRECTINPUTA;
|
||||
|
||||
#ifdef UNICODE
|
||||
#define IID_IDirectInput IID_IDirectInputW
|
||||
#define IDirectInput IDirectInputW
|
||||
#define IDirectInputVtbl IDirectInputWVtbl
|
||||
#else
|
||||
#define IID_IDirectInput IID_IDirectInputA
|
||||
#define IDirectInput IDirectInputA
|
||||
#define IDirectInputVtbl IDirectInputAVtbl
|
||||
#endif
|
||||
typedef struct IDirectInput *LPDIRECTINPUT;
|
||||
|
||||
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirectInput_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
|
||||
#define IDirectInput_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||
#define IDirectInput_Release(p) (p)->lpVtbl->Release(p)
|
||||
#define IDirectInput_CreateDevice(p,a,b,c) (p)->lpVtbl->CreateDevice(p,a,b,c)
|
||||
#define IDirectInput_EnumDevices(p,a,b,c,d) (p)->lpVtbl->EnumDevices(p,a,b,c,d)
|
||||
#define IDirectInput_GetDeviceStatus(p,a) (p)->lpVtbl->GetDeviceStatus(p,a)
|
||||
#define IDirectInput_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b)
|
||||
#define IDirectInput_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b)
|
||||
#endif
|
||||
|
||||
extern HRESULT WINAPI DirectInputCreateA(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTA *ppDI, LPUNKNOWN punkOuter);
|
||||
extern HRESULT WINAPI DirectInputCreateW(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTW *ppDI, LPUNKNOWN punkOuter);
|
||||
#ifdef UNICODE
|
||||
#define DirectInputCreate DirectInputCreateW
|
||||
#else
|
||||
#define DirectInputCreate DirectInputCreateA
|
||||
#endif // !UNICODE
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* Return Codes
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/*
|
||||
* The operation completed successfully.
|
||||
*/
|
||||
#define DI_OK S_OK
|
||||
|
||||
/*
|
||||
* The device exists but is not currently attached.
|
||||
*/
|
||||
#define DI_NOTATTACHED S_FALSE
|
||||
|
||||
/*
|
||||
* The device buffer overflowed; some input was lost.
|
||||
*/
|
||||
#define DI_BUFFEROVERFLOW S_FALSE
|
||||
|
||||
/*
|
||||
* The change in device properties had no effect.
|
||||
*/
|
||||
#define DI_PROPNOEFFECT S_FALSE
|
||||
|
||||
/*
|
||||
* The device is a polled device. As a result, device buffering
|
||||
* will not collect any data and event notifications will not be
|
||||
* signalled until GetDeviceState is called.
|
||||
*/
|
||||
#define DI_POLLEDDEVICE ((HRESULT)0x00000002L)
|
||||
|
||||
/*
|
||||
* The application requires a newer version of DirectInput.
|
||||
*/
|
||||
#define DIERR_OLDDIRECTINPUTVERSION \
|
||||
MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_OLD_WIN_VERSION)
|
||||
|
||||
/*
|
||||
* The application was written for an unsupported prerelease version
|
||||
* of DirectInput.
|
||||
*/
|
||||
#define DIERR_BETADIRECTINPUTVERSION \
|
||||
MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_RMODE_APP)
|
||||
|
||||
/*
|
||||
* The object could not be created due to an incompatible driver version
|
||||
* or mismatched or incomplete driver components.
|
||||
*/
|
||||
#define DIERR_BADDRIVERVER \
|
||||
MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_BAD_DRIVER_LEVEL)
|
||||
|
||||
/*
|
||||
* The device or device instance is not registered with DirectInput.
|
||||
*/
|
||||
#define DIERR_DEVICENOTREG REGDB_E_CLASSNOTREG
|
||||
|
||||
/*
|
||||
* The requested object does not exist.
|
||||
*/
|
||||
#define DIERR_OBJECTNOTFOUND \
|
||||
MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND)
|
||||
|
||||
/*
|
||||
* An invalid parameter was passed to the returning function,
|
||||
* or the object was not in a state that admitted the function
|
||||
* to be called.
|
||||
*/
|
||||
#define DIERR_INVALIDPARAM E_INVALIDARG
|
||||
|
||||
/*
|
||||
* The specified interface is not supported by the object
|
||||
*/
|
||||
#define DIERR_NOINTERFACE E_NOINTERFACE
|
||||
|
||||
/*
|
||||
* An undetermined error occured inside the DInput subsystem
|
||||
*/
|
||||
#define DIERR_GENERIC E_FAIL
|
||||
|
||||
/*
|
||||
* The DInput subsystem couldn't allocate sufficient memory to complete the
|
||||
* caller's request.
|
||||
*/
|
||||
#define DIERR_OUTOFMEMORY E_OUTOFMEMORY
|
||||
|
||||
/*
|
||||
* The function called is not supported at this time
|
||||
*/
|
||||
#define DIERR_UNSUPPORTED E_NOTIMPL
|
||||
|
||||
/*
|
||||
* This object has not been initialized
|
||||
*/
|
||||
#define DIERR_NOTINITIALIZED \
|
||||
MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_READY)
|
||||
|
||||
/*
|
||||
* This object is already initialized
|
||||
*/
|
||||
#define DIERR_ALREADYINITIALIZED \
|
||||
MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_ALREADY_INITIALIZED)
|
||||
|
||||
/*
|
||||
* This object does not support aggregation
|
||||
*/
|
||||
#define DIERR_NOAGGREGATION CLASS_E_NOAGGREGATION
|
||||
|
||||
/*
|
||||
* Another app has a higher priority level, preventing this call from
|
||||
* succeeding.
|
||||
*/
|
||||
#define DIERR_OTHERAPPHASPRIO E_ACCESSDENIED
|
||||
|
||||
/*
|
||||
* Access to the input device has been lost. It must be re-acquired.
|
||||
*/
|
||||
#define DIERR_INPUTLOST \
|
||||
MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_READ_FAULT)
|
||||
|
||||
/*
|
||||
* The operation cannot be performed while the device is acquired.
|
||||
*/
|
||||
#define DIERR_ACQUIRED \
|
||||
MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_BUSY)
|
||||
|
||||
/*
|
||||
* The operation cannot be performed unless the device is acquired.
|
||||
*/
|
||||
#define DIERR_NOTACQUIRED \
|
||||
MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_INVALID_ACCESS)
|
||||
|
||||
/*
|
||||
* The specified property cannot be changed.
|
||||
*/
|
||||
#define DIERR_READONLY E_ACCESSDENIED
|
||||
|
||||
/*
|
||||
* The device already has an event notification associated with it.
|
||||
*/
|
||||
#define DIERR_HANDLEEXISTS E_ACCESSDENIED
|
||||
|
||||
/*
|
||||
* Data is not yet available.
|
||||
*/
|
||||
#ifndef E_PENDING
|
||||
#define E_PENDING 0x80070007L
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif /* __DINPUT_INCLUDED__ */
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* Definitions for non-IDirectInput (VJoyD) features defined more recently
|
||||
* than the current sdk files
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef _INC_MMSYSTEM
|
||||
#ifndef MMNOJOY
|
||||
|
||||
#ifndef __VJOYDX_INCLUDED__
|
||||
#define __VJOYDX_INCLUDED__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Flag to indicate that the dwReserved2 field of the JOYINFOEX structure
|
||||
* contains mini-driver specific data to be passed by VJoyD to the mini-
|
||||
* driver instead of doing a poll.
|
||||
*/
|
||||
#define JOY_PASSDRIVERDATA 0x10000000l
|
||||
|
||||
/*
|
||||
* Informs the joystick driver that the configuration has been changed
|
||||
* and should be reloaded from the registery.
|
||||
* dwFlags is reserved and should be set to zero
|
||||
*/
|
||||
WINMMAPI MMRESULT WINAPI joyConfigChanged( DWORD dwFlags );
|
||||
|
||||
/*
|
||||
* Hardware Setting indicating that the device is a headtracker
|
||||
*/
|
||||
#define JOY_HWS_ISHEADTRACKER 0x02000000l
|
||||
|
||||
/*
|
||||
* Hardware Setting indicating that the VxD is used to replace
|
||||
* the standard analog polling
|
||||
*/
|
||||
#define JOY_HWS_ISGAMEPORTDRIVER 0x04000000l
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif /* __VJOYDX_INCLUDED__ */
|
||||
|
||||
#endif /* not MMNOJOY */
|
||||
#endif /* _INC_MMSYSTEM */
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* Definitions for non-IDirectInput (VJoyD) features defined more recently
|
||||
* than the current ddk files
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef _INC_MMDDK
|
||||
#ifndef MMNOJOYDEV
|
||||
|
||||
#ifndef __VJOYDXD_INCLUDED__
|
||||
#define __VJOYDXD_INCLUDED__
|
||||
/*
|
||||
* Poll type in which the do_other field of the JOYOEMPOLLDATA
|
||||
* structure contains mini-driver specific data passed from an app.
|
||||
*/
|
||||
#define JOY_OEMPOLL_PASSDRIVERDATA 7
|
||||
|
||||
#endif /* __VJOYDXD_INCLUDED__ */
|
||||
|
||||
#endif /* not MMNOJOYDEV */
|
||||
#endif /* _INC_MMDDK */
|
||||
308
WinQuake/dxsdk/SDK/INC/DPLAY.H
Normal file
308
WinQuake/dxsdk/SDK/INC/DPLAY.H
Normal file
@@ -0,0 +1,308 @@
|
||||
/*==========================================================================;
|
||||
*
|
||||
* Copyright (C) 1994-1995 Microsoft Corporation. All Rights Reserved.
|
||||
*
|
||||
* File: dplay.h
|
||||
* Content: DirectPlay include file
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef __DPLAY_INCLUDED__
|
||||
#define __DPLAY_INCLUDED__
|
||||
#ifdef _WIN32
|
||||
/* for DECLARE_INTERFACE and HRESULT. */
|
||||
#include <ole2.h>
|
||||
#endif
|
||||
|
||||
#define _FACDP 0x877
|
||||
#define MAKE_DPHRESULT( code ) MAKE_HRESULT( 1, _FACDP, code )
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#pragma pack(push, 1)
|
||||
|
||||
|
||||
/*============================================================================
|
||||
*
|
||||
* DirectPlay Structures
|
||||
*
|
||||
* Various structures used to invoke DirectPlay.
|
||||
*
|
||||
*==========================================================================*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
/* 'struct' not 'class' per the way DECLARE_INTERFACE_ is defined */
|
||||
struct IDirectPlay;
|
||||
typedef struct IDirectPlay FAR *LPDIRECTPLAY;
|
||||
#else
|
||||
typedef struct IDirectPlay FAR *LPDIRECTPLAY;
|
||||
#endif
|
||||
|
||||
typedef DWORD DPID, FAR *LPDPID;
|
||||
|
||||
typedef struct _DPCAPS
|
||||
{
|
||||
DWORD dwSize;
|
||||
DWORD dwFlags;
|
||||
DWORD dwMaxBufferSize;
|
||||
DWORD dwMaxQueueSize; // Function of DPlay, not SP.
|
||||
DWORD dwMaxPlayers;
|
||||
DWORD dwHundredBaud; // 24 is 2400, 96 is 9600, etc.
|
||||
DWORD dwLatency;
|
||||
} DPCAPS;
|
||||
|
||||
typedef DPCAPS FAR *LPDPCAPS;
|
||||
|
||||
#define DPLONGNAMELEN 52
|
||||
#define DPSHORTNAMELEN 20
|
||||
#define DPSESSIONNAMELEN 32
|
||||
#define DPPASSWORDLEN 16
|
||||
#define DPUSERRESERVED 16
|
||||
|
||||
typedef struct
|
||||
{
|
||||
DWORD dwSize;
|
||||
GUID guidSession; // Id for Game. Null is all games.
|
||||
DWORD dwSession; // session identifier
|
||||
DWORD dwMaxPlayers; // Maximum players allowed in game.
|
||||
DWORD dwCurrentPlayers; // Current players in Game.
|
||||
DWORD dwFlags; // DPOPEN_* flags
|
||||
char szSessionName[DPSESSIONNAMELEN];// Human readable name for Game
|
||||
char szUserField[DPUSERRESERVED];
|
||||
DWORD dwReserved1; // Reserved for future MS use.
|
||||
char szPassword[DPPASSWORDLEN]; // Password to be allowed into game.
|
||||
DWORD dwReserved2; // Reserved for future MS use.
|
||||
DWORD dwUser1;
|
||||
DWORD dwUser2;
|
||||
DWORD dwUser3;
|
||||
DWORD dwUser4;
|
||||
} DPSESSIONDESC;
|
||||
typedef DPSESSIONDESC FAR *LPDPSESSIONDESC;
|
||||
|
||||
|
||||
/*
|
||||
* Create API
|
||||
*/
|
||||
typedef BOOL (FAR PASCAL * LPDPENUMDPCALLBACK)(
|
||||
LPGUID lpSPGuid,
|
||||
LPSTR lpFriendlyName,
|
||||
DWORD dwMajorVersion,
|
||||
DWORD dwMinorVersion,
|
||||
LPVOID lpContext);
|
||||
|
||||
typedef BOOL (FAR PASCAL * LPDPENUMSESSIONSCALLBACK)(
|
||||
LPDPSESSIONDESC lpDPSGameDesc,
|
||||
LPVOID lpContext,
|
||||
LPDWORD lpdwTimeOut,
|
||||
DWORD dwFlags);
|
||||
|
||||
|
||||
|
||||
extern HRESULT WINAPI DirectPlayCreate( LPGUID lpGUID, LPDIRECTPLAY FAR *lplpDP, IUnknown FAR *pUnk);
|
||||
extern HRESULT WINAPI DirectPlayEnumerate( LPDPENUMDPCALLBACK, LPVOID );
|
||||
|
||||
|
||||
/* Player enumeration callback prototype */
|
||||
typedef BOOL (FAR PASCAL *LPDPENUMPLAYERSCALLBACK)(
|
||||
DPID dpId,
|
||||
LPSTR lpFriendlyName,
|
||||
LPSTR lpFormalName,
|
||||
DWORD dwFlags,
|
||||
LPVOID lpContext );
|
||||
|
||||
/*
|
||||
* IDirectPlay
|
||||
*/
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirectPlay
|
||||
#ifdef _WIN32
|
||||
DECLARE_INTERFACE_( IDirectPlay, IUnknown )
|
||||
{
|
||||
/*** IUnknown methods ***/
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
|
||||
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||||
/*** IDirectPlay methods ***/
|
||||
STDMETHOD(AddPlayerToGroup) (THIS_ DPID, DPID) PURE;
|
||||
STDMETHOD(Close) (THIS) PURE;
|
||||
STDMETHOD(CreatePlayer) (THIS_ LPDPID,LPSTR,LPSTR,LPHANDLE) PURE;
|
||||
STDMETHOD(CreateGroup) (THIS_ LPDPID,LPSTR,LPSTR) PURE;
|
||||
STDMETHOD(DeletePlayerFromGroup)(THIS_ DPID,DPID) PURE;
|
||||
STDMETHOD(DestroyPlayer) (THIS_ DPID) PURE;
|
||||
STDMETHOD(DestroyGroup) (THIS_ DPID) PURE;
|
||||
STDMETHOD(EnableNewPlayers) (THIS_ BOOL) PURE;
|
||||
STDMETHOD(EnumGroupPlayers) (THIS_ DPID, LPDPENUMPLAYERSCALLBACK,LPVOID,DWORD) PURE;
|
||||
STDMETHOD(EnumGroups) (THIS_ DWORD, LPDPENUMPLAYERSCALLBACK,LPVOID,DWORD) PURE;
|
||||
STDMETHOD(EnumPlayers) (THIS_ DWORD, LPDPENUMPLAYERSCALLBACK,LPVOID,DWORD) PURE;
|
||||
STDMETHOD(EnumSessions) (THIS_ LPDPSESSIONDESC,DWORD,LPDPENUMSESSIONSCALLBACK,LPVOID,DWORD) PURE;
|
||||
STDMETHOD(GetCaps) (THIS_ LPDPCAPS) PURE;
|
||||
STDMETHOD(GetMessageCount) (THIS_ DPID, LPDWORD) PURE;
|
||||
STDMETHOD(GetPlayerCaps) (THIS_ DPID, LPDPCAPS) PURE;
|
||||
STDMETHOD(GetPlayerName) (THIS_ DPID,LPSTR,LPDWORD,LPSTR,LPDWORD) PURE;
|
||||
STDMETHOD(Initialize) (THIS_ LPGUID) PURE;
|
||||
STDMETHOD(Open) (THIS_ LPDPSESSIONDESC) PURE;
|
||||
STDMETHOD(Receive) (THIS_ LPDPID,LPDPID,DWORD,LPVOID,LPDWORD) PURE;
|
||||
STDMETHOD(SaveSession) (THIS_ LPSTR) PURE;
|
||||
STDMETHOD(Send) (THIS_ DPID, DPID, DWORD, LPVOID, DWORD) PURE;
|
||||
STDMETHOD(SetPlayerName) (THIS_ DPID,LPSTR,LPSTR) PURE;
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* DIRECTPLAY ERRORS
|
||||
*
|
||||
* Errors are represented by negative values and cannot be combined.
|
||||
*
|
||||
****************************************************************************/
|
||||
#define DP_OK 0
|
||||
#define DPERR_ALREADYINITIALIZED MAKE_DPHRESULT( 5 )
|
||||
#define DPERR_ACCESSDENIED MAKE_DPHRESULT( 10 )
|
||||
#define DPERR_ACTIVEPLAYERS MAKE_DPHRESULT( 20 )
|
||||
#define DPERR_BUFFERTOOSMALL MAKE_DPHRESULT( 30 )
|
||||
#define DPERR_CANTADDPLAYER MAKE_DPHRESULT( 40 )
|
||||
#define DPERR_CANTCREATEGROUP MAKE_DPHRESULT( 50 )
|
||||
#define DPERR_CANTCREATEPLAYER MAKE_DPHRESULT( 60 )
|
||||
#define DPERR_CANTCREATESESSION MAKE_DPHRESULT( 70 )
|
||||
#define DPERR_CAPSNOTAVAILABLEYET MAKE_DPHRESULT( 80 )
|
||||
#define DPERR_EXCEPTION MAKE_DPHRESULT( 90 )
|
||||
#define DPERR_GENERIC E_FAIL
|
||||
|
||||
#define DPERR_INVALIDFLAGS MAKE_DPHRESULT( 120 )
|
||||
#define DPERR_INVALIDOBJECT MAKE_DPHRESULT( 130 )
|
||||
#define DPERR_INVALIDPARAM E_INVALIDARG
|
||||
#define DPERR_INVALIDPARAMS DPERR_INVALIDPARAM
|
||||
#define DPERR_INVALIDPLAYER MAKE_DPHRESULT( 150 )
|
||||
#define DPERR_NOCAPS MAKE_DPHRESULT( 160 )
|
||||
#define DPERR_NOCONNECTION MAKE_DPHRESULT( 170 )
|
||||
#define DPERR_NOMEMORY E_OUTOFMEMORY
|
||||
#define DPERR_OUTOFMEMORY DPERR_NOMEMORY
|
||||
#define DPERR_NOMESSAGES MAKE_DPHRESULT( 190 )
|
||||
#define DPERR_NONAMESERVERFOUND MAKE_DPHRESULT( 200 )
|
||||
#define DPERR_NOPLAYERS MAKE_DPHRESULT( 210 )
|
||||
#define DPERR_NOSESSIONS MAKE_DPHRESULT( 220 )
|
||||
#define DPERR_SENDTOOBIG MAKE_DPHRESULT( 230 )
|
||||
#define DPERR_TIMEOUT MAKE_DPHRESULT( 240 )
|
||||
#define DPERR_UNAVAILABLE MAKE_DPHRESULT( 250 )
|
||||
#define DPERR_UNSUPPORTED E_NOTIMPL
|
||||
#define DPERR_BUSY MAKE_DPHRESULT( 270 )
|
||||
#define DPERR_USERCANCEL MAKE_DPHRESULT( 280 )
|
||||
|
||||
|
||||
#define DPOPEN_OPENSESSION 0x00000001
|
||||
#define DPOPEN_CREATESESSION 0x00000002
|
||||
|
||||
#define DPSEND_GUARANTEE 0x00000001
|
||||
#define DPSEND_HIGHPRIORITY 0x00000002
|
||||
#define DPSEND_TRYONCE 0x00000004
|
||||
|
||||
#define DPRECEIVE_ALL 0x00000001
|
||||
#define DPRECEIVE_TOPLAYER 0x00000002
|
||||
#define DPRECEIVE_FROMPLAYER 0x00000004
|
||||
#define DPRECEIVE_PEEK 0x00000008
|
||||
|
||||
#define DPCAPS_NAMESERVICE 0x00000001 // A name server is supported.
|
||||
#define DPCAPS_NAMESERVER 0x00000002 // You are the name server.
|
||||
#define DPCAPS_GUARANTEED 0x00000004 // SP's don't have to implement guarantees.
|
||||
|
||||
#define DPENUMSESSIONS_AVAILABLE 0x00000001 // All games that match password (if given)
|
||||
// and have openings.
|
||||
#define DPENUMSESSIONS_ALL 0x00000002
|
||||
#define DPENUMSESSIONS_PREVIOUS 0x00000004
|
||||
|
||||
#define DPENUMPLAYERS_ALL 0x00000000
|
||||
#define DPENUMPLAYERS_PREVIOUS 0x00000004
|
||||
#define DPENUMPLAYERS_LOCAL 0x00000008
|
||||
#define DPENUMPLAYERS_REMOTE 0x00000010
|
||||
#define DPENUMPLAYERS_GROUP 0x00000020
|
||||
#define DPENUMPLAYERS_SESSION 0x00000080
|
||||
|
||||
//
|
||||
// This flag is set on the enumsessions callback when the time out has occured.
|
||||
// This means that there is no session data for this callback.
|
||||
// If lpdwTimeOut is set to a non-zero value and the EnumSessionsCallback returns
|
||||
// TRUE then EnumSessions will continue until the next timeout occurs.
|
||||
// Timeouts are in milliseconds.
|
||||
|
||||
#define DPESC_TIMEDOUT 0x00000001
|
||||
|
||||
|
||||
//
|
||||
// System message structures and types.
|
||||
//
|
||||
// System messages have a leading 4 byte type code to identify the message.
|
||||
// an app knows it is a system message because it is addressed 'To' player 0.
|
||||
//
|
||||
|
||||
|
||||
#define DPSYS_ADDPLAYER 0x0003 // DPMSG_ADDPLAYER
|
||||
#define DPSYS_DELETEPLAYER 0x0005 // DPMSG_DELETEPLAYER
|
||||
|
||||
#define DPSYS_ADDPLAYERTOGROUP 0x0007 // DPMSG_GROUPADD
|
||||
|
||||
#define DPSYS_INVITE 0x000e // DPMSG_INVITE, Net only.
|
||||
|
||||
#define DPSYS_DELETEGROUP 0x0020 // DPMSG_DELETEPLAYER
|
||||
#define DPSYS_DELETEPLAYERFROMGRP 0x0021 // DPMSG_GROUPDELETE
|
||||
#define DPSYS_SESSIONLOST 0x0031
|
||||
|
||||
#define DPSYS_CONNECT 0x484b // DPMSG_GENERIC
|
||||
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
DWORD dwType;
|
||||
DWORD dwPlayerType;
|
||||
DPID dpId;
|
||||
char szLongName[DPLONGNAMELEN];
|
||||
char szShortName[DPSHORTNAMELEN];
|
||||
DWORD dwCurrentPlayers;
|
||||
} DPMSG_ADDPLAYER;
|
||||
|
||||
typedef DPMSG_ADDPLAYER DPMSG_ADDGROUP;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
DWORD dwType;
|
||||
DPID dpIdGroup;
|
||||
DPID dpIdPlayer;
|
||||
} DPMSG_GROUPADD;
|
||||
|
||||
typedef DPMSG_GROUPADD DPMSG_GROUPDELETE;
|
||||
typedef struct
|
||||
{
|
||||
DWORD dwType;
|
||||
DPID dpId;
|
||||
} DPMSG_DELETEPLAYER;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
DWORD dwType;
|
||||
DPSESSIONDESC dpsDesc;
|
||||
} DPMSG_INVITE;
|
||||
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
DWORD dwType;
|
||||
} DPMSG_GENERIC;
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
|
||||
DEFINE_GUID( IID_IDirectPlay, 0x5454e9a0, 0xdb65, 0x11ce, 0x92, 0x1c, 0x00, 0xaa, 0x00, 0x6c, 0x49, 0x72);
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
||||
66
WinQuake/dxsdk/SDK/INC/DSETUP.H
Normal file
66
WinQuake/dxsdk/SDK/INC/DSETUP.H
Normal file
@@ -0,0 +1,66 @@
|
||||
/*==========================================================================
|
||||
*
|
||||
* Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved.
|
||||
*
|
||||
* File: dsetup.h
|
||||
* Content: DirectXSetup, error codes and flags
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef __DSETUP_H__
|
||||
#define __DSETUP_H__
|
||||
|
||||
#ifdef _WIN32
|
||||
#define COM_NO_WINDOWS_H
|
||||
#include <objbase.h>
|
||||
#else
|
||||
#define GUID void
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define DSETUPERR_BADWINDOWSVERSION -1
|
||||
#define DSETUPERR_SOURCEFILENOTFOUND -2
|
||||
#define DSETUPERR_BADSOURCESIZE -3
|
||||
#define DSETUPERR_BADSOURCETIME -4
|
||||
#define DSETUPERR_NOCOPY -5
|
||||
#define DSETUPERR_OUTOFDISKSPACE -6
|
||||
#define DSETUPERR_CANTFINDINF -7
|
||||
#define DSETUPERR_CANTFINDDIR -8
|
||||
#define DSETUPERR_INTERNAL -9
|
||||
#define DSETUPERR_NTWITHNO3D -10
|
||||
|
||||
|
||||
#define MAX_INFLINE (16*1024)
|
||||
#define MAX_DESCRIPTION 256
|
||||
|
||||
#define DSETUP_DDRAW 0x00000001 /* install DirectDraw */
|
||||
#define DSETUP_DSOUND 0x00000002 /* install DirectSound */
|
||||
#define DSETUP_DPLAY 0x00000004 /* install DirectPlay */
|
||||
#define DSETUP_DDRAWDRV 0x00000008 /* install DirectDraw Drivers */
|
||||
#define DSETUP_DSOUNDDRV 0x00000010 /* install DirectSound Drivers */
|
||||
#define DSETUP_DPLAYSP 0x00000020 /* install DirectPlay Providers */
|
||||
#define DSETUP_DVIDEO 0x00000040 /* install DirectVideo */
|
||||
#define DSETUP_REINSTALL 0x00000080 /* install DirectX even if existing components have the same version */
|
||||
#define DSETUP_DRVINFONLY 0x00000100 /* install DirectX inf files but not drivers */
|
||||
#define DSETUP_D3D 0x00000200 /* install Direct3D */
|
||||
#define DSETUP_REQUIRESD3D 0x00000400 | DSETUP_D3D /* install Direct3D, pop up dialog box on NT, if no D3D present */
|
||||
|
||||
#define DSETUP_DIRECTX (DSETUP_D3D | DSETUP_DDRAW | DSETUP_DSOUND | DSETUP_DPLAY | DSETUP_DDRAWDRV | DSETUP_DSOUNDDRV | DSETUP_DPLAYSP)
|
||||
|
||||
int WINAPI DirectXSetup( HWND hwnd, LPSTR root_path, DWORD flags );
|
||||
int WINAPI DirectXDeviceDriverSetup( HWND hwnd, LPSTR driver_class, LPSTR inf_path, LPSTR driver_path, DWORD flags );
|
||||
int WINAPI DirectXSetupIsJapan( void );
|
||||
int WINAPI DirectXSetupIsJapanNec( void );
|
||||
|
||||
typedef int (WINAPI * LPDIRECTXSETUP)( HWND, LPSTR, DWORD );
|
||||
typedef int (WINAPI * LPDIRECTXDEVICEDRIVERSETUP)( HWND, LPSTR, LPSTR, LPSTR, DWORD );
|
||||
typedef int (WINAPI * LPDIRECTXSETUPISJAPAN)( void );
|
||||
typedef int (WINAPI * LPDIRECTXSETUPISJAPANNEC)( void );
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user