From 56276fb47e8d51465c314f46591003819ab07527 Mon Sep 17 00:00:00 2001 From: Tom Kidd Date: Thu, 5 Apr 2018 17:46:40 -0500 Subject: [PATCH] Updated and reorganized to run on iOS 11 --- .gitignore | 8 + wolf3d/README.md | 16 + wolf3d/code/.DS_Store | Bin 6148 -> 8196 bytes wolf3d/code/env/cmd.c | 14 +- wolf3d/code/env/com_string.c | 2 +- wolf3d/code/env/common.c | 10 +- wolf3d/code/env/console.c | 24 +- wolf3d/code/env/fileio.c | 2 +- wolf3d/code/env/files.c | 94 +- wolf3d/code/env/font_manager.c | 2 +- wolf3d/code/env/glob.c | 70 +- wolf3d/code/env/oggfile.c | 6 +- wolf3d/code/env/opengl_draw.c | 2 +- wolf3d/code/env/opengl_local.h | 2 +- wolf3d/code/env/random_number.c | 2 +- wolf3d/code/env/sound.c | 4 +- wolf3d/code/env/sound_local.h | 4 +- wolf3d/code/env/sound_sfx_id.c | 6 +- wolf3d/code/env/sound_stream.c | 10 +- wolf3d/code/env/texture_manager.c | 12 +- wolf3d/code/env/tga.c | 8 +- wolf3d/code/env/unix_timer.c | 2 +- wolf3d/code/env/wavfile.c | 34 +- wolf3d/code/env/zmem.c | 2 +- wolf3d/code/iphone/.DS_Store | Bin 6148 -> 6148 bytes wolf3d/code/iphone/CreditsView.xib | 1593 +---------- wolf3d/code/iphone/CreditsViewController.h | 5 +- wolf3d/code/iphone/CreditsViewController.m | 260 +- wolf3d/code/iphone/EAGLView.m | 23 +- wolf3d/code/iphone/EpisodeCell.xib | 763 +----- wolf3d/code/iphone/EpisodeView.xib | 1122 ++------ wolf3d/code/iphone/EpisodeViewController.m | 36 +- wolf3d/code/iphone/FSCopyObject.c | 1986 -------------- wolf3d/code/iphone/FSCopyObject.h | 258 -- wolf3d/code/iphone/GenLinkedList.c | 212 -- wolf3d/code/iphone/GenLinkedList.h | 93 - wolf3d/code/iphone/Info.plist | 10 +- wolf3d/code/iphone/Launch Screen.storyboard | 31 + wolf3d/code/iphone/LegalView.xib | 789 +----- wolf3d/code/iphone/LegalViewController.m | 14 - wolf3d/code/iphone/LevelSelectView.xib | 1167 ++------ .../code/iphone/LevelSelectViewController.m | 27 +- wolf3d/code/iphone/MainMenuView.xib | 1351 +++------- wolf3d/code/iphone/MainMenuViewController.h | 2 +- wolf3d/code/iphone/MainMenuViewController.m | 49 +- wolf3d/code/iphone/MainWindow.xib | 223 -- wolf3d/code/iphone/POSITYPE-idSettler10v2.otf | Bin 0 -> 30004 bytes .../Resources-iPad/CreditsView~ipad.xib | 1575 +---------- .../Resources-iPad/EpisodeView~ipad.xib | 1123 ++------ .../iphone/Resources-iPad/LegalView~ipad.xib | 744 +---- .../Resources-iPad/LevelSelectView~ipad.xib | 1087 ++------ .../Resources-iPad/MainMenuView~ipad.xib | 1320 +++------ .../Resources-iPad/SettingsView~ipad.xib | 2092 +++----------- .../iphone/Resources-iPad/SkillView~ipad.xib | 1588 +++-------- .../iphone/Resources-iPad/TriviaView~ipad.xib | 1709 +++--------- wolf3d/code/iphone/SettingsView.xib | 2115 +++------------ wolf3d/code/iphone/SettingsViewController.m | 34 +- wolf3d/code/iphone/SkillView.xib | 1587 +++-------- wolf3d/code/iphone/SkillViewController.m | 21 +- wolf3d/code/iphone/TriviaView.xib | 1713 +++--------- wolf3d/code/iphone/TriviaViewController.m | 24 +- wolf3d/code/iphone/UIFontButton.m | 1 + wolf3d/code/iphone/UIFontLabel.m | 1 + wolf3d/code/iphone/UITableViewScrolling.m | 4 +- wolf3d/code/iphone/WOLF_114.png | Bin 0 -> 25852 bytes wolf3d/code/iphone/WOLF_57.png | Bin 0 -> 9676 bytes wolf3d/code/iphone/WOLF_72.png | Bin 0 -> 12981 bytes wolf3d/code/iphone/WolfSlider.m | 5 +- wolf3d/code/iphone/default.png | Bin 186836 -> 249224 bytes wolf3d/code/iphone/default_wolf3dlite.png | Bin 186653 -> 0 bytes wolf3d/code/iphone/gles_glue.h | 4 +- wolf3d/code/iphone/hud.c | 10 +- wolf3d/code/iphone/iphone_alerts.h | 4 +- wolf3d/code/iphone/iphone_alerts.m | 12 +- wolf3d/code/iphone/iphone_downloadSOD.m | 2 +- wolf3d/code/iphone/iphone_downloadUserMap.m | 4 +- wolf3d/code/iphone/iphone_loop.c | 74 +- wolf3d/code/iphone/iphone_main.c | 4 +- wolf3d/code/iphone/iphone_mapselector.c | 4 +- wolf3d/code/iphone/iphone_menus.c | 26 +- wolf3d/code/iphone/iphone_store.m | 2 +- wolf3d/code/iphone/iphone_sys.m | 66 +- wolf3d/code/iphone/iphone_wolf.h | 78 +- wolf3d/code/iphone/untgz.c | 703 ----- wolf3d/code/iphone/victory_wolf3dlite.tga | Bin 262188 -> 0 bytes .../iphone/wolf3d.xcodeproj/project.pbxproj | 700 +++-- wolf3d/code/iphone/wolf3dAppDelegate.h | 4 +- wolf3d/code/iphone/wolf3dAppDelegate.m | 116 +- wolf3d/code/iphone/wolf3dViewController.m | 232 +- wolf3d/code/iphone/wondering.caf | Bin 0 -> 279287 bytes wolf3d/code/wolf/wolf_actor_ai.c | 8 +- wolf3d/code/wolf/wolf_ai_com.c | 32 +- wolf3d/code/wolf/wolf_bj.c | 6 +- wolf3d/code/wolf/wolf_level.c | 36 +- wolf3d/code/wolf/wolf_opengl.c | 6 +- wolf3d/code/wolf/wolf_player.c | 43 +- wolf3d/code/wolf/wolf_raycast.c | 10 +- wolf3d/code/wolf/wolf_sprites.c | 10 +- wolf3d/code/wolf/wolf_weapon.c | 14 +- wolf3d/code/wolfiphone.h | 13 +- wolf3d/newCode/Tremor/CHANGELOG | 19 - wolf3d/newCode/Tremor/COPYING | 28 - wolf3d/newCode/Tremor/Makefile.am | 38 - wolf3d/newCode/Tremor/README | 46 - wolf3d/newCode/Tremor/Version_script.in | 49 - wolf3d/newCode/Tremor/asm_arm.h | 243 -- wolf3d/newCode/Tremor/autogen.sh | 120 - wolf3d/newCode/Tremor/backends.h | 130 - wolf3d/newCode/Tremor/bitwise.c | 265 -- wolf3d/newCode/Tremor/block.c | 453 ---- wolf3d/newCode/Tremor/block.h | 24 - wolf3d/newCode/Tremor/codebook.c | 371 --- wolf3d/newCode/Tremor/codebook.h | 102 - wolf3d/newCode/Tremor/codec_internal.h | 92 - wolf3d/newCode/Tremor/config_types.h | 25 - wolf3d/newCode/Tremor/configure.in | 131 - wolf3d/newCode/Tremor/debian/Makefile.am | 6 - wolf3d/newCode/Tremor/debian/changelog | 9 - wolf3d/newCode/Tremor/debian/control | 22 - wolf3d/newCode/Tremor/debian/copyright | 37 - .../Tremor/debian/libvorbisidec-dev.install | 8 - .../Tremor/debian/libvorbisidec1.install | 1 - wolf3d/newCode/Tremor/debian/rules | 151 -- wolf3d/newCode/Tremor/doc/OggVorbis_File.html | 132 - wolf3d/newCode/Tremor/doc/build.html | 111 - wolf3d/newCode/Tremor/doc/callbacks.html | 113 - wolf3d/newCode/Tremor/doc/datastructures.html | 61 - wolf3d/newCode/Tremor/doc/decoding.html | 82 - wolf3d/newCode/Tremor/doc/diff.html | 67 - wolf3d/newCode/Tremor/doc/example.html | 205 -- wolf3d/newCode/Tremor/doc/fileinfo.html | 95 - wolf3d/newCode/Tremor/doc/index.html | 53 - wolf3d/newCode/Tremor/doc/initialization.html | 101 - wolf3d/newCode/Tremor/doc/ov_bitrate.html | 72 - .../Tremor/doc/ov_bitrate_instant.html | 65 - wolf3d/newCode/Tremor/doc/ov_callbacks.html | 78 - wolf3d/newCode/Tremor/doc/ov_clear.html | 64 - wolf3d/newCode/Tremor/doc/ov_comment.html | 66 - wolf3d/newCode/Tremor/doc/ov_info.html | 64 - wolf3d/newCode/Tremor/doc/ov_open.html | 115 - .../newCode/Tremor/doc/ov_open_callbacks.html | 110 - wolf3d/newCode/Tremor/doc/ov_pcm_seek.html | 81 - .../newCode/Tremor/doc/ov_pcm_seek_page.html | 83 - wolf3d/newCode/Tremor/doc/ov_pcm_tell.html | 63 - wolf3d/newCode/Tremor/doc/ov_pcm_total.html | 67 - wolf3d/newCode/Tremor/doc/ov_raw_seek.html | 75 - wolf3d/newCode/Tremor/doc/ov_raw_tell.html | 63 - wolf3d/newCode/Tremor/doc/ov_raw_total.html | 68 - wolf3d/newCode/Tremor/doc/ov_read.html | 115 - wolf3d/newCode/Tremor/doc/ov_seekable.html | 63 - .../newCode/Tremor/doc/ov_serialnumber.html | 67 - wolf3d/newCode/Tremor/doc/ov_streams.html | 64 - wolf3d/newCode/Tremor/doc/ov_test.html | 89 - .../newCode/Tremor/doc/ov_test_callbacks.html | 90 - wolf3d/newCode/Tremor/doc/ov_test_open.html | 82 - wolf3d/newCode/Tremor/doc/ov_time_seek.html | 70 - .../newCode/Tremor/doc/ov_time_seek_page.html | 83 - wolf3d/newCode/Tremor/doc/ov_time_tell.html | 63 - wolf3d/newCode/Tremor/doc/ov_time_total.html | 67 - wolf3d/newCode/Tremor/doc/overview.html | 61 - wolf3d/newCode/Tremor/doc/reference.html | 75 - wolf3d/newCode/Tremor/doc/return.html | 77 - wolf3d/newCode/Tremor/doc/seeking.html | 74 - wolf3d/newCode/Tremor/doc/style.css | 7 - wolf3d/newCode/Tremor/doc/threads.html | 50 - wolf3d/newCode/Tremor/doc/vorbis_comment.html | 70 - wolf3d/newCode/Tremor/doc/vorbis_info.html | 80 - wolf3d/newCode/Tremor/floor0.c | 435 --- wolf3d/newCode/Tremor/floor1.c | 441 --- wolf3d/newCode/Tremor/framing.c | 1126 -------- wolf3d/newCode/Tremor/info.c | 356 --- wolf3d/newCode/Tremor/ivorbiscodec.h | 202 -- wolf3d/newCode/Tremor/ivorbisfile.h | 130 - wolf3d/newCode/Tremor/ivorbisfile_example.c | 86 - wolf3d/newCode/Tremor/lsp_lookup.h | 136 - wolf3d/newCode/Tremor/mapping0.c | 322 --- wolf3d/newCode/Tremor/mdct.c | 510 ---- wolf3d/newCode/Tremor/mdct.h | 52 - wolf3d/newCode/Tremor/mdct_lookup.h | 540 ---- wolf3d/newCode/Tremor/misc.h | 244 -- wolf3d/newCode/Tremor/ogg.h | 206 -- wolf3d/newCode/Tremor/os.h | 64 - wolf3d/newCode/Tremor/os_types.h | 88 - wolf3d/newCode/Tremor/registry.c | 50 - wolf3d/newCode/Tremor/registry.h | 40 - wolf3d/newCode/Tremor/res012.c | 342 --- wolf3d/newCode/Tremor/sharedbook.c | 439 --- wolf3d/newCode/Tremor/synthesis.c | 113 - wolf3d/newCode/Tremor/vorbisfile.c | 1586 ----------- wolf3d/newCode/Tremor/window.c | 83 - wolf3d/newCode/Tremor/window.h | 27 - wolf3d/newCode/Tremor/window_lookup.h | 2084 -------------- wolf3d/newCode/env/angle.c | 172 -- wolf3d/newCode/env/angle.h | 53 - wolf3d/newCode/env/app_def.h | 50 - wolf3d/newCode/env/arch.c | 60 - wolf3d/newCode/env/arch.h | 273 -- wolf3d/newCode/env/cmd.c | 1195 -------- wolf3d/newCode/env/cmd.h | 150 -- wolf3d/newCode/env/com_string.c | 518 ---- wolf3d/newCode/env/com_string.h | 87 - wolf3d/newCode/env/common.c | 593 ---- wolf3d/newCode/env/common.h | 206 -- wolf3d/newCode/env/common_utils.h | 62 - wolf3d/newCode/env/console.c | 822 ------ wolf3d/newCode/env/console.h | 86 - wolf3d/newCode/env/cvar.c | 765 ------ wolf3d/newCode/env/cvar.h | 162 -- wolf3d/newCode/env/fileio.c | 302 --- wolf3d/newCode/env/files.c | 162 -- wolf3d/newCode/env/filestring.c | 161 -- wolf3d/newCode/env/filestring.h | 55 - wolf3d/newCode/env/filesystem.h | 134 - wolf3d/newCode/env/font_manager.c | 492 ---- wolf3d/newCode/env/font_manager.h | 78 - wolf3d/newCode/env/glob.c | 207 -- wolf3d/newCode/env/glob.h | 22 - wolf3d/newCode/env/math.c | 224 -- wolf3d/newCode/env/matrix.c | 158 -- wolf3d/newCode/env/matrix.h | 43 - wolf3d/newCode/env/memory.c | 193 -- wolf3d/newCode/env/memory.h | 57 - wolf3d/newCode/env/mymath.h | 95 - wolf3d/newCode/env/myopengl.h | 872 ------ wolf3d/newCode/env/myopengl_extension.h | 716 ----- wolf3d/newCode/env/num_type.h | 48 - wolf3d/newCode/env/oggfile.c | 154 -- wolf3d/newCode/env/oggfile.h | 29 - wolf3d/newCode/env/openal_binding.c | 335 --- wolf3d/newCode/env/openal_binding.h | 186 -- wolf3d/newCode/env/openal_main.c | 244 -- wolf3d/newCode/env/opengl_draw.c | 339 --- wolf3d/newCode/env/opengl_extension.c | 1024 ------- wolf3d/newCode/env/opengl_local.h | 256 -- wolf3d/newCode/env/opengl_main.c | 497 ---- wolf3d/newCode/env/opengl_texture.c | 253 -- wolf3d/newCode/env/random_number.c | 107 - wolf3d/newCode/env/random_number.h | 48 - wolf3d/newCode/env/renderer.h | 107 - wolf3d/newCode/env/share.c | 189 -- wolf3d/newCode/env/sound.c | 791 ------ wolf3d/newCode/env/sound.h | 94 - wolf3d/newCode/env/sound_local.h | 112 - wolf3d/newCode/env/sound_sfx_id.c | 314 --- wolf3d/newCode/env/sound_stream.c | 516 ---- wolf3d/newCode/env/texture_manager.c | 1379 ---------- wolf3d/newCode/env/texture_manager.h | 176 -- wolf3d/newCode/env/tga.c | 783 ------ wolf3d/newCode/env/tga.h | 49 - wolf3d/newCode/env/timer.h | 44 - wolf3d/newCode/env/unix_file.c | 286 -- wolf3d/newCode/env/unix_timer.c | 67 - wolf3d/newCode/env/vector.c | 650 ----- wolf3d/newCode/env/vector.h | 125 - wolf3d/newCode/env/video.h | 68 - wolf3d/newCode/env/wavfile.c | 241 -- wolf3d/newCode/env/wavfile.h | 54 - wolf3d/newCode/env/zmem.c | 191 -- wolf3d/newCode/env/zmem.h | 75 - wolf3d/newCode/iphone/.DS_Store | Bin 6148 -> 0 bytes wolf3d/newCode/iphone/EAGLView.h | 58 - wolf3d/newCode/iphone/EAGLView.m | 293 -- wolf3d/newCode/iphone/Info.plist | 36 - wolf3d/newCode/iphone/MainWindow.xib | 223 -- wolf3d/newCode/iphone/default.png | Bin 336799 -> 0 bytes wolf3d/newCode/iphone/dist.plist | 8 - wolf3d/newCode/iphone/gles_glue.c | 134 - wolf3d/newCode/iphone/gles_glue.h | 77 - wolf3d/newCode/iphone/iphone_loop.c | 1025 ------- wolf3d/newCode/iphone/iphone_main.c | 244 -- wolf3d/newCode/iphone/iphone_menus.c | 1061 -------- wolf3d/newCode/iphone/iphone_qgl.h | 2392 ----------------- wolf3d/newCode/iphone/iphone_qgl_enumerants.h | 40 - wolf3d/newCode/iphone/iphone_wolf.h | 151 -- wolf3d/newCode/iphone/main.m | 45 - .../iphone/wolf3d.xcodeproj/project.pbxproj | 847 ------ wolf3d/newCode/iphone/wolf3dAppDelegate.h | 46 - wolf3d/newCode/iphone/wolf3dAppDelegate.m | 120 - wolf3d/newCode/iphone/wolf3dEpisode1_icon.png | Bin 8077 -> 0 bytes wolf3d/newCode/iphone/wolf3d_Prefix.pch | 8 - wolf3d/newCode/iphone/wolf3d_icon.png | Bin 5935 -> 0 bytes wolf3d/newCode/wolf/wolf_act_stat.h | 1619 ----------- wolf3d/newCode/wolf/wolf_actor_ai.c | 968 ------- wolf3d/newCode/wolf/wolf_actor_ai.h | 73 - wolf3d/newCode/wolf/wolf_actors.c | 471 ---- wolf3d/newCode/wolf/wolf_actors.h | 172 -- wolf3d/newCode/wolf/wolf_ai_com.c | 1315 --------- wolf3d/newCode/wolf/wolf_ai_com.h | 65 - wolf3d/newCode/wolf/wolf_areas.c | 170 -- wolf3d/newCode/wolf/wolf_bj.c | 136 - wolf3d/newCode/wolf/wolf_bj.h | 59 - wolf3d/newCode/wolf/wolf_client_main.c | 94 - wolf3d/newCode/wolf/wolf_doors.c | 506 ---- wolf3d/newCode/wolf/wolf_level.c | 1389 ---------- wolf3d/newCode/wolf/wolf_level.h | 285 -- wolf3d/newCode/wolf/wolf_local.h | 150 -- wolf3d/newCode/wolf/wolf_main.c | 87 - wolf3d/newCode/wolf/wolf_math.c | 341 --- wolf3d/newCode/wolf/wolf_math.h | 147 - wolf3d/newCode/wolf/wolf_opengl.c | 629 ----- wolf3d/newCode/wolf/wolf_player.c | 1023 ------- wolf3d/newCode/wolf/wolf_player.h | 180 -- wolf3d/newCode/wolf/wolf_powerups.c | 427 --- wolf3d/newCode/wolf/wolf_powerups.h | 79 - wolf3d/newCode/wolf/wolf_pushwalls.c | 175 -- wolf3d/newCode/wolf/wolf_raycast.c | 370 --- wolf3d/newCode/wolf/wolf_raycast.h | 74 - wolf3d/newCode/wolf/wolf_renderer.c | 96 - wolf3d/newCode/wolf/wolf_renderer.h | 64 - wolf3d/newCode/wolf/wolf_sprites.c | 291 -- wolf3d/newCode/wolf/wolf_sprites.h | 430 --- wolf3d/newCode/wolf/wolf_sv_ccmds.c | 95 - wolf3d/newCode/wolf/wolf_weapon.c | 194 -- wolf3d/newCode/wolfiphone.h | 87 - 314 files changed, 5681 insertions(+), 77333 deletions(-) create mode 100644 .gitignore create mode 100644 wolf3d/README.md delete mode 100644 wolf3d/code/iphone/FSCopyObject.c delete mode 100644 wolf3d/code/iphone/FSCopyObject.h delete mode 100644 wolf3d/code/iphone/GenLinkedList.c delete mode 100644 wolf3d/code/iphone/GenLinkedList.h create mode 100644 wolf3d/code/iphone/Launch Screen.storyboard delete mode 100644 wolf3d/code/iphone/MainWindow.xib create mode 100755 wolf3d/code/iphone/POSITYPE-idSettler10v2.otf create mode 100755 wolf3d/code/iphone/WOLF_114.png create mode 100755 wolf3d/code/iphone/WOLF_57.png create mode 100755 wolf3d/code/iphone/WOLF_72.png delete mode 100644 wolf3d/code/iphone/default_wolf3dlite.png delete mode 100644 wolf3d/code/iphone/untgz.c delete mode 100644 wolf3d/code/iphone/victory_wolf3dlite.tga create mode 100755 wolf3d/code/iphone/wondering.caf delete mode 100644 wolf3d/newCode/Tremor/CHANGELOG delete mode 100644 wolf3d/newCode/Tremor/COPYING delete mode 100644 wolf3d/newCode/Tremor/Makefile.am delete mode 100644 wolf3d/newCode/Tremor/README delete mode 100644 wolf3d/newCode/Tremor/Version_script.in delete mode 100644 wolf3d/newCode/Tremor/asm_arm.h delete mode 100644 wolf3d/newCode/Tremor/autogen.sh delete mode 100644 wolf3d/newCode/Tremor/backends.h delete mode 100644 wolf3d/newCode/Tremor/bitwise.c delete mode 100644 wolf3d/newCode/Tremor/block.c delete mode 100644 wolf3d/newCode/Tremor/block.h delete mode 100644 wolf3d/newCode/Tremor/codebook.c delete mode 100644 wolf3d/newCode/Tremor/codebook.h delete mode 100644 wolf3d/newCode/Tremor/codec_internal.h delete mode 100644 wolf3d/newCode/Tremor/config_types.h delete mode 100644 wolf3d/newCode/Tremor/configure.in delete mode 100644 wolf3d/newCode/Tremor/debian/Makefile.am delete mode 100644 wolf3d/newCode/Tremor/debian/changelog delete mode 100644 wolf3d/newCode/Tremor/debian/control delete mode 100644 wolf3d/newCode/Tremor/debian/copyright delete mode 100644 wolf3d/newCode/Tremor/debian/libvorbisidec-dev.install delete mode 100644 wolf3d/newCode/Tremor/debian/libvorbisidec1.install delete mode 100644 wolf3d/newCode/Tremor/debian/rules delete mode 100644 wolf3d/newCode/Tremor/doc/OggVorbis_File.html delete mode 100644 wolf3d/newCode/Tremor/doc/build.html delete mode 100644 wolf3d/newCode/Tremor/doc/callbacks.html delete mode 100644 wolf3d/newCode/Tremor/doc/datastructures.html delete mode 100644 wolf3d/newCode/Tremor/doc/decoding.html delete mode 100644 wolf3d/newCode/Tremor/doc/diff.html delete mode 100644 wolf3d/newCode/Tremor/doc/example.html delete mode 100644 wolf3d/newCode/Tremor/doc/fileinfo.html delete mode 100644 wolf3d/newCode/Tremor/doc/index.html delete mode 100644 wolf3d/newCode/Tremor/doc/initialization.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_bitrate.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_bitrate_instant.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_callbacks.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_clear.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_comment.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_info.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_open.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_open_callbacks.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_pcm_seek.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_pcm_seek_page.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_pcm_tell.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_pcm_total.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_raw_seek.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_raw_tell.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_raw_total.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_read.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_seekable.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_serialnumber.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_streams.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_test.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_test_callbacks.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_test_open.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_time_seek.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_time_seek_page.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_time_tell.html delete mode 100644 wolf3d/newCode/Tremor/doc/ov_time_total.html delete mode 100644 wolf3d/newCode/Tremor/doc/overview.html delete mode 100644 wolf3d/newCode/Tremor/doc/reference.html delete mode 100644 wolf3d/newCode/Tremor/doc/return.html delete mode 100644 wolf3d/newCode/Tremor/doc/seeking.html delete mode 100644 wolf3d/newCode/Tremor/doc/style.css delete mode 100644 wolf3d/newCode/Tremor/doc/threads.html delete mode 100644 wolf3d/newCode/Tremor/doc/vorbis_comment.html delete mode 100644 wolf3d/newCode/Tremor/doc/vorbis_info.html delete mode 100644 wolf3d/newCode/Tremor/floor0.c delete mode 100644 wolf3d/newCode/Tremor/floor1.c delete mode 100644 wolf3d/newCode/Tremor/framing.c delete mode 100644 wolf3d/newCode/Tremor/info.c delete mode 100644 wolf3d/newCode/Tremor/ivorbiscodec.h delete mode 100644 wolf3d/newCode/Tremor/ivorbisfile.h delete mode 100644 wolf3d/newCode/Tremor/ivorbisfile_example.c delete mode 100644 wolf3d/newCode/Tremor/lsp_lookup.h delete mode 100644 wolf3d/newCode/Tremor/mapping0.c delete mode 100644 wolf3d/newCode/Tremor/mdct.c delete mode 100644 wolf3d/newCode/Tremor/mdct.h delete mode 100644 wolf3d/newCode/Tremor/mdct_lookup.h delete mode 100644 wolf3d/newCode/Tremor/misc.h delete mode 100644 wolf3d/newCode/Tremor/ogg.h delete mode 100644 wolf3d/newCode/Tremor/os.h delete mode 100644 wolf3d/newCode/Tremor/os_types.h delete mode 100644 wolf3d/newCode/Tremor/registry.c delete mode 100644 wolf3d/newCode/Tremor/registry.h delete mode 100644 wolf3d/newCode/Tremor/res012.c delete mode 100644 wolf3d/newCode/Tremor/sharedbook.c delete mode 100644 wolf3d/newCode/Tremor/synthesis.c delete mode 100644 wolf3d/newCode/Tremor/vorbisfile.c delete mode 100644 wolf3d/newCode/Tremor/window.c delete mode 100644 wolf3d/newCode/Tremor/window.h delete mode 100644 wolf3d/newCode/Tremor/window_lookup.h delete mode 100644 wolf3d/newCode/env/angle.c delete mode 100644 wolf3d/newCode/env/angle.h delete mode 100644 wolf3d/newCode/env/app_def.h delete mode 100644 wolf3d/newCode/env/arch.c delete mode 100644 wolf3d/newCode/env/arch.h delete mode 100644 wolf3d/newCode/env/cmd.c delete mode 100644 wolf3d/newCode/env/cmd.h delete mode 100644 wolf3d/newCode/env/com_string.c delete mode 100644 wolf3d/newCode/env/com_string.h delete mode 100644 wolf3d/newCode/env/common.c delete mode 100644 wolf3d/newCode/env/common.h delete mode 100644 wolf3d/newCode/env/common_utils.h delete mode 100644 wolf3d/newCode/env/console.c delete mode 100644 wolf3d/newCode/env/console.h delete mode 100644 wolf3d/newCode/env/cvar.c delete mode 100644 wolf3d/newCode/env/cvar.h delete mode 100644 wolf3d/newCode/env/fileio.c delete mode 100644 wolf3d/newCode/env/files.c delete mode 100644 wolf3d/newCode/env/filestring.c delete mode 100644 wolf3d/newCode/env/filestring.h delete mode 100644 wolf3d/newCode/env/filesystem.h delete mode 100644 wolf3d/newCode/env/font_manager.c delete mode 100644 wolf3d/newCode/env/font_manager.h delete mode 100644 wolf3d/newCode/env/glob.c delete mode 100644 wolf3d/newCode/env/glob.h delete mode 100644 wolf3d/newCode/env/math.c delete mode 100644 wolf3d/newCode/env/matrix.c delete mode 100644 wolf3d/newCode/env/matrix.h delete mode 100644 wolf3d/newCode/env/memory.c delete mode 100644 wolf3d/newCode/env/memory.h delete mode 100644 wolf3d/newCode/env/mymath.h delete mode 100644 wolf3d/newCode/env/myopengl.h delete mode 100644 wolf3d/newCode/env/myopengl_extension.h delete mode 100644 wolf3d/newCode/env/num_type.h delete mode 100644 wolf3d/newCode/env/oggfile.c delete mode 100644 wolf3d/newCode/env/oggfile.h delete mode 100644 wolf3d/newCode/env/openal_binding.c delete mode 100644 wolf3d/newCode/env/openal_binding.h delete mode 100644 wolf3d/newCode/env/openal_main.c delete mode 100644 wolf3d/newCode/env/opengl_draw.c delete mode 100644 wolf3d/newCode/env/opengl_extension.c delete mode 100644 wolf3d/newCode/env/opengl_local.h delete mode 100644 wolf3d/newCode/env/opengl_main.c delete mode 100644 wolf3d/newCode/env/opengl_texture.c delete mode 100644 wolf3d/newCode/env/random_number.c delete mode 100644 wolf3d/newCode/env/random_number.h delete mode 100644 wolf3d/newCode/env/renderer.h delete mode 100644 wolf3d/newCode/env/share.c delete mode 100644 wolf3d/newCode/env/sound.c delete mode 100644 wolf3d/newCode/env/sound.h delete mode 100644 wolf3d/newCode/env/sound_local.h delete mode 100644 wolf3d/newCode/env/sound_sfx_id.c delete mode 100644 wolf3d/newCode/env/sound_stream.c delete mode 100644 wolf3d/newCode/env/texture_manager.c delete mode 100644 wolf3d/newCode/env/texture_manager.h delete mode 100644 wolf3d/newCode/env/tga.c delete mode 100644 wolf3d/newCode/env/tga.h delete mode 100644 wolf3d/newCode/env/timer.h delete mode 100644 wolf3d/newCode/env/unix_file.c delete mode 100644 wolf3d/newCode/env/unix_timer.c delete mode 100644 wolf3d/newCode/env/vector.c delete mode 100644 wolf3d/newCode/env/vector.h delete mode 100644 wolf3d/newCode/env/video.h delete mode 100644 wolf3d/newCode/env/wavfile.c delete mode 100644 wolf3d/newCode/env/wavfile.h delete mode 100644 wolf3d/newCode/env/zmem.c delete mode 100644 wolf3d/newCode/env/zmem.h delete mode 100644 wolf3d/newCode/iphone/.DS_Store delete mode 100644 wolf3d/newCode/iphone/EAGLView.h delete mode 100644 wolf3d/newCode/iphone/EAGLView.m delete mode 100644 wolf3d/newCode/iphone/Info.plist delete mode 100644 wolf3d/newCode/iphone/MainWindow.xib delete mode 100644 wolf3d/newCode/iphone/default.png delete mode 100644 wolf3d/newCode/iphone/dist.plist delete mode 100644 wolf3d/newCode/iphone/gles_glue.c delete mode 100644 wolf3d/newCode/iphone/gles_glue.h delete mode 100644 wolf3d/newCode/iphone/iphone_loop.c delete mode 100644 wolf3d/newCode/iphone/iphone_main.c delete mode 100644 wolf3d/newCode/iphone/iphone_menus.c delete mode 100644 wolf3d/newCode/iphone/iphone_qgl.h delete mode 100644 wolf3d/newCode/iphone/iphone_qgl_enumerants.h delete mode 100644 wolf3d/newCode/iphone/iphone_wolf.h delete mode 100644 wolf3d/newCode/iphone/main.m delete mode 100644 wolf3d/newCode/iphone/wolf3d.xcodeproj/project.pbxproj delete mode 100644 wolf3d/newCode/iphone/wolf3dAppDelegate.h delete mode 100644 wolf3d/newCode/iphone/wolf3dAppDelegate.m delete mode 100644 wolf3d/newCode/iphone/wolf3dEpisode1_icon.png delete mode 100644 wolf3d/newCode/iphone/wolf3d_Prefix.pch delete mode 100644 wolf3d/newCode/iphone/wolf3d_icon.png delete mode 100644 wolf3d/newCode/wolf/wolf_act_stat.h delete mode 100644 wolf3d/newCode/wolf/wolf_actor_ai.c delete mode 100644 wolf3d/newCode/wolf/wolf_actor_ai.h delete mode 100644 wolf3d/newCode/wolf/wolf_actors.c delete mode 100644 wolf3d/newCode/wolf/wolf_actors.h delete mode 100644 wolf3d/newCode/wolf/wolf_ai_com.c delete mode 100644 wolf3d/newCode/wolf/wolf_ai_com.h delete mode 100644 wolf3d/newCode/wolf/wolf_areas.c delete mode 100644 wolf3d/newCode/wolf/wolf_bj.c delete mode 100644 wolf3d/newCode/wolf/wolf_bj.h delete mode 100644 wolf3d/newCode/wolf/wolf_client_main.c delete mode 100644 wolf3d/newCode/wolf/wolf_doors.c delete mode 100644 wolf3d/newCode/wolf/wolf_level.c delete mode 100644 wolf3d/newCode/wolf/wolf_level.h delete mode 100644 wolf3d/newCode/wolf/wolf_local.h delete mode 100644 wolf3d/newCode/wolf/wolf_main.c delete mode 100644 wolf3d/newCode/wolf/wolf_math.c delete mode 100644 wolf3d/newCode/wolf/wolf_math.h delete mode 100644 wolf3d/newCode/wolf/wolf_opengl.c delete mode 100644 wolf3d/newCode/wolf/wolf_player.c delete mode 100644 wolf3d/newCode/wolf/wolf_player.h delete mode 100644 wolf3d/newCode/wolf/wolf_powerups.c delete mode 100644 wolf3d/newCode/wolf/wolf_powerups.h delete mode 100644 wolf3d/newCode/wolf/wolf_pushwalls.c delete mode 100644 wolf3d/newCode/wolf/wolf_raycast.c delete mode 100644 wolf3d/newCode/wolf/wolf_raycast.h delete mode 100644 wolf3d/newCode/wolf/wolf_renderer.c delete mode 100644 wolf3d/newCode/wolf/wolf_renderer.h delete mode 100644 wolf3d/newCode/wolf/wolf_sprites.c delete mode 100644 wolf3d/newCode/wolf/wolf_sprites.h delete mode 100644 wolf3d/newCode/wolf/wolf_sv_ccmds.c delete mode 100644 wolf3d/newCode/wolf/wolf_weapon.c delete mode 100644 wolf3d/newCode/wolfiphone.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0dc6251 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +*xcuserdata/ +*build/ +*.mode1v3 +*.pbxuser +*.xcworkspace +*.moved-aside/ +.svn \ No newline at end of file diff --git a/wolf3d/README.md b/wolf3d/README.md new file mode 100644 index 0000000..2ec87c3 --- /dev/null +++ b/wolf3d/README.md @@ -0,0 +1,16 @@ +# Wolfenstein 3D for iOS 11 + +This is my update for Wolfenstein 3D for iOS to run on iOS 11. It also runs in modern resolutions including the full width of the iPhone X. + +Improvements/Changes + +- Compiles and runs in iOS 11 SDK +- Orientation and coordinate system fixed to reflect iOS 8 changes +- C warnings fixed for Xcode 9.3 +- Basic MFi controller support +- Deprecated APIs removed and replaced with modern equivalents +- Code locations reorganized and consolodated + +This commit only includes the changes made to the original source code and the original files. A "menu_art" directory is still required to build correctly, but as that consists of copyrighted material, I have not included it in this commit. + +My plan is to do a pull request to id Software on this commit and then make a second commit with placeholder menu art for others to be able to compile from scratch. \ No newline at end of file diff --git a/wolf3d/code/.DS_Store b/wolf3d/code/.DS_Store index 390aed0b5b3453399a18bbd2393cb427d43d69ba..bccadcf152c88af7e8de7d833f5a1829ed7d5fa2 100644 GIT binary patch literal 8196 zcmeHMU2GIp6u#e5%8U%`w1REH$!;wO;vy|6KNTfQTPw9xiY>H-LfPG!(h1X8Q7h!P+C2-`%GR7pTzEtN^bDiRk`}LX<2{ff7LH3N<%t#m9;k4zX zubCYxLIgqtLIgqtLIgqtZUhAA&i0Em!@Vy?!!|@9L||4T;GYk1s=iDHa$HD$bWp=n z0Fou7=7pXq58yWOKqdn@E+jW4pCWreV2U8cfH0@=xIdj_GLYj!3UdZw&JaXKkfDG_ zC%ZVG&X5!`Y(oS>1g=HE&)rLz$%fe=bBgl!3+Z9YbiLZzi-^oAnOizfl4VI=An)xQ zbPAnb%FDTpsq7xV*OBrD)4_9><5*MAsq`+>DD@gt}YSZSU;ACk2b7rNW?cZ)Q^qHQpNJRdt3JpjT{+$c^wi|itrdHxCP6x50HULy}JVDc)aje{s?e?o>nUs~uSt-xh zVp;xV(nZ}&*0HP($2C3Ev3q+wqU@$0!}iPp)5z{Dn7TLE zn{qRTt(*3N?!4)mY0K!cQ$t1>Mr3&+T3NMZ>8+YJ)6||^+B}pqy%DuWl6Z`GwWjpx z^mgrz?nlwp^Ah=?=*z1$ZI3_Flr^Z;$)H>?kl$({LREC7ylW~TIXq_&P+}NaP`~1k;Qm(gs z*s$rXE>QR-l~qx#T5FZ0UVn6puG3r9B#-~X0jx=`6hPJp!59ZdR{d*DW4E)7bd7bf z0or1ZuoLVwJICH;@34>9XY305iha+1X1}pN*q>mK5k(cMu?h*S#$DKeX0+gbY{d@j z#Xj_75GD@7!XX^ND8_IU$8Z8q;we0hXK@;5@FHHqS)9XpyotB)K0d}}e2y=01>fR3 zT*VLg5x+-DBhkpB$YSxvk;%=oV{!$7zJlbm1A<5&eBg_mxjyM*TU#G!Q(A6#(qCFA zn7;Uyium$XYw8;|H%*bDhy(v5BWItW7pL7Mt@uwqjn5NeODM6O#7^VzOglrJ=krjS zSX#BDGIm>RnM90JgYJsh9TIH|HNt(}nTRRs9NGag@7C5SF?BAHUElH;Uq1_-x z@7_eCrNn#TN=Yh>vcFYT#v>^!VlA?y;=ft^uN?lAU1nF=PwZFX?p!QDIbv8zysgJ( z;_X(nVH?`93*G3&ZuG&xK)_%Rc^t+FvG^Ds#bbCJPv9h;Ar3!>Q+RH0sCTh4h}(PkPe_CZXn?b#O)gkzcWwfmoa2ym~6u%%>y(9WH87shRyLj GbC?1B&lJr7 diff --git a/wolf3d/code/env/cmd.c b/wolf3d/code/env/cmd.c index b8644bd..fc7f80e 100644 --- a/wolf3d/code/env/cmd.c +++ b/wolf3d/code/env/cmd.c @@ -133,7 +133,7 @@ PUBLIC void Cbuf_AddText( const char *text ) return; } - SZ_Write( &cmd_text, (void *)text, length ); + SZ_Write( &cmd_text, (void *)text, (int)length ); } /* @@ -174,7 +174,7 @@ PUBLIC void Cbuf_InsertText( char *text ) // add the copied off data if( templen ) { - SZ_Write( &cmd_text, temp, templen ); + SZ_Write( &cmd_text, temp, (int)templen ); Z_Free( temp ); } } @@ -501,7 +501,7 @@ PRIVATE void Cmd_Exec_f( void ) return; } - len = FS_GetFileSize( hfile ); + len = (int)FS_GetFileSize( hfile ); Com_Printf( "execing %s\n", Cmd_Argv( 1 ) ); @@ -725,7 +725,7 @@ PRIVATE char *Cmd_MacroExpandString( char *text ) inquote = false; scan = text; - len = strlen( scan ); + len = (int)strlen( scan ); if( len >= MAX_STRING_CHARS ) { Com_Printf( "Line exceeded %i chars, discarded.\n", MAX_STRING_CHARS ); @@ -753,7 +753,7 @@ PRIVATE char *Cmd_MacroExpandString( char *text ) token = Cvar_VariableString (token); - j = strlen(token); + j = (int)strlen(token); len += j; if (len >= MAX_STRING_CHARS) { @@ -851,7 +851,7 @@ PUBLIC void Cmd_TokenizeString( char *text, _boolean macroExpand ) my_strlcpy( cmd_args, text, sizeof( cmd_args ) - 1 ); // strip off any trailing whitespace - l = strlen( cmd_args ) - 1; + l = (int)strlen( cmd_args ) - 1; for( ; l >= 0 ; --l ) { if (cmd_args[l] <= ' ') @@ -1019,7 +1019,7 @@ PUBLIC char *Cmd_CompleteCommand( char *partial ) cmdalias_t *a; W32 hashid; - len = strlen( partial ); + len = (int)strlen( partial ); if( ! len ) { diff --git a/wolf3d/code/env/com_string.c b/wolf3d/code/env/com_string.c index 400007e..c311a63 100644 --- a/wolf3d/code/env/com_string.c +++ b/wolf3d/code/env/com_string.c @@ -454,7 +454,7 @@ PUBLIC double StringToFloat( const char *string, W32 *error ) const char *ptr = string; double number = 0; SW32 exponent = 0; - W32 expError; + W32 expError = 0; _boolean bNegative = false; *error = 0; diff --git a/wolf3d/code/env/common.c b/wolf3d/code/env/common.c index 1572967..de7c350 100644 --- a/wolf3d/code/env/common.c +++ b/wolf3d/code/env/common.c @@ -399,7 +399,7 @@ PUBLIC void SZ_Print( sizebuf_t *buf, W8 *data ) { int len; - len = strlen( (char *)data ) + 1; + len = (int)strlen( (char *)data ) + 1; if (buf->cursize) { @@ -585,9 +585,9 @@ PUBLIC void COM_AddParm( char *parm ) ----------------------------------------------------------------------------- */ -PRIVATE void Com_Error_f (void) -{ - Com_Error( ERR_FATAL, "%s", Cmd_Argv( 1 ) ); -} +//PRIVATE void Com_Error_f (void) +//{ +// Com_Error( ERR_FATAL, "%s", Cmd_Argv( 1 ) ); +//} diff --git a/wolf3d/code/env/console.c b/wolf3d/code/env/console.c index 735ab86..06d76f7 100644 --- a/wolf3d/code/env/console.c +++ b/wolf3d/code/env/console.c @@ -67,10 +67,10 @@ colour3_t colourconLLGray = { 192, 192, 192 }; ----------------------------------------------------------------------------- */ -PRIVATE void DrawString( int x, int y, char *s ) -{ - Font_put_line( FONT0, x, y, s ); -} +//PRIVATE void DrawString( int x, int y, char *s ) +//{ +// Font_put_line( FONT0, x, y, s ); +//} /* ----------------------------------------------------------------------------- @@ -479,7 +479,7 @@ PUBLIC void Con_CenteredPrint( const char *text ) int length; char buffer[ 1024 ]; - length = strlen( text ); + length = (int)strlen( text ); length = ( con.linewidth - length ) >> 1; if( length < 0 ) { @@ -532,7 +532,7 @@ PRIVATE void Con_DrawInput( void ) return; } strcpy( buf, SysIPhoneGetConsoleTextField() ); - key_linepos = strlen( buf ); + key_linepos = (int)strlen( buf ); buf[key_linepos+1] = 0; text = buf; } @@ -610,7 +610,7 @@ PUBLIC void Con_DrawNotify( void ) continue; } - time = FloatToInt( con.times[ i % NUM_CON_TIMES ] ); + time = (int)FloatToInt( con.times[ i % NUM_CON_TIMES ] ); if( time == 0 ) { continue; @@ -681,15 +681,15 @@ PUBLIC void Con_DrawConsole( float frac ) // // Draw the background // - R_Draw_Fill( 0, -viddef.height + lines, viddef.width, viddef.height, colourBlack ); - R_Draw_Fill( 0, lines-2, viddef.width, 2, colourconLGray ); + R_Draw_Fill( 0, (int)(-viddef.height + lines), viddef.width, viddef.height, colourBlack ); + R_Draw_Fill( 0, (int)(lines-2), viddef.width, 2, colourconLGray ); Font_SetColour( FONT0, colourconLLGray ); // // Draw the text // - con.vislines = lines; + con.vislines = (int)lines; #if 0 @@ -699,9 +699,9 @@ PUBLIC void Con_DrawConsole( float frac ) #else - rows = (lines - 22) >> 3; // rows of text to draw + rows = ((int)lines - 22) >> 3; // rows of text to draw - y = lines - 30; + y = (int)lines - 30; #endif diff --git a/wolf3d/code/env/fileio.c b/wolf3d/code/env/fileio.c index e5c9e2c..8fcc254 100644 --- a/wolf3d/code/env/fileio.c +++ b/wolf3d/code/env/fileio.c @@ -244,7 +244,7 @@ PUBLIC filehandle_t *FS_OpenFile( const char *filename, W32 FlagsAndAttributes ) hFile = Z_Malloc( sizeof( filehandle_t ) ); memset( hFile, 0, sizeof( filehandle_t ) ); - hFile->filesize = s.st_size; + hFile->filesize = (W32)s.st_size; #ifdef USE_MMAP hFile->filedata = mmap( NULL, hFile->filesize, PROT_READ, MAP_FILE|MAP_PRIVATE, fd, 0 ); if ( (int)hFile->filedata == -1 ) { diff --git a/wolf3d/code/env/files.c b/wolf3d/code/env/files.c index 7c552fd..7f86360 100644 --- a/wolf3d/code/env/files.c +++ b/wolf3d/code/env/files.c @@ -109,53 +109,53 @@ PUBLIC char *FS_ForceGamedir( void ) ----------------------------------------------------------------------------- */ -PRIVATE char **FS_ListFiles( char *findname, int *numfiles, unsigned musthave, unsigned canthave ) -{ - char *s; - int nfiles = 0; - char **list = 0; - - s = FS_FindFirst( findname, musthave, canthave ); - while ( s ) - { - if ( s[strlen(s)-1] != '.' ) - nfiles++; - s = FS_FindNext( musthave, canthave ); - } - FS_FindClose (); - - if ( !nfiles ) - return NULL; - - nfiles++; // add space for a guard - *numfiles = nfiles; - - list = MM_MALLOC( sizeof( char * ) * nfiles ); - if( list == NULL ) - { - MM_OUTOFMEM( "list" ); - } - - memset( list, 0, sizeof( char * ) * nfiles ); - - s = FS_FindFirst( findname, musthave, canthave ); - nfiles = 0; - while( s ) - { - if( s[ strlen( s ) - 1 ] != '.' ) - { - list[ nfiles ] = strdup( s ); - - (void)my_strlwr( list[ nfiles ] ); - - nfiles++; - } - s = FS_FindNext( musthave, canthave ); - } - FS_FindClose(); - - return list; -} +//PRIVATE char **FS_ListFiles( char *findname, int *numfiles, unsigned musthave, unsigned canthave ) +//{ +// char *s; +// int nfiles = 0; +// char **list = 0; +// +// s = FS_FindFirst( findname, musthave, canthave ); +// while ( s ) +// { +// if ( s[strlen(s)-1] != '.' ) +// nfiles++; +// s = FS_FindNext( musthave, canthave ); +// } +// FS_FindClose (); +// +// if ( !nfiles ) +// return NULL; +// +// nfiles++; // add space for a guard +// *numfiles = nfiles; +// +// list = MM_MALLOC( sizeof( char * ) * nfiles ); +// if( list == NULL ) +// { +// MM_OUTOFMEM( "list" ); +// } +// +// memset( list, 0, sizeof( char * ) * nfiles ); +// +// s = FS_FindFirst( findname, musthave, canthave ); +// nfiles = 0; +// while( s ) +// { +// if( s[ strlen( s ) - 1 ] != '.' ) +// { +// list[ nfiles ] = strdup( s ); +// +// (void)my_strlwr( list[ nfiles ] ); +// +// nfiles++; +// } +// s = FS_FindNext( musthave, canthave ); +// } +// FS_FindClose(); +// +// return list; +//} /* diff --git a/wolf3d/code/env/font_manager.c b/wolf3d/code/env/font_manager.c index b4bf57e..120f55a 100644 --- a/wolf3d/code/env/font_manager.c +++ b/wolf3d/code/env/font_manager.c @@ -315,7 +315,7 @@ void Font_put_lineR2L( FONTSELECT fs, int x, int y, const char *string ) for ( i = 0; i < strlen( string ); ++i ) { - charindex = strlen( string ) - i - 1; + charindex = (int)strlen( string ) - i - 1; mx -= myfonts[ fs ]->nCharWidth[ string[ charindex ]-32 ] * myfonts[ fs ]->nSize; R_Draw_Character( mx, y, string[ charindex ], myfonts[ fs ] ); diff --git a/wolf3d/code/env/glob.c b/wolf3d/code/env/glob.c index 02a68e1..cce073c 100644 --- a/wolf3d/code/env/glob.c +++ b/wolf3d/code/env/glob.c @@ -64,41 +64,41 @@ static int glob_match_after_star( char *pattern, char *text ) } /* Return nonzero if PATTERN has any special globbing chars in it. */ -static int glob_pattern_p( char *pattern ) -{ - register char *p = pattern; - register char c; - int open = 0; - - while( (c = *p++) != '\0' ) - { - switch( c ) - { - case '?': - case '*': - return 1; - - case '[': /* Only accept an open brace if there is a close */ - open++; /* brace to match it. Bracket expressions must be */ - continue; /* complete, according to Posix.2 */ - case ']': - if( open ) - { - return 1; - } - continue; - - case '\\': - if( *p++ == '\0' ) - { - return 0; - } - } - - } - - return 0; -} +//static int glob_pattern_p( char *pattern ) +//{ +// register char *p = pattern; +// register char c; +// int open = 0; +// +// while( (c = *p++) != '\0' ) +// { +// switch( c ) +// { +// case '?': +// case '*': +// return 1; +// +// case '[': /* Only accept an open brace if there is a close */ +// open++; /* brace to match it. Bracket expressions must be */ +// continue; /* complete, according to Posix.2 */ +// case ']': +// if( open ) +// { +// return 1; +// } +// continue; +// +// case '\\': +// if( *p++ == '\0' ) +// { +// return 0; +// } +// } +// +// } +// +// return 0; +//} /* Match the pattern PATTERN against the string TEXT; return 1 if it matches, 0 otherwise. diff --git a/wolf3d/code/env/oggfile.c b/wolf3d/code/env/oggfile.c index 6e66488..2391bdc 100644 --- a/wolf3d/code/env/oggfile.c +++ b/wolf3d/code/env/oggfile.c @@ -36,7 +36,7 @@ PRIVATE size_t ovc_read( void *ptr, size_t size, size_t nmemb, void *dataSource PRIVATE int ovc_seek( void *dataSource, ogg_int64_t offset, int whence ) { - return FS_FileSeek( fh, offset, whence ); + return (int)FS_FileSeek( fh, (long)offset, whence ); } PRIVATE int ovc_close( void *dataSource ) @@ -79,7 +79,7 @@ PUBLIC _boolean LoadOggInfo( const char *filename, W8 **wav, soundInfo_t *info ) newFilename = strdup( filename ); - len = strlen( newFilename ); + len = (int)strlen( newFilename ); if ( len < 5 || strcmp( newFilename + len - 4, ".wav" ) ) { free( newFilename ); return false; @@ -121,7 +121,7 @@ PUBLIC _boolean LoadOggInfo( const char *filename, W8 **wav, soundInfo_t *info ) while( size < BUFFER_SIZE ) { int read = 0; - read = ov_read( &vorbisFile, (char *)data + size, BUFFER_SIZE - size, &dummy ); + read = (int)ov_read( &vorbisFile, (char *)data + size, BUFFER_SIZE - size, &dummy ); if( read == 0 ) { break; diff --git a/wolf3d/code/env/opengl_draw.c b/wolf3d/code/env/opengl_draw.c index 62ec23e..8ad54f9 100644 --- a/wolf3d/code/env/opengl_draw.c +++ b/wolf3d/code/env/opengl_draw.c @@ -75,7 +75,7 @@ PUBLIC void R_Draw_Character( int x, int y, int num, font_t *myfont ) return; // totally off screen } - scale = myfont->nSize; + scale = (int)myfont->nSize; sh = myfont->nMaxHeight; row = (num >> 4) - 2; diff --git a/wolf3d/code/env/opengl_local.h b/wolf3d/code/env/opengl_local.h index a4f738a..a911b7a 100644 --- a/wolf3d/code/env/opengl_local.h +++ b/wolf3d/code/env/opengl_local.h @@ -235,7 +235,7 @@ IMPLEMENTATION SPECIFIC FUNCTIONS extern "C" { #endif -void GLimp_BeginFrame(); +void GLimp_BeginFrame(void); _boolean GLimp_Init( void *hinstance, void *hWnd ); void GLimp_Shutdown( void ); int GLimp_SetMode( int *pwidth, int *pheight, int mode, _boolean fullscreen ); diff --git a/wolf3d/code/env/random_number.c b/wolf3d/code/env/random_number.c index 7256694..7f6a3fc 100644 --- a/wolf3d/code/env/random_number.c +++ b/wolf3d/code/env/random_number.c @@ -101,7 +101,7 @@ PUBLIC int US_RndT( void ) rndindex++; rndindex &= 0xFF; - return rndtable[ rndindex ]; + return (int)rndtable[ rndindex ]; } diff --git a/wolf3d/code/env/sound.c b/wolf3d/code/env/sound.c index 5282838..b27380d 100644 --- a/wolf3d/code/env/sound.c +++ b/wolf3d/code/env/sound.c @@ -289,8 +289,8 @@ PUBLIC channel_t *Sound_PickChannel( W32 entNum, W32 entChannel ) ch = &s_channels[ firstToDie ]; - ch->entNum = entNum; - ch->entChannel = entChannel; + ch->entNum = (int)entNum; + ch->entChannel = (int)entChannel; ch->startTime = iphoneFrameNum; // Make sure this channel is stopped diff --git a/wolf3d/code/env/sound_local.h b/wolf3d/code/env/sound_local.h index ec19e2c..59ef8bf 100644 --- a/wolf3d/code/env/sound_local.h +++ b/wolf3d/code/env/sound_local.h @@ -106,8 +106,8 @@ extern sfx_t *Sound_FindSound( const char *name ); extern _boolean Sound_Device_Setup( void ); extern void Sound_Device_Shutdown( void ); -void AL_CheckErrors(); -void ALC_CheckErrors(); +void AL_CheckErrors(void); +void ALC_CheckErrors(void); #endif /* __SOUND_LOCAL_H__ */ diff --git a/wolf3d/code/env/sound_sfx_id.c b/wolf3d/code/env/sound_sfx_id.c index 7e757f4..cd8e188 100644 --- a/wolf3d/code/env/sound_sfx_id.c +++ b/wolf3d/code/env/sound_sfx_id.c @@ -176,10 +176,10 @@ PUBLIC _boolean Sound_LoadSound( sfx_t *sfx ) } sfx->loaded = true; - sfx->samples = info.samples; - sfx->rate = info.sample_rate; + sfx->samples = (int)info.samples; + sfx->rate = (int)info.sample_rate; - Sound_UploadSound( data, info.sample_size, info.channels, sfx ); + Sound_UploadSound( data, (int)info.sample_size, (int)info.channels, sfx ); Z_Free( data ); diff --git a/wolf3d/code/env/sound_stream.c b/wolf3d/code/env/sound_stream.c index b101730..742aa48 100644 --- a/wolf3d/code/env/sound_stream.c +++ b/wolf3d/code/env/sound_stream.c @@ -112,7 +112,7 @@ PRIVATE int ovc_seek( void *datasource, ogg_int64_t offset, int whence ) { musicTrack_t *track = (musicTrack_t *)datasource; - return FS_FileSeek( track->hFile, offset, whence ); + return (int)FS_FileSeek( track->hFile, (long)offset, whence ); } /* @@ -218,8 +218,8 @@ PRIVATE _boolean Sound_OpenBGTrack( const char *name, musicTrack_t *track ) return false; } - track->start = ov_raw_tell( vorbisFile ); - track->rate = vorbisInfo->rate; + track->start = (int)ov_raw_tell( vorbisFile ); + track->rate = (int)vorbisInfo->rate; track->format = (vorbisInfo->channels == 2) ? AL_FORMAT_STEREO16 : AL_FORMAT_MONO16; return true; @@ -308,7 +308,7 @@ PUBLIC void Sound_StreamBGTrack( void ) // Stream from disk while( size < BUFFER_SIZE ) { - read = ov_read( bgTrack.vorbisFile, (char *)data + size, BUFFER_SIZE - size, &dummy ); + read = (int)ov_read( bgTrack.vorbisFile, (char *)data + size, BUFFER_SIZE - size, &dummy ); if( read == 0 ) { // End of file @@ -331,7 +331,7 @@ PUBLIC void Sound_StreamBGTrack( void ) ov_raw_seek( bgTrack.vorbisFile, (ogg_int64_t)bgTrack.start ); // Try streaming again - read = ov_read( bgTrack.vorbisFile, (char *)data + size, BUFFER_SIZE - size, &dummy ); + read = (int)ov_read( bgTrack.vorbisFile, (char *)data + size, BUFFER_SIZE - size, &dummy ); } if( read <= 0 ) diff --git a/wolf3d/code/env/texture_manager.c b/wolf3d/code/env/texture_manager.c index 5886557..5ccc9da 100644 --- a/wolf3d/code/env/texture_manager.c +++ b/wolf3d/code/env/texture_manager.c @@ -268,8 +268,8 @@ PUBLIC texture_t *TM_LoadTexture( const char *name, W8 *data, int width, int hei tex->MipMap = false; tex->WrapS = Clamp; tex->WrapT = Clamp; - tex->MinFilter = Nearest; - tex->MagFilter = NearestMipMapOff; + tex->MinFilter = NearestMipMapOff; + tex->MagFilter = Nearest; break; case TT_Wall: @@ -284,8 +284,8 @@ PUBLIC texture_t *TM_LoadTexture( const char *name, W8 *data, int width, int hei default: tex->WrapS = Repeat; tex->WrapT = Repeat; - tex->MinFilter = Nearest; - tex->MagFilter = NearestMipMapOff; + tex->MinFilter = NearestMipMapOff; + tex->MagFilter = Nearest; break; } @@ -465,7 +465,7 @@ PUBLIC texture_t *TM_FindTexture( const char *name, texturetype_t type ) } // Check for file extension - len = strlen( name ); + len = (int)strlen( name ); if( len < 5 ) { return r_notexture; @@ -625,7 +625,7 @@ PUBLIC texture_t *TM_FindTexture( const char *name, texturetype_t type ) Com_Printf( "Failed to find texture %s\n", name ); return r_notexture; } //else { //added the else...gsh - jpgSize = FS_GetFileSize( fh ); + jpgSize = (int)FS_GetFileSize( fh ); jpgData = fh->ptrStart; SysIPhoneLoadJPG( jpgData, jpgSize, &data, &width, &height, &bytes ); diff --git a/wolf3d/code/env/tga.c b/wolf3d/code/env/tga.c index 82312db..93107e5 100644 --- a/wolf3d/code/env/tga.c +++ b/wolf3d/code/env/tga.c @@ -616,7 +616,7 @@ PRIVATE void rle_write( FILE *fp, /* next pixel is different */ if( repeat ) { - putc( 128 + repeat, fp ); + putc( 128 + (int)repeat, fp ); fwrite( from, bytes, 1, fp ); from = buffer + bytes; /* point to first different pixel */ repeat = 0; @@ -632,7 +632,7 @@ PRIVATE void rle_write( FILE *fp, /* next pixel is the same */ if( direct ) { - putc( direct - 1, fp ); + putc( (int)direct - 1, fp ); fwrite( from, bytes, direct, fp ); from = buffer; /* point to first identical pixel */ direct = 0; @@ -666,12 +666,12 @@ PRIVATE void rle_write( FILE *fp, if( repeat > 0 ) { - putc( 128 + repeat, fp ); + putc( 128 + (int)repeat, fp ); fwrite( from, bytes, 1, fp ); } else { - putc( direct, fp ); + putc( (int)direct, fp ); fwrite( from, bytes, direct + 1, fp ); } } diff --git a/wolf3d/code/env/unix_timer.c b/wolf3d/code/env/unix_timer.c index 38b6f42..d4392da 100644 --- a/wolf3d/code/env/unix_timer.c +++ b/wolf3d/code/env/unix_timer.c @@ -57,7 +57,7 @@ PUBLIC W32 Sys_Milliseconds( void ) if( ! secbase ) { - secbase = tp.tv_sec; + secbase = (int)tp.tv_sec; return tp.tv_usec / 1000; } diff --git a/wolf3d/code/env/wavfile.c b/wolf3d/code/env/wavfile.c index 47e89ea..d030a70 100644 --- a/wolf3d/code/env/wavfile.c +++ b/wolf3d/code/env/wavfile.c @@ -108,23 +108,23 @@ PRIVATE void Wav_FindChunk( const char *name ) Wav_FindNextChunk( name ); } -PRIVATE void DumpChunks( void ) -{ - char str[ 5 ]; - - str[ 4 ] = 0; - iff_pdata = iff_data; - do - { - memcpy( str, iff_pdata, 4 ); - iff_pdata += 4; - iff_chunk_len = Wav_GetLittleLong(); - Com_Printf( "0x%x : %s (%d)\n", (int)(iff_pdata - 4), str, iff_chunk_len ); - iff_pdata += (iff_chunk_len + 1) & ~1; - - } while( iff_pdata < iff_end ); - -} +//PRIVATE void DumpChunks( void ) +//{ +// char str[ 5 ]; +// +// str[ 4 ] = 0; +// iff_pdata = iff_data; +// do +// { +// memcpy( str, iff_pdata, 4 ); +// iff_pdata += 4; +// iff_chunk_len = Wav_GetLittleLong(); +// Com_Printf( "0x%x : %s (%d)\n", (int)(iff_pdata - 4), str, iff_chunk_len ); +// iff_pdata += (iff_chunk_len + 1) & ~1; +// +// } while( iff_pdata < iff_end ); +// +//} /* diff --git a/wolf3d/code/env/zmem.c b/wolf3d/code/env/zmem.c index 872d594..a2e8f9e 100644 --- a/wolf3d/code/env/zmem.c +++ b/wolf3d/code/env/zmem.c @@ -161,7 +161,7 @@ PUBLIC void *Z_TagMalloc( size_t size, int tag ) z_bytes += size; z->magic = Z_MAGIC; z->tag = tag; - z->size = size; + z->size = (int)size; // Add new memory block to chain. z->next = z_chain.next; diff --git a/wolf3d/code/iphone/.DS_Store b/wolf3d/code/iphone/.DS_Store index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..cf67a01c47a38d59d1d3ae2aae742ce970c3c17c 100644 GIT binary patch delta 190 zcmZoMXfc=|&e%RNQEZ}~q9_vs0|O%ig8&1AF+&Q29zz8~GDH5vMD+}igaAW1Lq0 - - - 1056 - 10K549 - 851 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - YES - - - 256 - {480, 320} - - NO - YES - 1 - YES - IBCocoaTouchFramework - - NSImage - credits_bg.png - - - - - 292 - {{21, 265}, {32, 32}} - - 1 - NO - IBCocoaTouchFramework - - NSImage - back_arrow.png - - - - - 292 - {{20, 242}, {66, 29}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - BACK - - POSITYPE-idSettler_v10.2 - 18 - 16 - - - 3 - MQA - - - 1 - 10 - 5 - - - - 301 - {{3, 237}, {69, 69}} - - NO - NO - 1 - IBCocoaTouchFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - NSImage - button_highlight.png - - - - - 292 - - YES - - - 292 - {{94, 733}, {271, 116}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Wolfenstein 3D and Spear of Destiny originally created by id Software - - Helvetica-Bold - 20 - 16 - - - - - 1 - MCAwIDAAA - - {1, 1} - 1 - 10 - 4 - 1 - 0 - - - - 292 - {{99, 20}, {275, 59}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Wolfenstein 3D Classic Platinum - - Helvetica-Bold - 22 - 16 - - - - - {1, 1} - 1 - 10 - 2 - 1 - 0 - - - - 292 - {{86, 87}, {307, 36}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Programming - - - - - {1, 1} - 1 - 10 - 2 - 1 - 0 - - - - 292 - {{86, 294}, {307, 36}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Art - - - - - {1, 1} - 1 - 10 - 2 - 1 - 0 - - - - 292 - {{86, 421}, {307, 36}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Audio - - - - - {1, 1} - 1 - 10 - 2 - 1 - 0 - - - - 292 - {{85, 910}, {307, 36}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Programming - - - - - {1, 1} - 1 - 10 - 2 - 1 - 0 - - - - 292 - {{85, 1024}, {307, 36}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Design - - - - - {1, 1} - 1 - 10 - 2 - 1 - 0 - - - - 292 - {{85, 1174}, {307, 36}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Art - - - - - {1, 1} - 1 - 10 - 2 - 1 - 0 - - - - 292 - {{85, 1303}, {307, 36}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Audio - - - - - {1, 1} - 1 - 10 - 2 - 1 - 0 - - - - 292 - {{86, 532}, {307, 36}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Production - - - - - {1, 1} - 1 - 10 - 2 - 1 - 0 - - - - 292 - {{87, 639}, {307, 36}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - QA Testing - - - - - {1, 1} - 1 - 10 - 2 - 1 - 0 - - - - 292 - {{184, 140}, {111, 21}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - John Carmack - - Helvetica - 17 - 16 - - - - - {1, 1} - 1 - 10 - 1 - - - - 292 - {{183, 954}, {111, 21}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - John Carmack - - - - - {1, 1} - 1 - 10 - 1 - - - - 292 - {{183, 1068}, {111, 21}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - John Ramero - - - - - {1, 1} - 1 - 10 - 1 - - - - 292 - {{183, 1094}, {111, 21}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Tom Hall - - - - - {1, 1} - 1 - 10 - 1 - - - - 292 - {{178, 1218}, {121, 23}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Adrian Carmack - - - - - {1, 1} - 1 - 10 - 1 - - - - 292 - {{183, 1246}, {111, 21}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Kevin Cloud - - - - - {1, 1} - 1 - 10 - 1 - - - - 292 - {{183, 1351}, {111, 21}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Bobby Prince - - - - - {1, 1} - 1 - 10 - 1 - - - - 292 - {{185, 338}, {111, 21}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - John Burnett - - - - - {1, 1} - 1 - 10 - 1 - - - - 292 - {{185, 367}, {111, 21}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Mike Horton - - - - - {1, 1} - 1 - 10 - 1 - - - - 292 - {{171, 465}, {137, 26}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Christian Antkow - - - - - {1, 1} - 1 - NO - 10 - 1 - - - - 292 - {{171, 576}, {137, 26}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Rafael Brown - - - - - {1, 1} - 1 - NO - 10 - 1 - - - - 292 - {{172, 683}, {137, 26}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Sean Palomino - - - - - {1, 1} - 1 - NO - 10 - 1 - - - - 292 - {{184, 169}, {111, 21}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Jeff Farrand - - - - - {1, 1} - 1 - 10 - 1 - - - - 292 - {{184, 198}, {111, 21}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Ryan Gerleve - - - - - {1, 1} - 1 - 10 - 1 - - - - 292 - {{184, 234}, {111, 21}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Greg Hodges - - - - - {1, 1} - 1 - 10 - 1 - - - {{83, 320}, {460, 1400}} - - - 3 - MCAwAA - - NO - - 3 - - IBCocoaTouchFramework - - - {480, 320} - - - 3 - MAA - - - 3 - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 6 - - - - creditsRoll - - - - 20 - - - - back: - - - 7 - - 21 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 9 - - - - - 10 - - - - - 11 - - - - - 8 - - - - - 12 - - - YES - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Credtis text roll - - - 40 - - - - - 13 - - - - - 39 - - - - - 38 - - - - - 37 - - - - - 36 - - - - - 35 - - - - - 34 - - - - - 33 - - - - - 32 - - - - - 31 - - - - - 30 - - - - - 29 - - - - - 28 - - - - - 27 - - - - - 26 - - - - - 25 - - - - - 24 - - - - - 23 - - - - - 22 - - - - - 19 - - - - - 18 - - - - - 17 - - - - - 16 - - - - - 15 - - - - - 14 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 10.CustomClassName - 10.IBPluginDependency - 10.IBViewBoundsToFrameTransform - 11.IBPluginDependency - 11.IBViewBoundsToFrameTransform - 12.IBEditorWindowLastContentRect - 12.IBPluginDependency - 12.IBViewBoundsToFrameTransform - 13.IBPluginDependency - 13.IBViewBoundsToFrameTransform - 14.IBPluginDependency - 14.IBViewBoundsToFrameTransform - 15.IBPluginDependency - 15.IBViewBoundsToFrameTransform - 16.IBPluginDependency - 16.IBViewBoundsToFrameTransform - 17.IBPluginDependency - 17.IBViewBoundsToFrameTransform - 18.IBPluginDependency - 18.IBViewBoundsToFrameTransform - 19.IBPluginDependency - 19.IBViewBoundsToFrameTransform - 22.IBPluginDependency - 22.IBViewBoundsToFrameTransform - 23.IBPluginDependency - 23.IBViewBoundsToFrameTransform - 24.IBPluginDependency - 24.IBViewBoundsToFrameTransform - 25.IBPluginDependency - 25.IBViewBoundsToFrameTransform - 26.IBPluginDependency - 26.IBViewBoundsToFrameTransform - 27.IBPluginDependency - 27.IBViewBoundsToFrameTransform - 28.IBPluginDependency - 28.IBViewBoundsToFrameTransform - 29.IBPluginDependency - 29.IBViewBoundsToFrameTransform - 30.IBPluginDependency - 30.IBViewBoundsToFrameTransform - 31.IBPluginDependency - 31.IBViewBoundsToFrameTransform - 32.IBPluginDependency - 32.IBViewBoundsToFrameTransform - 33.IBPluginDependency - 33.IBViewBoundsToFrameTransform - 34.IBPluginDependency - 34.IBViewBoundsToFrameTransform - 35.IBPluginDependency - 35.IBViewBoundsToFrameTransform - 36.IBPluginDependency - 36.IBViewBoundsToFrameTransform - 37.IBPluginDependency - 37.IBViewBoundsToFrameTransform - 38.IBPluginDependency - 38.IBViewBoundsToFrameTransform - 39.IBPluginDependency - 39.IBViewBoundsToFrameTransform - 40.IBPluginDependency - 40.IBViewBoundsToFrameTransform - 8.IBViewBoundsToFrameTransform - 9.IBPluginDependency - 9.IBViewBoundsToFrameTransform - - - YES - CreditsViewController - UIResponder - {{522, 817}, {480, 320}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBoAAAw4aAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUIUAABDg4AAA - - {{387, 0}, {475, 1156}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAxK7AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCkgAAxFPAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCqgAAwuwAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUKsAABCrgAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUM4AABDDAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDQAAAw2QAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDQAAAw4CAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDQAAAw48AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUKsAABDkwAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUM5AABDyQAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUM5AABD14AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUKsAABD0oAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUMrAABEBEAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUKsAABEFQAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUMrAABEIAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCrgAAwz4AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUM7AABDTAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCrgAAw0UAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUKqAABEgAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCrgAAxATAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUM3AABEboAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCrgAAw8oAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUM3AABEhYAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUM3AABEiMAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUM3AABEmEAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDOQAAwyQAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUM3AABEmEAAA - - - P4AAAL+AAAAAAAAAw58AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUBAAABDbQAAA - - - - - YES - - - YES - - - - - YES - - - YES - - - - 40 - - - - YES - - CreditsViewController - UIViewController - - back: - id - - - back: - - back: - id - - - - creditsRoll - UIView - - - creditsRoll - - creditsRoll - UIView - - - - IBProjectSource - CreditsViewController.h - - - - UIFontLabel - UILabel - - IBProjectSource - UIFontLabel.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - wolf3d.xcodeproj - 3 - - YES - - YES - back_arrow.png - button_highlight.png - credits_bg.png - - - YES - {65, 63} - {4, 4} - {960, 640} - - - 141 - - + + + + + + + + + + + + Helvetica-Bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wolf3d/code/iphone/CreditsViewController.h b/wolf3d/code/iphone/CreditsViewController.h index 16bf0b9..0096831 100644 --- a/wolf3d/code/iphone/CreditsViewController.h +++ b/wolf3d/code/iphone/CreditsViewController.h @@ -24,9 +24,8 @@ #import -@interface CreditsViewController : UIViewController { - @private - IBOutlet UIView* creditsRoll; +@interface CreditsViewController : UIViewController { + IBOutlet UITableView *creditsList; } - (IBAction)back:(id)sender; diff --git a/wolf3d/code/iphone/CreditsViewController.m b/wolf3d/code/iphone/CreditsViewController.m index bf90572..28a8666 100644 --- a/wolf3d/code/iphone/CreditsViewController.m +++ b/wolf3d/code/iphone/CreditsViewController.m @@ -22,72 +22,131 @@ */ #import "CreditsViewController.h" -#import - -#define CREDITS_ANIMATION_POINTS_PER_SECOND ( 320.0f / 6.0f ) // Six seconds to scroll up - // an iPhone screen. +#import "wolfiphone.h" @interface CreditsViewController () - @property (nonatomic, retain) UIView* creditsRoll; +@property (nonatomic, retain) UITableView *creditsList; @end @implementation CreditsViewController -@synthesize creditsRoll; +@synthesize creditsList; -// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. -/* -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - // Custom initialization. - } - return self; -} -*/ +#define CREDITS_LINES 48 -/* -// Implement loadView to create a view hierarchy programmatically, without using a nib. -- (void)loadView { -} -*/ +// 1 - heading 1 +// 2 - heading 2 +// 3 - normal text +// 4 - tiny text + +static const char * const CreditText[CREDITS_LINES] = { + "Wolfenstein 3D Classic Platinum", + "", + "Programming", + "", + "John Carmack", + "Jeff Farrand", + "Ryan Gerleve", + "Greg Hodges", + "", + "Art", + "", + "John Burnett", + "Mike Horton", + "", + "Audio", + "", + "Christian Antkow", + "", + "Production", + "", + "Rafael Brown", + "", + "QA Testing", + "", + "Sean Palomino", + "", + "", + "Wolfenstein 3D and Spear of Destiny", + "originally created by id Software", + "", + "", + "Programming", + "", + "John Carmack", + "", + "Design", + "", + "John Romero", + "Tom Hall", + "", + "Art", + "", + "Adrian Carmack", + "Kevin Cloud", + "", + "Audio", + "", + "Bobby Prince" +}; + +static const int CreditSizes[CREDITS_LINES] = { + 1, + 4, + 2, + 4, + 3, + 3, + 3, + 3, + 4, + 2, + 4, + 3, + 3, + 4, + 2, + 4, + 3, + 4, + 2, + 4, + 3, + 4, + 2, + 4, + 3, + 4, + 4, + 5, + 5, + 4, + 4, + 2, + 4, + 3, + 4, + 2, + 4, + 3, + 3, + 4, + 2, + 4, + 3, + 3, + 4, + 2, + 4, + 3 +}; // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; - - // This is the starting position of the credits text. - CGPoint startPoint = self.creditsRoll.center; - - // Set up the end point. We can stop the animation as soon as the bottom of the credits - // get to the top of the screen. - CGPoint endPoint = startPoint; - - endPoint.y = -self.creditsRoll.bounds.size.height; - - // Start credits animation - CABasicAnimation *theAnimation; - - theAnimation=[CABasicAnimation animationWithKeyPath:@"position"]; - - CGFloat pointDistance = endPoint.y - startPoint.y; - - theAnimation.duration= fabs( pointDistance ) * ( 1.0f / CREDITS_ANIMATION_POINTS_PER_SECOND ); - - theAnimation.fromValue=[NSValue valueWithCGPoint:startPoint]; - theAnimation.toValue=[NSValue valueWithCGPoint:endPoint]; - - [self.creditsRoll.layer addAnimation:theAnimation forKey:@"animatePosition"]; -} - - -// Override to allow orientations other than the default portrait orientation. -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - // Return YES for supported orientations. - return UIInterfaceOrientationIsLandscape(interfaceOrientation); } - (void)didReceiveMemoryWarning { @@ -97,14 +156,6 @@ // Release any cached data, images, etc. that aren't in use. } -- (void)viewDidUnload { - [super viewDidUnload]; - // Release any retained subviews of the main view. - // e.g. self.myOutlet = nil; - self.creditsRoll = nil; -} - - - (void)dealloc { [super dealloc]; } @@ -113,4 +164,95 @@ [self.navigationController popViewControllerAnimated:YES]; } +/* + ======================== + + UITableView interface + + ======================== + */ + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return CREDITS_LINES; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + static NSString *MyIdentifier = @"MyIdentifier"; + + UITableViewCell *cell = (UITableViewCell*)[self.creditsList dequeueReusableCellWithIdentifier:MyIdentifier]; + + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease]; + } + + cell.selectionStyle = UITableViewCellSelectionStyleNone; + + cell.textLabel.text = [NSString stringWithCString:CreditText[indexPath.row] encoding:NSASCIIStringEncoding]; + + cell.backgroundColor = UIColor.clearColor; + + cell.textLabel.textColor = UIColor.whiteColor; + + CGFloat points = cell.textLabel.font.pointSize; + + switch (CreditSizes[indexPath.row]) { + case 1: + points = 22; + break; + case 2: + points = 20; + break; + case 3: + points = 17; + break; + case 4: + points = 14; + break; + case 5: + points = 20; + break; + + default: + break; + } + + if (IS_IPAD) { + cell.textLabel.font =[UIFont systemFontOfSize:points weight:UIFontWeightBold]; + } else { + cell.textLabel.font =[UIFont systemFontOfSize:points-5 weight:UIFontWeightBold]; + } + + cell.textLabel.textAlignment = NSTextAlignmentCenter; + + return cell; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { + + CGFloat size = 40; + + switch (CreditSizes[indexPath.row]) { + case 1: + size = 60; + break; + case 2: + size = 40; + break; + case 3: + size = 20; + break; + case 4: + size = 10; + break; + case 5: + size = 24; + break; + + default: + break; + } + + return size; +} + @end diff --git a/wolf3d/code/iphone/EAGLView.m b/wolf3d/code/iphone/EAGLView.m index cd3f59f..7df5b20 100644 --- a/wolf3d/code/iphone/EAGLView.m +++ b/wolf3d/code/iphone/EAGLView.m @@ -263,9 +263,9 @@ EAGLView *eaglview = nil; } - loggedTimes[iphoneFrameNum&(MAX_LOGGED_TIMES-1)].beforeSwap = Sys_Milliseconds(); + loggedTimes[iphoneFrameNum&(MAX_LOGGED_TIMES-1)].beforeSwap = (int)Sys_Milliseconds(); success = [context presentRenderbuffer:GL_RENDERBUFFER_OES]; - loggedTimes[iphoneFrameNum&(MAX_LOGGED_TIMES-1)].afterSwap = Sys_Milliseconds(); + loggedTimes[iphoneFrameNum&(MAX_LOGGED_TIMES-1)].afterSwap = (int)Sys_Milliseconds(); } return success; @@ -276,7 +276,7 @@ EAGLView *eaglview = nil; //float widthRatio = ( self.bounds.size.width * deviceScale ) / REFERENCE_WIDTH; //float heightRatio = ( self.bounds.size.height * deviceScale ) / REFERENCE_HEIGHT; - [self deleteFramebuffer]; + [self deleteFramebuffer]; /* if ( widthRatio < heightRatio ) { @@ -317,10 +317,15 @@ EAGLView *eaglview = nil; for (UITouch *myTouch in t) { CGPoint touchLocation = [myTouch locationInView:self]; - - points[ 2 * touchCount + 0 ] = touchLocation.x; - points[ 2 * touchCount + 1 ] = touchLocation.y; // ( h - 1 ) - touchLocation.y; - + + if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft) { + points[ 2 * touchCount + 1 ] = self.bounds.size.width - (self.bounds.size.width - touchLocation.x); + points[ 2 * touchCount + 0 ] = self.bounds.size.height - touchLocation.y; + } else { + points[ 2 * touchCount + 1 ] = self.bounds.size.width - touchLocation.x; + points[ 2 * touchCount + 0 ] = self.bounds.size.height - (self.bounds.size.height - touchLocation.y); + } + touchCount++; if (myTouch.phase == UITouchPhaseBegan) { @@ -353,7 +358,7 @@ EAGLView *eaglview = nil; textField.autocorrectionType = UITextAutocorrectionTypeNo; [textField becomeFirstResponder]; } else { - void iphoneDeactivateConsole(); + void iphoneDeactivateConsole(void); [textField resignFirstResponder]; [textField removeFromSuperview]; textField = nil; @@ -479,7 +484,7 @@ void SysIPhoneLoadJPG( W8* jpegData, int jpegBytes, W8 **pic, W16 *width, W16 *h *height = img.size.height; imgBytes = (int)(*width) * (int)(*height) * 4; data = CGDataProviderCopyData( CGImageGetDataProvider( img.CGImage ) ); - dataBytes = CFDataGetLength( data ); + dataBytes = (int)CFDataGetLength( data ); *bytes = 4; if ( dataBytes > imgBytes ) { *pic = NULL; diff --git a/wolf3d/code/iphone/EpisodeCell.xib b/wolf3d/code/iphone/EpisodeCell.xib index cedbbab..ad4957d 100644 --- a/wolf3d/code/iphone/EpisodeCell.xib +++ b/wolf3d/code/iphone/EpisodeCell.xib @@ -1,698 +1,67 @@ - - - 1056 - 10K540 - 851 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 1298 - - YES - - - 1280 - - YES - - - -2147482332 - {{0, 2}, {328, 100}} - - 3 - NO - 2 - IBCocoaTouchFramework - - NSImage - highlight_bracket.png - - - - - 1316 - {{4, 6}, {319, 92}} - - NO - 2 - IBCocoaTouchFramework - - NSImage - episode_bracket.png - - - - - 1316 - {{13, 32}, {260, 3}} - - NO - 2 - IBCocoaTouchFramework - - NSImage - episode_divider.png - - - - - 1316 - {{12, 10}, {314, 34}} - - NO - YES - 7 - 1 - NO - 2 - IBCocoaTouchFramework - Episode Number - - POSITYPE-idSettler_v10.2 - 20 - 16 - - - 3 - MC42NjY2NjY2NjY3AA - - - 3 - MC4zMzMzMzMzMzMzAA - - 1 - 10 - - - - 1316 - {{12, 37}, {323, 41}} - - NO - YES - 9 - 2 - NO - 2 - IBCocoaTouchFramework - Episode Name - - POSITYPE-idSettler_v10.2 - 32 - 16 - - - 3 - MQA - - - 1 - NO - 10 - - - - 1316 - {{12, 64}, {323, 41}} - - NO - YES - 9 - 2 - NO - 2 - IBCocoaTouchFramework - - - - - 1 - NO - 10 - - - {336, 103} - - - 3 - MCAwAA - - NO - YES - 4 - YES - IBCocoaTouchFramework - - - {336, 103} - - - 1 - MSAxIDEAA - - 2 - IBCocoaTouchFramework - 1 - - 0 - MyIdentifier - - - - - YES - - - episodeCell - - - - 7 - - - - - YES - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 2 - - - YES - - - - - - - - - - - 3 - - - - - 4 - - - - - 8 - - - - - 9 - - - - - 10 - - - - - 11 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 10.CustomClassName - 10.IBPluginDependency - 10.IBViewBoundsToFrameTransform - 11.IBPluginDependency - 11.IBViewBoundsToFrameTransform - 2.IBEditorWindowLastContentRect - 2.IBPluginDependency - 3.CustomClassName - 3.IBPluginDependency - 3.IBViewBoundsToFrameTransform - 4.CustomClassName - 4.IBPluginDependency - 4.IBViewBoundsToFrameTransform - 8.IBPluginDependency - 8.IBViewBoundsToFrameTransform - 9.IBPluginDependency - 9.IBViewBoundsToFrameTransform - - - YES - EpisodeViewController - UIResponder - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBoAAAwtgAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AQAAAABAAAAAA - - {{614, 707}, {672, 206}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCsAAAwjQAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUDgAABCHAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUJgAABCMAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AQAAAABAoAAAA - - - - - YES - - - YES - - - - - YES - - - YES - - - - 11 - - - - YES - - EpisodeViewController - UIViewController - - YES - - YES - back: - next: - setEpisode: - - - YES - id - id - id - - - - YES - - YES - back: - next: - setEpisode: - - - YES - - back: - id - - - next: - id - - - setEpisode: - id - - - - - YES - - YES - episodeCell - episodeList - - - YES - UITableViewCell - UITableView - - - - YES - - YES - episodeCell - episodeList - - - YES - - episodeCell - UITableViewCell - - - episodeList - UITableView - - - - - IBProjectSource - EpisodeViewController.h - - - - UIFontLabel - UILabel - - IBProjectSource - UIFontLabel.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UIScrollView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIScrollView.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UITableView - UIScrollView - - IBFrameworkSource - UIKit.framework/Headers/UITableView.h - - - - UITableViewCell - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITableViewCell.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - wolf3d.xcodeproj - 3 - - YES - - YES - episode_bracket.png - episode_divider.png - highlight_bracket.png - - - YES - {606, 168} - {387, 3} - {623, 189} - - - 141 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wolf3d/code/iphone/EpisodeView.xib b/wolf3d/code/iphone/EpisodeView.xib index a1b52fa..c612b4b 100644 --- a/wolf3d/code/iphone/EpisodeView.xib +++ b/wolf3d/code/iphone/EpisodeView.xib @@ -1,935 +1,189 @@ - - - 1056 - 10K549 - 851 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - YES - - - 274 - {480, 320} - - NO - YES - 1 - YES - IBCocoaTouchFramework - - NSImage - wolf_bg.png - - - - - 274 - {{25, 259}, {32, 32}} - - 1 - NO - IBCocoaTouchFramework - - NSImage - back_arrow.png - - - - - 274 - {{422, 259}, {32, 32}} - - 1 - NO - IBCocoaTouchFramework - - NSImage - next_arrow.png - - - - - 274 - {{24, 240}, {66, 29}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - BACK - - POSITYPE-idSettler_v10.2 - 18 - 16 - - - 3 - MQA - - - 1 - 10 - 5 - - - - 274 - {{421, 240}, {66, 29}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - NEXT - - - - 1 - 10 - 5 - - - - 274 - {{81, 8}, {128, 31}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Episode Select - - POSITYPE-idSettler_v10.2 - 24 - 16 - - - - 1 - 10 - 5 - - - - 274 - {{20, 231}, {52, 62}} - - NO - NO - 1 - IBCocoaTouchFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - NSImage - button_highlight.png - - - - - 274 - {{416, 231}, {50, 62}} - - NO - NO - 1 - IBCocoaTouchFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - - 274 - {{220, 299}, {46, 24}} - - NO - NO - 1 - IBCocoaTouchFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - NSImage - down_arrow.png - - - - - 274 - {{220, 11}, {46, 24}} - - NO - NO - 1 - IBCocoaTouchFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - NSImage - up_arrow.png - - - - - 274 - {{79.5, 35}, {336, 260}} - - - 3 - MCAwAA - - YES - IBCocoaTouchFramework - YES - NO - 2 - 0 - YES - 103 - - - {480, 320} - - - 1 - MCAwIDAAA - - - 3 - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 13 - - - - back: - - - 7 - - 36 - - - - episodeList - - - - 62 - - - - dataSource - - - - 63 - - - - delegate - - - - 64 - - - - next: - - - 7 - - 65 - - - - pageDown: - - - 7 - - 66 - - - - pageUp: - - - 7 - - 67 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 31 - - - - - 32 - - - - - 33 - - - - - 35 - - - - - 28 - - - - - 49 - - - - - 51 - - - - - 53 - - - - - 54 - - - - - 55 - - - - - 61 - - - Episode List - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 28.IBViewBoundsToFrameTransform - 31.CustomClassName - 31.IBPluginDependency - 31.IBViewBoundsToFrameTransform - 32.CustomClassName - 32.IBPluginDependency - 32.IBViewBoundsToFrameTransform - 33.IBPluginDependency - 33.IBViewBoundsToFrameTransform - 35.IBPluginDependency - 35.IBViewBoundsToFrameTransform - 49.IBPluginDependency - 49.IBViewBoundsToFrameTransform - 51.IBPluginDependency - 51.IBViewBoundsToFrameTransform - 53.IBPluginDependency - 53.IBViewBoundsToFrameTransform - 54.CustomClassName - 54.IBPluginDependency - 54.IBViewBoundsToFrameTransform - 55.IBPluginDependency - 55.IBViewBoundsToFrameTransform - 61.IBPluginDependency - - - YES - EpisodeViewController - UIResponder - {{647, 827}, {480, 320}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAw58AAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUIEAABDbQAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUK4AABBUAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBoAAAw2cAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCFAAAw5KAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUNcAABDlYAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDNgAAw5SAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUIUAABDg4AAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUIEAABDbQAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABD0oAAw2cAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 67 - - - - YES - - EpisodeViewController - UIViewController - - YES - - YES - back: - next: - pageDown: - pageUp: - setEpisode: - - - YES - id - id - id - id - id - - - - YES - - YES - back: - next: - pageDown: - pageUp: - setEpisode: - - - YES - - back: - id - - - next: - id - - - pageDown: - id - - - pageUp: - id - - - setEpisode: - id - - - - - YES - - YES - episodeCell - episodeList - - - YES - UITableViewCell - UITableView - - - - YES - - YES - episodeCell - episodeList - - - YES - - episodeCell - UITableViewCell - - - episodeList - UITableView - - - - - IBProjectSource - EpisodeViewController.h - - - - UIFontLabel - UILabel - - IBProjectSource - UIFontLabel.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UIScrollView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIScrollView.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UITableView - UIScrollView - - IBFrameworkSource - UIKit.framework/Headers/UITableView.h - - - - UITableViewCell - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITableViewCell.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - wolf3d.xcodeproj - 3 - - YES - - YES - back_arrow.png - button_highlight.png - down_arrow.png - next_arrow.png - up_arrow.png - wolf_bg.png - - - YES - {65, 63} - {4, 4} - {80, 36} - {65, 63} - {80, 36} - {480, 320} - - - 141 - - + + + + + + + + + + + + Helvetica-Bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wolf3d/code/iphone/EpisodeViewController.m b/wolf3d/code/iphone/EpisodeViewController.m index 149ba66..d41fe67 100644 --- a/wolf3d/code/iphone/EpisodeViewController.m +++ b/wolf3d/code/iphone/EpisodeViewController.m @@ -94,32 +94,14 @@ static const char * const EpisodeNames[TOTAL_EPISODES][2] = { [self handleSelectionAtIndexPath:initialPath]; } - - -// Override to allow orientations other than the default portrait orientation. -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - // Return YES for supported orientations. - return UIInterfaceOrientationIsLandscape(interfaceOrientation); -} - - - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; - // Release any cached data, images, etc. that aren't in use. + [self.episodeList release]; + self.episodeList = nil; } -- (void)viewDidUnload { - [super viewDidUnload]; - // Release any retained subviews of the main view. - // e.g. self.myOutlet = nil; - - [self.episodeList release]; - self.episodeList = nil; -} - - - (void)dealloc { [super dealloc]; } @@ -159,7 +141,7 @@ static const char * const EpisodeNames[TOTAL_EPISODES][2] = { int maxRow = 0; for ( NSIndexPath* path in visibleIndexPaths ) { - maxRow = maxRow < path.row ? path.row: maxRow; + maxRow = maxRow < path.row ? (int)path.row: maxRow; } const int rowToMakeVisible = maxRow + 1; @@ -180,7 +162,7 @@ static const char * const EpisodeNames[TOTAL_EPISODES][2] = { int minRow = TOTAL_EPISODES - 1; for ( NSIndexPath* path in visibleIndexPaths ) { - minRow = minRow < path.row ? minRow: path.row; + minRow = minRow < path.row ? minRow: (int)path.row; } const int rowToMakeVisible = minRow - 1; @@ -312,9 +294,10 @@ static CGRect maximumNameLabelFrame = { { 0.0, 0.0 }, { 0.0, 0.0 } }; episodeNameLabel = (UILabel *)[cell viewWithTag:2]; NSString* episodeNameText = [NSString stringWithCString:EpisodeNames[indexPath.row][1] encoding:NSASCIIStringEncoding]; - CGSize expectedLabelSize = [episodeNameText sizeWithFont:episodeNameLabel.font - constrainedToSize:maximumNameLabelFrame.size - lineBreakMode:episodeNameLabel.lineBreakMode]; + CGSize expectedLabelSize = [episodeNameText boundingRectWithSize:maximumNameLabelFrame.size + options:NSStringDrawingUsesLineFragmentOrigin + attributes:@{NSFontAttributeName: episodeNameLabel.font} + context:nil].size; //adjust the label the the new height. CGRect newFrame = maximumNameLabelFrame; @@ -322,6 +305,9 @@ static CGRect maximumNameLabelFrame = { { 0.0, 0.0 }, { 0.0, 0.0 } }; episodeNameLabel.frame = newFrame; episodeNameLabel.text = episodeNameText; + + cell.backgroundColor = UIColor.clearColor; + return cell; } diff --git a/wolf3d/code/iphone/FSCopyObject.c b/wolf3d/code/iphone/FSCopyObject.c deleted file mode 100644 index d4580be..0000000 --- a/wolf3d/code/iphone/FSCopyObject.c +++ /dev/null @@ -1,1986 +0,0 @@ -/* - File: FSCopyObject.c - - Contains: A Copy/Delete Files/Folders engine which uses HFS+ API's. - This code takes some tricks/techniques from MoreFilesX and - MPFileCopy, wraps them all up into an easy to use API, and - adds a bunch of features. It will run on Mac OS 9.1 through - 9.2.x and 10.1.x and up (Classic, Carbon and Mach-O) - - Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. - ("Apple") in consideration of your agreement to the following terms, and your - use, installation, modification or redistribution of this Apple software - constitutes acceptance of these terms. If you do not agree with these terms, - please do not use, install, modify or redistribute this Apple software. - - In consideration of your agreement to abide by the following terms, and subject - to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs - copyrights in this original Apple software (the "Apple Software"), to use, - reproduce, modify and redistribute the Apple Software, with or without - modifications, in source and/or binary forms; provided that if you redistribute - the Apple Software in its entirety and without modifications, you must retain - this notice and the following text and disclaimers in all such redistributions of - the Apple Software. Neither the name, trademarks, service marks or logos of - Apple Computer, Inc. may be used to endorse or promote products derived from the - Apple Software without specific prior written permission from Apple. Except as - expressly stated in this notice, no other rights or licenses, express or implied, - are granted by Apple herein, including but not limited to any patent rights that - may be infringed by your derivative works or by other works in which the Apple - Software may be incorporated. - - The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO - WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED - WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN - COMBINATION WITH YOUR PRODUCTS. - - IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION - OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT - (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Copyright © 2002-2004 Apple Computer, Inc., All Rights Reserved -*/ - -#include "FSCopyObject.h" -#include "GenLinkedList.h" -#if !TARGET_API_MAC_OSX -#include -#endif -#include -#include - -#pragma mark ----- Tunable Parameters ----- - -/* The following constants control the behavior of the copy engine. */ - -enum { /* BufferSizeForVolSpeed */ -/* kDefaultCopyBufferSize = 2L * 1024 * 1024,*/ /* 2MB, Fast but not very responsive. */ - kDefaultCopyBufferSize = 256L * 1024, /* 256kB, Slower but can still use machine. */ - kMaximumCopyBufferSize = 2L * 1024 * 1024, - kMinimumCopyBufferSize = 1024 -}; - -enum { /* CheckForDestInsideSrc */ - errFSDestInsideSource = -1234 -}; - -enum { - /* for use with PBHGetDirAccess in IsDropBox */ - kPrivilegesMask = kioACAccessUserWriteMask | kioACAccessUserReadMask | kioACAccessUserSearchMask, - - /* for use with FSGetCatalogInfo and FSPermissionInfo->mode */ - /* from sys/stat.h... note -- sys/stat.h definitions are in octal */ - /* */ - /* You can use these values to adjust the users/groups permissions */ - /* on a file/folder with FSSetCatalogInfo and extracting the */ - /* kFSCatInfoPermissions field. See code below for examples */ - kRWXUserAccessMask = 0x01C0, - kReadAccessUser = 0x0100, - kWriteAccessUser = 0x0080, - kExecuteAccessUser = 0x0040, - - kRWXGroupAccessMask = 0x0038, - kReadAccessGroup = 0x0020, - kWriteAccessGroup = 0x0010, - kExecuteAccessGroup = 0x0008, - - kRWXOtherAccessMask = 0x0007, - kReadAccessOther = 0x0004, - kWriteAccessOther = 0x0002, - kExecuteAccessOther = 0x0001, - - kDropFolderValue = kWriteAccessOther | kExecuteAccessOther -}; - -#define kNumObjects 80 - -#define VolHasCopyFile(volParms) (((volParms)->vMAttrib & (1L << bHasCopyFile)) != 0) - -#pragma mark ----- Struct Definitions ----- - - /* The CopyParams data structure holds the copy buffer used */ - /* when copying the forks over, as well as special case */ - /* info on the destination */ -struct CopyParams { - void *copyBuffer; - ByteCount copyBufferSize; - Boolean copyingToDropFolder; - Boolean copyingToLocalVolume; - Boolean volHasCopyFile; - DupeAction dupeAction; -}; -typedef struct CopyParams CopyParams; - - /* The FilterParams data structure holds the date and info */ - /* that the caller wants passed into the Filter Proc, as well */ - /* as the Filter Proc Pointer itself */ -struct FilterParams { - FSCatalogInfoBitmap whichInfo; - CopyObjectFilterProcPtr filterProcPtr; - Boolean containerChanged; - Boolean wantSpec; - Boolean wantName; - void *yourDataPtr; -}; -typedef struct FilterParams FilterParams; - - /* The ForkTracker data structure holds information about a specific fork, */ - /* specifically the name and the refnum. We use this to build a list of */ - /* all the forks before we start copying them. We need to do this because */ - /* if we're copying into a drop folder, we must open all the forks before */ - /* we start copying data into any of them. */ - /* Plus it's a convenient way to keep track of all the forks... */ -struct ForkTracker { - HFSUniStr255 forkName; - SInt64 forkSize; - SInt16 forkDestRefNum; -}; -typedef struct ForkTracker ForkTracker; -typedef ForkTracker *ForkTrackerPtr; - - /* The FolderListData data structure holds FSRefs to the source and */ - /* coorisponding destination folder, as well as which level its on */ - /* for use in ProcessFolderList. */ -struct FolderListData -{ - FSRef sourceDirRef; - FSRef destDirRef; - UInt32 level; -}; -typedef struct FolderListData FolderListData; - - /* The FSCopyFolderGlobals data structure holds the information needed to */ - /* copy a directory */ -struct FSCopyFolderGlobals -{ - FSRef *sourceDirRef; - FSRef *destDirRef; - - FSCatalogInfo *catInfoList; - FSRef *srcRefList; - HFSUniStr255 *nameList; - - GenLinkedList folderList; - GenIteratorPtr folderListIter; - - CopyParams *copyParams; - FilterParams *filterParams; - Boolean containerChanged; - - ItemCount maxLevels; - ItemCount currentLevel; -}; -typedef struct FSCopyFolderGlobals FSCopyFolderGlobals; - - /* The FSDeleteObjectGlobals data structure holds information needed to */ - /* recursively delete a directory */ -struct FSDeleteObjectGlobals -{ - FSCatalogInfo catalogInfo; /* FSCatalogInfo */ - ItemCount actualObjects; /* number of objects returned */ - OSErr result; /* result */ -}; -typedef struct FSDeleteObjectGlobals FSDeleteObjectGlobals; - -#pragma mark ----- Local Prototypes ----- - -static OSErr FSCopyObjectPreflight ( const FSRef *source, - const FSRef *destDir, - const DupeAction dupeAction, - FSCatalogInfo *sourceCatInfo, - CopyParams *copyParams, /* can be NULL */ - HFSUniStr255 *newObjectName, - FSRef *deleteMeRef, - Boolean *isReplacing, - Boolean *isDirectory ); - -static OSErr FSCopyFile ( const FSRef *source, - const FSRef *destDir, - const FSCatalogInfo *sourceCatInfo, - const HFSUniStr255 *newFileName, - CopyParams *copyParams, - FilterParams *filterParams, - FSRef *newFileRef, /* can be NULL */ - FSSpec *newFileSpec ); /* can be NULL */ - -static OSErr CopyFile ( const FSRef *source, - FSCatalogInfo *sourceCatInfo, - const FSRef *destDir, - const HFSUniStr255 *destName, /* can be NULL */ - CopyParams *copyParams, - FSRef *newRef, /* can be NULL */ - FSSpec *newSpec ); /* can be NULL */ - -static OSErr FSUsePBHCopyFile ( const FSRef *srcFileRef, - const FSRef *dstDirectoryRef, - const HFSUniStr255 *destName, /* can be NULL (no rename during copy) */ - TextEncoding textEncodingHint, - FSRef *newRef, /* can be NULL */ - FSSpec *newSpec ); /* can be NULL */ - -static OSErr DoCopyFile ( const FSRef *source, - FSCatalogInfo *sourceCatInfo, - const FSRef *destDir, - const HFSUniStr255 *destName, - CopyParams *params, - FSRef *newRef, /* can be NULL */ - FSSpec *newSpec ); /* can be NULL */ - -static OSErr FSCopyFolder ( const FSRef *source, - const FSRef *destDir, - const FSCatalogInfo *sourceCatInfo, - const HFSUniStr255 *newFoldName, - CopyParams *copyParams, - FilterParams *filterParams, - ItemCount maxLevels, - FSRef *outDirRef, /* can be NULL */ - FSSpec *outDirSpec ); /* can be NULL */ - -static OSErr ProcessFolderList ( FSCopyFolderGlobals *folderGlobals ); - -static OSErr CopyFolder ( FSCopyFolderGlobals *folderGlobals ); - -static OSErr CheckForDestInsideSrc ( const FSRef *source, - const FSRef *destDir ); - -static OSErr CopyForks ( const FSRef *source, - const FSRef *dest, - CopyParams *params ); - -static OSErr CopyForksToDisk ( const FSRef *source, - const FSRef *dest, - CopyParams *params ); - -static OSErr CopyForksToDropBox ( const FSRef *source, - const FSRef *dest, - CopyParams *params ); - -static OSErr OpenAllForks ( const FSRef *dest, - GenLinkedList *forkList ); - -static OSErr WriteFork ( const SInt16 srcRefNum, - const SInt16 destRefNum, - const CopyParams *params, - const SInt64 forkSize ); - -static UInt32 CalcBufferSizeForVol ( const GetVolParmsInfoBuffer *volParms, - UInt32 volParmsSize ); - -static UInt32 BufferSizeForVolSpeed ( UInt32 volumeBytesPerSecond ); - -static OSErr FSDeleteFolder ( const FSRef *container ); - -static void FSDeleteFolderLevel ( const FSRef *container, - FSDeleteObjectGlobals *theGlobals ); - -static OSErr IsDropBox ( const FSRef *source, - Boolean *isDropBox ); - -static OSErr GetMagicBusyCreateDate( UTCDateTime *date ); - -static OSErr FSGetVRefNum ( const FSRef *ref, - FSVolumeRefNum *vRefNum ); - -static OSErr FSGetVolParms ( FSVolumeRefNum volRefNum, - UInt32 bufferSize, - GetVolParmsInfoBuffer*volParmsInfo, - UInt32 *actualInfoSize ); /* Can Be NULL */ - -static OSErr UniStrToPStr ( const HFSUniStr255 *uniStr, - TextEncoding textEncodingHint, - Boolean isVolumeName, - Str255 pStr ); - -static OSErr FSMakeFSRef ( FSVolumeRefNum volRefNum, - SInt32 dirID, - ConstStr255Param name, - FSRef *ref ); - -static OSErr SetupDestination ( const FSRef *destDir, - const DupeAction dupeAction, - HFSUniStr255 *sourceName, - FSRef *deleteMeRef, - Boolean *isReplacing); - -static OSErr GetUniqueName ( const FSRef *destDir, - HFSUniStr255 *sourceName ); - -static OSErr GetObjectName ( const FSRef *sourceRef, - HFSUniStr255 *sourceName, - TextEncoding *sourceEncoding ); - -static OSErr CreateFolder ( const FSRef *sourceRef, - const FSRef *destDirRef, - const FSCatalogInfo *catalogInfo, - const HFSUniStr255 *folderName, - CopyParams *params, - FSRef *newFSRefPtr, - FSSpec *newFSSpecPtr ); - -static OSErr DoCreateFolder ( const FSRef *sourceRef, - const FSRef *destDirRef, - const FSCatalogInfo *catalogInfo, - const HFSUniStr255 *folderName, - CopyParams *params, - FSRef *newFSRefPtr, - FSSpec *newFSSpecPtr); - -static pascal void MyDisposeDataProc ( void *pData ); - -static pascal void MyCloseForkProc ( void *pData ); - -/*****************************************************************************/ -/*****************************************************************************/ -/*****************************************************************************/ - -#pragma mark ----- Copy Objects ----- - - /* This routine acts as the top level of the copy engine. */ -OSErr FSCopyObject( const FSRef *source, - const FSRef *destDir, - ItemCount maxLevels, - FSCatalogInfoBitmap whichInfo, - DupeAction dupeAction, - const HFSUniStr255 *newObjectName, /* can be NULL */ - Boolean wantFSSpec, - Boolean wantName, - CopyObjectFilterProcPtr filterProcPtr, /* can be NULL */ - void *yourDataPtr, /* can be NULL */ - FSRef *newObjectRef, /* can be NULL */ - FSSpec *newObjectSpec) /* can be NULL */ -{ - CopyParams copyParams; - FilterParams filterParams; - FSCatalogInfo sourceCatInfo; - HFSUniStr255 sourceName, - tmpObjectName; - FSRef tmpObjectRef, - deleteMeRef; - Boolean isDirectory, - isReplacing = false; - OSErr err = ( source != NULL && destDir != NULL ) ? noErr : paramErr; - - /* Zero out these two FSRefs in case an error occurs before or */ - /* inside FSCopyObjectPreflight. Paranoia mainly... */ - BlockZero( &deleteMeRef, sizeof( FSRef ) ); - BlockZero( &tmpObjectRef, sizeof( FSRef ) ); - - /* setup filterParams */ - filterParams.whichInfo = whichInfo; - filterParams.filterProcPtr = filterProcPtr; - filterParams.wantSpec = ( filterProcPtr && wantFSSpec ); /* only get this info if */ - filterParams.wantName = ( filterProcPtr && wantName ); /* a filterProc is provied */ - filterParams.yourDataPtr = yourDataPtr; - - /* Get and store away the name of the source object */ - /* and setup the initial name of the new object */ - if( err == noErr ) - err = GetObjectName( source, &sourceName, NULL ); - if( err == noErr ) - tmpObjectName = (newObjectName != NULL) ? *newObjectName : sourceName; - - if( err == noErr ) /* preflight/prep the destination and our internal variables */ - err = FSCopyObjectPreflight( source, destDir, dupeAction, &sourceCatInfo, ©Params, &tmpObjectName, &deleteMeRef, &isReplacing, &isDirectory ); - - /* now that we have some info, lets print it */ - if( err == noErr ) - { - dwarning(( "%s -- err: %d, maxLevels: %u, whichInfo: %08x,\n", __FUNCTION__, err, (unsigned int)maxLevels, (int)whichInfo )); - dwarning(( "\t\t\t\tdupeAction: %s, wantSpec: %s, wantName: %s,\n", ((dupeAction == kDupeActionReplace) ? "replace" : ((dupeAction == kDupeActionRename) ? "rename" : "standard")), (filterParams.wantSpec)?"yes":"no", (filterParams.wantName)?"yes":"no" )); - dwarning(( "\t\t\t\tfilterProcPtr: 0x%08x, yourDataPtr: 0x%08x,\n", (unsigned int)filterProcPtr, (unsigned int)yourDataPtr )); - dwarning(( "\t\t\t\tnewObjectRef: 0x%08x, newObjectSpec: 0x%08x,\n", (unsigned int)newObjectRef, (unsigned int)newObjectSpec )); - dwarning(( "\t\t\t\tcopyBufferSize: %dkB, isDirectory: %s, isLocal: %s,\n", (int)copyParams.copyBufferSize/1024, (isDirectory)?"yes":"no", (copyParams.copyingToLocalVolume)?"yes":"no" )); - dwarning(( "\t\t\t\tisDropBox: %s, PBHCopyFileSync supported: %s\n\n", (copyParams.copyingToDropFolder)?"yes":"no", (copyParams.volHasCopyFile)?"yes":"no" )); - } - - if( err == noErr ) /* now copy the file/folder... */ - { /* is it a folder? */ - if ( isDirectory ) - { /* yes */ - err = CheckForDestInsideSrc(source, destDir); - if( err == noErr ) - err = FSCopyFolder( source, destDir, &sourceCatInfo, &tmpObjectName, ©Params, &filterParams, maxLevels, &tmpObjectRef, newObjectSpec ); - } - else /* no */ - err = FSCopyFile(source, destDir, &sourceCatInfo, &tmpObjectName, ©Params, &filterParams, &tmpObjectRef, newObjectSpec); - } - - /* if an object existed in the destination with the same name as */ - /* the source and the caller wants to replace it, we had renamed it */ - /* to ".DeleteMe" earlier. If no errors, we delete it, else delete */ - /* the one we just created and rename the origenal back to its */ - /* origenal name. */ - /* */ - /* This is done mainly to cover the case of the source being in the */ - /* destination directory when kDupeActionReplace is selected */ - /* (3188701) */ - if( copyParams.dupeAction == kDupeActionReplace && isReplacing == true ) - { - dwarning(("%s -- Cleaning up, this might take a moment. err : %d\n", __FUNCTION__, err)); - - if( err == noErr ) - err = FSDeleteObjects( &deleteMeRef ); - else - { /* not much we can do if the delete or rename fails, we need to preserve */ - /* the origenal error code that got us here. */ - /* */ - /* If an error occurs before or inside SetupDestination, newFileRef and */ - /* deleteMeRef will be invalid so the delete and rename will simply fail */ - /* leaving the source and destination unchanged */ - myverify_noerr( FSDeleteObjects( &tmpObjectRef ) ); - myverify_noerr( FSRenameUnicode( &deleteMeRef, sourceName.length, sourceName.unicode, sourceCatInfo.textEncodingHint, NULL ) ); - } - } - - if( err == noErr && newObjectRef != NULL ) - *newObjectRef = tmpObjectRef; - - /* Clean up for space and safety... Who me? */ - if( copyParams.copyBuffer != NULL ) - DisposePtr((char*)copyParams.copyBuffer); - - mycheck_noerr( err ); - - return err; -} - -/*****************************************************************************/ - - /* Does a little preflighting (as the name suggests) to figure out the optimal */ - /* buffer size, if its a drop box, on a remote volume etc */ -static OSErr FSCopyObjectPreflight( const FSRef *source, - const FSRef *destDir, - const DupeAction dupeAction, - FSCatalogInfo *sourceCatInfo, - CopyParams *copyParams, - HFSUniStr255 *newObjectName, - FSRef *deleteMeRef, - Boolean *isReplacing, - Boolean *isDirectory) -{ - GetVolParmsInfoBuffer srcVolParms, - destVolParms; - UInt32 srcVolParmsSize = 0, - destVolParmsSize = 0; - FSVolumeRefNum srcVRefNum, - destVRefNum; - OSErr err = ( source != NULL && destDir != NULL && - sourceCatInfo != NULL && copyParams != NULL && - newObjectName != NULL && deleteMeRef != NULL && - isDirectory != NULL ) ? noErr : paramErr; - - BlockZero( copyParams, sizeof( CopyParams ) ); - - copyParams->dupeAction = dupeAction; - - if( err == noErr ) /* Get the info we will need later about the source object */ - err = FSGetCatalogInfo( source, kFSCatInfoSettableInfo, sourceCatInfo, NULL, NULL, NULL ); - if( err == noErr ) /* get the source's vRefNum */ - err = FSGetVRefNum( source, &srcVRefNum ); - if( err == noErr ) /* get the source's volParams */ - err = FSGetVolParms( srcVRefNum, sizeof(GetVolParmsInfoBuffer), &srcVolParms, &srcVolParmsSize ); - if( err == noErr ) /* get the destination's vRefNum */ - err = FSGetVRefNum( destDir, &destVRefNum ); - if( err == noErr ) - { - /* Calculate the optimal copy buffer size for the src vol */ - copyParams->copyBufferSize = CalcBufferSizeForVol( &srcVolParms, srcVolParmsSize ); - - /* if src and dest on different volumes, get its vol parms */ - /* and calculate its optimal buffer size */ - /* else destVolParms = srcVolParms */ - if( srcVRefNum != destVRefNum ) - { - err = FSGetVolParms( destVRefNum, sizeof(GetVolParmsInfoBuffer), &destVolParms, &destVolParmsSize ); - if( err == noErr ) - { - ByteCount tmpBufferSize = CalcBufferSizeForVol( &destVolParms, destVolParmsSize ); - if( tmpBufferSize < copyParams->copyBufferSize ) - copyParams->copyBufferSize = tmpBufferSize; - } - } - else - destVolParms = srcVolParms; - } - if( err == noErr ) - err = ((copyParams->copyBuffer = NewPtr( copyParams->copyBufferSize )) != NULL ) ? noErr : MemError(); - - /* figure out if source is a file or folder */ - /* if it is on a local volume, */ - /* if destination is a drop box */ - /* if source and dest are on same server */ - /* and if it supports PBHCopyFile */ - if( err == noErr ) /* is the destination a Drop Box */ - err = IsDropBox( destDir, ©Params->copyingToDropFolder ); - if( err == noErr ) - { - /* Is it a directory */ - *isDirectory = ((sourceCatInfo->nodeFlags & kFSNodeIsDirectoryMask) != 0); - /* destVolParms.vMServerAdr is non-zero for remote volumes */ - copyParams->copyingToLocalVolume = (destVolParms.vMServerAdr == 0); - if( !copyParams->copyingToLocalVolume ) - { - /* If the destination is on a remote volume, and source and dest are on */ - /* the same server, then it might support PBHCopyFileSync */ - /* If not, then PBHCopyFileSync won't work */ - - /* figure out if the volumes support PBHCopyFileSync */ - copyParams->volHasCopyFile = ( err == noErr && destVolParms.vMServerAdr == srcVolParms.vMServerAdr ) ? - VolHasCopyFile(&srcVolParms) : false; - } - } - - if( err == noErr ) - err = SetupDestination( destDir, copyParams->dupeAction, newObjectName, deleteMeRef, isReplacing ); - - return err; -} - -#pragma mark ----- Copy Files ----- - -/*****************************************************************************/ - -static OSErr FSCopyFile( const FSRef *source, - const FSRef *destDir, - const FSCatalogInfo *sourceCatInfo, - const HFSUniStr255 *newFileName, - CopyParams *copyParams, - FilterParams *filterParams, - FSRef *outFileRef, - FSSpec *outFileSpec ) -{ - FSCatalogInfo catInfo = *sourceCatInfo; - FSRef newFileRef; - FSSpec newFileSpec; - OSErr err = ( source != NULL && destDir != NULL && - copyParams != NULL && filterParams != NULL ) ? noErr : paramErr; - - /* If you would like a Pre-Copy filter (i.e to weed out objects */ - /* you don't want to copy) you should add it here */ - - if( err == noErr ) /* copy the file over */ - err = CopyFile( source, &catInfo, destDir, newFileName, copyParams, &newFileRef, (filterParams->wantSpec || outFileSpec) ? &newFileSpec : NULL ); - - /* Call the IterateFilterProc _after_ the new file was created even if an error occured. */ - /* Note: if an error occured above, the FSRef and other info might not be valid */ - if( filterParams->filterProcPtr != NULL ) - { - /* get the extra info the user wanted on the new file that we don't have */ - if( err == noErr && (filterParams->whichInfo & ~kFSCatInfoSettableInfo) != kFSCatInfoNone ) - err = FSGetCatalogInfo( &newFileRef, filterParams->whichInfo & ~kFSCatInfoSettableInfo, &catInfo, NULL, NULL, NULL ); - - err = CallCopyObjectFilterProc( filterParams->filterProcPtr, false, 0, err, &catInfo, &newFileRef, - (filterParams->wantSpec) ? &newFileSpec : NULL, - (filterParams->wantName) ? newFileName : NULL, - filterParams->yourDataPtr); - } - - if( err == noErr ) - { - if( outFileRef != NULL ) - *outFileRef = newFileRef; - if( outFileSpec != NULL ) - *outFileSpec = newFileSpec; - } - - mycheck_noerr(err); - - return err; -} - -/*****************************************************************************/ - -static OSErr CopyFile( const FSRef *source, - FSCatalogInfo *sourceCatInfo, - const FSRef *destDir, - const HFSUniStr255 *destName, /* can be NULL */ - CopyParams *params, - FSRef *newFile, /* can be NULL */ - FSSpec *newSpec ) /* can be NULL */ -{ - OSErr err = paramErr; - - /* Clear the "inited" bit so that the Finder positions the icon for us. */ - ((FInfo *)(sourceCatInfo->finderInfo))->fdFlags &= ~kHasBeenInited; - - /* if the volumes support PBHCopyFileSync, try to use it */ - if( params->volHasCopyFile == true ) - err = FSUsePBHCopyFile( source, destDir, destName, kTextEncodingUnknown, newFile, newSpec ); - - /* if PBHCopyFile didn't work or not supported, */ - if( err != noErr ) /* then try old school file transfer */ - err = DoCopyFile( source, sourceCatInfo, destDir, destName, params, newFile, newSpec ); - - mycheck_noerr(err); - - return err; -} - -/*****************************************************************************/ - - /* Wrapper function for PBHCopyFileSync */ -static OSErr FSUsePBHCopyFile( const FSRef *srcFileRef, - const FSRef *dstDirectoryRef, - const HFSUniStr255 *destName, /* can be NULL */ - TextEncoding textEncodingHint, - FSRef *newRef, /* can be NULL */ - FSSpec *newSpec) /* can be NULL */ -{ - FSSpec srcFileSpec; - FSCatalogInfo catalogInfo; - HParamBlockRec pb; - Str255 hfsName; - OSErr err = ( srcFileRef != NULL && dstDirectoryRef != NULL ) ? noErr : paramErr; - - if( err == noErr ) /* get FSSpec of source FSRef */ - err = FSGetCatalogInfo(srcFileRef, kFSCatInfoNone, NULL, NULL, &srcFileSpec, NULL); - if( err == noErr ) /* get the destination vRefNum and nodeID (nodeID is the dirID) */ - err = FSGetCatalogInfo(dstDirectoryRef, kFSCatInfoVolume | kFSCatInfoNodeID, &catalogInfo, NULL, NULL, NULL); - if( err == noErr ) /* gather all the info needed */ - { - pb.copyParam.ioVRefNum = srcFileSpec.vRefNum; - pb.copyParam.ioDirID = srcFileSpec.parID; - pb.copyParam.ioNamePtr = (StringPtr)srcFileSpec.name; - pb.copyParam.ioDstVRefNum = catalogInfo.volume; - pb.copyParam.ioNewDirID = (long)catalogInfo.nodeID; - pb.copyParam.ioNewName = NULL; - if( destName != NULL ) - err = UniStrToPStr( destName, textEncodingHint, false, hfsName ); - pb.copyParam.ioCopyName = ( destName != NULL && err == noErr ) ? hfsName : NULL; - } - if( err == noErr ) /* tell the server to copy the object */ - err = PBHCopyFileSync(&pb); - - if( err == noErr ) - { - if( newSpec != NULL ) /* caller wants an FSSpec, so make it */ - myverify_noerr(FSMakeFSSpec( pb.copyParam.ioDstVRefNum, pb.copyParam.ioNewDirID, pb.copyParam.ioCopyName, newSpec)); - if( newRef != NULL ) /* caller wants an FSRef, so make it */ - myverify_noerr(FSMakeFSRef( pb.copyParam.ioDstVRefNum, pb.copyParam.ioNewDirID, pb.copyParam.ioCopyName, newRef)); - } - - if( err != paramErr ) /* returning paramErr is ok, it means PBHCopyFileSync was not supported */ - mycheck_noerr(err); - - return err; -} - -/*****************************************************************************/ - - /* Copies a file referenced by source to the directory referenced by */ - /* destDir. destName is the name the file we are going to copy to the */ - /* destination. sourceCatInfo is the catalog info of the file, which */ - /* is passed in as an optimization (we could get it by doing a */ - /* FSGetCatalogInfo but the caller has already done that so we might as */ - /* well take advantage of that). */ - /* */ -static OSErr DoCopyFile(const FSRef *source, - FSCatalogInfo *sourceCatInfo, - const FSRef *destDir, - const HFSUniStr255 *destName, - CopyParams *params, - FSRef *newRef, - FSSpec *newSpec ) -{ - FSRef dest; - FSSpec tmpSpec; - FSPermissionInfo originalPermissions; - OSType originalFileType = 'xxxx'; - UInt16 originalNodeFlags = kFSCatInfoNone; - Boolean getSpec; - OSErr err = noErr; - - /* If we're copying to a drop folder, we won't be able to reset this */ - /* information once the copy is done, so we don't mess it up in */ - /* the first place. We still clear the locked bit though; items dropped */ - /* into a drop folder always become unlocked. */ - if (!params->copyingToDropFolder) - { - /* Remember to clear the file's type, so the Finder doesn't */ - /* look at the file until we're done. */ - originalFileType = ((FInfo *) &sourceCatInfo->finderInfo)->fdType; - ((FInfo *) &sourceCatInfo->finderInfo)->fdType = kFirstMagicBusyFiletype; - - /* Remember and clear the file's locked status, so that we can */ - /* actually write the forks we're about to create. */ - originalNodeFlags = sourceCatInfo->nodeFlags; - } - sourceCatInfo->nodeFlags &= ~kFSNodeLockedMask; - - /* figure out if we should get the FSSpec to the new file or not */ - /* If the caller asked for it, or if we need it for symlinks */ - getSpec = ( ( newSpec != NULL ) || ( !params->copyingToDropFolder && originalFileType == 'slnk' && ((FInfo *) &sourceCatInfo->finderInfo)->fdCreator == 'rhap' ) ); - - /* we need to have user level read/write/execute access to the file we are */ - /* going to create otherwise FSCreateFileUnicode will return */ - /* -5000 (afpAccessDenied), and the FSRef returned will be invalid, yet */ - /* the file is created (size 0k)... bug? */ - originalPermissions = *((FSPermissionInfo*)sourceCatInfo->permissions); - ((FSPermissionInfo*)sourceCatInfo->permissions)->mode |= kRWXUserAccessMask; - - /* Classic only supports 9.1 and higher, so we don't have to worry */ - /* about 2397324 */ - if( err == noErr ) - err = FSCreateFileUnicode(destDir, destName->length, destName->unicode, kFSCatInfoSettableInfo, sourceCatInfo, &dest, ( getSpec ) ? &tmpSpec : NULL ); - if( err == noErr ) /* Copy the forks over to the new file */ - err = CopyForks(source, &dest, params); - - /* Restore the original file type, creation and modification dates, */ - /* locked status and permissions. */ - /* This is one of the places where we need to handle drop */ - /* folders as a special case because this FSSetCatalogInfo will fail for */ - /* an item in a drop folder, so we don't even attempt it. */ - if (err == noErr && !params->copyingToDropFolder) - { - ((FInfo *) &sourceCatInfo->finderInfo)->fdType = originalFileType; - sourceCatInfo->nodeFlags = originalNodeFlags; - *((FSPermissionInfo*)sourceCatInfo->permissions) = originalPermissions; - - /* 2796751, FSSetCatalogInfo returns -36 when setting the Finder Info */ - /* for a symlink. To workaround this, when the file is a */ - /* symlink (slnk/rhap) we will finish the copy in two steps. First */ - /* setting everything but the Finder Info on the file, then calling */ - /* FSpSetFInfo to set the Finder Info for the file. I would rather use */ - /* an FSRef function to set the Finder Info, but FSSetCatalogInfo is */ - /* the only one... catch-22... */ - /* */ - /* The Carbon File Manager always sets the type/creator of a symlink to */ - /* slnk/rhap if the file is a symlink we do the two step, if it isn't */ - /* we use FSSetCatalogInfo to do all the work. */ - if ((originalFileType == 'slnk') && (((FInfo *) &sourceCatInfo->finderInfo)->fdCreator == 'rhap')) - { /* Its a symlink */ - /* set all the info, except the Finder info */ - err = FSSetCatalogInfo(&dest, kFSCatInfoNodeFlags | kFSCatInfoPermissions, sourceCatInfo); - if ( err == noErr ) /* set the Finder Info to that file */ - err = FSpSetFInfo( &tmpSpec, ((FInfo *) &sourceCatInfo->finderInfo) ); - } - else /* its a regular file */ - err = FSSetCatalogInfo(&dest, kFSCatInfoNodeFlags | kFSCatInfoFinderInfo | kFSCatInfoPermissions, sourceCatInfo); - } - - /* If we created the file and the copy failed, try to clean up by */ - /* deleting the file we created. We do this because, while it's */ - /* possible for the copy to fail halfway through and the File Manager */ - /* doesn't really clean up that well in that case, we *really* don't want */ - /* any half-created files being left around. */ - /* if the file already existed, we don't want to delete it */ - if( err == noErr || err == dupFNErr ) - { /* if everything was fine, then return the new file Spec/Ref */ - if( newRef != NULL ) - *newRef = dest; - if( newSpec != NULL ) - *newSpec = tmpSpec; - } - else - myverify_noerr( FSDeleteObjects(&dest) ); - - mycheck_noerr(err); - - return err; -} - -/*****************************************************************************/ - -#pragma mark ----- Copy Folders ----- - -static OSErr FSCopyFolder( const FSRef *source, - const FSRef *destDir, - const FSCatalogInfo *sourceCatInfo, - const HFSUniStr255 *newObjectName, - CopyParams *copyParams, - FilterParams *filterParams, - ItemCount maxLevels, - FSRef *outDirRef, - FSSpec *outDirSpec ) -{ - FSCopyFolderGlobals folderGlobals; - FolderListData *tmpListData = NULL; - FSCatalogInfo catInfo = *sourceCatInfo; - FSRef newDirRef; - FSSpec newDirSpec; - OSErr err; - - /* setup folder globals */ - folderGlobals.catInfoList = (FSCatalogInfo*) NewPtr( sizeof( FSCatalogInfo ) * kNumObjects ); - folderGlobals.srcRefList = (FSRef*) NewPtr( sizeof( FSRef ) * kNumObjects ); - folderGlobals.nameList = (HFSUniStr255*) NewPtr( sizeof( HFSUniStr255 ) * kNumObjects ); - folderGlobals.folderListIter = NULL; - folderGlobals.copyParams = copyParams; - folderGlobals.filterParams = filterParams; - folderGlobals.maxLevels = maxLevels; - folderGlobals.currentLevel = 0; - - /* if any of the NewPtr calls failed, we MUST bail */ - err = ( folderGlobals.catInfoList != NULL && - folderGlobals.srcRefList != NULL && - folderGlobals.nameList != NULL ) ? noErr : memFullErr; - - /* init the linked list we will use to keep track of the folders */ - InitLinkedList( &folderGlobals.folderList, MyDisposeDataProc ); - - if( err == noErr && !copyParams->copyingToDropFolder ) - err = GetMagicBusyCreateDate( &catInfo.createDate ); - if( err == noErr ) /* create the directory */ - err = DoCreateFolder( source, destDir, &catInfo, newObjectName, folderGlobals.copyParams, &newDirRef, (filterParams->wantSpec || outDirSpec ) ? &newDirSpec : NULL ); - - /* Note: if an error occured above, the FSRef and other info might not be valid */ - if( filterParams->filterProcPtr != NULL ) - { - /* get the info the user wanted about the source directory we don't have */ - if( err == noErr && (filterParams->whichInfo & ~kFSCatInfoSettableInfo) != kFSCatInfoNone ) - err = FSGetCatalogInfo(&newDirRef, filterParams->whichInfo & ~kFSCatInfoSettableInfo, &catInfo, NULL, NULL, NULL); - - err = CallCopyObjectFilterProc(filterParams->filterProcPtr, false, folderGlobals.currentLevel, - err, &catInfo, &newDirRef, - ( filterParams->wantSpec ) ? &newDirSpec : NULL, - ( filterParams->wantName ) ? newObjectName : NULL, - filterParams->yourDataPtr); - } - if( err == noErr ) /* create the memory for this folder */ - err = ( ( tmpListData = (FolderListData*) NewPtr( sizeof( FolderListData ) ) ) != NULL ) ? noErr : MemError(); - if( err == noErr ) - { /* setup the folder info */ - tmpListData->sourceDirRef = *source; - tmpListData->destDirRef = newDirRef; - tmpListData->level = folderGlobals.currentLevel; - /* add this folder to the list to give ProcessFolderList something to chew on */ - err = AddToTail( &folderGlobals.folderList, tmpListData ); - if( err == noErr ) /* tmpListData added successfully */ - err = ProcessFolderList( &folderGlobals ); - else /* error occured, so dispose of memory */ - DisposePtr( (char*) tmpListData ); - } - - dwarning(("\n%s -- %u folders were found\n", __FUNCTION__, (unsigned int)GetNumberOfItems( &folderGlobals.folderList ) )); - - /* when we're done destroy the list and free up any memory we allocated */ - DestroyList( &folderGlobals.folderList ); - - /* now that the copy is complete, we can set things back to normal */ - /* for the directory we just created. */ - /* We have to do this only for the top directory of the copy */ - /* all subdirectories were created all at once */ - if( err == noErr && !folderGlobals.copyParams->copyingToDropFolder ) - err = FSSetCatalogInfo( &newDirRef, kFSCatInfoCreateDate | kFSCatInfoPermissions, sourceCatInfo ); - - /* Copy went as planned, and caller wants an FSRef/FSSpec to the new directory */ - if( err == noErr ) - { - if( outDirRef != NULL) - *outDirRef = newDirRef; - if( outDirSpec != NULL ) - *outDirSpec = newDirSpec; - } - - /* clean up for space and safety, who me? */ - if( folderGlobals.catInfoList ) - DisposePtr( (char*) folderGlobals.catInfoList ); - if( folderGlobals.srcRefList ) - DisposePtr( (char*) folderGlobals.srcRefList ); - if( folderGlobals.nameList ) - DisposePtr( (char*) folderGlobals.nameList ); - - mycheck_noerr(err); - - return ( err ); -} - -/*****************************************************************************/ - - /* We now store a list of all the folders/subfolders we encounter in the source */ - /* Each node in the list contains an FSRef to the source, an FSRef to the */ - /* mirror folder in the destination, and the level in the source that folder */ - /* is on. This is done so that we can use FSGetCatalogInfoBulk to its full */ - /* potential (getting items in bulk). We copy the source one folder at a time. */ - /* Copying over the contents of each folder before we continue on to the next */ - /* folder in the list. This allows us to use the File Manager's own caching */ - /* system to our advantage. */ -static OSErr ProcessFolderList( FSCopyFolderGlobals *folderGlobals ) -{ - FolderListData *folderListData; - OSErr err = noErr; - - /* iterate through the list of folders and copy over each one individually */ - for( InitIterator( &folderGlobals->folderList, &folderGlobals->folderListIter ); folderGlobals->folderListIter != NULL && err == noErr; Next( &folderGlobals->folderListIter ) ) - { - /* Get the data for this folder */ - folderListData = (FolderListData*) GetData( folderGlobals->folderListIter ); - if( folderListData != NULL ) - { - #if DEBUG && !TARGET_API_MAC_OS8 - { - char path[1024]; - myverify_noerr(FSRefMakePath( &(folderListData->sourceDirRef), (unsigned char*)path, 1024 )); - dwarning(("\n\n%s -- Copying contents of\n\t%s\n", __FUNCTION__, path)); - myverify_noerr(FSRefMakePath( &(folderListData->destDirRef), (unsigned char*)path, 1024 )); - dwarning(("\t\tto\n\t%s\n", path)); - } - #endif - - /* stuff the data into our globals */ - folderGlobals->sourceDirRef = &(folderListData->sourceDirRef); - folderGlobals->destDirRef = &(folderListData->destDirRef); - folderGlobals->currentLevel = folderListData->level; - - /* Copy over this folder and add any subfolders to our list of folders */ - /* so they will get processed later */ - err = CopyFolder( folderGlobals ); - } - } - - return err; -} - -/*****************************************************************************/ - - /* Copy the contents of the source into the destination. If any subfolders */ - /* are found, add them to a local list of folders during the loop stage */ - /* Once the copy is done, insert the local list into the global list right */ - /* after the current position in the list. This is done so we don't jump */ - /* all over the disk getting the different folders to copy */ -static OSErr CopyFolder( FSCopyFolderGlobals *folderGlobals ) -{ - GenLinkedList tmpList; - FolderListData *tmpListData = NULL; - FilterParams *filterPtr = folderGlobals->filterParams; - FSIterator iterator; - FSRef newRef; - FSSpec newSpec; - UInt32 actualObjects; - OSErr err, - junkErr; - int i; - - /* Init the local list */ - InitLinkedList( &tmpList, MyDisposeDataProc); - - err = FSOpenIterator( folderGlobals->sourceDirRef, kFSIterateFlat, &iterator ); - if( err == noErr ) - { - do - { - /* grab a bunch of objects (kNumObjects) from this folder and copy them over */ - err = FSGetCatalogInfoBulk( iterator, kNumObjects, &actualObjects, &filterPtr->containerChanged, - kFSCatInfoSettableInfo, folderGlobals->catInfoList, folderGlobals->srcRefList, - NULL, folderGlobals->nameList ); - if( ( err == noErr || err == errFSNoMoreItems ) && - ( actualObjects != 0 ) ) - { - dwarning(("%s -- actualObjects retrieved from FSGetCatalogInfoBulk: %u\n",__FUNCTION__, (unsigned int)actualObjects )); - - /* iterate over the objects actually returned */ - for( i = 0; i < actualObjects; i++ ) - { - /* Any errors in here will be passed to the filter proc */ - /* we don't want an error in here to prematurely cancel the copy */ - - /* If you would like a Pre-Copy filter (i.e to weed out objects */ - /* you don't want to copy) you should add it here */ - - /* Is the new object a directory? */ - if( ( folderGlobals->catInfoList[i].nodeFlags & kFSNodeIsDirectoryMask ) != 0 ) - { /* yes */ - junkErr = CreateFolder( &folderGlobals->srcRefList[i], folderGlobals->destDirRef, - &folderGlobals->catInfoList[i], &folderGlobals->nameList[i], - folderGlobals->copyParams, &newRef, (filterPtr->wantSpec) ? &newSpec : NULL ); - /* If maxLevels is zero, we aren't checking levels */ - /* If currentLevel+1 < maxLevels, add this folder to the list */ - if( folderGlobals->maxLevels == 0 || (folderGlobals->currentLevel + 1) < folderGlobals->maxLevels ) - { - if( junkErr == noErr ) /* Create memory for folder list data */ - junkErr = ( ( tmpListData = (FolderListData*) NewPtr( sizeof( FolderListData ) ) ) != NULL ) ? noErr : MemError(); - if( junkErr == noErr ) - { /* Setup the folder list data */ - tmpListData->sourceDirRef = folderGlobals->srcRefList[i]; - tmpListData->destDirRef = newRef; - tmpListData->level = folderGlobals->currentLevel + 1; - - /* Add it to the local list */ - junkErr = AddToTail( &tmpList, tmpListData ); - } - /* If an error occured and memory was created, we need to dispose of it */ - /* since it was not added to the list */ - if( junkErr != noErr && tmpListData != NULL ) - DisposePtr( (char*) tmpListData ); - } - } - else - { /* no */ - junkErr = CopyFile( &folderGlobals->srcRefList[i], &folderGlobals->catInfoList[i], - folderGlobals->destDirRef, &folderGlobals->nameList[i], - folderGlobals->copyParams, &newRef, ( filterPtr->wantSpec ) ? &newSpec : NULL ); - } - - /* Note: if an error occured above, the FSRef and other info might not be valid */ - if( filterPtr->filterProcPtr != NULL ) - { - if( junkErr == noErr && (filterPtr->whichInfo & ~kFSCatInfoSettableInfo) != kFSCatInfoNone ) /* get the extra info about the new object that the user wanted that we don't already have */ - junkErr = FSGetCatalogInfo( &newRef, filterPtr->whichInfo & ~kFSCatInfoSettableInfo, &folderGlobals->catInfoList[i], NULL, NULL, NULL ); - - err = CallCopyObjectFilterProc( filterPtr->filterProcPtr, filterPtr->containerChanged, - folderGlobals->currentLevel, junkErr, - &folderGlobals->catInfoList[i], &newRef, - ( filterPtr->wantSpec ) ? &newSpec : NULL, - ( filterPtr->wantName ) ? &folderGlobals->nameList[i] : NULL, - filterPtr->yourDataPtr); - } - } - } - }while( err == noErr ); - - /* errFSNoMoreItems is OK - it only means we hit the end of this level */ - /* afpAccessDenied is OK too - it only means we cannot see inside the directory */ - if( err == errFSNoMoreItems || err == afpAccessDenied ) - err = noErr; - - /* Insert the local list of folders from the current folder into our global list. Even */ - /* if no items were added to the local list (due to error, or empty folder), InsertList */ - /* handles it correctly. We add the local list even if an error occurred. It will get */ - /* disposed of when the global list is destroyed. Doesn't hurt to have a couple extra */ - /* steps when we're going to bail anyways. */ - InsertList( &folderGlobals->folderList, &tmpList, folderGlobals->folderListIter ); - - /* Close the FSIterator (closing an open iterator should never fail) */ - (void) FSCloseIterator(iterator); - } - - mycheck_noerr( err ); - - return err; -} - -/*****************************************************************************/ - - /* Determines whether the destination directory is equal to the source */ - /* item, or whether it's nested inside the source item. Returns a */ - /* errFSDestInsideSource if that's the case. We do this to prevent */ - /* endless recursion while copying. */ - /* */ -static OSErr CheckForDestInsideSrc( const FSRef *source, - const FSRef *destDir) -{ - FSRef thisDir = *destDir; - FSCatalogInfo thisDirInfo; - Boolean done = false; - OSErr err; - - do - { - err = FSCompareFSRefs(source, &thisDir); - if (err == noErr) - err = errFSDestInsideSource; - else if (err == diffVolErr) - { - err = noErr; - done = true; - } - else if (err == errFSRefsDifferent) - { - /* This is somewhat tricky. We can ask for the parent of thisDir */ - /* by setting the parentRef parameter to FSGetCatalogInfo but, if */ - /* thisDir is the volume's FSRef, this will give us back junk. */ - /* So we also ask for the parent's dir ID to be returned in the */ - /* FSCatalogInfo record, and then check that against the node */ - /* ID of the root's parent (ie 1). If we match that, we've made */ - /* it to the top of the hierarchy without hitting source, so */ - /* we leave with no error. */ - - err = FSGetCatalogInfo(&thisDir, kFSCatInfoParentDirID, &thisDirInfo, NULL, NULL, &thisDir); - if( ( err == noErr ) && ( thisDirInfo.parentDirID == fsRtParID ) ) - done = true; - } - } while ( err == noErr && ! done ); - - mycheck_noerr( err ); - - return err; -} - -/*****************************************************************************/ - -#pragma mark ----- Copy Forks ----- - - /* This is where the majority of the work is done. I special cased */ - /* DropBoxes in order to use FSIterateForks to its full potential for */ - /* the more common case (read/write permissions). It also simplifies */ - /* the code to have it seperate. */ -static OSErr CopyForks( const FSRef *source, - const FSRef *dest, - CopyParams *params) -{ - OSErr err; - - err = ( !params->copyingToDropFolder ) ? CopyForksToDisk ( source, dest, params ) : - CopyForksToDropBox ( source, dest, params ); - - mycheck_noerr( err ); - - return err; -} - - /* Open each fork individually and copy them over to the destination */ -static OSErr CopyForksToDisk( const FSRef *source, - const FSRef *dest, - CopyParams *params ) -{ - HFSUniStr255 forkName; - CatPositionRec iterator; - SInt64 forkSize; - SInt16 srcRefNum, - destRefNum; - OSErr err; - - /* need to initialize the iterator before using it */ - iterator.initialize = 0; - - do - { - err = FSIterateForks( source, &iterator, &forkName, &forkSize, NULL ); - - /* Create the fork. Note: Data and Resource forks are automatically */ - /* created when the file is created. FSCreateFork returns noErr for them */ - /* We also want to create the fork even if there is no data to preserve */ - /* empty forks */ - if( err == noErr ) - err = FSCreateFork( dest, forkName.length, forkName.unicode ); - - /* Mac OS 9.0 has a bug (in the AppleShare external file system, */ - /* I think) [2410374] that causes FSCreateFork to return an errFSForkExists */ - /* error even though the fork is empty. The following code swallows */ - /* the error (which is harmless) in that case. */ - if( err == errFSForkExists && !params->copyingToLocalVolume ) - err = noErr; - - /* The remainder of this code only applies if there is actual data */ - /* in the source fork. */ - - if( err == noErr && forkSize > 0 ) - { - destRefNum = srcRefNum = 0; - - /* Open the destination fork */ - err = FSOpenFork(dest, forkName.length, forkName.unicode, fsWrPerm, &destRefNum); - if( err == noErr ) /* Open the source fork */ - err = FSOpenFork(source, forkName.length, forkName.unicode, fsRdPerm, &srcRefNum); - if( err == noErr ) /* Write the fork to disk */ - err = WriteFork( srcRefNum, destRefNum, params, forkSize ); - - if( destRefNum != 0 ) /* Close the destination fork */ - myverify_noerr( FSCloseFork( destRefNum ) ); - if( srcRefNum != 0 ) /* Close the source fork */ - myverify_noerr( FSCloseFork( srcRefNum ) ); - } - } - while( err == noErr ); - - if( err == errFSNoMoreItems ) - err = noErr; - - mycheck_noerr( err ); - - return err; -} - - /* If we're copying to a DropBox, we have to handle the copy process a little */ - /* differently then when we are copying to a regular folder. */ -static OSErr CopyForksToDropBox( const FSRef *source, - const FSRef *dest, - CopyParams *params ) -{ - GenLinkedList forkList; - GenIteratorPtr pIter; - ForkTrackerPtr forkPtr; - SInt16 srcRefNum; - OSErr err; - - InitLinkedList( &forkList, MyCloseForkProc ); - - /* If we're copying into a drop folder, open up all of those forks. */ - /* We have to do this because once we've started writing to a fork */ - /* in a drop folder, we can't open any more forks. */ - err = OpenAllForks( dest, &forkList ); - - /* Copy each fork over to the destination */ - for( InitIterator( &forkList, &pIter ); pIter != NULL && err == noErr; Next( &pIter ) ) - { - srcRefNum = 0; - forkPtr = GetData( pIter ); - /* Open the source fork */ - err = FSOpenFork(source, forkPtr->forkName.length, forkPtr->forkName.unicode, fsRdPerm, &srcRefNum); - if( err == noErr ) /* Write the data over */ - err = WriteFork( srcRefNum, forkPtr->forkDestRefNum, params, forkPtr->forkSize ); - - if( srcRefNum != 0 ) /* Close the source fork */ - myverify_noerr( FSCloseFork( srcRefNum ) ); - } - /* we're done, so destroy the list even if an error occured */ - /* the DisposeDataProc will close any open forks */ - DestroyList( &forkList ); - - mycheck_noerr( err ); - - return err; -} - -/*****************************************************************************/ - - /* Create and open all the forks in the destination file. We need to do this when */ - /* we're copying into a drop folder, where you must open all the forks before starting */ - /* to write to any of them. */ - /* */ - /* IMPORTANT: If it fails, this routine won't close forks that opened successfully. */ - /* Make sure that the DisposeDataProc for the forkList closed any open forks */ - /* Or you close each one manually before destroying the list */ -static OSErr OpenAllForks( const FSRef *dest, - GenLinkedList *forkList ) -{ - ForkTrackerPtr forkPtr; - HFSUniStr255 forkName; - CatPositionRec iterator; - SInt64 forkSize; - OSErr err = ( dest != NULL && forkList != NULL ) ? noErr : paramErr; - - /* need to initialize the iterator before using it */ - iterator.initialize = 0; - - /* Iterate over the list of forks */ - while( err == noErr ) - { - forkPtr = NULL; /* init forkPtr */ - - err = FSIterateForks( dest, &iterator, &forkName, &forkSize, NULL ); - if( err == noErr ) - err = ( forkPtr = (ForkTrackerPtr) NewPtr( sizeof( ForkTracker ) ) ) != NULL ? noErr : MemError(); - if( err == noErr ) - { - forkPtr->forkName = forkName; - forkPtr->forkSize = forkSize; - forkPtr->forkDestRefNum = 0; - - /* Create the fork. Note: Data and Resource forks are automatically */ - /* created when the file is created. FSCreateFork returns noErr for them */ - /* We also want to create the fork even if there is no data to preserve */ - /* empty forks */ - err = FSCreateFork( dest, forkName.length, forkName.unicode ); - - /* Swallow afpAccessDenied because this operation causes the external file */ - /* system compatibility shim in Mac OS 9 to generate a GetCatInfo request */ - /* to the AppleShare external file system, which in turn causes an AFP */ - /* GetFileDirParms request on the wire, which the AFP server bounces with */ - /* afpAccessDenied because the file is in a drop folder. As there's no */ - /* native support for non-classic forks in current AFP, there's no way I */ - /* can decide how I should handle this in a non-test case. So I just */ - /* swallow the error and hope that when native AFP support arrives, the */ - /* right thing will happen. */ - if( err == afpAccessDenied ) - err = noErr; - - /* only open the fork if the fork has some data */ - if( err == noErr && forkPtr->forkSize > 0 ) - err = FSOpenFork( dest, forkPtr->forkName.length, forkPtr->forkName.unicode, fsWrPerm, &forkPtr->forkDestRefNum ); - - /* if everything is ok, add this fork to the list */ - if( err == noErr ) - err = AddToTail( forkList, forkPtr ); - } - - if( err != noErr && forkPtr != NULL ) - DisposePtr( (char*) forkPtr ); - } - - if( err == errFSNoMoreItems ) - err = noErr; - - mycheck_noerr( err ); - - return err; -} - -/*****************************************************************************/ - - /* Writes the fork from the source, references by srcRefNum, to the destination fork */ - /* references by destRefNum */ -static OSErr WriteFork( const SInt16 srcRefNum, - const SInt16 destRefNum, - const CopyParams *params, - const SInt64 forkSize ) -{ - UInt64 bytesRemaining; - UInt64 bytesToReadThisTime; - UInt64 bytesToWriteThisTime; - OSErr err; - - - /* Here we create space for the entire fork on the destination volume. */ - /* FSAllocateFork has the right semantics on both traditional Mac OS */ - /* and Mac OS X. On traditional Mac OS it will allocate space for the */ - /* file in one hit without any other special action. On Mac OS X, */ - /* FSAllocateFork is preferable to FSSetForkSize because it prevents */ - /* the system from zero filling the bytes that were added to the end */ - /* of the fork (which would be waste because we're about to write over */ - /* those bytes anyway. */ - err = FSAllocateFork(destRefNum, kFSAllocNoRoundUpMask, fsFromStart, 0, forkSize, NULL); - - /* Copy the file from the source to the destination in chunks of */ - /* no more than params->copyBufferSize bytes. This is fairly */ - /* boring code except for the bytesToReadThisTime/bytesToWriteThisTime */ - /* distinction. On the last chunk, we round bytesToWriteThisTime */ - /* up to the next 512 byte boundary and then, after we exit the loop, */ - /* we set the file's EOF back to the real location (if the fork size */ - /* is not a multiple of 512 bytes). */ - /* */ - /* This technique works around a 'bug' in the traditional Mac OS File Manager, */ - /* where the File Manager will put the last 512-byte block of a large write into */ - /* the cache (even if we specifically request no caching) if that block is not */ - /* full. If the block goes into the cache it will eventually have to be */ - /* flushed, which causes sub-optimal disk performance. */ - /* */ - /* This is only done if the destination volume is local. For a network */ - /* volume, it's better to just write the last bytes directly. */ - /* */ - /* This is extreme over-optimization given the other limits of this */ - /* sample, but I will hopefully get to the other limits eventually. */ - bytesRemaining = forkSize; - while( err == noErr && bytesRemaining != 0 ) - { - if( bytesRemaining > params->copyBufferSize ) - { - bytesToReadThisTime = params->copyBufferSize; - bytesToWriteThisTime = bytesToReadThisTime; - } - else - { - bytesToReadThisTime = bytesRemaining; - bytesToWriteThisTime = ( params->copyingToLocalVolume ) ? - ( (bytesRemaining + 0x01FF ) & ~0x01FF ) : bytesRemaining; - } - - err = FSReadFork( srcRefNum, fsAtMark + noCacheMask, 0, bytesToReadThisTime, params->copyBuffer, NULL ); - if( err == noErr ) - err = FSWriteFork( destRefNum, fsAtMark + noCacheMask, 0, bytesToWriteThisTime, params->copyBuffer, NULL ); - if( err == noErr ) - bytesRemaining -= bytesToReadThisTime; - } - - if (err == noErr && params->copyingToLocalVolume && ( forkSize & 0x01FF ) != 0 ) - err = FSSetForkSize( destRefNum, fsFromStart, forkSize ); - - return err; -} - -/*****************************************************************************/ - -#pragma mark ----- Calculate Buffer Size ----- - - /* This routine calculates the appropriate buffer size for */ - /* the given volParms. It's a simple composition of FSGetVolParms */ - /* BufferSizeForVolSpeed. */ -static UInt32 CalcBufferSizeForVol(const GetVolParmsInfoBuffer *volParms, UInt32 volParmsSize) -{ - UInt32 volumeBytesPerSecond = 0; - - /* Version 1 of the GetVolParmsInfoBuffer included the vMAttrib */ - /* field, so we don't really need to test actualSize. A noErr */ - /* result indicates that we have the info we need. This is */ - /* just a paranoia check. */ - - mycheck(volParmsSize >= offsetof(GetVolParmsInfoBuffer, vMVolumeGrade)); - - /* On the other hand, vMVolumeGrade was not introduced until */ - /* version 2 of the GetVolParmsInfoBuffer, so we have to explicitly */ - /* test whether we got a useful value. */ - - if( ( volParmsSize >= offsetof(GetVolParmsInfoBuffer, vMForeignPrivID) ) && - ( volParms->vMVolumeGrade <= 0 ) ) - { - volumeBytesPerSecond = -volParms->vMVolumeGrade; - } - - return BufferSizeForVolSpeed(volumeBytesPerSecond); -} - -/*****************************************************************************/ - - /* Calculate an appropriate copy buffer size based on the volumes */ - /* rated speed. Our target is to use a buffer that takes 0.25 */ - /* seconds to fill. This is necessary because the volume might be */ - /* mounted over a very slow link (like ARA), and if we do a 256 KB */ - /* read over an ARA link we'll block the File Manager queue for */ - /* so long that other clients (who might have innocently just */ - /* called PBGetCatInfoSync) will block for a noticeable amount of time. */ - /* */ - /* Note that volumeBytesPerSecond might be 0, in which case we assume */ - /* some default value. */ -static UInt32 BufferSizeForVolSpeed(UInt32 volumeBytesPerSecond) -{ - ByteCount bufferSize; - - if (volumeBytesPerSecond == 0) - bufferSize = kDefaultCopyBufferSize; - else - { /* We want to issue a single read that takes 0.25 of a second, */ - /* so devide the bytes per second by 4. */ - bufferSize = volumeBytesPerSecond / 4; - } - - /* Round bufferSize down to 512 byte boundary. */ - bufferSize &= ~0x01FF; - - /* Clip to sensible limits. */ - if (bufferSize < kMinimumCopyBufferSize) - bufferSize = kMinimumCopyBufferSize; - else if (bufferSize > kMaximumCopyBufferSize) - bufferSize = kMaximumCopyBufferSize; - - return bufferSize; -} - -/*****************************************************************************/ - -#pragma mark ----- Delete Objects ----- - -OSErr FSDeleteObjects( const FSRef *source ) -{ - FSCatalogInfo catalogInfo; - OSErr err = ( source != NULL ) ? noErr : paramErr; - - #if DEBUG && !TARGET_API_MAC_OS8 - if( err == noErr ) - { - char path[1024]; - myverify_noerr(FSRefMakePath( source, (unsigned char*)path, 1024 )); - dwarning(("\n%s -- Deleting %s\n", __FUNCTION__, path)); - } - #endif - - /* get nodeFlags for container */ - if( err == noErr ) - err = FSGetCatalogInfo(source, kFSCatInfoNodeFlags, &catalogInfo, NULL, NULL,NULL); - if( err == noErr && (catalogInfo.nodeFlags & kFSNodeIsDirectoryMask) != 0 ) - { /* its a directory, so delete its contents before we delete it */ - err = FSDeleteFolder(source); - } - if( err == noErr && (catalogInfo.nodeFlags & kFSNodeLockedMask) != 0 ) /* is object locked? */ - { /* then attempt to unlock the object (ignore err since FSDeleteObject will set it correctly) */ - catalogInfo.nodeFlags &= ~kFSNodeLockedMask; - (void) FSSetCatalogInfo(source, kFSCatInfoNodeFlags, &catalogInfo); - } - if( err == noErr ) /* delete the object (if it was a directory it is now empty, so we can delete it) */ - err = FSDeleteObject(source); - - mycheck_noerr( err ); - - return ( err ); -} - -/*****************************************************************************/ - -#pragma mark ----- Delete Folders ----- - -static OSErr FSDeleteFolder( const FSRef *container ) -{ - FSDeleteObjectGlobals theGlobals; - - theGlobals.result = ( container != NULL ) ? noErr : paramErr; - - /* delete container's contents */ - if( theGlobals.result == noErr ) - FSDeleteFolderLevel(container, &theGlobals); - - mycheck_noerr( theGlobals.result ); - - return ( theGlobals.result ); -} - -/*****************************************************************************/ - -static void FSDeleteFolderLevel(const FSRef *container, - FSDeleteObjectGlobals *theGlobals ) -{ - FSIterator iterator; - FSRef itemToDelete; - UInt16 nodeFlags; - - /* Open FSIterator for flat access and give delete optimization hint */ - theGlobals->result = FSOpenIterator(container, kFSIterateFlat + kFSIterateDelete, &iterator); - if ( theGlobals->result == noErr ) - { - do /* delete the contents of the directory */ - { - /* get 1 item to delete */ - theGlobals->result = FSGetCatalogInfoBulk( iterator, 1, &theGlobals->actualObjects, - NULL, kFSCatInfoNodeFlags, &theGlobals->catalogInfo, - &itemToDelete, NULL, NULL); - if ( (theGlobals->result == noErr) && (theGlobals->actualObjects == 1) ) - { - /* save node flags in local in case we have to recurse */ - nodeFlags = theGlobals->catalogInfo.nodeFlags; - - /* is it a directory? */ - if ( (nodeFlags & kFSNodeIsDirectoryMask) != 0 ) - { /* yes -- delete its contents before attempting to delete it */ - FSDeleteFolderLevel(&itemToDelete, theGlobals); - } - if ( theGlobals->result == noErr) /* are we still OK to delete? */ - { - if ( (nodeFlags & kFSNodeLockedMask) != 0 ) /* is item locked? */ - { /* then attempt to unlock it (ignore result since FSDeleteObject will set it correctly) */ - theGlobals->catalogInfo.nodeFlags = nodeFlags & ~kFSNodeLockedMask; - (void) FSSetCatalogInfo(&itemToDelete, kFSCatInfoNodeFlags, &theGlobals->catalogInfo); - } - /* delete the item */ - theGlobals->result = FSDeleteObject(&itemToDelete); - } - } - } while ( theGlobals->result == noErr ); - - /* we found the end of the items normally, so return noErr */ - if ( theGlobals->result == errFSNoMoreItems ) - theGlobals->result = noErr; - - /* close the FSIterator (closing an open iterator should never fail) */ - myverify_noerr(FSCloseIterator(iterator)); - } - - mycheck_noerr( theGlobals->result ); - - return; -} - -/*****************************************************************************/ - -#pragma mark ----- Utilities ----- - - /* Figures out if the given directory is a drop box or not */ - /* if it is, the Copy Engine will behave slightly differently */ -static OSErr IsDropBox( const FSRef* source, - Boolean *isDropBox ) -{ - FSCatalogInfo tmpCatInfo; - FSSpec sourceSpec; - Boolean isDrop = false; - OSErr err; - - /* get info about the destination, and an FSSpec to it for PBHGetDirAccess */ - err = FSGetCatalogInfo(source, kFSCatInfoNodeFlags | kFSCatInfoPermissions, &tmpCatInfo, NULL, &sourceSpec, NULL); - if( err == noErr ) /* make sure the source is a directory */ - err = ((tmpCatInfo.nodeFlags & kFSNodeIsDirectoryMask) != 0) ? noErr : errFSNotAFolder; - if( err == noErr ) - { - HParamBlockRec hPB; - - BlockZero( &hPB, sizeof( HParamBlockRec ) ); - - hPB.accessParam.ioNamePtr = sourceSpec.name; - hPB.accessParam.ioVRefNum = sourceSpec.vRefNum; - hPB.accessParam.ioDirID = sourceSpec.parID; - - /* This is the official way (reads: the way X Finder does it) to figure */ - /* out the current users access privileges to a given directory */ - err = PBHGetDirAccessSync(&hPB); - if( err == noErr ) /* its a drop folder if the current user only has write access */ - isDrop = (hPB.accessParam.ioACAccess & kPrivilegesMask) == kioACAccessUserWriteMask; - else if ( err == paramErr ) - { - /* There is a bug (2908703) in the Classic File System (not OS 9.x or Carbon) */ - /* on 10.1.x where PBHGetDirAccessSync sometimes returns paramErr even when the */ - /* data passed in is correct. This is a workaround/hack for that problem, */ - /* but is not as accurate. */ - /* Basically, if "Everyone" has only Write/Search access then its a drop folder */ - /* that is the most common case when its a drop folder */ - FSPermissionInfo *tmpPerm = (FSPermissionInfo *)tmpCatInfo.permissions; - isDrop = ((tmpPerm->mode & kRWXOtherAccessMask) == kDropFolderValue); - err = noErr; - } - } - - *isDropBox = isDrop; - - mycheck_noerr( err ); - - return err; -} - -/*****************************************************************************/ - - /* The copy engine is going to set the item's creation date */ - /* to kMagicBusyCreationDate while it's copying the item. */ - /* But kMagicBusyCreationDate is an old-style 32-bit date/time, */ - /* while the HFS Plus APIs use the new 64-bit date/time. So */ - /* we have to call a happy UTC utilities routine to convert from */ - /* the local time kMagicBusyCreationDate to a UTCDateTime */ - /* gMagicBusyCreationDate, which the File Manager will store */ - /* on disk and which the Finder we read back using the old */ - /* APIs, whereupon the File Manager will convert it back */ - /* to local time (and hopefully get the kMagicBusyCreationDate */ - /* back!). */ -static OSErr GetMagicBusyCreateDate( UTCDateTime *date ) -{ - static UTCDateTime magicDate = { 0, 0xDEADBEEF, 0 }; - OSErr err = ( date != NULL ) ? noErr : paramErr; - - if( err == noErr && magicDate.lowSeconds == 0xDEADBEEF ) - err = ConvertLocalTimeToUTC( kMagicBusyCreationDate, &magicDate.lowSeconds ); - if( err == noErr ) - *date = magicDate; - - mycheck_noerr( err ); - - return err; -} - -/*****************************************************************************/ - -static OSErr FSGetVRefNum( const FSRef *ref, - FSVolumeRefNum *vRefNum) -{ - FSCatalogInfo catalogInfo; - OSErr err = ( ref != NULL && vRefNum != NULL ) ? noErr : paramErr; - - if( err == noErr ) /* get the volume refNum from the FSRef */ - err = FSGetCatalogInfo(ref, kFSCatInfoVolume, &catalogInfo, NULL, NULL, NULL); - if( err == noErr ) - *vRefNum = catalogInfo.volume; - - mycheck_noerr( err ); - - return err; -} - -/*****************************************************************************/ - -static OSErr FSGetVolParms( FSVolumeRefNum volRefNum, - UInt32 bufferSize, - GetVolParmsInfoBuffer *volParmsInfo, - UInt32 *actualInfoSize) /* Can Be NULL */ -{ - HParamBlockRec pb; - OSErr err = ( volParmsInfo != NULL ) ? noErr : paramErr; - - if( err == noErr ) - { - pb.ioParam.ioNamePtr = NULL; - pb.ioParam.ioVRefNum = volRefNum; - pb.ioParam.ioBuffer = (Ptr)volParmsInfo; - pb.ioParam.ioReqCount = (SInt32)bufferSize; - err = PBHGetVolParmsSync(&pb); - } - /* return number of bytes the file system returned in volParmsInfo buffer */ - if( err == noErr && actualInfoSize != NULL) - *actualInfoSize = (UInt32)pb.ioParam.ioActCount; - - mycheck_noerr( err ); - - return ( err ); -} - -/*****************************************************************************/ - -/* Converts a unicode string to a PString */ -/* If your code is only for OS X, you can use CFString functions to do all this */ -/* Since this sample code supports OS 9.1 -> OS X, I have to do this the */ -/* old fashioned way. */ -static OSErr UniStrToPStr( const HFSUniStr255 *uniStr, - TextEncoding textEncodingHint, - Boolean isVolumeName, - Str255 pStr ) -{ - UnicodeMapping uMapping; - UnicodeToTextInfo utInfo; - ByteCount unicodeByteLength = 0; - ByteCount unicodeBytesConverted; - ByteCount actualPascalBytes; - OSErr err = (uniStr != NULL && pStr != NULL) ? noErr : paramErr; - - /* make sure output is valid in case we get errors or there's nothing to convert */ - pStr[0] = 0; - - if( err == noErr ) - unicodeByteLength = uniStr->length * sizeof(UniChar); /* length can be zero, which is fine */ - if( err == noErr && unicodeByteLength != 0 ) - { - /* if textEncodingHint is kTextEncodingUnknown, get a "default" textEncodingHint */ - if ( kTextEncodingUnknown == textEncodingHint ) - { - ScriptCode script; - RegionCode region; - - script = (ScriptCode)GetScriptManagerVariable(smSysScript); - region = (RegionCode)GetScriptManagerVariable(smRegionCode); - err = UpgradeScriptInfoToTextEncoding(script, kTextLanguageDontCare, - region, NULL, &textEncodingHint ); - if ( err == paramErr ) - { /* ok, ignore the region and try again */ - err = UpgradeScriptInfoToTextEncoding(script, kTextLanguageDontCare, - kTextRegionDontCare, NULL, - &textEncodingHint ); - } - if ( err != noErr ) /* ok... try something */ - textEncodingHint = kTextEncodingMacRoman; - } - - uMapping.unicodeEncoding = CreateTextEncoding( kTextEncodingUnicodeV2_0, - kUnicodeCanonicalDecompVariant, - kUnicode16BitFormat); - uMapping.otherEncoding = GetTextEncodingBase(textEncodingHint); - uMapping.mappingVersion = kUnicodeUseHFSPlusMapping; - - err = CreateUnicodeToTextInfo(&uMapping, &utInfo); - if( err == noErr ) - { - err = ConvertFromUnicodeToText( utInfo, unicodeByteLength, uniStr->unicode, kUnicodeLooseMappingsMask, - 0, NULL, 0, NULL, /* offsetCounts & offsetArrays */ - isVolumeName ? kHFSMaxVolumeNameChars : kHFSPlusMaxFileNameChars, - &unicodeBytesConverted, &actualPascalBytes, &pStr[1]); - } - if( err == noErr ) - pStr[0] = actualPascalBytes; - - /* verify the result in debug builds -- there's really not anything you can do if it fails */ - myverify_noerr(DisposeUnicodeToTextInfo(&utInfo)); - } - - mycheck_noerr( err ); - - return ( err ); -} - -/*****************************************************************************/ - - /* Yeah I know there is FSpMakeFSRef, but this way I don't have to */ - /* actually have an FSSpec created to make the FSRef, and this is */ - /* what FSpMakeFSRef does anyways */ -static OSErr FSMakeFSRef( FSVolumeRefNum volRefNum, - SInt32 dirID, - ConstStr255Param name, - FSRef *ref ) -{ - FSRefParam pb; - OSErr err = ( ref != NULL ) ? noErr : paramErr; - - if( err == noErr ) - { - pb.ioVRefNum = volRefNum; - pb.ioDirID = dirID; - pb.ioNamePtr = (StringPtr)name; - pb.newRef = ref; - err = PBMakeFSRefSync(&pb); - } - - mycheck_noerr( err ); - - return ( err ); -} - -/*****************************************************************************/ - - /* This checks the destination to see if an object of the same name as the source */ - /* exists or not. If it does we have to special handle the DupeActions */ - /* */ - /* If kDupeActionReplace we move aside the object by renameing it to ".DeleteMe" */ - /* so that it will be invisible (X only), and give a suggestion on what to do with */ - /* it if for some unknown reason it survives the copy and the user finds it. This */ - /* rename is mainly done to handle the case where the source is in the destination */ - /* and the user wants to replace. Basically keeping the source around throughout */ - /* the copy, deleting it afterwards. Its also done cause its a good idea not to */ - /* dispose of the existing object in case the copy fails */ - /* */ - /* If kDupeActionRename, we create a unique name for the new object and pass */ - /* it back to the caller */ -static OSErr SetupDestination( const FSRef *destDir, - const DupeAction dupeAction, - HFSUniStr255 *sourceName, - FSRef *deleteMeRef, - Boolean *isReplacing ) -{ - FSRef tmpRef; - OSErr err; - - /* check if an object of the same name already exists in the destination */ - err = FSMakeFSRefUnicode( destDir, sourceName->length, sourceName->unicode, kTextEncodingUnknown, &tmpRef ); - if( err == noErr ) - { /* if the user wants to replace the existing */ - /* object, rename it to .DeleteMe first. Delete it */ - if( dupeAction == kDupeActionReplace ) /* only after copying the new one successfully */ - { - err = FSRenameUnicode( &tmpRef, 9, (UniChar*)"\0.\0D\0e\0l\0e\0t\0e\0M\0e", kTextEncodingMacRoman, deleteMeRef ); - *isReplacing = ( err == noErr ) ? true : false; - } - else if( dupeAction == kDupeActionRename ) /* if the user wants to just rename it */ - err = GetUniqueName( destDir, sourceName ); /* then we get a unique name for the new object */ - } - else if ( err == fnfErr ) /* if no object exists then */ - err = noErr; /* continue with no error */ - - return err; -} - -/*****************************************************************************/ - - /* Given a directory and a name, GetUniqueName will check if an object */ - /* with the same name already exists, and if it does it will create */ - /* a new, unique name for and return it. */ - /* it simply appends a number to the end of the name. It is not */ - /* fool proof, and it is limited... I'll take care of that in a */ - /* later release */ - /* If anyone has any suggestions/better techniques I would love to hear */ - /* about them */ -static OSErr GetUniqueName( const FSRef *destDir, - HFSUniStr255 *sourceName ) -{ - HFSUniStr255 tmpName = *sourceName; - FSRef tmpRef; - unsigned char hexStr[17] = "123456789"; /* yeah, only 9... I'm lazy, sosumi */ - long count = 0; - int index; - OSErr err; - - /* find the dot, if there is one */ - for( index = tmpName.length; index >= 0 && tmpName.unicode[index] != (UniChar) '.'; index-- ) { /* Do Nothing */ } - - if( index <= 0) /* no dot or first char is a dot (invisible file), so append to end of name */ - index = tmpName.length; - else /* shift the extension up two spots to make room for our digits */ - BlockMoveData( tmpName.unicode + index, tmpName.unicode + index + 2, (tmpName.length - index) * 2 ); - - /* add the space to the name */ - tmpName.unicode[ index ] = (UniChar)' '; - /* we're adding two characters to the name */ - tmpName.length += 2; - - do { /* add the digit to the name */ - tmpName.unicode[ index + 1 ] = hexStr[count]; - /* check if the file with this new name already exists */ - err = FSMakeFSRefUnicode( destDir, tmpName.length, tmpName.unicode, kTextEncodingUnknown, &tmpRef ); - count++; - } while( err == noErr && count < 10 ); - - if( err == fnfErr ) - { - err = noErr; - *sourceName = tmpName; - } - - return err; -} - -/*****************************************************************************/ - -static OSErr GetObjectName( const FSRef *sourceRef, - HFSUniStr255 *sourceName, /* can be NULL */ - TextEncoding *sourceEncoding ) /* can be NULL */ -{ - FSCatalogInfo catInfo; - FSCatalogInfoBitmap whichInfo = (sourceEncoding != NULL) ? kFSCatInfoTextEncoding : kFSCatInfoNone; - OSErr err; - - err = FSGetCatalogInfo( sourceRef, whichInfo, &catInfo, sourceName, NULL, NULL ); - if( err == noErr && sourceEncoding != NULL ) - *sourceEncoding = catInfo.textEncodingHint; - - return err; -} - -/*****************************************************************************/ - -static OSErr CreateFolder( const FSRef *sourceRef, - const FSRef *destDirRef, - const FSCatalogInfo *catalogInfo, - const HFSUniStr255 *folderName, - CopyParams *params, - FSRef *newFSRefPtr, - FSSpec *newFSSpecPtr ) -{ - FSCatalogInfo tmpCatInfo; - FSPermissionInfo origPermissions; - OSErr err = ( sourceRef != NULL && destDirRef != NULL && catalogInfo != NULL && - folderName != NULL && newFSRefPtr != NULL ) ? noErr : paramErr; - - if( err == noErr ) - { /* store away the catInfo, create date and permissions on the orig folder */ - tmpCatInfo = *catalogInfo; - origPermissions = *((FSPermissionInfo*)catalogInfo->permissions); - } - if( err == noErr ) /* create the new folder */ - err = DoCreateFolder( sourceRef, destDirRef, &tmpCatInfo, folderName, params, newFSRefPtr, newFSSpecPtr ); - if( err == noErr && !params->copyingToDropFolder ) - { /* if its not a drop box, set the permissions on the new folder */ - *((FSPermissionInfo*)tmpCatInfo.permissions) = origPermissions; - err = FSSetCatalogInfo( newFSRefPtr, kFSCatInfoPermissions, &tmpCatInfo ); - } - - mycheck_noerr( err ); - - return err; -} - -/*****************************************************************************/ - -static OSErr DoCreateFolder(const FSRef *sourceRef, - const FSRef *destDirRef, - const FSCatalogInfo *catalogInfo, - const HFSUniStr255 *folderName, - CopyParams *params, - FSRef *newFSRefPtr, - FSSpec *newFSSpecPtr) -{ - FSCatalogInfo catInfo = *catalogInfo; - OSErr err; - - /* Clear the "inited" bit so that the Finder positions the icon for us. */ - ((FInfo *)(catInfo.finderInfo))->fdFlags &= ~kHasBeenInited; - - /* we need to have user level read/write/execute access to the folder we are going to create, */ - /* otherwise FSCreateDirectoryUnicode will return -5000 (afpAccessDenied), */ - /* and the FSRef returned will be invalid, yet the folder is created... bug? */ - ((FSPermissionInfo*) catInfo.permissions)->mode |= kRWXUserAccessMask; - - err = FSCreateDirectoryUnicode( destDirRef, folderName->length, - folderName->unicode, kFSCatInfoSettableInfo, - &catInfo, newFSRefPtr, - newFSSpecPtr, NULL); - - /* With the new APIs, folders can have forks as well as files. Before */ - /* we start copying items in the folder, we must copy over the forks */ - /* Currently, MacOS doesn't support any file systems that have forks in */ - /* folders, but the API supports it so (for possible future */ - /* compatability) I kept this in here. */ - if( err == noErr ) - err = CopyForks( sourceRef, newFSRefPtr, params ); - - mycheck_noerr( err ); - - return err; -} - -/*****************************************************************************/ - - /* This is the DisposeDataProc that is used by the GenLinkedList in FSCopyFolder */ - /* Simply disposes of the data we created and returns */ -static pascal void MyDisposeDataProc( void *pData ) -{ - if( pData != NULL ) - DisposePtr( (char*) pData ); -} - -/*****************************************************************************/ - - /* This is the DisposeDataProc that is used by the GenLinkedList in CopyItemForks */ - /* Simply closes the resource fork (if opened, != 0) and disposes of the memory */ -static pascal void MyCloseForkProc( void *pData ) -{ - SInt16 refNum; - - if( pData == NULL ) - return; - - refNum = ((ForkTrackerPtr)pData)->forkDestRefNum; - if( refNum != 0 ) - myverify_noerr( FSCloseFork( refNum ) ); /* the fork was opened, so close it */ - - DisposePtr( (char*) pData ); -} diff --git a/wolf3d/code/iphone/FSCopyObject.h b/wolf3d/code/iphone/FSCopyObject.h deleted file mode 100644 index 3189f00..0000000 --- a/wolf3d/code/iphone/FSCopyObject.h +++ /dev/null @@ -1,258 +0,0 @@ -/* - File: FSCopyObject.h - - Contains: A Copy/Delete Files/Folders engine which uses the HFS+ API's - - Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. - ("Apple") in consideration of your agreement to the following terms, and your - use, installation, modification or redistribution of this Apple software - constitutes acceptance of these terms. If you do not agree with these terms, - please do not use, install, modify or redistribute this Apple software. - - In consideration of your agreement to abide by the following terms, and subject - to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs - copyrights in this original Apple software (the "Apple Software"), to use, - reproduce, modify and redistribute the Apple Software, with or without - modifications, in source and/or binary forms; provided that if you redistribute - the Apple Software in its entirety and without modifications, you must retain - this notice and the following text and disclaimers in all such redistributions of - the Apple Software. Neither the name, trademarks, service marks or logos of - Apple Computer, Inc. may be used to endorse or promote products derived from the - Apple Software without specific prior written permission from Apple. Except as - expressly stated in this notice, no other rights or licenses, express or implied, - are granted by Apple herein, including but not limited to any patent rights that - may be infringed by your derivative works or by other works in which the Apple - Software may be incorporated. - - The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO - WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED - WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN - COMBINATION WITH YOUR PRODUCTS. - - IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION - OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT - (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Copyright © 2002-2004 Apple Computer, Inc., All Rights Reserved -*/ - - -#ifndef __FSCOPYOBJECT_H__ -#define __FSCOPYOBJECT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#if TARGET_API_MAC_OSX || defined( __APPLE_CC__ ) -#include -#endif - -#define DEBUG 1 /* set to zero if you don't want debug spew */ - -#if DEBUG - #include - - #define QuoteExceptionString(x) #x - - #define dwarning(s) do { printf s; fflush(stderr); } while( 0 ) - - #define mycheck_noerr( error ) \ - do { \ - if( (OSErr) error != noErr ) { \ - dwarning((QuoteExceptionString(error) " != noErr in File: %s, Function: %s, Line: %d, Error: %d\n", \ - __FILE__, __FUNCTION__, __LINE__, (OSErr) error)); \ - } \ - } while( false ) - - #define mycheck( assertion ) \ - do { \ - if( ! assertion ) { \ - dwarning((QuoteExceptionString(assertion) " failed in File: %s, Function: %s, Line: %d\n", \ - __FILE__, __FUNCTION__, __LINE__)); \ - } \ - } while( false ) - - #define myverify(assertion) mycheck(assertion) - #define myverify_noerr(assertion) mycheck_noerr( (assertion) ) -#else - #define dwarning(s) - - #define mycheck(assertion) - #define mycheck_noerr(err) - #define myverify(assertion) do { (void) (assertion); } while (0) - #define myverify_noerr(assertion) myverify(assertion) -#endif - -/* - This code takes some tricks/techniques from MoreFilesX (by Jim Luther) and - MPFileCopy (by Quinn), wraps them all up into an easy to use API, and adds a bunch of - features and bug fixes. It will run on Mac OS 9.1 through 9.2.x and 10.1.x - and up (Classic, Carbon and Mach-O) -*/ - - /* Different options that FSCopyObject can take during a copy */ -typedef UInt32 DupeAction; -enum { - kDupeActionStandard, /* will do the copy with no frills */ - kDupeActionReplace, /* will delete the existing object and then copy over the new one */ - kDupeActionRename /* will rename the new object if an object of the same name exists */ -}; - -/*****************************************************************************/ - -#pragma mark CopyObjectFilterProcPtr - -/* - This is the prototype for the CallCopyObjectFilterProc function which - is called once for each file and directory found by FSCopyObject. - The CallCopyObjectFilterProc can use the read-only data it receives for - whatever it wants. - - The result of the CallCopyObjectFilterProc function indicates if - the copy should be stopped. To stop the copy, return an error; to continue - the copy, return noErr. - - The yourDataPtr parameter can point to whatever data structure you might - want to access from within the CallCopyObjectFilterProc. - - Note: If an error had occured during the copy of the current object - (currentOSErr != noErr) the FSRef etc might not be valid - - containerChanged --> Set to true if the container's contents changed - during iteration. - currentLevel --> The current recursion level into the container. - 1 = the container, 2 = the container's immediate - subdirectories, etc. - currentOSErr --> The current error code, shows the results of the - copy of the current object (ref) - catalogInfo --> The catalog information for the current object. - Only the fields requested by the whichInfo - parameter passed to FSIterateContainer are valid. - ref --> The FSRef to the current object. - spec --> The FSSpec to the current object if the wantFSSpec - parameter passed to FSCopyObject is true. - name --> The name of the current object if the wantName - parameter passed to FSCopyObject is true. - yourDataPtr --> An optional pointer to whatever data structure you - might want to access from within the - CallCopyObjectFilterProc. - result <-- To continue the copy, return noErr - - __________ - - Also see: FSCopyObject -*/ - -typedef CALLBACK_API( OSErr , CopyObjectFilterProcPtr ) ( - Boolean containerChanged, - ItemCount currentLevel, - OSErr currentOSErr, - const FSCatalogInfo *catalogInfo, - const FSRef *ref, - const FSSpec *spec, - const HFSUniStr255 *name, - void *yourDataPtr); - - -/*****************************************************************************/ - -#pragma mark CallCopyObjectFilterProc - -#define CallCopyObjectFilterProc(userRoutine, containerChanged, currentLevel, currentOSErr, catalogInfo, ref, spec, name, yourDataPtr) \ - (*(userRoutine))((containerChanged), (currentLevel), (currentOSErr), (catalogInfo), (ref), (spec), (name), (yourDataPtr)) - -/*****************************************************************************/ - -#pragma mark FSCopyObject - -/* - The FSCopyObject function takes a source object (can be a file or directory) - and copies it (and its contents if it's a directory) to the new destination - directory. - - It will call your CopyObjectFilterProcPtr once for each object copied - - The maxLevels parameter is only used when the object is a directory, - ignored otherwise. - It lets you control how deep the recursion goes. - If maxLevels is 1, FSCopyObject only scans the specified directory; - if maxLevels is 2, FSCopyObject scans the specified directory and - one subdirectory below the specified directory; etc. Set maxLevels to - zero to scan all levels. - - The yourDataPtr parameter can point to whatever data structure you might - want to access from within your CopyObjectFilterProcPtr. - - source --> The FSRef to the object you want to copy - destDir --> The FSRef to the directory you wish to copy source to - maxLevels --> Maximum number of directory levels to scan or - zero to scan all directory levels, ignored if the - object is a file - whichInfo --> The fields of the FSCatalogInfo you wish passed - to you in your CopyObjectFilterProc - dupeAction --> The action to take if an object of the same name exists - in the destination - newName --> The name you want the new object to have. If you pass - in NULL, the source object name will be used. - wantFSSpec --> Set to true if you want the FSSpec to each - object passed to your CopyObjectFilterProc. - wantName --> Set to true if you want the name of each - object passed to your CopyObjectFilterProc. - filterProcPtr --> A pointer to the CopyObjectFilterProc you - want called once for each object found - by FSCopyObject. - yourDataPtr --> An optional pointer to whatever data structure you - might want to access from within the - CopyObjectFilterProc. - newObjectRef --> An optional pointer to an FSRef that, on return, - references the new object. If you don't want this - info returned, pass in NULL - newObjectSpec --> An optional pointer to an FSSPec that, on return, - references the new object. If you don't want this - info returned, pass in NULL -*/ - -OSErr FSCopyObject( const FSRef *source, - const FSRef *destDir, - ItemCount maxLevels, - FSCatalogInfoBitmap whichInfo, - DupeAction dupeAction, - const HFSUniStr255 *newName, /* can be NULL */ - Boolean wantFSSpec, - Boolean wantName, - CopyObjectFilterProcPtr filterProcPtr, /* can be NULL */ - void *yourDataPtr, /* can be NULL */ - FSRef *newObjectRef, /* can be NULL */ - FSSpec *newObjectSpec); /* can be NULL */ - -/*****************************************************************************/ - -#pragma mark FSDeleteObjects - -/* - The FSDeleteObjects function takes an FSRef to a file or directory - and attempts to delete it. If the object is a directory, all files - and subdirectories in the specified directory are deleted. If a - locked file or directory is encountered, it is unlocked and then - deleted. After deleting the directory's contents, the directory - is deleted. If any unexpected errors are encountered, - FSDeleteContainer quits and returns to the caller. - - source --> FSRef to an object (can be file or directory). - - __________ -*/ - -OSErr FSDeleteObjects( const FSRef *source ); - -#ifdef __cplusplus -} -#endif - -#endif \ No newline at end of file diff --git a/wolf3d/code/iphone/GenLinkedList.c b/wolf3d/code/iphone/GenLinkedList.c deleted file mode 100644 index 50a3761..0000000 --- a/wolf3d/code/iphone/GenLinkedList.c +++ /dev/null @@ -1,212 +0,0 @@ -/* - File: GenLinkedList.c - - Contains: Linked List utility routines - - Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. - ("Apple") in consideration of your agreement to the following terms, and your - use, installation, modification or redistribution of this Apple software - constitutes acceptance of these terms. If you do not agree with these terms, - please do not use, install, modify or redistribute this Apple software. - - In consideration of your agreement to abide by the following terms, and subject - to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs - copyrights in this original Apple software (the "Apple Software"), to use, - reproduce, modify and redistribute the Apple Software, with or without - modifications, in source and/or binary forms; provided that if you redistribute - the Apple Software in its entirety and without modifications, you must retain - this notice and the following text and disclaimers in all such redistributions of - the Apple Software. Neither the name, trademarks, service marks or logos of - Apple Computer, Inc. may be used to endorse or promote products derived from the - Apple Software without specific prior written permission from Apple. Except as - expressly stated in this notice, no other rights or licenses, express or implied, - are granted by Apple herein, including but not limited to any patent rights that - may be infringed by your derivative works or by other works in which the Apple - Software may be incorporated. - - The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO - WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED - WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN - COMBINATION WITH YOUR PRODUCTS. - - IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION - OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT - (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Copyright © 2003-2004 Apple Computer, Inc., All Rights Reserved -*/ - -#include "GenLinkedList.h" - -#pragma mark --- Data Structures --- - - /* This is the internal data structure for the nodes in the linked list. */ - /* */ - /* Note: The memory pointed to by pNext is owned by the list and is disposed of */ - /* in DestroyList. It should not be disposed of in any other way. */ - /* */ - /* Note: The memory pointed to by pData is owned by the caller of the linked */ - /* list. The caller is responsible for disposing of this memory. This can be */ - /* done by simply implementing a DisposeDataProc that will be called on each */ - /* node in the list, giving the caller a chance to dispose of any memory */ - /* created. The DisposeDataProc is called from DestroyList */ -struct GenNode -{ - struct GenNode *pNext; /* Pointer to the next node in the list */ - GenDataPtr pData; /* The data for this node, owned by caller */ -}; -typedef struct GenNode GenNode; - -#pragma mark --- List Implementation --- - - /* Initializes the given GenLinkedList to an empty list. This MUST be */ - /* called before any operations are performed on the list, otherwise bad things */ - /* will happen. */ -void InitLinkedList( GenLinkedList *pList, DisposeDataProcPtr disposeProcPtr) -{ - if( pList == NULL ) - return; - - pList->pHead = pList->pTail = NULL; - pList->NumberOfItems = 0; - pList->DisposeProcPtr = disposeProcPtr; -} - - /* returns the current number of items in the given list. */ - /* If pList == NULL, it returns 0 */ -ItemCount GetNumberOfItems( GenLinkedList *pList ) -{ - return (pList) ? pList->NumberOfItems : 0; -} - - /* Creates a new node, containing pData, and adds it to the tail of pList. */ - /* Note: if an error occurs, pList is unchanged. */ -OSErr AddToTail( GenLinkedList *pList, void *pData ) -{ - OSErr err = paramErr; - GenNode *tmpNode = NULL; - - if( pList == NULL || pData == NULL ) - return err; - - /* create memory for new node, if this fails we _must_ bail */ - err = ( ( tmpNode = (GenNode*) NewPtr( sizeof( GenNode ) ) ) != NULL ) ? noErr : MemError(); - if( err == noErr ) - { - tmpNode->pData = pData; /* Setup new node */ - tmpNode->pNext = NULL; - - if( pList->pTail != NULL ) /* more then one item already */ - ((GenNode*) pList->pTail)->pNext = (void*) tmpNode; /* so append to tail */ - else - pList->pHead = (void*) tmpNode; /* no items, so adjust head */ - - pList->pTail = (void*) tmpNode; - pList->NumberOfItems += 1; - } - - return err; -} - - /* Takes pSrcList and inserts it into pDestList at the location pIter points to. */ - /* The lists must have the same DisposeProcPtr, but the Data can be different. If pSrcList */ - /* is empty, it does nothing and just returns */ - /* */ - /* If pIter == NULL, insert pSrcList before the head */ - /* else If pIter == pTail, append pSrcList to the tail */ - /* else insert pSrcList in the middle somewhere */ - /* On return: pSrcList is cleared and is an empty list. */ - /* The data that was owned by pSrcList is now owned by pDestList */ -void InsertList( GenLinkedList *pDestList, GenLinkedList *pSrcList, GenIteratorPtr pIter ) -{ - if( pDestList == NULL || pSrcList == NULL || - pSrcList->pHead == NULL || pSrcList->pTail == NULL || - pDestList->DisposeProcPtr != pSrcList->DisposeProcPtr ) - return; - - if( pDestList->pHead == NULL && pDestList->pTail == NULL ) /* empty list */ - { - pDestList->pHead = pSrcList->pHead; - pDestList->pTail = pSrcList->pTail; - } - else if( pIter == NULL ) /* insert before head */ - { - /* attach the list */ - ((GenNode*)pSrcList->pTail)->pNext = pDestList->pHead; - /* fix up head */ - pDestList->pHead = pSrcList->pHead; - } - else if( pIter == pDestList->pTail ) /* append to tail */ - { - /* attach the list */ - ((GenNode*)pDestList->pTail)->pNext = pSrcList->pHead; - /* fix up tail */ - pDestList->pTail = pSrcList->pTail; - } - else /* insert in middle somewhere */ - { - GenNode *tmpNode = ((GenNode*)pIter)->pNext; - ((GenNode*)pIter)->pNext = pSrcList->pHead; - ((GenNode*)pSrcList->pTail)->pNext = tmpNode; - } - - pDestList->NumberOfItems += pSrcList->NumberOfItems; /* sync up NumberOfItems */ - - InitLinkedList( pSrcList, NULL); /* reset the source list */ -} - - /* Goes through the list and disposes of any memory we allocated. Calls the DisposeProcPtr,*/ - /* if it exists, to give the caller a chance to free up their memory */ -void DestroyList( GenLinkedList *pList ) -{ - GenIteratorPtr pIter = NULL, - pNextIter = NULL; - - if( pList == NULL ) - return; - - for( InitIterator( pList, &pIter ), pNextIter = pIter; pIter != NULL; pIter = pNextIter ) - { - Next( &pNextIter ); /* get the next node before we blow away the link */ - - if( pList->DisposeProcPtr != NULL ) - CallDisposeDataProc( pList->DisposeProcPtr, GetData( pIter ) ); - DisposePtr( (char*) pIter ); - } - - InitLinkedList( pList, NULL); -} - -/*#############################################*/ -/*#############################################*/ -/*#############################################*/ - -#pragma mark - -#pragma mark --- Iterator Implementation --- - - /* Initializes pIter to point at the head of pList */ - /* This must be called before performing any operations with pIter */ -void InitIterator( GenLinkedList *pList, GenIteratorPtr *pIter ) -{ - if( pList != NULL && pIter != NULL ) - *pIter = pList->pHead; -} - - /* On return, pIter points to the next node in the list. NULL if its gone */ - /* past the end of the list */ -void Next( GenIteratorPtr *pIter ) -{ - if( pIter != NULL ) - *pIter = ((GenNode*)*pIter)->pNext; -} - - /* Returns the data of the current node that pIter points to */ -GenDataPtr GetData( GenIteratorPtr pIter ) -{ - return ( pIter != NULL ) ? ((GenNode*)pIter)->pData : NULL; -} diff --git a/wolf3d/code/iphone/GenLinkedList.h b/wolf3d/code/iphone/GenLinkedList.h deleted file mode 100644 index c6dd69a..0000000 --- a/wolf3d/code/iphone/GenLinkedList.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - File: GenLinkedList.h - - Contains: Linked List utility routines prototypes - - Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. - ("Apple") in consideration of your agreement to the following terms, and your - use, installation, modification or redistribution of this Apple software - constitutes acceptance of these terms. If you do not agree with these terms, - please do not use, install, modify or redistribute this Apple software. - - In consideration of your agreement to abide by the following terms, and subject - to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs - copyrights in this original Apple software (the "Apple Software"), to use, - reproduce, modify and redistribute the Apple Software, with or without - modifications, in source and/or binary forms; provided that if you redistribute - the Apple Software in its entirety and without modifications, you must retain - this notice and the following text and disclaimers in all such redistributions of - the Apple Software. Neither the name, trademarks, service marks or logos of - Apple Computer, Inc. may be used to endorse or promote products derived from the - Apple Software without specific prior written permission from Apple. Except as - expressly stated in this notice, no other rights or licenses, express or implied, - are granted by Apple herein, including but not limited to any patent rights that - may be infringed by your derivative works or by other works in which the Apple - Software may be incorporated. - - The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO - WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED - WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN - COMBINATION WITH YOUR PRODUCTS. - - IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION - OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT - (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Copyright © 2003-2004 Apple Computer, Inc., All Rights Reserved -*/ - - -#ifndef __GENLINKEDLIST__ -#define __GENLINKEDLIST__ - -#ifdef __cplusplus -extern "C" { -#endif - -#if TARGET_API_MAC_OSX || defined( __APPLE_CC__ ) -#include -#endif - -/* This is a quick, simple and generic linked list implementation. I tried */ -/* to setup the code so that you could use any linked list implementation you */ -/* want. They just need to support these few functions. */ - -typedef void* GenIteratorPtr; -typedef void* GenDataPtr; - - /* This is a callback that is called from DestroyList for each node in the */ - /* list. It gives the caller the oportunity to free any memory they might */ - /* allocated in each node. */ -typedef CALLBACK_API( void , DisposeDataProcPtr ) ( GenDataPtr pData ); - -#define CallDisposeDataProc( userRoutine, pData ) (*(userRoutine))((pData)) - -struct GenLinkedList -{ - GenDataPtr pHead; /* Pointer to the head of the list */ - GenDataPtr pTail; /* Pointer to the tail of the list */ - ItemCount NumberOfItems; /* Number of items in the list (mostly for debugging) */ - DisposeDataProcPtr DisposeProcPtr; /* rountine called to dispose of caller data, can be NULL */ -}; -typedef struct GenLinkedList GenLinkedList; - -void InitLinkedList ( GenLinkedList *pList, DisposeDataProcPtr disposeProcPtr ); -ItemCount GetNumberOfItems( GenLinkedList *pList ); -OSErr AddToTail ( GenLinkedList *pList, GenDataPtr pData ); -void InsertList ( GenLinkedList *pDestList, GenLinkedList *pSrcList, GenIteratorPtr pIter ); -void DestroyList ( GenLinkedList *pList ); - -void InitIterator ( GenLinkedList *pList, GenIteratorPtr *pIter ); -void Next ( GenIteratorPtr *pIter ); -GenDataPtr GetData ( GenIteratorPtr pIter ); - -#ifdef __cplusplus -} -#endif - -#endif \ No newline at end of file diff --git a/wolf3d/code/iphone/Info.plist b/wolf3d/code/iphone/Info.plist index 87d0c63..6cfb776 100644 --- a/wolf3d/code/iphone/Info.plist +++ b/wolf3d/code/iphone/Info.plist @@ -15,7 +15,7 @@ WOLF_72 CFBundleIdentifier - com.idsoftware.${PRODUCT_NAME:identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -36,8 +36,12 @@ UIInterfaceOrientation UIInterfaceOrientationLandscapeLeft + UILaunchStoryboardName + Launch Screen UIPrerenderedIcon + UIRequiresFullScreen + UIStatusBarHidden UISupportedInterfaceOrientations @@ -47,8 +51,8 @@ UISupportedInterfaceOrientations~ipad - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationLandscapeLeft diff --git a/wolf3d/code/iphone/Launch Screen.storyboard b/wolf3d/code/iphone/Launch Screen.storyboard new file mode 100644 index 0000000..7c2f962 --- /dev/null +++ b/wolf3d/code/iphone/Launch Screen.storyboard @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wolf3d/code/iphone/LegalView.xib b/wolf3d/code/iphone/LegalView.xib index b9545d6..b121da9 100644 --- a/wolf3d/code/iphone/LegalView.xib +++ b/wolf3d/code/iphone/LegalView.xib @@ -1,657 +1,134 @@ - - - 1056 - 10K549 - 851 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - YES - - - 292 - {480, 320} - - NO - IBCocoaTouchFramework - - NSImage - credits_bg.png - - - - - 292 - {{245, 14}, {134, 52}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Legal - - POSITYPE-idSettler_v10.2 - 36 - 16 - - - 3 - MQA - - - - 1 - MCAwIDAAA - - {2, 2} - 1 - 10 - 1 - - - - 292 - {{20, 265}, {32, 32}} - - 1 - NO - IBCocoaTouchFramework - - NSImage - back_arrow.png - - - - - 292 - {{20, 243}, {66, 29}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - BACK - - POSITYPE-idSettler_v10.2 - 18 - 16 - - - - 1 - 10 - 5 - - - - 301 - {{6, 239}, {69, 69}} - - NO - NO - 1 - IBCocoaTouchFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - NSImage - button_highlight.png - - - - - 292 - {{185, 59}, {255, 242}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Wolfenstein® 3D Classic Platinum© 2009-2011 id Software LLC, a ZeniMax Media company. Wolfenstein, id, id Software, id Tech and related logos are registered trademarks or trademarks of id Software LLC in the U.S. and/or other countries. Bethesda, Bethesda Softworks, ZeniMax and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the U.S. and/or other countries. All Rights Reserved. - - POSITYPE-idSettler_v10.2 - 14 - 16 - - - 1 - MSAxIDEAA - - 1 - - - - - 1 - 10 - 12 - 1 - 0 - - - - 292 - {{163, 69}, {298, 7}} - - NO - IBCocoaTouchFramework - - NSImage - settings_divider.png - - - - {480, 320} - - - 3 - MAA - - - 3 - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 3 - - - - back: - - - 7 - - 12 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 4 - - - - - 7 - - - - - 10 - - - - - 11 - - - - - 9 - - - - - 18 - - - - - 19 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 10.IBPluginDependency - 10.IBViewBoundsToFrameTransform - 11.CustomClassName - 11.IBPluginDependency - 11.IBViewBoundsToFrameTransform - 18.IBPluginDependency - 19.IBPluginDependency - 4.CustomClassName - 4.IBPluginDependency - 4.IBViewBoundsToFrameTransform - 7.IBPluginDependency - 7.IBViewBoundsToFrameTransform - 9.IBPluginDependency - 9.IBViewBoundsToFrameTransform - - - YES - LegalViewController - UIResponder - {{369, 805}, {480, 320}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABChgAAw5EAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABChgAAw4SAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDLQAAwpQAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAw58AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUDAAABDbwAAA - - - - - YES - - - YES - - - - - YES - - - YES - - - - 19 - - - - YES - - LegalViewController - UIViewController - - back: - id - - - back: - - back: - id - - - - IBProjectSource - LegalViewController.h - - - - UIFontLabel - UILabel - - IBProjectSource - UIFontLabel.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - wolf3d.xcodeproj - 3 - - YES - - YES - back_arrow.png - button_highlight.png - credits_bg.png - settings_divider.png - - - YES - {65, 63} - {4, 4} - {960, 640} - {597, 13} - - - 141 - - + + + + + + + + + + + + Helvetica-Bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wolf3d/code/iphone/LegalViewController.m b/wolf3d/code/iphone/LegalViewController.m index 4d27604..86d7951 100644 --- a/wolf3d/code/iphone/LegalViewController.m +++ b/wolf3d/code/iphone/LegalViewController.m @@ -50,13 +50,6 @@ } */ -// Override to allow orientations other than the default portrait orientation. -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - // Return YES for supported orientations. - return UIInterfaceOrientationIsLandscape(interfaceOrientation); -} - - - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; @@ -64,13 +57,6 @@ // Release any cached data, images, etc. that aren't in use. } -- (void)viewDidUnload { - [super viewDidUnload]; - // Release any retained subviews of the main view. - // e.g. self.myOutlet = nil; -} - - - (void)dealloc { [super dealloc]; } diff --git a/wolf3d/code/iphone/LevelSelectView.xib b/wolf3d/code/iphone/LevelSelectView.xib index 01cfd72..73015e6 100644 --- a/wolf3d/code/iphone/LevelSelectView.xib +++ b/wolf3d/code/iphone/LevelSelectView.xib @@ -1,976 +1,193 @@ - - - 1056 - 10K549 - 851 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - YES - - - 256 - {480, 320} - - NO - YES - 1 - YES - IBCocoaTouchFramework - - NSImage - episode_bg.png - - - - - 292 - {{32, 260}, {32, 32}} - - 1 - NO - IBCocoaTouchFramework - - NSImage - back_arrow.png - - - - - 292 - {{421, 260}, {32, 32}} - - 1 - NO - IBCocoaTouchFramework - - NSImage - next_arrow.png - - - - - 292 - {{31, 237}, {66, 29}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - BACK - - POSITYPE-idSettler_v10.2 - 18 - 16 - - - 3 - MQA - - - 1 - 10 - 5 - - - - 292 - {{420, 237}, {66, 29}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - PLAY - - - - 1 - 10 - 5 - - - - 292 - {{92, 13}, {102, 29}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - MISSION - - POSITYPE-idSettler_v10.2 - 24 - 16 - - - - 1 - 10 - - - - 301 - {{23, 238}, {52, 56}} - - - 3 - MC42NjY2NjY2NjY3IDAAA - - NO - NO - 1 - IBCocoaTouchFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - NSImage - button_highlight.png - - - - - 301 - {{412, 238}, {52, 56}} - - NO - NO - 1 - IBCocoaTouchFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - - 274 - {{92, 42}, {297, 246}} - - - 3 - MCAwAA - - YES - IBCocoaTouchFramework - YES - NO - 2 - 0 - YES - 38 - - - - 274 - {{217, 296}, {46, 24}} - - NO - NO - 1 - IBCocoaTouchFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - NSImage - down_arrow.png - - - - - 274 - {{217, 8}, {46, 24}} - - NO - NO - 1 - IBCocoaTouchFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - NSImage - up_arrow.png - - - - {480, 320} - - - - 3 - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 4 - - - - next: - - - 7 - - 24 - - - - back: - - - 7 - - 25 - - - - dataSource - - - - 35 - - - - delegate - - - - 36 - - - - missionList - - - - 37 - - - - pageDown: - - - 7 - - 56 - - - - pageUp: - - - 7 - - 57 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 13 - - - - - 14 - - - - - 15 - - - - - 16 - - - - - 20 - - - - - 21 - - - - - 22 - - - - - 23 - - - - - 34 - - - Mission List - - - 54 - - - - - 55 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 1.IBUserGuides - 14.CustomClassName - 14.IBPluginDependency - 14.IBViewBoundsToFrameTransform - 15.CustomClassName - 15.IBPluginDependency - 15.IBViewBoundsToFrameTransform - 16.CustomClassName - 16.IBPluginDependency - 16.IBViewBoundsToFrameTransform - 20.IBPluginDependency - 20.IBViewBoundsToFrameTransform - 21.IBPluginDependency - 21.IBViewBoundsToFrameTransform - 22.IBPluginDependency - 22.IBViewBoundsToFrameTransform - 23.IBPluginDependency - 23.IBViewBoundsToFrameTransform - 34.IBPluginDependency - 54.IBPluginDependency - 54.IBViewBoundsToFrameTransform - 55.IBPluginDependency - 55.IBViewBoundsToFrameTransform - - - YES - LevelSelectViewController - UIResponder - {{299, 832}, {480, 320}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - YES - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUIEAABDbQAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUK4AABBUAAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCuAAAw4QAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBuAAAw5GAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUIUAABDg4AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDzgAAw5GAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUPSgABDg4AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUNhAABDmAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUNhAABBgAAAA - - - - - YES - - - YES - - - - - YES - - - YES - - - - 57 - - - - YES - - LevelSelectViewController - UIViewController - - YES - - YES - back: - next: - pageDown: - pageUp: - selectDifficulty1: - selectDifficulty2: - selectDifficulty3: - selectDifficulty4: - - - YES - id - id - id - id - id - id - id - id - - - - YES - - YES - back: - next: - pageDown: - pageUp: - selectDifficulty1: - selectDifficulty2: - selectDifficulty3: - selectDifficulty4: - - - YES - - back: - id - - - next: - id - - - pageDown: - id - - - pageUp: - id - - - selectDifficulty1: - id - - - selectDifficulty2: - id - - - selectDifficulty3: - id - - - selectDifficulty4: - id - - - - - YES - - YES - difficultyBox - difficultyText1 - difficultyText2 - difficultyText3 - difficultyText4 - missionList - - - YES - UIView - UIView - UIView - UIView - UIView - UITableView - - - - YES - - YES - difficultyBox - difficultyText1 - difficultyText2 - difficultyText3 - difficultyText4 - missionList - - - YES - - difficultyBox - UIView - - - difficultyText1 - UIView - - - difficultyText2 - UIView - - - difficultyText3 - UIView - - - difficultyText4 - UIView - - - missionList - UITableView - - - - - IBProjectSource - LevelSelectViewController.h - - - - UIFontLabel - UILabel - - IBProjectSource - UIFontLabel.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UIScrollView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIScrollView.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UITableView - UIScrollView - - IBFrameworkSource - UIKit.framework/Headers/UITableView.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - wolf3d.xcodeproj - 3 - - YES - - YES - back_arrow.png - button_highlight.png - down_arrow.png - episode_bg.png - next_arrow.png - up_arrow.png - - - YES - {65, 63} - {4, 4} - {80, 36} - {480, 320} - {65, 63} - {80, 36} - - - 141 - - + + + + + + + + + + + + Helvetica-Bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wolf3d/code/iphone/LevelSelectViewController.m b/wolf3d/code/iphone/LevelSelectViewController.m index 8f8b07a..22b1072 100644 --- a/wolf3d/code/iphone/LevelSelectViewController.m +++ b/wolf3d/code/iphone/LevelSelectViewController.m @@ -102,7 +102,7 @@ UITableView interface - (void)handleSelectionAtIndexPath:(NSIndexPath*)indexPath { int episodeIndex = episode->value; - int levelIndex = indexPath.row; + int levelIndex = (int)indexPath.row; // Prompt for In-App Purchase when the user selects a level that is not currently available. if ( SysIPhoneGetContentVersion() == CONTENT_LITE ) { @@ -165,10 +165,10 @@ UITableView interface cell.selectionStyle = UITableViewCellSelectionStyleNone; // Cell text configuration - NSString* levelName = [NSString stringWithFormat:@"Level %d", indexPath.row + 1 ]; + NSString* levelName = [NSString stringWithFormat:@"Level %lu", (long)(indexPath.row + 1) ]; int episodeIndex = episode->value; - int levelIndex = indexPath.row; + int levelIndex = (int)indexPath.row; if ( episodeIndex < NUM_ORIGINAL_EPISODES ) { // Wolfenstein episodes are the first six, and they all follow the pattern of 8 levels, @@ -203,6 +203,8 @@ UITableView interface cell.textLabel.textColor = [UIColor lightGrayColor]; cell.textLabel.highlightedTextColor = [UIColor colorWithRed:98.0/255.0 green:149.0/255.0 blue:212.0/255.0 alpha:1.0]; + + cell.backgroundColor = UIColor.clearColor; return cell; } @@ -225,30 +227,13 @@ UITableView interface [self handleSelectionAtIndexPath:indexPath]; } -// Override to allow orientations other than the default portrait orientation. -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - // Return YES for supported orientations. - return UIInterfaceOrientationIsLandscape(interfaceOrientation); -} - - - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; - // Release any cached data, images, etc. that aren't in use. + self.missionList = nil; } -- (void)viewDidUnload { - [super viewDidUnload]; - // Release any retained subviews of the main view. - // e.g. self.myOutlet = nil; - - self.missionList = nil; - -} - - - (void)dealloc { [super dealloc]; } diff --git a/wolf3d/code/iphone/MainMenuView.xib b/wolf3d/code/iphone/MainMenuView.xib index c90d0ca..dd6032a 100644 --- a/wolf3d/code/iphone/MainMenuView.xib +++ b/wolf3d/code/iphone/MainMenuView.xib @@ -1,1034 +1,319 @@ - - - 800 - 10K540 - 851 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 - - - - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 1298 - - - - 1298 - {480, 320} - - - YES - 1 - YES - 2 - IBCocoaTouchFramework - - NSImage - main_bg.png - - - - - 1343 - {{291, 243}, {157, 50}} - - NO - 2 - IBCocoaTouchFramework - 0 - 0 - - POSITYPE-idSettler_v10.2 - 42 - 16 - - {2, 2} - Resume - - 3 - MC4zMzMzMzMzMzMzAA - - - 3 - MQA - - - 1 - MCAwIDAAA - - - - - 1343 - {{40, 98}, {187, 50}} - - - NO - 2 - IBCocoaTouchFramework - 0 - - {2, 2} - New Game - - - - - - - 1343 - {{48, 147}, {152, 50}} - - - NO - 2 - IBCocoaTouchFramework - 0 - - {2, 2} - Settings - - - - - - - 1343 - {{63, 194}, {110, 50}} - - - NO - 2 - IBCocoaTouchFramework - 0 - - {2, 2} - About - - - - - - - -2147482305 - {{48, 147}, {134, 50}} - - NO - 2 - IBCocoaTouchFramework - 0 - - {2, 2} - Legal - - - - - - - -2147482305 - {{40, 98}, {134, 50}} - - NO - 2 - IBCocoaTouchFramework - 0 - - {2, 2} - Credits - - - - - - - -2147482305 - {{40, 98}, {181, 50}} - - NO - 2 - IBCocoaTouchFramework - 0 - - {2, 2} - id Games - - - - - - - -2147482305 - {{48, 147}, {211, 50}} - - NO - 2 - IBCocoaTouchFramework - 0 - - {2, 2} - id Software - - - - - - - -2147482305 - {{63, 194}, {134, 50}} - - NO - 2 - IBCocoaTouchFramework - 0 - - {2, 2} - Trivia - - - - - - - -2147482305 - {{74, 243}, {134, 50}} - - NO - 2 - IBCocoaTouchFramework - 0 - - {2, 2} - Back - - - - - - - 1343 - {{74, 243}, {120, 50}} - - - NO - 2 - IBCocoaTouchFramework - 0 - - {2, 2} - Extras - - - - - - - 1316 - {{425, 245}, {30, 30}} - - NO - 2 - IBCocoaTouchFramework - - NSImage - star_icon.png - - - - {480, 320} - - - - 3 - MAA - - - 3 - - 2 - IBCocoaTouchFramework - - - - - - - view - - - - 3 - - - - resume: - - - 7 - - 9 - - - - newGame: - - - 7 - - 10 - - - - settings: - - - 7 - - 11 - - - - about: - - - 7 - - 12 - - - - extras: - - - 7 - - 13 - - - - legal: - - - 7 - - 34 - - - - aboutButton - - - - 35 - - - - extrasButton - - - - 37 - - - - legalButton - - - - 38 - - - - newGameButton - - - - 39 - - - - resumeButton - - - - 40 - - - - settingsButton - - - - 41 - - - - backButton - - - - 44 - - - - back: - - - 7 - - 45 - - - - creditsButton - - - - 50 - - - - credits: - - - 7 - - 51 - - - - idGamesButton - - - - 58 - - - - idSoftwareButton - - - - 59 - - - - triviaButton - - - - 60 - - - - idGames: - - - 7 - - 61 - - - - idSoftware: - - - 7 - - 62 - - - - trivia: - - - 7 - - 63 - - - - resumeStar - - - - 65 - - - - - - 0 - - - - - - 1 - - - - - - - - - - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 4 - - - - - 5 - - - - - 6 - - - - - 7 - - - - - 8 - - - - - 16 - - - - - 32 - - - - - 42 - - - - - 47 - - - - - 52 - - - - - 54 - - - - - 56 - - - - - 64 - - - - - - - MainMenuViewController - UIResponder - {{440, 404}, {960, 640}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAADDcAAAwx4AAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUJAAABDEwAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDkYAAw5GAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDgYAAwxkAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUIgAABCxAAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCIAAAwwkAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDagAAwrYAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDawAAwsIAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCVAAAw0gAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUI8AABDEwAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDHAAAwq4AAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUJYAABDQgAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUKSAABDbwAAA - - - - - - - 65 - - - - - MainMenuViewController - UIViewController - - id - id - id - id - id - id - id - id - id - id - id - id - - - - about: - id - - - back: - id - - - credits: - id - - - extras: - id - - - idGames: - id - - - idSoftware: - id - - - legal: - id - - - newGame: - id - - - oldNewGame: - id - - - resume: - id - - - settings: - id - - - trivia: - id - - - - UIButton - UIButton - UIButton - UIButton - UIButton - UIButton - UIButton - UIButton - UIButton - UIView - UIButton - UIButton - - - - aboutButton - UIButton - - - backButton - UIButton - - - creditsButton - UIButton - - - extrasButton - UIButton - - - idGamesButton - UIButton - - - idSoftwareButton - UIButton - - - legalButton - UIButton - - - newGameButton - UIButton - - - resumeButton - UIButton - - - resumeStar - UIView - - - settingsButton - UIButton - - - triviaButton - UIButton - - - - IBProjectSource - MainMenuViewController.h - - - - UIFontButton - UIButton - - IBProjectSource - UIFontButton.h - - - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - YES - wolf3d.xcodeproj - 3 - - {960, 640} - {41, 39} - - 141 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wolf3d/code/iphone/MainMenuViewController.h b/wolf3d/code/iphone/MainMenuViewController.h index fc430d4..edae31e 100644 --- a/wolf3d/code/iphone/MainMenuViewController.h +++ b/wolf3d/code/iphone/MainMenuViewController.h @@ -28,7 +28,7 @@ @private // Main menu IBOutlet UIButton *resumeButton; - IBOutlet UIButton *newGameButton; + IBOutlet UIButton *startNewGameButton; IBOutlet UIButton *settingsButton; IBOutlet UIButton *aboutButton; IBOutlet UIButton *extrasButton; diff --git a/wolf3d/code/iphone/MainMenuViewController.m b/wolf3d/code/iphone/MainMenuViewController.m index 7251192..777abb6 100644 --- a/wolf3d/code/iphone/MainMenuViewController.m +++ b/wolf3d/code/iphone/MainMenuViewController.m @@ -34,7 +34,7 @@ @interface MainMenuViewController () @property (nonatomic, retain) IBOutlet UIButton *resumeButton; - @property (nonatomic, retain) IBOutlet UIButton *newGameButton; + @property (nonatomic, retain) IBOutlet UIButton *startNewGameButton; @property (nonatomic, retain) IBOutlet UIButton *settingsButton; @property (nonatomic, retain) IBOutlet UIButton *aboutButton; @property (nonatomic, retain) IBOutlet UIButton *extrasButton; @@ -57,35 +57,32 @@ @implementation MainMenuViewController -@synthesize resumeButton, newGameButton, settingsButton, aboutButton, extrasButton, resumeStar; +@synthesize resumeButton, startNewGameButton, settingsButton, aboutButton, extrasButton, resumeStar; @synthesize creditsButton, legalButton; @synthesize idGamesButton, idSoftwareButton, triviaButton; @synthesize backButton; -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - return UIInterfaceOrientationIsLandscape(interfaceOrientation); -} - -- (void)viewDidUnload { - [super viewDidUnload]; +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; - - self.resumeButton = nil; - self.newGameButton = nil; - self.settingsButton = nil; - self.aboutButton = nil; - self.extrasButton = nil; - self.resumeStar = nil; - - self.idGamesButton = nil; - self.idSoftwareButton = nil; - self.triviaButton = nil; - - self.creditsButton = nil; - self.legalButton = nil; - - self.backButton = nil; + + self.resumeButton = nil; + self.startNewGameButton = nil; + self.settingsButton = nil; + self.aboutButton = nil; + self.extrasButton = nil; + self.resumeStar = nil; + + self.idGamesButton = nil; + self.idSoftwareButton = nil; + self.triviaButton = nil; + + self.creditsButton = nil; + self.legalButton = nil; + + self.backButton = nil; } - (IBAction)resume:(id)sender { @@ -157,7 +154,7 @@ - (void)setMainHidden:(BOOL)hide { // Set the main menu visibility [self.resumeButton setHidden:hide]; - [self.newGameButton setHidden:hide]; + [self.startNewGameButton setHidden:hide]; [self.settingsButton setHidden:hide]; [self.aboutButton setHidden:hide]; [self.extrasButton setHidden:hide]; @@ -189,4 +186,4 @@ } -@end \ No newline at end of file +@end diff --git a/wolf3d/code/iphone/MainWindow.xib b/wolf3d/code/iphone/MainWindow.xib deleted file mode 100644 index fc76dc5..0000000 --- a/wolf3d/code/iphone/MainWindow.xib +++ /dev/null @@ -1,223 +0,0 @@ - - - - 528 - 9E17 - 672 - 949.33 - 352.00 - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - IBFilesOwner - - - IBFirstResponder - - - - - 1316 - - YES - - - 1298 - {320, 480} - - - 3 - MQA - - 2 - - - NO - - - - {320, 480} - - - 1 - MSAxIDEAA - - NO - YES - - - - - YES - - - delegate - - - - 4 - - - - window - - - - 5 - - - - glView - - - - 9 - - - - - YES - - 0 - - YES - - - - - - 2 - - - YES - - - - - - -1 - - - RmlsZSdzIE93bmVyA - - - 3 - - - - - 8 - - - - - -2 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 2.IBAttributePlaceholdersKey - 2.IBEditorWindowLastContentRect - 2.IBPluginDependency - 3.CustomClassName - 3.IBPluginDependency - 8.CustomClassName - 8.IBPluginDependency - - - YES - UIApplication - UIResponder - - YES - - YES - - - YES - - - {{500, 343}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - wolf3dAppDelegate - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - EAGLView - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - YES - - - YES - - - - - YES - - YES - - - YES - - - - 9 - - - - YES - - EAGLView - UIView - - IBProjectSource - Classes/EAGLView.h - - - - wolf3dAppDelegate - NSObject - - YES - - YES - glView - window - - - YES - EAGLView - UIWindow - - - - IBProjectSource - Classes/wolf3dAppDelegate.h - - - - - 0 - wolf3d.xcodeproj - 3 - - diff --git a/wolf3d/code/iphone/POSITYPE-idSettler10v2.otf b/wolf3d/code/iphone/POSITYPE-idSettler10v2.otf new file mode 100755 index 0000000000000000000000000000000000000000..1e07fe56e83a53e49c617f4cf3c425fa087a3c00 GIT binary patch literal 30004 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 literal 0 HcmV?d00001 diff --git a/wolf3d/code/iphone/Resources-iPad/CreditsView~ipad.xib b/wolf3d/code/iphone/Resources-iPad/CreditsView~ipad.xib index eca309b..6b15bce 100644 --- a/wolf3d/code/iphone/Resources-iPad/CreditsView~ipad.xib +++ b/wolf3d/code/iphone/Resources-iPad/CreditsView~ipad.xib @@ -1,1482 +1,95 @@ - - - 1056 - 10K549 - 851 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 274 - - YES - - - 274 - {1024, 768} - - NO - YES - YES - IBIPadFramework - - NSImage - credits_bg.png - - - - - 292 - {{26, 45}, {63, 65}} - - 1 - NO - IBIPadFramework - - NSImage - back_arrow.png - - - - - 292 - {{23, 16}, {99, 43}} - - NO - YES - 7 - NO - IBIPadFramework - BACK - - POSITYPE-idSettler_v10.2 - 36 - 16 - - - 3 - MQA - - - 1 - 10 - 5 - - - - 301 - {{22, 11}, {70, 100}} - - NO - NO - 1 - IBIPadFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - NSImage - button_highlight.png - - - - - 292 - - YES - - - 292 - {{55, 794}, {379, 55}} - - NO - YES - 7 - NO - IBIPadFramework - Wolfenstein 3D and Spear of Destiny originally created by id Software - - Helvetica-Bold - 20 - 16 - - - - - 1 - MCAwIDAAA - - {1, 1} - 1 - 10 - 2 - 1 - 0 - - - - 292 - {{73, 20}, {344, 36}} - - NO - YES - 7 - NO - IBIPadFramework - Wolfenstein 3D Classic Platinum - - Helvetica-Bold - 22 - 16 - - - - - {1, 1} - 1 - 10 - 2 - 1 - 0 - - - - 292 - {{86, 87}, {307, 36}} - - NO - YES - 7 - NO - IBIPadFramework - Programming - - - - - {1, 1} - 1 - 10 - 2 - 1 - 0 - - - - 292 - {{86, 294}, {307, 36}} - - NO - YES - 7 - NO - IBIPadFramework - Art - - - - - {1, 1} - 1 - 10 - 2 - 1 - 0 - - - - 292 - {{86, 421}, {307, 36}} - - NO - YES - 7 - NO - IBIPadFramework - Audio - - - - - {1, 1} - 1 - 10 - 2 - 1 - 0 - - - - 292 - {{85, 910}, {307, 36}} - - NO - YES - 7 - NO - IBIPadFramework - Programming - - - - - {1, 1} - 1 - 10 - 2 - 1 - 0 - - - - 292 - {{85, 1024}, {307, 36}} - - NO - YES - 7 - NO - IBIPadFramework - Design - - - - - {1, 1} - 1 - 10 - 2 - 1 - 0 - - - - 292 - {{85, 1174}, {307, 36}} - - NO - YES - 7 - NO - IBIPadFramework - Art - - - - - {1, 1} - 1 - 10 - 2 - 1 - 0 - - - - 292 - {{85, 1303}, {307, 36}} - - NO - YES - 7 - NO - IBIPadFramework - Audio - - - - - {1, 1} - 1 - 10 - 2 - 1 - 0 - - - - 292 - {{86, 532}, {307, 36}} - - NO - YES - 7 - NO - IBIPadFramework - Production - - - - - {1, 1} - 1 - 10 - 2 - 1 - 0 - - - - 292 - {{87, 639}, {307, 36}} - - NO - YES - 7 - NO - IBIPadFramework - QA Testing - - - - - {1, 1} - 1 - 10 - 2 - 1 - 0 - - - - 292 - {{184, 140}, {111, 21}} - - NO - YES - 7 - NO - IBIPadFramework - John Carmack - - Helvetica - 17 - 16 - - - - - {1, 1} - 1 - 10 - 1 - - - - 292 - {{183, 954}, {111, 21}} - - NO - YES - 7 - NO - IBIPadFramework - John Carmack - - - - - {1, 1} - 1 - 10 - 1 - - - - 292 - {{183, 1068}, {111, 21}} - - NO - YES - 7 - NO - IBIPadFramework - John Ramero - - - - - {1, 1} - 1 - 10 - 1 - - - - 292 - {{183, 1094}, {111, 21}} - - NO - YES - 7 - NO - IBIPadFramework - Tom Hall - - - - - {1, 1} - 1 - 10 - 1 - - - - 292 - {{178, 1218}, {121, 23}} - - NO - YES - 7 - NO - IBIPadFramework - Adrian Carmack - - - - - {1, 1} - 1 - 10 - 1 - - - - 292 - {{183, 1246}, {111, 21}} - - NO - YES - 7 - NO - IBIPadFramework - Kevin Cloud - - - - - {1, 1} - 1 - 10 - 1 - - - - 292 - {{183, 1351}, {111, 21}} - - NO - YES - 7 - NO - IBIPadFramework - Bobby Prince - - - - - {1, 1} - 1 - 10 - 1 - - - - 292 - {{185, 338}, {111, 21}} - - NO - YES - 7 - NO - IBIPadFramework - John Burnett - - - - - {1, 1} - 1 - 10 - 1 - - - - 292 - {{185, 367}, {111, 21}} - - NO - YES - 7 - NO - IBIPadFramework - Mike Horton - - - - - {1, 1} - 1 - 10 - 1 - - - - 292 - {{171, 465}, {137, 26}} - - NO - YES - 7 - NO - IBIPadFramework - Christian Antkow - - - - - {1, 1} - 1 - NO - 10 - 1 - - - - 292 - {{171, 576}, {137, 26}} - - NO - YES - 7 - NO - IBIPadFramework - Rafael Brown - - - - - {1, 1} - 1 - NO - 10 - 1 - - - - 292 - {{172, 683}, {137, 26}} - - NO - YES - 7 - NO - IBIPadFramework - Sean Palomino - - - - - {1, 1} - 1 - NO - 10 - 1 - - - - 292 - {{184, 169}, {111, 21}} - - NO - YES - 7 - NO - IBIPadFramework - Jeff Farrand - - - - - {1, 1} - 1 - 10 - 1 - - - - 292 - {{184, 198}, {111, 21}} - - NO - YES - 7 - NO - IBIPadFramework - Ryan Gerleve - - - - - {1, 1} - 1 - 10 - 1 - - - - 292 - {{184, 234}, {111, 21}} - - NO - YES - 7 - NO - IBIPadFramework - Greg Hodges - - - - - {1, 1} - 1 - 10 - 1 - - - {{442, 768}, {460, 1400}} - - - 3 - MCAwAA - - NO - - 3 - - IBIPadFramework - - - {1024, 768} - - - 3 - MAA - - - 3 - - IBIPadFramework - - - - - YES - - - view - - - - 6 - - - - creditsRoll - - - - 20 - - - - back: - - - 7 - - 21 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 9 - - - - - 10 - - - - - 11 - - - - - 8 - - - - - 12 - - - YES - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Credtis text roll - - - 40 - - - - - 13 - - - - - 39 - - - - - 38 - - - - - 37 - - - - - 36 - - - - - 35 - - - - - 34 - - - - - 33 - - - - - 32 - - - - - 31 - - - - - 30 - - - - - 29 - - - - - 28 - - - - - 27 - - - - - 26 - - - - - 25 - - - - - 24 - - - - - 23 - - - - - 22 - - - - - 19 - - - - - 18 - - - - - 17 - - - - - 16 - - - - - 15 - - - - - 14 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 10.CustomClassName - 10.IBPluginDependency - 10.IBViewBoundsToFrameTransform - 11.IBPluginDependency - 11.IBViewBoundsToFrameTransform - 12.IBEditorWindowLastContentRect - 12.IBPluginDependency - 12.IBViewBoundsToFrameTransform - 13.IBPluginDependency - 13.IBViewBoundsToFrameTransform - 14.IBPluginDependency - 14.IBViewBoundsToFrameTransform - 15.IBPluginDependency - 15.IBViewBoundsToFrameTransform - 16.IBPluginDependency - 16.IBViewBoundsToFrameTransform - 17.IBPluginDependency - 17.IBViewBoundsToFrameTransform - 18.IBPluginDependency - 18.IBViewBoundsToFrameTransform - 19.IBPluginDependency - 19.IBViewBoundsToFrameTransform - 22.IBPluginDependency - 22.IBViewBoundsToFrameTransform - 23.IBPluginDependency - 23.IBViewBoundsToFrameTransform - 24.IBPluginDependency - 24.IBViewBoundsToFrameTransform - 25.IBPluginDependency - 25.IBViewBoundsToFrameTransform - 26.IBPluginDependency - 26.IBViewBoundsToFrameTransform - 27.IBPluginDependency - 27.IBViewBoundsToFrameTransform - 28.IBPluginDependency - 28.IBViewBoundsToFrameTransform - 29.IBPluginDependency - 29.IBViewBoundsToFrameTransform - 30.IBPluginDependency - 30.IBViewBoundsToFrameTransform - 31.IBPluginDependency - 31.IBViewBoundsToFrameTransform - 32.IBPluginDependency - 32.IBViewBoundsToFrameTransform - 33.IBPluginDependency - 33.IBViewBoundsToFrameTransform - 34.IBPluginDependency - 34.IBViewBoundsToFrameTransform - 35.IBPluginDependency - 35.IBViewBoundsToFrameTransform - 36.IBPluginDependency - 36.IBViewBoundsToFrameTransform - 37.IBPluginDependency - 37.IBViewBoundsToFrameTransform - 38.IBPluginDependency - 38.IBViewBoundsToFrameTransform - 39.IBPluginDependency - 39.IBViewBoundsToFrameTransform - 40.IBPluginDependency - 40.IBViewBoundsToFrameTransform - 8.IBViewBoundsToFrameTransform - 9.IBPluginDependency - 9.IBViewBoundsToFrameTransform - - - YES - CreditsViewController - UIResponder - {{174, 377}, {1024, 768}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDkgAAw/aAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDkoAAxAHAAA - - {{387, 0}, {475, 1156}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAxK7AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCkgAAxFPAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCqgAAwuwAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUKsAABCrgAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUM4AABDDAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDQAAAw2QAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDQAAAw4CAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDQAAAw48AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUKsAABDkwAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUM5AABDyQAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUM5AABD14AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUKsAABD0oAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUMrAABEBEAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUKsAABEFQAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUMrAABEIAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCrgAAwz4AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUM7AABDTAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCrgAAw0UAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUKqAABEgAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCrgAAxATAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUM3AABEboAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCrgAAw8oAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUM3AABEhYAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUM3AABEiMAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUM3AABEmEAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDOQAAwyQAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUM3AABEmEAAA - - - P4AAAL+AAAAAAAAAw58AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUGwAABBoAAAA - - - - - YES - - - YES - - - - - YES - - - YES - - - - 40 - - - - YES - - CreditsViewController - UIViewController - - back: - id - - - back: - - back: - id - - - - creditsRoll - UIView - - - creditsRoll - - creditsRoll - UIView - - - - IBProjectSource - CreditsViewController.h - - - - UIFontLabel - UILabel - - IBProjectSource - UIFontLabel.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../wolf3d.xcodeproj - 3 - - YES - - YES - back_arrow.png - button_highlight.png - credits_bg.png - - - YES - {65, 63} - {4, 4} - {960, 640} - - - 141 - - + + + + + + + + + + + + Helvetica-Bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wolf3d/code/iphone/Resources-iPad/EpisodeView~ipad.xib b/wolf3d/code/iphone/Resources-iPad/EpisodeView~ipad.xib index f192f9a..d03444e 100644 --- a/wolf3d/code/iphone/Resources-iPad/EpisodeView~ipad.xib +++ b/wolf3d/code/iphone/Resources-iPad/EpisodeView~ipad.xib @@ -1,938 +1,187 @@ - - - 1056 - 10K549 - 851 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 274 - - YES - - - 274 - {1024, 768} - - NO - YES - YES - IBIPadFramework - - NSImage - episode_bg.png - - - - - 274 - {{68, 87}, {63, 65}} - - 1 - NO - IBIPadFramework - - NSImage - back_arrow.png - - - - - 274 - {{66, 58}, {99, 43}} - - NO - YES - 7 - NO - IBIPadFramework - BACK - - POSITYPE-idSettler_v10.2 - 36 - 16 - - - 3 - MQA - - - 1 - 10 - 5 - - - - 274 - {{899, 87}, {63, 65}} - - 1 - NO - IBIPadFramework - - NSImage - next_arrow.png - - - - - 274 - {{897, 58}, {99, 43}} - - NO - YES - 7 - NO - IBIPadFramework - NEXT - - - - 1 - 10 - 5 - - - - 274 - {{191, 47}, {214, 57}} - - NO - YES - 7 - NO - IBIPadFramework - EPISODE - - POSITYPE-idSettler_v10.2 - 48 - 16 - - - - 1 - 10 - 5 - - - - 274 - {{205, 104}, {625, 577}} - - - 3 - MCAwAA - - YES - IBIPadFramework - YES - NO - 2 - 0 - YES - 189 - - - - 274 - {{63, 49}, {73, 105}} - - NO - NO - 1 - IBIPadFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - NSImage - button_highlight.png - - - - - 274 - {{893, 50}, {73, 105}} - - NO - NO - 1 - IBIPadFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - - 274 - {{478, 715}, {80, 36}} - - NO - NO - 1 - IBIPadFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - NSImage - down_arrow.png - - - - - 274 - {{478, 37}, {80, 36}} - - NO - NO - 1 - IBIPadFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - NSImage - up_arrow.png - - - - {1024, 768} - - - 1 - MCAwIDAAA - - - 3 - - IBIPadFramework - - - - - YES - - - view - - - - 13 - - - - back: - - - 7 - - 36 - - - - dataSource - - - - 51 - - - - delegate - - - - 52 - - - - episodeList - - - - 53 - - - - pageUp: - - - 7 - - 54 - - - - pageDown: - - - 7 - - 55 - - - - next: - - - 7 - - 58 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 28 - - - - - 31 - - - - - 32 - - - - - 33 - - - - - 35 - - - - - 48 - - - - - 49 - - - - - 50 - - - Episode List - - - 56 - - - - - 59 - - - - - 60 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 28.IBViewBoundsToFrameTransform - 31.CustomClassName - 31.IBPluginDependency - 31.IBViewBoundsToFrameTransform - 32.CustomClassName - 32.IBPluginDependency - 32.IBViewBoundsToFrameTransform - 33.IBPluginDependency - 33.IBViewBoundsToFrameTransform - 35.IBPluginDependency - 35.IBViewBoundsToFrameTransform - 48.IBPluginDependency - 48.IBViewBoundsToFrameTransform - 49.IBPluginDependency - 49.IBViewBoundsToFrameTransform - 50.IBPluginDependency - 50.IBViewBoundsToFrameTransform - 56.IBPluginDependency - 56.IBViewBoundsToFrameTransform - 59.IBPluginDependency - 59.IBViewBoundsToFrameTransform - 60.CustomClassName - 60.IBPluginDependency - 60.IBViewBoundsToFrameTransform - - - YES - EpisodeViewController - UIResponder - {{179, 382}, {1024, 768}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAxD+AAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUKEAABCaAAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDtgAAw4QAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCaAAAw56AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUKIAABCrgAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABD+wAAw7GAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABD+wAAw7GAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUNNAABC4AAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEX0AAw8eAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCkgAAwxYAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCjgAAwsYAAA - - - - - YES - - - YES - - - - - YES - - - YES - - - - 60 - - - - YES - - EpisodeViewController - UIViewController - - YES - - YES - back: - next: - pageDown: - pageUp: - setEpisode: - - - YES - id - id - id - id - id - - - - YES - - YES - back: - next: - pageDown: - pageUp: - setEpisode: - - - YES - - back: - id - - - next: - id - - - pageDown: - id - - - pageUp: - id - - - setEpisode: - id - - - - - YES - - YES - episodeCell - episodeList - - - YES - UITableViewCell - UITableView - - - - YES - - YES - episodeCell - episodeList - - - YES - - episodeCell - UITableViewCell - - - episodeList - UITableView - - - - - IBProjectSource - EpisodeViewController.h - - - - UIFontLabel - UILabel - - IBProjectSource - UIFontLabel.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UIScrollView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIScrollView.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UITableView - UIScrollView - - IBFrameworkSource - UIKit.framework/Headers/UITableView.h - - - - UITableViewCell - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITableViewCell.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../wolf3d.xcodeproj - 3 - - YES - - YES - back_arrow.png - button_highlight.png - down_arrow.png - episode_bg.png - next_arrow.png - up_arrow.png - - - YES - {65, 63} - {4, 4} - {80, 36} - {480, 320} - {65, 63} - {80, 36} - - - 141 - - + + + + + + + + + + + + Helvetica-Bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wolf3d/code/iphone/Resources-iPad/LegalView~ipad.xib b/wolf3d/code/iphone/Resources-iPad/LegalView~ipad.xib index 6ffcd43..07b6dcd 100644 --- a/wolf3d/code/iphone/Resources-iPad/LegalView~ipad.xib +++ b/wolf3d/code/iphone/Resources-iPad/LegalView~ipad.xib @@ -1,639 +1,107 @@ - - - 1056 - 10K549 - 851 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 274 - - YES - - - 292 - {1024, 768} - - NO - IBIPadFramework - - NSImage - credits_bg.png - - - - - 292 - {{26, 45}, {63, 65}} - - 1 - NO - IBIPadFramework - - NSImage - back_arrow.png - - - - - 292 - {{22.5, 15.5}, {99, 43}} - - NO - YES - 7 - NO - IBIPadFramework - BACK - - POSITYPE-idSettler_v10.2 - 36 - 16 - - - 3 - MQA - - - 1 - 10 - 5 - - - - 301 - {{21, 10}, {75, 102}} - - NO - NO - 1 - IBIPadFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - NSImage - button_highlight.png - - - - - 292 - {{396, -27}, {556, 510}} - - NO - YES - 7 - NO - IBIPadFramework - Wolfenstein® 3D Classic Platinum© 2009-2011 id Software LLC, a ZeniMax Media company. Wolfenstein, id, id Software, id Tech and related logos are registered trademarks or trademarks of id Software LLC in the U.S. and/or other countries. Bethesda, Bethesda Softworks, ZeniMax and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the U.S. and/or other countries. All Rights Reserved. - - POSITYPE-idSettler_v10.2 - 22 - 16 - - - 1 - MSAxIDEAA - - 1 - - - - - 1 - MCAwIDAAA - - 1 - 10 - 10 - 1 - 0 - - - - 292 - {{607, 44}, {134, 54}} - - NO - YES - 7 - NO - IBIPadFramework - Legal - - POSITYPE-idSettler_v10.2 - 44 - 16 - - - - - {2, 2} - 1 - 10 - 1 - - - {1024, 768} - - - 3 - MAA - - - 3 - - IBIPadFramework - - - - - YES - - - view - - - - 3 - - - - back: - - - 7 - - 12 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 7 - - - - - 10 - - - - - 11 - - - - - 9 - - - - - 17 - - - - - 4 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 10.IBPluginDependency - 10.IBViewBoundsToFrameTransform - 11.CustomClassName - 11.IBPluginDependency - 11.IBViewBoundsToFrameTransform - 17.IBPluginDependency - 17.IBViewBoundsToFrameTransform - 4.CustomClassName - 4.IBPluginDependency - 4.IBViewBoundsToFrameTransform - 7.IBPluginDependency - 7.IBViewBoundsToFrameTransform - 9.IBPluginDependency - 9.IBViewBoundsToFrameTransform - - - YES - LegalViewController - UIResponder - {{140, 350}, {1024, 768}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBoAAAw5OAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBoAAAw4cAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUPGAADBAAAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABD3oAAw8wAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAxD+AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCGAAAxCBAAA - - - - - YES - - - YES - - - - - YES - - - YES - - - - 17 - - - - YES - - LegalViewController - UIViewController - - back: - id - - - back: - - back: - id - - - - IBProjectSource - LegalViewController.h - - - - UIFontLabel - UILabel - - IBProjectSource - UIFontLabel.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../wolf3d.xcodeproj - 3 - - YES - - YES - back_arrow.png - button_highlight.png - credits_bg.png - - - YES - {65, 63} - {4, 4} - {960, 640} - - - 141 - - + + + + + + + + + Helvetica-Bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wolf3d/code/iphone/Resources-iPad/LevelSelectView~ipad.xib b/wolf3d/code/iphone/Resources-iPad/LevelSelectView~ipad.xib index 0d28b71..6734801 100644 --- a/wolf3d/code/iphone/Resources-iPad/LevelSelectView~ipad.xib +++ b/wolf3d/code/iphone/Resources-iPad/LevelSelectView~ipad.xib @@ -1,898 +1,191 @@ - - - 1056 - 10K540 - 851 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 274 - - YES - - - 256 - {1024, 768} - - NO - YES - YES - IBIPadFramework - - NSImage - episode_bg.png - - - - - 292 - {{61, 87}, {65, 63}} - - 1 - NO - IBIPadFramework - - NSImage - back_arrow.png - - - - - 292 - {{900, 87}, {65, 63}} - - 1 - NO - IBIPadFramework - - NSImage - next_arrow.png - - - - - 292 - {{60, 56}, {99, 43}} - - NO - YES - 7 - NO - IBIPadFramework - BACK - - POSITYPE-idSettler_v10.2 - 36 - 16 - - - 3 - MQA - - - 1 - 10 - 5 - - - - 292 - {{899, 56}, {93, 43}} - - NO - YES - 7 - NO - IBIPadFramework - PLAY - - - - 1 - 10 - 5 - - - - 292 - {{190, 48}, {186, 52}} - - NO - YES - 7 - NO - IBIPadFramework - MISSION - - POSITYPE-idSettler_v10.2 - 44 - 16 - - - - 1 - 10 - - - - 274 - {{204, 104}, {625, 593}} - - - 3 - MCAwAA - - YES - IBIPadFramework - YES - NO - 2 - 0 - YES - 50 - - - - 274 - {{472, 712}, {80, 36}} - - NO - NO - 1 - IBIPadFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - NSImage - button_highlight.png - - - NSImage - down_arrow.png - - - - - 274 - {{472, 37}, {80, 36}} - - NO - NO - 1 - IBIPadFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - NSImage - up_arrow.png - - - - - 301 - {{896, 45}, {73, 105}} - - NO - NO - 1 - IBIPadFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - - 301 - {{58, 46}, {75, 108}} - - - 3 - MC42NjY2NjY2NjY3IDAAA - - NO - NO - 1 - IBIPadFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - {1024, 768} - - - - 3 - - IBIPadFramework - - - - - YES - - - view - - - - 4 - - - - next: - - - 7 - - 24 - - - - back: - - - 7 - - 25 - - - - dataSource - - - - 35 - - - - delegate - - - - 36 - - - - missionList - - - - 37 - - - - pageDown: - - - 7 - - 56 - - - - pageUp: - - - 7 - - 57 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 13 - - - - - 14 - - - - - 15 - - - - - 16 - - - - - 21 - - - - - 23 - - - - - 34 - - - Mission List - - - 54 - - - - - 55 - - - - - 22 - - - - - 20 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 1.IBUserGuides - 14.CustomClassName - 14.IBPluginDependency - 14.IBViewBoundsToFrameTransform - 15.CustomClassName - 15.IBPluginDependency - 15.IBViewBoundsToFrameTransform - 16.CustomClassName - 16.IBPluginDependency - 16.IBViewBoundsToFrameTransform - 20.IBPluginDependency - 20.IBViewBoundsToFrameTransform - 21.IBPluginDependency - 21.IBViewBoundsToFrameTransform - 22.IBPluginDependency - 22.IBViewBoundsToFrameTransform - 23.IBPluginDependency - 23.IBViewBoundsToFrameTransform - 34.IBPluginDependency - 54.IBPluginDependency - 54.IBViewBoundsToFrameTransform - 55.IBPluginDependency - 55.IBViewBoundsToFrameTransform - - - YES - LevelSelectViewController - UIResponder - {{218, 349}, {1024, 768}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - YES - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABChgAAxCoAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDtgAAw4QAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEY4AAxCoAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEXMAAww0AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCiAAAxDbAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEYAAAw6AAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEY8AAxDbAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABD7AAAxAkAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABD7AAAw4IAAA - - - - - YES - - - YES - - - - - YES - - - YES - - - - 57 - - - - YES - - LevelSelectViewController - UIViewController - - YES - - YES - back: - next: - pageDown: - pageUp: - - - YES - id - id - id - id - - - - YES - - YES - back: - next: - pageDown: - pageUp: - - - YES - - back: - id - - - next: - id - - - pageDown: - id - - - pageUp: - id - - - - - missionList - UITableView - - - missionList - - missionList - UITableView - - - - IBProjectSource - LevelSelectViewController.h - - - - UIFontLabel - UILabel - - IBProjectSource - UIFontLabel.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UIScrollView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIScrollView.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UITableView - UIScrollView - - IBFrameworkSource - UIKit.framework/Headers/UITableView.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../wolf3d.xcodeproj - 3 - - YES - - YES - back_arrow.png - button_highlight.png - down_arrow.png - episode_bg.png - next_arrow.png - up_arrow.png - - - YES - {65, 63} - {4, 4} - {80, 36} - {480, 320} - {65, 63} - {80, 36} - - - 141 - - + + + + + + + + + + + + Helvetica-Bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wolf3d/code/iphone/Resources-iPad/MainMenuView~ipad.xib b/wolf3d/code/iphone/Resources-iPad/MainMenuView~ipad.xib index 7954dad..867985f 100644 --- a/wolf3d/code/iphone/Resources-iPad/MainMenuView~ipad.xib +++ b/wolf3d/code/iphone/Resources-iPad/MainMenuView~ipad.xib @@ -1,1017 +1,305 @@ - - - 800 - 10K540 - 851 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 - - - - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 274 - - - - 274 - {1024, 768} - - - YES - YES - IBIPadFramework - - NSImage - main_bg.png - - - - - 319 - {{660, 610.5}, {239, 75}} - - NO - IBIPadFramework - 0 - 0 - - POSITYPE-idSettler_v10.2 - 64 - 16 - - {2, 2} - Resume - - 3 - MC4zMzMzMzMzMzMzAA - - - 3 - MQA - - - 1 - MCAwIDAAA - - - - - 319 - {{88, 269}, {322, 75}} - - - NO - IBIPadFramework - 0 - - {2, 2} - New Game - - - - - - - 319 - {{105, 383}, {232, 75}} - - - NO - IBIPadFramework - 0 - - {2, 2} - Settings - - - - - - - 319 - {{137, 499}, {168, 75}} - - - NO - IBIPadFramework - 0 - - {2, 2} - About - - - - - - - -2147483329 - {{105, 383}, {157, 75}} - - NO - IBIPadFramework - 0 - - {2, 2} - Legal - - - - - - - -2147483329 - {{88, 269}, {203, 75}} - - NO - IBIPadFramework - 0 - - {2, 2} - Credits - - - - - - - -2147483329 - {{168, 611}, {143, 75}} - - NO - IBIPadFramework - 0 - - {2, 2} - Back - - - - - - - 319 - {{168, 611}, {182, 75}} - - - NO - IBIPadFramework - 0 - - {2, 2} - Extras - - - - - - - -2147483329 - {{90, 269}, {275, 75}} - - NO - IBIPadFramework - 0 - - {2, 2} - id Games - - - - - - - -2147483329 - {{105, 383}, {321, 75}} - - NO - IBIPadFramework - 0 - - {2, 2} - id Software - - - - - - - -2147483329 - {{131, 499}, {157, 75}} - - NO - IBIPadFramework - 0 - - {2, 2} - Trivia - - - - - - - 274 - {{864, 619}, {41, 39}} - - YES - YES - IBIPadFramework - - NSImage - star_icon.png - - - - {1024, 768} - - - - 3 - MAA - - - 3 - - IBIPadFramework - - - - - - - view - - - - 3 - - - - resume: - - - 7 - - 9 - - - - newGame: - - - 7 - - 10 - - - - settings: - - - 7 - - 11 - - - - about: - - - 7 - - 12 - - - - extras: - - - 7 - - 13 - - - - legal: - - - 7 - - 34 - - - - aboutButton - - - - 35 - - - - extrasButton - - - - 37 - - - - legalButton - - - - 38 - - - - newGameButton - - - - 39 - - - - resumeButton - - - - 40 - - - - settingsButton - - - - 41 - - - - backButton - - - - 44 - - - - back: - - - 7 - - 45 - - - - creditsButton - - - - 50 - - - - idGamesButton - - - - 57 - - - - idSoftwareButton - - - - 58 - - - - triviaButton - - - - 59 - - - - idGames: - - - 7 - - 60 - - - - idSoftware: - - - 7 - - 61 - - - - trivia: - - - 7 - - 62 - - - - credits: - - - 7 - - 63 - - - - resumeStar - - - - 65 - - - - - - 0 - - - - - - 1 - - - - - - - - - - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 4 - - - - - 5 - - - - - 6 - - - - - 7 - - - - - 8 - - - - - 16 - - - - - 32 - - - - - 42 - - - - - 47 - - - - - 54 - - - - - 55 - - - - - 56 - - - - - 64 - - - - - - - MainMenuViewController - UIResponder - {{138, 377}, {1024, 768}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUJAAABDEwAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUOTAABDYgAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDgYAAwxkAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCVAAAw0gAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCIAAAwwkAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABELEAAw8aAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEKIAAw8aAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEMkAAw8aAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUI8AABDEwAAA - - - AURWgABEGsAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUJYAABDQgAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUKSAABDbwAAA - - - - - - - 65 - - - - - MainMenuViewController - UIViewController - - id - id - id - id - id - id - id - id - id - id - id - id - - - - about: - id - - - back: - id - - - credits: - id - - - extras: - id - - - idGames: - id - - - idSoftware: - id - - - legal: - id - - - newGame: - id - - - oldNewGame: - id - - - resume: - id - - - settings: - id - - - trivia: - id - - - - UIButton - UIButton - UIButton - UIButton - UIButton - UIButton - UIButton - UIButton - UIButton - UIView - UIButton - UIButton - - - - aboutButton - UIButton - - - backButton - UIButton - - - creditsButton - UIButton - - - extrasButton - UIButton - - - idGamesButton - UIButton - - - idSoftwareButton - UIButton - - - legalButton - UIButton - - - newGameButton - UIButton - - - resumeButton - UIButton - - - resumeStar - UIView - - - settingsButton - UIButton - - - triviaButton - UIButton - - - - IBProjectSource - MainMenuViewController.h - - - - UIFontButton - UIButton - - IBProjectSource - UIFontButton.h - - - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - YES - ../wolf3d.xcodeproj - 3 - - {480, 320} - {41, 39} - - 141 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wolf3d/code/iphone/Resources-iPad/SettingsView~ipad.xib b/wolf3d/code/iphone/Resources-iPad/SettingsView~ipad.xib index 3c21dbb..1811e0f 100644 --- a/wolf3d/code/iphone/Resources-iPad/SettingsView~ipad.xib +++ b/wolf3d/code/iphone/Resources-iPad/SettingsView~ipad.xib @@ -1,1675 +1,419 @@ - - - 1056 - 10K549 - 851 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 1298 - - YES - - - 1316 - {1024, 768} - - - NO - 1 - IBIPadFramework - - NSImage - credits_bg.png - - - - - 1316 - {{413, 29}, {562, 192}} - - NO - 1 - IBIPadFramework - - NSImage - settings_line_art.png - - - - - 1316 - {{929, 692}, {65, 63}} - - 1 - NO - 1 - IBIPadFramework - - NSImage - next_arrow.png - - - - - 1316 - {{415.5, 692}, {65, 63}} - - NO - 1 - IBIPadFramework - - NSImage - adv_btn.png - - - - - 1316 - {{397, 668}, {597, 13}} - - NO - 1 - IBIPadFramework - - NSImage - settings_divider.png - - - - - 1316 - {{397, 311}, {597, 13}} - - NO - 1 - IBIPadFramework - - - - - 1316 - {{543, 375}, {307, 46}} - - - NO - YES - 7 - NO - 1 - IBIPadFramework - SENSITIVITY: - - POSITYPE-idSettler_v10.2 - 38 - 16 - - - 3 - MC42NjY2NjY2NjY3AA - - - 3 - MQA - - 1 - 10 - 2 - - - - 1316 - {{621, 264}, {160, 56}} - - - NO - YES - 7 - NO - 1 - IBIPadFramework - Preset - - POSITYPE-idSettler_v10.2 - 44 - 16 - - - - 1 - NO - 10 - - - - 1316 - {{406, 458}, {444, 46}} - - - NO - YES - 7 - NO - 1 - IBIPadFramework - TILT MOVE SPEED: - - - - 1 - 10 - 2 - - - - 1316 - {{409, 545}, {436, 47}} - - - NO - YES - 4 - NO - 1 - IBIPadFramework - TILT TURN SPEED: - - - - 1 - 10 - 2 - - - - 1316 - {{557, 632}, {288, 41}} - - - NO - YES - 7 - NO - 1 - IBIPadFramework - HUD ALPHA: - - - - 1 - 10 - 2 - - - - 1316 - {{422, 596}, {535, 23}} - - - NO - 1 - IBIPadFramework - 0 - 0 - 0.5 - - - - 1316 - {{422, 512}, {535, 23}} - - - NO - 1 - IBIPadFramework - 0 - 0 - 0.5 - 500 - 3000 - - - - 1316 - {{422, 422}, {535, 23}} - - - NO - 1 - IBIPadFramework - 0 - 0 - 0.5 - 5000 - 30000 - - - - 1316 - {{422, 332}, {535, 23}} - - - NO - 1 - IBIPadFramework - 0 - 0 - 0.5 - - - - 1316 - {{828, 727}, {93, 41}} - - - NO - YES - 7 - NO - 1 - IBIPadFramework - BACK - - POSITYPE-idSettler_v10.2 - 34 - 16 - - - - 1 - 10 - 2 - 5 - - - - 1316 - {{486, 727}, {152, 41}} - - NO - YES - 7 - NO - 1 - IBIPadFramework - Advanced - - - - 1 - 10 - 5 - - - - 1325 - {{828, 691}, {166, 66}} - - - NO - NO - 1 - 1 - IBIPadFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - NSImage - button_highlight.png - - - - - 1325 - {{415, 689}, {223, 66}} - - NO - NO - 1 - 1 - IBIPadFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - - 1316 - {{898, 97}, {66, 80}} - - NO - 1 - IBIPadFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - NSImage - right_chevron.png - - - - - 1316 - {{421, 97}, {66, 80}} - - NO - 1 - IBIPadFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - NSImage - left_chevron.png - - - - - 1316 - {{860, 371}, {123, 37}} - - NO - YES - 7 - NO - 1 - IBIPadFramework - 100% - - - - 1 - 10 - - - - 1316 - {{860, 456}, {123, 37}} - - NO - YES - 7 - NO - 1 - IBIPadFramework - 100% - - - - 1 - 10 - - - - 1316 - {{860, 542}, {123, 37}} - - NO - YES - 7 - NO - 1 - IBIPadFramework - 100% - - - - 1 - 10 - - - - 1316 - {{860, 628}, {123, 35}} - - NO - YES - 7 - NO - 1 - IBIPadFramework - 100% - - - - 1 - 10 - - - - 1316 - {{519, 19}, {348, 236}} - - 1 - NO - 1 - IBIPadFramework - - NSImage - iphone_preset_1.png - - - - - -2147482332 - {{519, 19}, {348, 236}} - - 2 - NO - 1 - IBIPadFramework - - NSImage - iphone_preset_2.png - - - - - -2147482332 - {{519, 19}, {348, 236}} - - 3 - NO - 1 - IBIPadFramework - - NSImage - iphone_preset_3.png - - - - - -2147482332 - {{519, 19}, {348, 236}} - - 4 - NO - 1 - IBIPadFramework - - NSImage - iphone_preset_4.png - - - - {1024, 768} - - - 1 - MCAwIDAAA - - - 3 - - 1 - IBIPadFramework - - - - - YES - - - view - - - - 22 - - - - SensitivityValChanged - - - 13 - - 23 - - - - TiltMoveSpeedValChanged - - - 13 - - 24 - - - - TiltTurnSpeedValChanged - - - 13 - - 25 - - - - HudAlphaValChanged - - - 13 - - 26 - - - - hudAlphaSlider - - - - 27 - - - - sensitivitySlider - - - - 28 - - - - tiltTurnSpeedSlider - - - - 30 - - - - tiltMoveSpeedSlider - - - - 31 - - - - back: - - - 7 - - 32 - - - - AdvancedPressed - - - 7 - - 64 - - - - hudAlphaLabel - - - - 72 - - - - sensitivityLabel - - - - 73 - - - - tiltMoveSpeedLabel - - - - 74 - - - - tiltTurnSpeedLabel - - - - 75 - - - - nextPreset - - - 7 - - 80 - - - - previousPreset - - - 7 - - 81 - - - - presetLabel - - - - 82 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 4 - - - - - 5 - - - - - 6 - - - - - 7 - - - - - 8 - - - - - 9 - - - - - 10 - - - - - 11 - - - - - 12 - - - - - 13 - - - - - 14 - - - - - 15 - - - - - 46 - - - - - 57 - - - - - 58 - - - - - 60 - - - - - 62 - - - - - 65 - - - - - 66 - - - - - 67 - - - - - 68 - - - - - 69 - - - - - 70 - - - - - 71 - - - - - 76 - - - - - 77 - - - - - 78 - - - - - 79 - - - - - 83 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 10.CustomClassName - 10.IBPluginDependency - 10.IBViewBoundsToFrameTransform - 11.CustomClassName - 11.IBPluginDependency - 11.IBViewBoundsToFrameTransform - 12.IBPluginDependency - 12.IBViewBoundsToFrameTransform - 13.CustomClassName - 13.IBPluginDependency - 13.IBViewBoundsToFrameTransform - 14.IBPluginDependency - 14.IBViewBoundsToFrameTransform - 15.IBPluginDependency - 15.IBViewBoundsToFrameTransform - 4.IBPluginDependency - 4.IBViewBoundsToFrameTransform - 46.CustomClassName - 46.IBPluginDependency - 46.IBViewBoundsToFrameTransform - 5.IBPluginDependency - 5.IBViewBoundsToFrameTransform - 57.IBPluginDependency - 57.IBViewBoundsToFrameTransform - 58.IBPluginDependency - 58.IBViewBoundsToFrameTransform - 6.IBPluginDependency - 6.IBViewBoundsToFrameTransform - 60.IBPluginDependency - 60.IBViewBoundsToFrameTransform - 62.IBPluginDependency - 62.IBViewBoundsToFrameTransform - 65.IBPluginDependency - 65.IBViewBoundsToFrameTransform - 66.IBPluginDependency - 66.IBViewBoundsToFrameTransform - 67.IBPluginDependency - 67.IBViewBoundsToFrameTransform - 68.IBPluginDependency - 68.IBViewBoundsToFrameTransform - 69.IBPluginDependency - 69.IBViewBoundsToFrameTransform - 7.CustomClassName - 7.IBPluginDependency - 7.IBViewBoundsToFrameTransform - 70.IBPluginDependency - 70.IBViewBoundsToFrameTransform - 71.IBPluginDependency - 71.IBViewBoundsToFrameTransform - 76.IBPluginDependency - 76.IBViewBoundsToFrameTransform - 77.IBPluginDependency - 77.IBViewBoundsToFrameTransform - 78.IBPluginDependency - 78.IBViewBoundsToFrameTransform - 79.IBPluginDependency - 79.IBViewBoundsToFrameTransform - 8.CustomClassName - 8.IBPluginDependency - 8.IBViewBoundsToFrameTransform - 83.CustomClassName - 83.IBPluginDependency - 83.IBViewBoundsToFrameTransform - 9.CustomClassName - 9.IBPluginDependency - 9.IBViewBoundsToFrameTransform - - - YES - SettingsViewController - UIResponder - {{265, 386}, {1024, 768}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDzIAAxAzAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEC0AAxCNAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABENEAAxDxAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEWQAAxEEAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEDAAAxDrAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAxD+AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEDIAAw+KAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEJ8AAw5YAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEDIAAw88AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDj4AAxDjAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEWwAAwzYAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEDIAAw7wAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDugAAw46AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDsIAAxDXAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDwAAAw/oAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDbwAAw6CAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDLAAAw0MAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEYsAAw9MAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEYsAAxAAAAA - - WolfSlider - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEDIAAw6qAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEYsAAxBEAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEVwAAxCHAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABA4AAAxBlAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBmAAAxBSAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBmAAAxBcAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDfAAAw1EAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEK0AAw9MAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEWkAAxD9AAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEE0AAxAAAAA - - - - - YES - - - YES - - - - - YES - - - YES - - - - 83 - - - - YES - - SettingsViewController - UIViewController - - YES - - YES - AdvancedPressed - ControlScheme1Pressed - ControlScheme2Pressed - ControlScheme3Pressed - ControlScheme4Pressed - HudAlphaValChanged - SensitivityValChanged - TiltMoveSpeedValChanged - TiltTurnSpeedValChanged - back: - nextPreset - previousPreset - - - YES - id - id - id - id - id - id - id - id - id - id - id - id - - - - YES - - YES - AdvancedPressed - ControlScheme1Pressed - ControlScheme2Pressed - ControlScheme3Pressed - ControlScheme4Pressed - HudAlphaValChanged - SensitivityValChanged - TiltMoveSpeedValChanged - TiltTurnSpeedValChanged - back: - nextPreset - previousPreset - - - YES - - AdvancedPressed - id - - - ControlScheme1Pressed - id - - - ControlScheme2Pressed - id - - - ControlScheme3Pressed - id - - - ControlScheme4Pressed - id - - - HudAlphaValChanged - id - - - SensitivityValChanged - id - - - TiltMoveSpeedValChanged - id - - - TiltTurnSpeedValChanged - id - - - back: - id - - - nextPreset - id - - - previousPreset - id - - - - - YES - - YES - controlScheme1Button - controlScheme2Button - controlScheme3Button - controlScheme4Button - hudAlphaLabel - hudAlphaSlider - presetLabel - sensitivityLabel - sensitivitySlider - tiltMoveSpeedLabel - tiltMoveSpeedSlider - tiltTurnSpeedLabel - tiltTurnSpeedSlider - - - YES - UIButton - UIButton - UIButton - UIButton - UILabel - UISlider - UILabel - UILabel - UISlider - UILabel - UISlider - UILabel - UISlider - - - - YES - - YES - controlScheme1Button - controlScheme2Button - controlScheme3Button - controlScheme4Button - hudAlphaLabel - hudAlphaSlider - presetLabel - sensitivityLabel - sensitivitySlider - tiltMoveSpeedLabel - tiltMoveSpeedSlider - tiltTurnSpeedLabel - tiltTurnSpeedSlider - - - YES - - controlScheme1Button - UIButton - - - controlScheme2Button - UIButton - - - controlScheme3Button - UIButton - - - controlScheme4Button - UIButton - - - hudAlphaLabel - UILabel - - - hudAlphaSlider - UISlider - - - presetLabel - UILabel - - - sensitivityLabel - UILabel - - - sensitivitySlider - UISlider - - - tiltMoveSpeedLabel - UILabel - - - tiltMoveSpeedSlider - UISlider - - - tiltTurnSpeedLabel - UILabel - - - tiltTurnSpeedSlider - UISlider - - - - - IBProjectSource - SettingsViewController.h - - - - UIFontLabel - UILabel - - IBProjectSource - UIFontLabel.h - - - - WolfSlider - UISlider - - IBProjectSource - WolfSlider.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UISlider - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UISlider.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../wolf3d.xcodeproj - 3 - - YES - - YES - adv_btn.png - button_highlight.png - credits_bg.png - iphone_preset_1.png - iphone_preset_2.png - iphone_preset_3.png - iphone_preset_4.png - left_chevron.png - next_arrow.png - right_chevron.png - settings_divider.png - settings_line_art.png - - - YES - {56, 55} - {4, 4} - {960, 640} - {306, 208} - {306, 208} - {306, 208} - {306, 208} - {66, 80} - {65, 63} - {66, 80} - {597, 13} - {562, 192} - - - 141 - - + + + + + + + + + + + + Helvetica-Bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wolf3d/code/iphone/Resources-iPad/SkillView~ipad.xib b/wolf3d/code/iphone/Resources-iPad/SkillView~ipad.xib index be18a19..6cb2b0d 100644 --- a/wolf3d/code/iphone/Resources-iPad/SkillView~ipad.xib +++ b/wolf3d/code/iphone/Resources-iPad/SkillView~ipad.xib @@ -1,1250 +1,340 @@ - - - 1056 - 10K549 - 851 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 1298 - - YES - - - 1298 - {1024, 768} - - NO - YES - 2 - YES - 1 - IBIPadFramework - - NSImage - wolf_bg.png - - - - - 1316 - {{200, 70}, {623, 174}} - - NO - 1 - IBIPadFramework - - NSImage - highlight_bracket.png - - - - - 1316 - {{209, 80}, {606, 151}} - - 1 - NO - 1 - IBIPadFramework - - NSImage - episode_bracket.png - - - - - 1316 - {{209, 252.5}, {606, 151}} - - 2 - NO - 1 - IBIPadFramework - - - - - 1316 - {{208, 423.5}, {606, 151}} - - 3 - NO - 1 - IBIPadFramework - - - - - 1316 - {{208, 595.5}, {606, 151}} - - 4 - NO - 1 - IBIPadFramework - - - - - 1316 - {{207, 29}, {302, 52}} - - NO - YES - 7 - NO - 1 - IBIPadFramework - Difficulty Select - - POSITYPE-idSettler_v10.2 - 44 - 16 - - - 3 - MQA - - - 1 - 10 - - - - 1298 - {{68, 78}, {65, 63}} - - 1 - NO - 1 - IBIPadFramework - - NSImage - back_arrow.png - - - - - 1298 - {{67, 48}, {99, 43}} - - NO - YES - 7 - NO - 1 - IBIPadFramework - BACK - - POSITYPE-idSettler_v10.2 - 36 - 16 - - - - 1 - 10 - 5 - - - - 1316 - {{891, 78}, {65, 63}} - - 1 - NO - 1 - IBIPadFramework - - NSImage - next_arrow.png - - - - - 1316 - {{890, 47}, {97, 43}} - - NO - YES - 7 - NO - 1 - IBIPadFramework - NEXT - - - - 1 - 10 - 5 - - - - 1325 - {{882, 42}, {78, 101}} - - NO - NO - 1 - 1 - IBIPadFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - NSImage - button_highlight.png - - - - - 1298 - {{62, 42}, {81, 99}} - - NO - NO - 1 - 1 - IBIPadFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - - 1298 - {{316, 80}, {488, 151}} - - NO - NO - 1 - 1 - IBIPadFramework - 0 - - Helvetica-Bold - 48 - 16 - - Can I Play, Daddy? - - - - - - - 1298 - {{316, 253}, {498, 150}} - - NO - NO - 1 - 1 - IBIPadFramework - 0 - - Don't Hurt Me - - - - - - - 1298 - {{310, 424}, {504, 150}} - - NO - NO - 1 - 1 - IBIPadFramework - 0 - - Bring 'Em On! - - - - - - - 1298 - {{310, 596}, {504, 150}} - - NO - NO - 1 - 1 - IBIPadFramework - 3 - - 0 - I am Death Incarnate! - - - - - - - 1298 - {{229, 102}, {79, 107}} - - NO - NO - 1 - 1 - IBIPadFramework - 2 - - Helvetica-Bold - 24 - 16 - - NO - - - - - NSImage - difficulty_head1.png - - - - - 1298 - {{224.5, 274.5}, {79, 107}} - - NO - NO - 1 - 1 - IBIPadFramework - 2 - - NO - - - - - NSImage - difficulty_head2.png - - - - - 1298 - {{224.5, 446.5}, {79, 107}} - - NO - NO - 1 - 1 - IBIPadFramework - 2 - - NO - - - - - NSImage - difficulty_head3.png - - - - - 1298 - {{224, 618}, {79, 107}} - - NO - NO - 1 - 1 - IBIPadFramework - 2 - - NO - - - - - NSImage - difficulty_head4.png - - - - {1024, 768} - - - 3 - MQA - - 2 - - - - 3 - - 1 - IBIPadFramework - - - - - YES - - - view - - - - 3 - - - - back: - - - 7 - - 29 - - - - BringEmOn: - - - 7 - - 30 - - - - canIPlayDaddy: - - - 7 - - 31 - - - - dontHurtMe: - - - 7 - - 32 - - - - IAmDeathIncarnate: - - - 7 - - 33 - - - - next: - - - 7 - - 34 - - - - selectionFrame - - - - 37 - - - - canIPlayDaddy: - - - 7 - - 41 - - - - dontHurtMe: - - - 7 - - 44 - - - - BringEmOn: - - - 7 - - 47 - - - - IAmDeathIncarnate: - - - 7 - - 50 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - - - - - - - - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 4 - - - - - 5 - - - - - 6 - - - - - 9 - - - - - 10 - - - - - 8 - - - - - 7 - - - - - 11 - - - - - 12 - - - - - 13 - - - - - 14 - - - - - 15 - - - - - 21 - - - - - 22 - - - - - 23 - - - - - 24 - - - - - 35 - - - - - 40 - - - - - 42 - - - - - 45 - - - - - 48 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 10.CustomClassName - 10.IBPluginDependency - 10.IBViewBoundsToFrameTransform - 11.CustomClassName - 11.IBPluginDependency - 11.IBViewBoundsToFrameTransform - 12.IBPluginDependency - 12.IBViewBoundsToFrameTransform - 13.IBPluginDependency - 13.IBViewBoundsToFrameTransform - 14.IBPluginDependency - 14.IBViewBoundsToFrameTransform - 15.IBPluginDependency - 15.IBViewBoundsToFrameTransform - 21.CustomClassName - 21.IBPluginDependency - 21.IBViewBoundsToFrameTransform - 22.CustomClassName - 22.IBPluginDependency - 22.IBViewBoundsToFrameTransform - 23.CustomClassName - 23.IBPluginDependency - 23.IBViewBoundsToFrameTransform - 24.CustomClassName - 24.IBPluginDependency - 24.IBViewBoundsToFrameTransform - 35.IBPluginDependency - 35.IBViewBoundsToFrameTransform - 4.IBViewBoundsToFrameTransform - 40.IBPluginDependency - 40.IBViewBoundsToFrameTransform - 42.IBPluginDependency - 42.IBViewBoundsToFrameTransform - 45.IBPluginDependency - 45.IBViewBoundsToFrameTransform - 48.IBPluginDependency - 48.IBViewBoundsToFrameTransform - 5.CustomClassName - 5.IBPluginDependency - 5.IBViewBoundsToFrameTransform - 6.IBPluginDependency - 6.IBViewBoundsToFrameTransform - 7.IBPluginDependency - 7.IBViewBoundsToFrameTransform - 8.IBEditorWindowLastContentRect - 8.IBPluginDependency - 8.IBViewBoundsToFrameTransform - 9.IBPluginDependency - 9.IBViewBoundsToFrameTransform - - - YES - SkillViewController - UIResponder - {{141, 378}, {1024, 768}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABELEAAw/9AAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDdgAAwngAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDUQAAw9EAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDtQAAw/UAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDq4AAxDKAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDq4AAxFAAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDzQAAw56AAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUOeAABDfQAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUObAABD1AAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUObAABEFQAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDswAAw/2AAA - - - P4AAAL+AAAAAAAAAxD+AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDagAAwzUAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDKAAAw88AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDOAAAw/mAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDGAAAxBjAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDk4AAw/+AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDlAAAxAVAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBoAAAxAVAAA - - {{323, 1045}, {52, 56}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEaYAAw/8AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABELIAAxAVAAA - - - - - YES - - - YES - - - - - YES - - - YES - - - - 50 - - - - YES - - SkillViewController - UIViewController - - YES - - YES - BringEmOn: - IAmDeathIncarnate: - back: - canIPlayDaddy: - dontHurtMe: - next: - - - YES - id - id - id - id - id - id - - - - YES - - YES - BringEmOn: - IAmDeathIncarnate: - back: - canIPlayDaddy: - dontHurtMe: - next: - - - YES - - BringEmOn: - id - - - IAmDeathIncarnate: - id - - - back: - id - - - canIPlayDaddy: - id - - - dontHurtMe: - id - - - next: - id - - - - - selectionFrame - UIView - - - selectionFrame - - selectionFrame - UIView - - - - IBProjectSource - SkillViewController.h - - - - UIFontButton - UIButton - - IBProjectSource - UIFontButton.h - - - - UIFontLabel - UILabel - - IBProjectSource - UIFontLabel.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../wolf3d.xcodeproj - 3 - - YES - - YES - back_arrow.png - button_highlight.png - difficulty_head1.png - difficulty_head2.png - difficulty_head3.png - difficulty_head4.png - episode_bracket.png - highlight_bracket.png - next_arrow.png - wolf_bg.png - - - YES - {65, 63} - {4, 4} - {64, 87} - {60, 82} - {60, 78} - {59, 79} - {606, 168} - {623, 189} - {65, 63} - {480, 320} - - - 141 - - + + + + + + + + + + + + Helvetica-Bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wolf3d/code/iphone/Resources-iPad/TriviaView~ipad.xib b/wolf3d/code/iphone/Resources-iPad/TriviaView~ipad.xib index 2d8bfed..b8969e7 100644 --- a/wolf3d/code/iphone/Resources-iPad/TriviaView~ipad.xib +++ b/wolf3d/code/iphone/Resources-iPad/TriviaView~ipad.xib @@ -1,1323 +1,388 @@ - - - 1056 - 10K549 - 851 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 274 - - YES - - - 274 - {1024, 768} - - NO - IBIPadFramework - - NSImage - wolf_bg.png - - - - - 292 - {{435, 20}, {159, 77}} - - NO - YES - 7 - NO - IBIPadFramework - Trivia - - POSITYPE-idSettler_v10.2 - 48 - 16 - - - 3 - MQA - - - - 1 - MCAwIDAAA - - {2, 2} - 1 - 10 - 1 - - - - 274 - {{155, 140}, {713, 400}} - - NO - YES - 7 - 1 - NO - IBIPadFramework - ORIGINAL WOLF: The original release of Wolfenstein 3D only contained 3 Episodes. Episodes 4, 5, and 6 were sold separately as "The Nocturnal Missions", and were intended to act as a prequel to the original trilogy of Episodes. Subsequent releases of the game included all 6 Episodes together. - - Helvetica - 30 - 16 - - - - - {2, 2} - 0 - 10 - 11 - 1 - 0 - - - - -2147483374 - {{162, 140}, {700, 400}} - - NO - YES - 7 - 2 - NO - IBIPadFramework - BJ, THE MAN: William Joseph Blazkowicz was born August 15, 1911, to Polish immigrants. Blazkowicz was a top spy for the Allied Forces, eventually receiving the Congressional Medal of Honor. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483374 - {{162, 140}, {700, 400}} - - NO - YES - 7 - 3 - NO - IBIPadFramework - BOX ART: Ken Rieger was the talented illustrator who created the cover art for Spear of Destiny, Wolfenstein3D and Commander Keen. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483374 - {{162, 140}, {700, 400}} - - NO - YES - 7 - 4 - NO - IBIPadFramework - THE REAL SPEAR: The Spear of Destiny, also known as The Spear or The Holy Lance, is believed to have been the weapon used to pierce the side of Jesus Christ at the Crucifixion. The Spear soon became a symbol of God's favor and those who possessed it were believed to be invincible. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483374 - {{162, 140}, {700, 400}} - - NO - YES - 7 - 5 - NO - IBIPadFramework - THE SPEAR AND HITLER: Hitler is believed to have acquired the Spear at the beginning of WWII. Near the end of that war, it is rumored that General Patton discovered the Spear and that the downfall of Germany began that day. It is fabled that the U.S. was destined to succeed Germany as the New World Power once ownership of the Spear changed hands. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483374 - {{162, 140}, {700, 400}} - - NO - YES - 7 - 6 - NO - IBIPadFramework - DEATH DIMENSION: It is said that Hitler made a pact with the Angel of Death, promising the souls of his Nazi soldiers, to protect the Spear of Destiny. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483374 - {{162, 140}, {700, 400}} - - NO - YES - 7 - 7 - NO - IBIPadFramework - GOD MODE: In the game, if you can access god mode, BJ's eyes will glow with eerie golden light. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483374 - {{162, 140}, {700, 400}} - - NO - YES - 7 - 8 - NO - IBIPadFramework - A PRINCE: Robert Prince, wrote the music for Commander Keen, Wolfenstein 3-D, and Doom. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483374 - {{142, 140}, {740, 400}} - - NO - YES - 7 - 9 - NO - IBIPadFramework - DELAYED DEVELOPMENT: It is rumored that work on Spear of Destiny was hindered by the development team's time spent playing Fatal Fury (which Jay Wilbur called 'Fatal Productivity'), and Street Fighter II. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483374 - {{142, 140}, {740, 400}} - - NO - YES - 7 - 10 - NO - IBIPadFramework - A MATTER OF DEGREES: John Carmack is known for his innovations in 3D graphics and rocketry but what is less known is that this self-taught engineer has no degrees - he dropped out of school after one semester. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483374 - {{162, 140}, {700, 400}} - - NO - YES - 7 - 11 - NO - IBIPadFramework - THE CARMACK: John Carmack, one of the founders of id Software, preferred to work at a pizza joint and make games rather than go to college. His favorite programming food is pizza and diet coke. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483374 - {{142, 140}, {740, 400}} - - NO - YES - 7 - 12 - NO - IBIPadFramework - DREAMING IN DIGITAL: Doom was reported to cause gamers to dream in pixels and lower productivity. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483374 - {{212, 140}, {600, 400}} - - NO - YES - 7 - 13 - NO - IBIPadFramework - KEEPING IT IN THE FAMILY: BJ is Commander Keen's grandfather. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483374 - {{242, 140}, {540, 400}} - - NO - YES - 7 - 14 - NO - IBIPadFramework - WHAT'S IN A NAME: The original name for Doom was "It's Green and Pissed" - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483374 - {{192, 140}, {640, 400}} - - NO - YES - 9 - 15 - NO - IBIPadFramework - GIBS: Gibs, pronounced with a hard 'g', is sometimes confused as 'jibs' due to its pronunciation. The term came from the imagery of flying chicken giblets, or gibs for short. - - - - - {2, 2} - 1 - NO - 10 - 7 - 1 - 0 - - - - -2147483374 - {{155, 140}, {713, 400}} - - NO - YES - 7 - 16 - NO - IBIPadFramework - WOLFENSTEIN 3D: The game was originally designed to have more complex gameplay. Though dragging bodies, stealth kills and uniforms were already programmed, it was decided that they slowed down the pace of the game and were removed. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - 292 - {{34, 66}, {63, 65}} - - NO - IBIPadFramework - - NSImage - back_arrow.png - - - - - 292 - {{31.5, 33.5}, {99, 43}} - - NO - YES - 7 - NO - IBIPadFramework - BACK - - POSITYPE-idSettler_v10.2 - 36 - 16 - - - - 1 - 10 - 5 - - - - 319 - {{693, 510}, {99, 57}} - - NO - IBIPadFramework - 0 - 0 - - {2, 2} - Next - - 3 - MC4zMzMzMzMzMzMzAA - - - - - - - 319 - {{440, 510}, {187, 57}} - - NO - IBIPadFramework - 0 - 0 - - {2, 2} - Previous - - - - - - - 301 - {{31, 27}, {72, 107}} - - NO - NO - 1 - IBIPadFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - NSImage - button_highlight.png - - - - {1024, 768} - - - 3 - MAA - - - 3 - - IBIPadFramework - - - - - YES - - - view - - - - 3 - - - - nextTrivia: - - - 7 - - 18 - - - - previousTrivia: - - - 7 - - 19 - - - - firstTrivia - - - - 24 - - - - lastTrivia - - - - 43 - - - - back: - - - 7 - - 47 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 5 - - - - - 16 - - - - - 17 - - - - - 20 - - - - - 26 - - - - - 27 - - - - - 28 - - - - - 29 - - - - - 30 - - - - - 31 - - - - - 32 - - - - - 33 - - - - - 34 - - - - - 35 - - - - - 36 - - - - - 37 - - - - - 38 - - - - - 39 - - - - - 40 - - - - - 44 - - - - - 45 - - - - - 46 - - - - - 48 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 16.CustomClassName - 16.IBPluginDependency - 16.IBViewBoundsToFrameTransform - 17.CustomClassName - 17.IBPluginDependency - 17.IBViewBoundsToFrameTransform - 20.IBPluginDependency - 20.IBViewBoundsToFrameTransform - 26.IBPluginDependency - 26.IBViewBoundsToFrameTransform - 27.IBPluginDependency - 27.IBViewBoundsToFrameTransform - 28.IBPluginDependency - 28.IBViewBoundsToFrameTransform - 29.IBPluginDependency - 29.IBViewBoundsToFrameTransform - 30.IBPluginDependency - 30.IBViewBoundsToFrameTransform - 31.IBPluginDependency - 31.IBViewBoundsToFrameTransform - 32.IBPluginDependency - 32.IBViewBoundsToFrameTransform - 33.IBPluginDependency - 33.IBViewBoundsToFrameTransform - 34.IBPluginDependency - 34.IBViewBoundsToFrameTransform - 35.IBPluginDependency - 35.IBViewBoundsToFrameTransform - 36.IBPluginDependency - 36.IBViewBoundsToFrameTransform - 37.IBPluginDependency - 37.IBViewBoundsToFrameTransform - 38.IBPluginDependency - 38.IBViewBoundsToFrameTransform - 39.IBPluginDependency - 39.IBViewBoundsToFrameTransform - 40.IBPluginDependency - 40.IBViewBoundsToFrameTransform - 44.CustomClassName - 44.IBPluginDependency - 44.IBViewBoundsToFrameTransform - 45.IBPluginDependency - 45.IBViewBoundsToFrameTransform - 46.IBPluginDependency - 46.IBViewBoundsToFrameTransform - 48.IBPluginDependency - 48.IBViewBoundsToFrameTransform - 5.CustomClassName - 5.IBPluginDependency - 5.IBViewBoundsToFrameTransform - - - YES - TriviaViewController - UIResponder - {{196, 385}, {1024, 768}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEZMAAxDXAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABELYAAxDXAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUGgAABCaAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUHIAABCfAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUHwAABCiAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUHIAABCfAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUIMAABCkgAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUIgAABCnAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUI0AABCpgAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBoAAAw2MAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUJIAABCsAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUI0AABCpgAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUI0AABCpgAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUI0AABCpgAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUI0AABCpgAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUI0AABCpgAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUI0AABCpgAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUI0AABCpgAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDkIAAw/cAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABB0AAAw9mAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUHQAABCNAAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUMtAABBoAAAA - - - - - YES - - - YES - - - - - YES - - - YES - - - - 48 - - - - YES - - TriviaViewController - UIViewController - - YES - - YES - back: - nextTrivia: - previousTrivia: - - - YES - id - id - id - - - - YES - - YES - back: - nextTrivia: - previousTrivia: - - - YES - - back: - id - - - nextTrivia: - id - - - previousTrivia: - id - - - - - YES - - YES - firstTrivia - lastTrivia - - - YES - UIView - UIView - - - - YES - - YES - firstTrivia - lastTrivia - - - YES - - firstTrivia - UIView - - - lastTrivia - UIView - - - - - IBProjectSource - TriviaViewController.h - - - - UIFontButton - UIButton - - IBProjectSource - UIFontButton.h - - - - UIFontLabel - UILabel - - IBProjectSource - UIFontLabel.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../wolf3d.xcodeproj - 3 - - YES - - YES - back_arrow.png - button_highlight.png - wolf_bg.png - - - YES - {65, 63} - {4, 4} - {480, 320} - - - 141 - - + + + + + + + + + Helvetica + Helvetica-Bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wolf3d/code/iphone/SettingsView.xib b/wolf3d/code/iphone/SettingsView.xib index f3579d9..c1508dc 100644 --- a/wolf3d/code/iphone/SettingsView.xib +++ b/wolf3d/code/iphone/SettingsView.xib @@ -1,1684 +1,433 @@ - - - 1056 - 10K549 - 851 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 1298 - - YES - - - 1316 - {480, 320} - - - NO - 2 - IBCocoaTouchFramework - - NSImage - credits_bg.png - - - - - 1316 - {{172.5, 5}, {281, 96}} - - NO - 2 - IBCocoaTouchFramework - - NSImage - settings_line_art.png - - - - - 1316 - {{431.5, 281}, {31, 32}} - - - 1 - NO - 2 - IBCocoaTouchFramework - - NSImage - next_arrow.png - - - - - 1316 - {{158.5, 281}, {31, 32}} - - NO - 2 - IBCocoaTouchFramework - - NSImage - adv_btn.png - - - - - 1316 - {{165, 270}, {298, 6}} - - NO - 2 - IBCocoaTouchFramework - - NSImage - settings_divider.png - - - - - 1316 - {{166.5, 107.5}, {298, 6}} - - NO - 2 - IBCocoaTouchFramework - - - - - 1316 - {{213, 134}, {192, 30}} - - - NO - YES - 7 - NO - 2 - IBCocoaTouchFramework - SENSITIVITY: - - POSITYPE-idSettler_v10.2 - 17 - 16 - - - 3 - MC42NjY2NjY2NjY3AA - - - 3 - MQA - - 1 - 10 - 2 - - - - 1316 - {{274, 83}, {79, 33}} - - - NO - YES - 7 - NO - 2 - IBCocoaTouchFramework - Preset - - POSITYPE-idSettler_v10.2 - 22 - 16 - - - - 1 - 10 - - - - 1316 - {{213, 171}, {192, 30}} - - - NO - YES - 7 - NO - 2 - IBCocoaTouchFramework - TILT MOVE SPEED: - - - - 1 - 10 - 2 - - - - 1316 - {{210, 210}, {195, 30}} - - - NO - YES - 4 - NO - 2 - IBCocoaTouchFramework - TILT TURN SPEED: - - - - 1 - 10 - 2 - - - - 1316 - {{210, 248}, {195, 30}} - - - NO - YES - 7 - NO - 2 - IBCocoaTouchFramework - HUD ALPHA: - - - - 1 - 10 - 2 - - - - 1316 - {{177, 229}, {274, 23}} - - - NO - 2 - IBCocoaTouchFramework - 0 - 0 - 0.5 - - - - 1316 - {{177, 190}, {274, 23}} - - - NO - 2 - IBCocoaTouchFramework - 0 - 0 - 0.5 - 500 - 3000 - - - - 1316 - {{177, 152}, {274, 23}} - - - NO - 2 - IBCocoaTouchFramework - 0 - 0 - 0.5 - 5000 - 30000 - - - - 1316 - {{177, 117}, {274, 23}} - - - NO - 2 - IBCocoaTouchFramework - 0 - 0 - 0.5 - - - - 1316 - {{375, 295}, {53, 29}} - - - NO - YES - 7 - NO - 2 - IBCocoaTouchFramework - BACK - - POSITYPE-idSettler_v10.2 - 18 - 16 - - - - 1 - 10 - 2 - 5 - - - - 1316 - {{194, 302}, {84, 19}} - - NO - 2 - IBCocoaTouchFramework - 2 - - Advanced - - - - 3 - MC41AA - - - - - 1325 - {{375, 278}, {91, 40}} - - - NO - NO - 1 - 2 - IBCocoaTouchFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - NSImage - button_highlight.png - - - - - 1325 - {{157, 279}, {117, 40}} - - NO - NO - 1 - 2 - IBCocoaTouchFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - - 1316 - {{385, 21}, {40, 49}} - - NO - 2 - IBCocoaTouchFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - NSImage - right_chevron.png - - - - - 1316 - {{196, 21}, {40, 49}} - - NO - 2 - IBCocoaTouchFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - NSImage - left_chevron.png - - - - - 1316 - {{406, 135}, {42, 21}} - - NO - YES - 7 - NO - 2 - IBCocoaTouchFramework - 100% - - - - 1 - 10 - - - - 1316 - {{406.5, 171.5}, {42, 21}} - - NO - YES - 7 - NO - 2 - IBCocoaTouchFramework - 100% - - - - 1 - 10 - - - - 1316 - {{406, 211}, {42, 21}} - - NO - YES - 7 - NO - 2 - IBCocoaTouchFramework - 100% - - - - 1 - 10 - - - - 1316 - {{406.5, 248.5}, {42, 21}} - - NO - YES - 7 - NO - 2 - IBCocoaTouchFramework - 100% - - - - 1 - 10 - - - - 1316 - {{252, 3.5}, {118, 79}} - - 1 - NO - 2 - IBCocoaTouchFramework - - NSImage - iphone_preset_1.png - - - - - -2147482332 - {{252, 3.5}, {118, 79}} - - 2 - NO - 2 - IBCocoaTouchFramework - - NSImage - iphone_preset_2.png - - - - - -2147482332 - {{252, 3.5}, {118, 79}} - - 3 - NO - 2 - IBCocoaTouchFramework - - NSImage - iphone_preset_3.png - - - - - -2147482332 - {{252, 3.5}, {118, 79}} - - 4 - NO - 2 - IBCocoaTouchFramework - - NSImage - iphone_preset_4.png - - - - {480, 320} - - - 1 - MCAwIDAAA - - - 3 - - 2 - IBCocoaTouchFramework - - - - - YES - - - view - - - - 22 - - - - SensitivityValChanged - - - 13 - - 23 - - - - TiltMoveSpeedValChanged - - - 13 - - 24 - - - - TiltTurnSpeedValChanged - - - 13 - - 25 - - - - HudAlphaValChanged - - - 13 - - 26 - - - - hudAlphaSlider - - - - 27 - - - - sensitivitySlider - - - - 28 - - - - tiltTurnSpeedSlider - - - - 30 - - - - tiltMoveSpeedSlider - - - - 31 - - - - back: - - - 7 - - 32 - - - - AdvancedPressed - - - 7 - - 47 - - - - AdvancedPressed - - - 7 - - 64 - - - - hudAlphaLabel - - - - 72 - - - - sensitivityLabel - - - - 73 - - - - tiltMoveSpeedLabel - - - - 74 - - - - tiltTurnSpeedLabel - - - - 75 - - - - nextPreset - - - 7 - - 80 - - - - previousPreset - - - 7 - - 81 - - - - presetLabel - - - - 82 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 4 - - - - - 5 - - - - - 6 - - - - - 7 - - - - - 8 - - - - - 9 - - - - - 10 - - - - - 11 - - - - - 12 - - - - - 13 - - - - - 14 - - - - - 15 - - - - - 45 - - - - - 46 - - - - - 57 - - - - - 58 - - - - - 60 - - - - - 62 - - - - - 65 - - - - - 66 - - - - - 67 - - - - - 68 - - - - - 69 - - - - - 70 - - - - - 71 - - - - - 76 - - - - - 77 - - - - - 78 - - - - - 79 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 10.CustomClassName - 10.IBPluginDependency - 10.IBViewBoundsToFrameTransform - 11.CustomClassName - 11.IBPluginDependency - 11.IBViewBoundsToFrameTransform - 12.IBPluginDependency - 12.IBViewBoundsToFrameTransform - 13.CustomClassName - 13.IBPluginDependency - 13.IBViewBoundsToFrameTransform - 14.IBPluginDependency - 14.IBViewBoundsToFrameTransform - 15.IBPluginDependency - 15.IBViewBoundsToFrameTransform - 4.IBPluginDependency - 4.IBViewBoundsToFrameTransform - 45.CustomClassName - 45.IBPluginDependency - 45.IBViewBoundsToFrameTransform - 46.CustomClassName - 46.IBPluginDependency - 46.IBViewBoundsToFrameTransform - 5.IBPluginDependency - 5.IBViewBoundsToFrameTransform - 57.IBPluginDependency - 57.IBViewBoundsToFrameTransform - 58.IBPluginDependency - 58.IBViewBoundsToFrameTransform - 6.IBPluginDependency - 6.IBViewBoundsToFrameTransform - 60.IBPluginDependency - 60.IBViewBoundsToFrameTransform - 62.IBPluginDependency - 62.IBViewBoundsToFrameTransform - 65.IBPluginDependency - 65.IBViewBoundsToFrameTransform - 66.IBPluginDependency - 66.IBViewBoundsToFrameTransform - 67.IBPluginDependency - 67.IBViewBoundsToFrameTransform - 68.IBPluginDependency - 68.IBViewBoundsToFrameTransform - 69.IBPluginDependency - 69.IBViewBoundsToFrameTransform - 7.CustomClassName - 7.IBPluginDependency - 7.IBViewBoundsToFrameTransform - 70.IBPluginDependency - 70.IBViewBoundsToFrameTransform - 71.IBPluginDependency - 76.IBPluginDependency - 76.IBViewBoundsToFrameTransform - 77.IBPluginDependency - 77.IBViewBoundsToFrameTransform - 78.IBPluginDependency - 78.IBViewBoundsToFrameTransform - 79.IBPluginDependency - 79.IBViewBoundsToFrameTransform - 8.CustomClassName - 8.IBPluginDependency - 8.IBViewBoundsToFrameTransform - 9.CustomClassName - 9.IBPluginDependency - 9.IBViewBoundsToFrameTransform - - - YES - SettingsViewController - UIResponder - {{313, 508}, {960, 640}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDRwAAw2uAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDRwAAw4nAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDvQAAw56AAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABD1wAAw40AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBYAAAw5gAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAw58AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDZwAAw3oAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUNCAABDlgAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDegAAwtIAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDZwAAw1cAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCQAAAw5gAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDtoAAwnwAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDLwAAw1sAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDQoAAwn4AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABAoAAAw56AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUMlAABDhwAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABC+QAAwnIAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBoAAAw2EAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUPSgABDDAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUPSwABDMIAAA - - WolfSlider - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDZwAAwxQAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUPSgABDWAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUN8AABAYAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUGgAABBUAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUGgAABC1gAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBoAAAw4qAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDSgAAwxcAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDSgAAwz+AAA - - - - - YES - - - YES - - - - - YES - - - YES - - - - 82 - - - - YES - - SettingsViewController - UIViewController - - YES - - YES - AdvancedPressed - ControlScheme1Pressed - ControlScheme2Pressed - ControlScheme3Pressed - ControlScheme4Pressed - HudAlphaValChanged - SensitivityValChanged - TiltMoveSpeedValChanged - TiltTurnSpeedValChanged - back: - nextPreset - previousPreset - - - YES - id - id - id - id - id - id - id - id - id - id - id - id - - - - YES - - YES - AdvancedPressed - ControlScheme1Pressed - ControlScheme2Pressed - ControlScheme3Pressed - ControlScheme4Pressed - HudAlphaValChanged - SensitivityValChanged - TiltMoveSpeedValChanged - TiltTurnSpeedValChanged - back: - nextPreset - previousPreset - - - YES - - AdvancedPressed - id - - - ControlScheme1Pressed - id - - - ControlScheme2Pressed - id - - - ControlScheme3Pressed - id - - - ControlScheme4Pressed - id - - - HudAlphaValChanged - id - - - SensitivityValChanged - id - - - TiltMoveSpeedValChanged - id - - - TiltTurnSpeedValChanged - id - - - back: - id - - - nextPreset - id - - - previousPreset - id - - - - - YES - - YES - controlScheme1Button - controlScheme2Button - controlScheme3Button - controlScheme4Button - hudAlphaLabel - hudAlphaSlider - presetLabel - sensitivityLabel - sensitivitySlider - tiltMoveSpeedLabel - tiltMoveSpeedSlider - tiltTurnSpeedLabel - tiltTurnSpeedSlider - - - YES - UIButton - UIButton - UIButton - UIButton - UILabel - UISlider - UILabel - UILabel - UISlider - UILabel - UISlider - UILabel - UISlider - - - - YES - - YES - controlScheme1Button - controlScheme2Button - controlScheme3Button - controlScheme4Button - hudAlphaLabel - hudAlphaSlider - presetLabel - sensitivityLabel - sensitivitySlider - tiltMoveSpeedLabel - tiltMoveSpeedSlider - tiltTurnSpeedLabel - tiltTurnSpeedSlider - - - YES - - controlScheme1Button - UIButton - - - controlScheme2Button - UIButton - - - controlScheme3Button - UIButton - - - controlScheme4Button - UIButton - - - hudAlphaLabel - UILabel - - - hudAlphaSlider - UISlider - - - presetLabel - UILabel - - - sensitivityLabel - UILabel - - - sensitivitySlider - UISlider - - - tiltMoveSpeedLabel - UILabel - - - tiltMoveSpeedSlider - UISlider - - - tiltTurnSpeedLabel - UILabel - - - tiltTurnSpeedSlider - UISlider - - - - - IBProjectSource - SettingsViewController.h - - - - UIFontButton - UIButton - - IBProjectSource - UIFontButton.h - - - - UIFontLabel - UILabel - - IBProjectSource - UIFontLabel.h - - - - WolfSlider - UISlider - - IBProjectSource - WolfSlider.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UISlider - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UISlider.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - wolf3d.xcodeproj - 3 - - YES - - YES - adv_btn.png - button_highlight.png - credits_bg.png - iphone_preset_1.png - iphone_preset_2.png - iphone_preset_3.png - iphone_preset_4.png - left_chevron.png - next_arrow.png - right_chevron.png - settings_divider.png - settings_line_art.png - - - YES - {56, 55} - {4, 4} - {960, 640} - {306, 208} - {306, 208} - {306, 208} - {306, 208} - {66, 80} - {65, 63} - {66, 80} - {597, 13} - {562, 192} - - - 141 - - + + + + + + + + + + + + Helvetica-Bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wolf3d/code/iphone/SettingsViewController.m b/wolf3d/code/iphone/SettingsViewController.m index 945ae00..b30b3bf 100644 --- a/wolf3d/code/iphone/SettingsViewController.m +++ b/wolf3d/code/iphone/SettingsViewController.m @@ -125,36 +125,24 @@ float convertSliderValue( UISlider * slider ); [self setPresetVisibility]; } -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - return UIInterfaceOrientationIsLandscape(interfaceOrientation); -} - - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc. that aren't in use. + self.sensitivitySlider = nil; + self.tiltTurnSpeedSlider = nil; + self.tiltMoveSpeedSlider = nil; + self.hudAlphaSlider = nil; + + self.sensitivityLabel = nil; + self.tiltTurnSpeedLabel = nil; + self.tiltMoveSpeedLabel = nil; + self.hudAlphaSlider = nil; + + self.presetLabel = nil; } -- (void)viewDidUnload { - [super viewDidUnload]; - // Release any retained subviews of the main view. - // e.g. self.myOutlet = nil; - - self.sensitivitySlider = nil; - self.tiltTurnSpeedSlider = nil; - self.tiltMoveSpeedSlider = nil; - self.hudAlphaSlider = nil; - - self.sensitivityLabel = nil; - self.tiltTurnSpeedLabel = nil; - self.tiltMoveSpeedLabel = nil; - self.hudAlphaSlider = nil; - - self.presetLabel = nil; -} - - - (void)dealloc { [super dealloc]; } diff --git a/wolf3d/code/iphone/SkillView.xib b/wolf3d/code/iphone/SkillView.xib index 933bc45..90d9a12 100644 --- a/wolf3d/code/iphone/SkillView.xib +++ b/wolf3d/code/iphone/SkillView.xib @@ -1,1250 +1,339 @@ - - - 1056 - 10K549 - 851 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 1298 - - YES - - - 1298 - {480, 320} - - NO - YES - 1 - YES - 2 - IBCocoaTouchFramework - - NSImage - wolf_bg.png - - - - - 1316 - {{86, 96}, {308, 73}} - - NO - 2 - IBCocoaTouchFramework - - NSImage - highlight_bracket.png - - - - - 1316 - {{90, 28}, {300, 65}} - - 1 - NO - 2 - IBCocoaTouchFramework - - NSImage - episode_bracket.png - - - - - 1316 - {{90, 100}, {300, 65}} - - 2 - NO - 2 - IBCocoaTouchFramework - - - - - 1316 - {{90, 173}, {300, 65}} - - 3 - NO - 2 - IBCocoaTouchFramework - - - - - 1316 - {{90, 246}, {300, 65}} - - 4 - NO - 2 - IBCocoaTouchFramework - - - - - 1316 - {{90, 1}, {169, 29}} - - NO - YES - 7 - NO - 2 - IBCocoaTouchFramework - Difficulty Select - - POSITYPE-idSettler_v10.2 - 24 - 16 - - - 3 - MQA - - - 1 - 10 - - - - 1298 - {{24, 279}, {32, 32}} - - 1 - NO - 2 - IBCocoaTouchFramework - - NSImage - back_arrow.png - - - - - 1298 - {{23, 260}, {66, 29}} - - NO - YES - 7 - NO - 2 - IBCocoaTouchFramework - BACK - - POSITYPE-idSettler_v10.2 - 18 - 16 - - - - 1 - 10 - 5 - - - - 1316 - {{418, 279}, {32, 32}} - - 1 - NO - 2 - IBCocoaTouchFramework - - NSImage - next_arrow.png - - - - - 1316 - {{417, 259.5}, {66, 29}} - - NO - YES - 7 - NO - 2 - IBCocoaTouchFramework - NEXT - - - - 1 - 10 - 5 - - - - 1325 - {{409, 257}, {52, 56}} - - NO - NO - 1 - 2 - IBCocoaTouchFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - NSImage - button_highlight.png - - - - - 1298 - {{17, 259}, {53, 54}} - - NO - NO - 1 - 2 - IBCocoaTouchFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - - 1298 - {{138, 31}, {249, 64}} - - NO - NO - 1 - 2 - IBCocoaTouchFramework - 2 - - Helvetica-Bold - 32 - 16 - - Can I Play, Daddy? - - - - - - - 1298 - {{100, 38}, {32, 45}} - - NO - NO - 1 - 2 - IBCocoaTouchFramework - 2 - - Helvetica-Bold - 24 - 16 - - NO - - - - - NSImage - difficulty_head1.png - - - - - 1298 - {{100, 109.5}, {32, 45}} - - NO - NO - 1 - 2 - IBCocoaTouchFramework - 2 - - NO - - - - - NSImage - difficulty_head2.png - - - - - 1298 - {{100, 182}, {32, 45}} - - NO - NO - 1 - 2 - IBCocoaTouchFramework - 2 - - NO - - - - - NSImage - difficulty_head3.png - - - - - 1298 - {{100, 255.5}, {32, 45}} - - NO - NO - 1 - 2 - IBCocoaTouchFramework - 2 - - NO - - - - - NSImage - difficulty_head4.png - - - - - 1298 - {{138, 103}, {249, 64}} - - NO - NO - 1 - 2 - IBCocoaTouchFramework - 2 - - Don't Hurt Me - - - - - - - 1298 - {{138, 175}, {249, 63}} - - NO - NO - 1 - 2 - IBCocoaTouchFramework - 2 - - Bring 'Em On! - - - - - - - 1298 - {{138, 248}, {249, 63}} - - NO - NO - 1 - 2 - IBCocoaTouchFramework - 2 - - 0 - I am Death Incarnate! - - - - - - {480, 320} - - - 3 - MQA - - 2 - - - - 3 - - 2 - IBCocoaTouchFramework - - - - - YES - - - view - - - - 3 - - - - back: - - - 7 - - 29 - - - - BringEmOn: - - - 7 - - 30 - - - - canIPlayDaddy: - - - 7 - - 31 - - - - dontHurtMe: - - - 7 - - 32 - - - - IAmDeathIncarnate: - - - 7 - - 33 - - - - next: - - - 7 - - 34 - - - - selectionFrame - - - - 37 - - - - canIPlayDaddy: - - - 7 - - 41 - - - - dontHurtMe: - - - 7 - - 44 - - - - BringEmOn: - - - 7 - - 47 - - - - IAmDeathIncarnate: - - - 7 - - 50 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - - - - - - - - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 4 - - - - - 5 - - - - - 6 - - - - - 9 - - - - - 10 - - - - - 8 - - - - - 7 - - - - - 11 - - - - - 12 - - - - - 13 - - - - - 14 - - - - - 15 - - - - - 21 - - - - - 22 - - - - - 23 - - - - - 24 - - - - - 35 - - - - - 40 - - - - - 42 - - - - - 45 - - - - - 48 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 10.CustomClassName - 10.IBPluginDependency - 10.IBViewBoundsToFrameTransform - 11.CustomClassName - 11.IBPluginDependency - 11.IBViewBoundsToFrameTransform - 12.IBPluginDependency - 12.IBViewBoundsToFrameTransform - 13.IBPluginDependency - 13.IBViewBoundsToFrameTransform - 14.IBPluginDependency - 14.IBViewBoundsToFrameTransform - 15.IBPluginDependency - 15.IBViewBoundsToFrameTransform - 21.CustomClassName - 21.IBPluginDependency - 21.IBViewBoundsToFrameTransform - 22.CustomClassName - 22.IBPluginDependency - 22.IBViewBoundsToFrameTransform - 23.CustomClassName - 23.IBPluginDependency - 23.IBViewBoundsToFrameTransform - 24.CustomClassName - 24.IBPluginDependency - 24.IBViewBoundsToFrameTransform - 35.IBPluginDependency - 35.IBViewBoundsToFrameTransform - 4.IBViewBoundsToFrameTransform - 40.IBPluginDependency - 40.IBViewBoundsToFrameTransform - 42.IBPluginDependency - 42.IBViewBoundsToFrameTransform - 45.IBPluginDependency - 45.IBViewBoundsToFrameTransform - 48.IBPluginDependency - 48.IBViewBoundsToFrameTransform - 5.CustomClassName - 5.IBPluginDependency - 5.IBViewBoundsToFrameTransform - 6.IBPluginDependency - 6.IBViewBoundsToFrameTransform - 7.IBPluginDependency - 7.IBViewBoundsToFrameTransform - 8.IBEditorWindowLastContentRect - 8.IBPluginDependency - 8.IBViewBoundsToFrameTransform - 9.IBPluginDependency - 9.IBViewBoundsToFrameTransform - - - YES - SkillViewController - UIResponder - {{303, 509}, {960, 640}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUPUgABDdQAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUK0AAA/gAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUK0AABBvAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUK0AABCwAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUK0AABDKQAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUK0AABDcgAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUMWAABCCAAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUMWAABC1AAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUMWAABDMwAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDGAAAwtoAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCrAAAwyMAAA - - - P4AAAL+AAAAAAAAAw58AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AULOAABCCAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUIeAABC0wAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUIcAABDMgAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCEAAAwrAAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUIEAABDbQAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUIUAABDg4AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBgAAAw3QAAA - - {{323, 1045}, {52, 56}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDzAAAw3QAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUPOgABDg4AAA - - - - - YES - - - YES - - - - - YES - - - YES - - - - 50 - - - - YES - - SkillViewController - UIViewController - - YES - - YES - BringEmOn: - IAmDeathIncarnate: - back: - canIPlayDaddy: - dontHurtMe: - next: - - - YES - id - id - id - id - id - id - - - - YES - - YES - BringEmOn: - IAmDeathIncarnate: - back: - canIPlayDaddy: - dontHurtMe: - next: - - - YES - - BringEmOn: - id - - - IAmDeathIncarnate: - id - - - back: - id - - - canIPlayDaddy: - id - - - dontHurtMe: - id - - - next: - id - - - - - selectionFrame - UIView - - - selectionFrame - - selectionFrame - UIView - - - - IBProjectSource - SkillViewController.h - - - - UIFontButton - UIButton - - IBProjectSource - UIFontButton.h - - - - UIFontLabel - UILabel - - IBProjectSource - UIFontLabel.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - wolf3d.xcodeproj - 3 - - YES - - YES - back_arrow.png - button_highlight.png - difficulty_head1.png - difficulty_head2.png - difficulty_head3.png - difficulty_head4.png - episode_bracket.png - highlight_bracket.png - next_arrow.png - wolf_bg.png - - - YES - {65, 63} - {4, 4} - {64, 87} - {60, 82} - {60, 78} - {59, 79} - {606, 168} - {623, 189} - {65, 63} - {480, 320} - - - 141 - - + + + + + + + + + + + + Helvetica-Bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wolf3d/code/iphone/SkillViewController.m b/wolf3d/code/iphone/SkillViewController.m index 4dfac40..f848ee3 100644 --- a/wolf3d/code/iphone/SkillViewController.m +++ b/wolf3d/code/iphone/SkillViewController.m @@ -65,16 +65,10 @@ // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; - - [self setSelectionFrame]; } - - -// Override to allow orientations other than the default portrait orientation. -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - // Return YES for supported orientations. - return UIInterfaceOrientationIsLandscape(interfaceOrientation); +- (void)viewDidLayoutSubviews { + [self setSelectionFrame]; } @@ -82,18 +76,9 @@ // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; - // Release any cached data, images, etc. that aren't in use. + self.selectionFrame = nil; } -- (void)viewDidUnload { - [super viewDidUnload]; - // Release any retained subviews of the main view. - // e.g. self.myOutlet = nil; - - self.selectionFrame = nil; -} - - - (void)dealloc { [super dealloc]; } diff --git a/wolf3d/code/iphone/TriviaView.xib b/wolf3d/code/iphone/TriviaView.xib index 6e78c8a..f7cfd42 100644 --- a/wolf3d/code/iphone/TriviaView.xib +++ b/wolf3d/code/iphone/TriviaView.xib @@ -1,1327 +1,388 @@ - - - 1056 - 10K540 - 851 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - YES - - - 292 - {480, 320} - - NO - IBCocoaTouchFramework - - NSImage - wolf_bg.png - - - - - 292 - {{163, 16}, {134, 52}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Trivia - - POSITYPE-idSettler_v10.2 - 42 - 16 - - - 3 - MQA - - - - 1 - MCAwIDAAA - - {2, 2} - 1 - 10 - 1 - - - - 288 - {{20, 50}, {440, 171}} - - NO - YES - 7 - 1 - NO - IBCocoaTouchFramework - ORIGINAL WOLF: The original release of Wolfenstein 3D only contained 3 Episodes. Episodes 4, 5, and 6 were sold separately as "The Nocturnal Missions", and were intended to act as a prequel to the original trilogy of Episodes. Subsequent releases of the game included all 6 Episodes together. - - Helvetica - 18 - 16 - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483360 - {{20, 27}, {440, 171}} - - NO - YES - 7 - 2 - NO - IBCocoaTouchFramework - BJ, THE MAN: William Joseph Blazkowicz was born August 15, 1911, to Polish immigrants. Blazkowicz was a top spy for the Allied Forces, eventually receiving the Congressional Medal of Honor. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483360 - {{20, 16}, {440, 171}} - - NO - YES - 7 - 3 - NO - IBCocoaTouchFramework - BOX ART: Ken Rieger was the talented illustrator who created the cover art for Spear of Destiny, Wolfenstein3D and Commander Keen. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483360 - {{20, 50}, {440, 171}} - - NO - YES - 7 - 4 - NO - IBCocoaTouchFramework - THE REAL SPEAR: The Spear of Destiny, also known as The Spear or The Holy Lance, is believed to have been the weapon used to pierce the side of Jesus Christ at the Crucifixion. The Spear soon became a symbol of God's favor and those who possessed it were believed to be invincible. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483360 - {{20, 60}, {440, 171}} - - NO - YES - 7 - 5 - NO - IBCocoaTouchFramework - THE SPEAR AND HITLER: Hitler is believed to have acquired the Spear at the beginning of WWII. Near the end of that war, it is rumored that General Patton discovered the Spear and that the downfall of Germany began that day. It is fabled that the U.S. was destined to succeed Germany as the New World Power once ownership of the Spear changed hands. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483360 - {{20, 16}, {440, 171}} - - NO - YES - 7 - 6 - NO - IBCocoaTouchFramework - DEATH DIMENSION: It is said that Hitler made a pact with the Angel of Death, promising the souls of his Nazi soldiers, to protect the Spear of Destiny. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483360 - {{20, 5}, {440, 171}} - - NO - YES - 7 - 7 - NO - IBCocoaTouchFramework - GOD MODE: In the game, if you can access god mode, BJ's eyes will glow with eerie golden light. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483360 - {{20, 5}, {440, 171}} - - NO - YES - 7 - 8 - NO - IBCocoaTouchFramework - A PRINCE: Robert Prince, wrote the music for Commander Keen, Wolfenstein 3-D, and Doom. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483360 - {{20, 37}, {440, 171}} - - NO - YES - 7 - 9 - NO - IBCocoaTouchFramework - DELAYED DEVELOPMENT: It is rumored that work on Spear of Destiny was hindered by the development team's time spent playing Fatal Fury (which Jay Wilbur called 'Fatal Productivity'), and Street Fighter II. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483360 - {{20, 38}, {440, 171}} - - NO - YES - 7 - 10 - NO - IBCocoaTouchFramework - A MATTER OF DEGREES: John Carmack is known for his innovations in 3D graphics and rocketry but what is less known is that this self-taught engineer has no degrees - he dropped out of school after one semester. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483360 - {{20, 28}, {440, 171}} - - NO - YES - 7 - 11 - NO - IBCocoaTouchFramework - THE CARMACK: John Carmack, one of the founders of id Software, preferred to work at a pizza joint and make games rather than go to college. His favorite programming food is pizza and diet coke. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483360 - {{20, 17}, {440, 171}} - - NO - YES - 7 - 12 - NO - IBCocoaTouchFramework - DREAMING IN DIGITAL: Doom was reported to cause gamers to dream in pixels and lower productivity. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483360 - {{20, 8}, {440, 171}} - - NO - YES - 7 - 13 - NO - IBCocoaTouchFramework - KEEPING IT IN THE FAMILY: BJ is Commander Keen's grandfather. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483360 - {{20, -6}, {440, 195}} - - NO - YES - 7 - 14 - NO - IBCocoaTouchFramework - WHAT'S IN A NAME: The original name for Doom was "It's Green and Pissed" - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - -2147483360 - {{20, 69}, {440, 92}} - - NO - YES - 9 - 15 - NO - IBCocoaTouchFramework - GIBS: Gibs, pronounced with a hard 'g', is sometimes confused as 'jibs' due to its pronunciation. The term came from the imagery of flying chicken giblets, or gibs for short. - - - - - {2, 2} - 1 - NO - 10 - 7 - 1 - 0 - - - - -2147483360 - {{20, 38}, {440, 171}} - - NO - YES - 7 - 16 - NO - IBCocoaTouchFramework - WOLFENSTEIN 3D: The game was originally designed to have more complex gameplay. Though dragging bodies, stealth kills and uniforms were already programmed, it was decided that they slowed down the pace of the game and were removed. - - - - - {2, 2} - 1 - 10 - 7 - 1 - 0 - - - - 292 - {{18, 268}, {32, 32}} - - NO - IBCocoaTouchFramework - - NSImage - back_arrow.png - - - - - 292 - {{17, 243}, {66, 29}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - BACK - - POSITYPE-idSettler_v10.2 - 18 - 16 - - - - 1 - 10 - 5 - - - - 319 - {{394, 256}, {66, 38}} - - NO - IBCocoaTouchFramework - 0 - 0 - - POSITYPE-idSettler_v10.2 - 32 - 16 - - {2, 2} - Next - - 3 - MC4zMzMzMzMzMzMzAA - - - - - - - 319 - {{173, 256}, {125, 38}} - - NO - IBCocoaTouchFramework - 0 - 0 - - {2, 2} - Previous - - - - - - - 301 - {{9, 244}, {60, 60}} - - NO - NO - 1 - IBCocoaTouchFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - NSImage - button_highlight.png - - - - {480, 320} - - - 3 - MAA - - - 3 - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 3 - - - - nextTrivia: - - - 7 - - 18 - - - - previousTrivia: - - - 7 - - 19 - - - - firstTrivia - - - - 24 - - - - lastTrivia - - - - 43 - - - - back: - - - 7 - - 48 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 5 - - - - - 16 - - - - - 17 - - - - - 20 - - - - - 26 - - - - - 27 - - - - - 28 - - - - - 29 - - - - - 30 - - - - - 31 - - - - - 32 - - - - - 33 - - - - - 34 - - - - - 35 - - - - - 36 - - - - - 37 - - - - - 38 - - - - - 39 - - - - - 40 - - - - - 44 - - - - - 45 - - - - - 46 - - - - - 47 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 16.CustomClassName - 16.IBPluginDependency - 16.IBViewBoundsToFrameTransform - 17.CustomClassName - 17.IBPluginDependency - 17.IBViewBoundsToFrameTransform - 20.IBPluginDependency - 20.IBViewBoundsToFrameTransform - 26.IBPluginDependency - 26.IBViewBoundsToFrameTransform - 27.IBPluginDependency - 27.IBViewBoundsToFrameTransform - 28.IBPluginDependency - 28.IBViewBoundsToFrameTransform - 29.IBPluginDependency - 29.IBViewBoundsToFrameTransform - 30.IBPluginDependency - 30.IBViewBoundsToFrameTransform - 31.IBPluginDependency - 31.IBViewBoundsToFrameTransform - 32.IBPluginDependency - 32.IBViewBoundsToFrameTransform - 33.IBPluginDependency - 33.IBViewBoundsToFrameTransform - 34.IBPluginDependency - 34.IBViewBoundsToFrameTransform - 35.IBPluginDependency - 35.IBViewBoundsToFrameTransform - 36.IBPluginDependency - 36.IBViewBoundsToFrameTransform - 37.IBPluginDependency - 37.IBViewBoundsToFrameTransform - 38.IBPluginDependency - 38.IBViewBoundsToFrameTransform - 39.IBPluginDependency - 39.IBViewBoundsToFrameTransform - 40.IBPluginDependency - 40.IBViewBoundsToFrameTransform - 44.CustomClassName - 44.IBPluginDependency - 44.IBViewBoundsToFrameTransform - 45.IBPluginDependency - 45.IBViewBoundsToFrameTransform - 46.IBPluginDependency - 46.IBViewBoundsToFrameTransform - 47.IBPluginDependency - 47.IBViewBoundsToFrameTransform - 5.CustomClassName - 5.IBPluginDependency - 5.IBViewBoundsToFrameTransform - - - YES - TriviaViewController - UIResponder - {{376, 816}, {480, 320}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDroAAw5IAAA - - UIFontButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABC8gAAw5IAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUGgAABCaAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUHIAABCfAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUHwAABCiAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUHIAABCfAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUIMAABCkgAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUIgAABCnAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUI0AABCpgAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBoAAAw2MAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUJIAABCsAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUI0AABCpgAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUI0AABCpgAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUI0AABCpgAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUI0AABCpgAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUI0AABCpgAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUI0AABCpgAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUI0AABCpgAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUIEAABDbQAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUK2AABDgYAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUFgAABDcwAAA - - UIFontLabel - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUMtAABBoAAAA - - - - - YES - - - YES - - - - - YES - - - YES - - - - 48 - - - - YES - - TriviaViewController - UIViewController - - YES - - YES - back: - nextTrivia: - previousTrivia: - - - YES - id - id - id - - - - YES - - YES - back: - nextTrivia: - previousTrivia: - - - YES - - back: - id - - - nextTrivia: - id - - - previousTrivia: - id - - - - - YES - - YES - firstTrivia - lastTrivia - - - YES - UIView - UIView - - - - YES - - YES - firstTrivia - lastTrivia - - - YES - - firstTrivia - UIView - - - lastTrivia - UIView - - - - - IBProjectSource - TriviaViewController.h - - - - UIFontButton - UIButton - - IBProjectSource - UIFontButton.h - - - - UIFontLabel - UILabel - - IBProjectSource - UIFontLabel.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - wolf3d.xcodeproj - 3 - - YES - - YES - back_arrow.png - button_highlight.png - wolf_bg.png - - - YES - {65, 63} - {4, 4} - {960, 640} - - - 141 - - + + + + + + + + + Helvetica + Helvetica-Bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wolf3d/code/iphone/TriviaViewController.m b/wolf3d/code/iphone/TriviaViewController.m index 509ab38..df91a88 100644 --- a/wolf3d/code/iphone/TriviaViewController.m +++ b/wolf3d/code/iphone/TriviaViewController.m @@ -64,32 +64,16 @@ } -// Override to allow orientations other than the default portrait orientation. -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - // Return YES for supported orientations. - return UIInterfaceOrientationIsLandscape(interfaceOrientation); -} - - - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; - // Release any cached data, images, etc. that aren't in use. + self.firstTrivia = nil; + self.lastTrivia = nil; + + self.currentTrivia = nil; } -- (void)viewDidUnload { - [super viewDidUnload]; - // Release any retained subviews of the main view. - // e.g. self.myOutlet = nil; - - self.firstTrivia = nil; - self.lastTrivia = nil; - - self.currentTrivia = nil; -} - - - (void)dealloc { [super dealloc]; } diff --git a/wolf3d/code/iphone/UIFontButton.m b/wolf3d/code/iphone/UIFontButton.m index 4243fc2..8e8ea7c 100644 --- a/wolf3d/code/iphone/UIFontButton.m +++ b/wolf3d/code/iphone/UIFontButton.m @@ -26,6 +26,7 @@ @implementation UIFontButton - (void)awakeFromNib { + [super awakeFromNib]; CGFloat points = self.titleLabel.font.pointSize; self.titleLabel.font = [UIFont fontWithName:@"POSITYPE idSettler v10.2" size:points]; diff --git a/wolf3d/code/iphone/UIFontLabel.m b/wolf3d/code/iphone/UIFontLabel.m index f6f2096..f19f38f 100644 --- a/wolf3d/code/iphone/UIFontLabel.m +++ b/wolf3d/code/iphone/UIFontLabel.m @@ -26,6 +26,7 @@ @implementation UIFontLabel - (void)awakeFromNib { + [super awakeFromNib]; CGFloat points = self.font.pointSize; self.font = [UIFont fontWithName:@"POSITYPE idSettler v10.2" size:points]; diff --git a/wolf3d/code/iphone/UITableViewScrolling.m b/wolf3d/code/iphone/UITableViewScrolling.m index 0b7d88c..84a0933 100644 --- a/wolf3d/code/iphone/UITableViewScrolling.m +++ b/wolf3d/code/iphone/UITableViewScrolling.m @@ -34,7 +34,7 @@ void UITableViewScrollingPageDown( UITableView * table, int totalRows ) { int maxRow = 0; for ( NSIndexPath* path in visibleIndexPaths ) { - maxRow = maxRow < path.row ? path.row: maxRow; + maxRow = maxRow < path.row ? (int)path.row: maxRow; } const int rowToMakeVisible = maxRow + 1; @@ -54,7 +54,7 @@ void UITableViewScrollingPageUp( UITableView * table, int totalRows ) { int minRow = totalRows - 1; for ( NSIndexPath* path in visibleIndexPaths ) { - minRow = minRow < path.row ? minRow: path.row; + minRow = minRow < path.row ? minRow: (int)path.row; } const int rowToMakeVisible = minRow - 1; diff --git a/wolf3d/code/iphone/WOLF_114.png b/wolf3d/code/iphone/WOLF_114.png new file mode 100755 index 0000000000000000000000000000000000000000..825c42402f54e7e62a758e7a9dfe2d6c03800ef7 GIT binary patch literal 25852 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 literal 0 HcmV?d00001 diff --git a/wolf3d/code/iphone/WOLF_57.png b/wolf3d/code/iphone/WOLF_57.png new file mode 100755 index 0000000000000000000000000000000000000000..dfb2765010c40393481ccd702729693d5f840f9f GIT binary patch literal 9676 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

kakO4@#*zh*4hZo*sMNNcHeSe;1 z}>kf$sYIZuCF%=wIvY!lC~r`@O6GHD7t#G*?%m8bN@w z7A0kf$$m|F|0b>XP1F2#2L5LZI?#aM7vI0{0Bb|u?)DE1pXR?+^d%svHUA%K40@IT O0000j1^HV42lZa2jn55j)S9! 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 literal 0 HcmV?d00001 diff --git a/wolf3d/code/iphone/WolfSlider.m b/wolf3d/code/iphone/WolfSlider.m index 68f3c11..e1d9fb9 100644 --- a/wolf3d/code/iphone/WolfSlider.m +++ b/wolf3d/code/iphone/WolfSlider.m @@ -32,8 +32,9 @@ UIImage* trackImage = [self minimumTrackImageForState:UIControlStateNormal]; CGFloat trackImageHeight = trackImage.size.height; - - return CGRectMake(bounds.origin.x, bounds.origin.y, self.bounds.size.width, trackImageHeight); + + // return CGRectMake(bounds.origin.x, bounds.origin.y, self.bounds.size.height, trackImageHeight); + return CGRectMake(bounds.origin.x, bounds.origin.y, self.bounds.size.width, trackImageHeight); } diff --git a/wolf3d/code/iphone/default.png b/wolf3d/code/iphone/default.png index c3505d4ccc61b0e689e540595107e70d556bb80b..3c327c43ead7d03fb3e5e3e729b964474c83da23 100644 GIT binary patch literal 249224 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 Y2ZN@q(*O-5qW}N^07*qoM6N<$g0Ws3WB>pF literal 186836 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

HAnA4=HYmxU~-@mxKWkdsWpWPTk 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 YAEQ!a360iGs12;A;#TJbv>y)ovC4~d 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


I^HYtZx;7Q&B*XwrC`1N$oZJ5>3DE#7 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

KQ91xDT$j0&pejd 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 0) diff --git a/wolf3d/code/iphone/iphone_loop.c b/wolf3d/code/iphone/iphone_loop.c index 6d4a00c..4d9d072 100644 --- a/wolf3d/code/iphone/iphone_loop.c +++ b/wolf3d/code/iphone/iphone_loop.c @@ -156,6 +156,24 @@ int isTouchMoving = 0; //gsh int touchCoordinateScale = 1; float deviceScale = 1.0f; +bool isiPhoneX; + +// Game controller stuff +bool controllerConnected = false; +bool leftTriggerPressed = false; +bool rightTriggerPressed = false; +bool leftShoulderPressed = false; +bool rightShoulderPressed = false; +bool buttonAPressed = false; +bool buttonBPressed = false; +bool buttonXPressed = false; +bool buttonYPressed = false; +// TODO: d-pad +float leftThumbstickYAxis = 0.0; +float leftThumbstickXAxis = 0.0; +float rightThumbstickYAxis = 0.0; +float rightThumbstickXAxis = 0.0; + deviceOrientation_t deviceOrientation = ORIENTATION_LANDSCAPE_LEFT; @@ -309,7 +327,7 @@ void iphoneSavePrevTouches() { */ extern font_t *myfonts[ 1 ]; int iphoneCenterText( int x, int y, const char *str ) { - int l = strlen( str ); + int l = (int)strlen( str ); int i; font_t *myfont = myfonts[0]; int scale; @@ -492,7 +510,7 @@ int iphoneCenterArialText( int x, int y, float scale, const char *str ) */ int iphoneDrawArialTextInBox( rect_t paragraph, int lineLength, const char *str, rect_t boxRect ) { - int l = strlen( str ); + int l = (int)strlen( str ); int i; if (paragraph.x > boxRect.x + boxRect.width) @@ -615,7 +633,7 @@ int iphoneDrawArialTextInBox( rect_t paragraph, int lineLength, const char *str, int iphoneDrawText( int x, int y, int width, int height, const char *str ) { - int l = strlen( str ); + int l = (int)strlen( str ); int i; font_t *myfont = myfonts[0]; // int scale; @@ -719,7 +737,7 @@ void iphoneDrawMapName( rect_t rect, const char *str ) { ================== */ int iphoneDrawTextInBox( rect_t paragraph, int lineLength, const char *str, rect_t boxRect ) { - int l = strlen( str ); + int l = (int)strlen( str ); int i; font_t *myfont = myfonts[0]; @@ -941,6 +959,9 @@ int TouchDown( int x, int y, int w, int h ) { int i; for ( i = 0 ; i < numTouches ; i++ ) { + +// Com_Printf("touch %i: %i %i | x: %i y: %i w: %i h: %i x+w: %i y+h: %i hit: %s\n", i, touches[i][0], touches[i][1], x, y, w, h, x + w, y + h, ( touches[i][0] >= x && touches[i][1] >= y && touches[i][0] < x + w && touches[i][1] < y + h ) ? "true" : "false" ); + if ( touches[i][0] >= x && touches[i][1] >= y && touches[i][0] < x + w && touches[i][1] < y + h ) { return 1; @@ -1278,8 +1299,17 @@ PRIVATE void CreateIphoneUserCmd() float forwardAxisHit = AxisHit( &huds.forwardStick ); float sideAxisHit = AxisHit( &huds.sideStick ); float turnAxisHit = AxisHit( &huds.turnStick ); + + if (controllerConnected) { + forwardAxisHit += -leftThumbstickYAxis + -rightThumbstickYAxis; + turnAxisHit += leftThumbstickXAxis + rightThumbstickXAxis; + + if (rightTriggerPressed) { + cmd->buttons |= BUTTON_ATTACK; + } + } - static bool printSticks = false; + static bool printSticks = false; if ( printSticks ) { printf( "Forward: %.4f \nSide: %.4f\nTurn: %.4f\n", forwardAxisHit, sideAxisHit, turnAxisHit ); @@ -1746,7 +1776,7 @@ void iphoneFrame() { unsigned char blendColor[4] = { 0, 0, 0, 0 }; iphoneFrameNum++; - loggedTimes[iphoneFrameNum&(MAX_LOGGED_TIMES-1)].enterFrame = Sys_Milliseconds(); + loggedTimes[iphoneFrameNum&(MAX_LOGGED_TIMES-1)].enterFrame = (int)Sys_Milliseconds(); // check for delayed intermission trigger after boss kill if ( intermissionTriggerFrame > 0 && iphoneFrameNum >= intermissionTriggerFrame ) { @@ -1781,7 +1811,7 @@ void iphoneFrame() { iphoneSet2D(); CFAbsoluteTime menuStartTime = CFAbsoluteTimeGetCurrent(); - iphoneDrawMenus( vnull, vnull, vnull, vnull ); + iphoneDrawMenus(); CFAbsoluteTime menuEndTime = CFAbsoluteTimeGetCurrent(); menuTime = menuEndTime - menuStartTime; @@ -1804,7 +1834,7 @@ void iphoneFrame() { if( Player.playstate != ex_dead ) { CreateIphoneUserCmd(); - Player.position.angle = NormalizeAngle( Player.position.angle ); + Player.position.angle = (int)NormalizeAngle( (int)Player.position.angle ); PL_Process( &Player, r_world ); // Player processing if ( !slowAI->value || --slowAIFrame < 0 ) { @@ -1950,4 +1980,32 @@ void iphoneDrawLoading() //SysIPhoneSwapBuffers(); // do the swapbuffers } +void iPhoneSetControllerConnected( bool _controllerConnected ) +{ + controllerConnected = _controllerConnected; +} +void iPhoneSetLeftThumbstickXValue( float _leftThumbstickXAxis ) +{ + leftThumbstickXAxis = _leftThumbstickXAxis; +} + +void iPhoneSetLeftThumbstickYValue( float _leftThumbstickYAxis ) +{ + leftThumbstickYAxis = _leftThumbstickYAxis; +} + +void iPhoneSetRightThumbstickXValue( float _rightThumbstickXAxis ) +{ + rightThumbstickXAxis = _rightThumbstickXAxis; +} + +void iPhoneSetRightThumbstickYValue( float _rightThumbstickYAxis ) +{ + rightThumbstickYAxis = _rightThumbstickYAxis; +} + +void iPhoneSetRightTriggerPressed( bool _rightTriggerPressed ) +{ + rightTriggerPressed = _rightTriggerPressed; +} diff --git a/wolf3d/code/iphone/iphone_main.c b/wolf3d/code/iphone/iphone_main.c index bdd4914..663c291 100644 --- a/wolf3d/code/iphone/iphone_main.c +++ b/wolf3d/code/iphone/iphone_main.c @@ -115,7 +115,7 @@ void Reset_f() { */ void iphoneStartup() { char *s; - int start = Sys_Milliseconds(); + int start = (int)Sys_Milliseconds(); static bool firstInit = true; if ( !firstInit ) { @@ -291,7 +291,7 @@ void iphoneStartGameplay() { =================== */ void iphonePreloadBeforePlay() { - int start = Sys_Milliseconds(); + int start = (int)Sys_Milliseconds(); // the texnums might have been different in the savegame HudSetTexnums(); diff --git a/wolf3d/code/iphone/iphone_mapselector.c b/wolf3d/code/iphone/iphone_mapselector.c index 8f83384..63499d5 100644 --- a/wolf3d/code/iphone/iphone_mapselector.c +++ b/wolf3d/code/iphone/iphone_mapselector.c @@ -112,7 +112,7 @@ const char levelNames[][29] = { int dragVelocity = 0; //velocity for the scrolling maps int dragPosition = 32; //position for the scrolling maps -extern int BackButton(); +extern int BackButton(void); #ifdef SPEARSTOREKIT extern void GetSpearOfDestiny( int x, int y ); #endif @@ -236,7 +236,7 @@ int iphoneDrawUserMaps(int Yoffset, int height, int spacing, int skillValue) struct dirent *ep; char mapBuffer[1024]; - int length = strlen(iphoneDocDirectory); + int length = (int)strlen(iphoneDocDirectory); strcpy(mapBuffer, iphoneDocDirectory); strcpy(mapBuffer + length, "/usermaps/"); diff --git a/wolf3d/code/iphone/iphone_menus.c b/wolf3d/code/iphone/iphone_menus.c index 8e7de9a..dddad60 100644 --- a/wolf3d/code/iphone/iphone_menus.c +++ b/wolf3d/code/iphone/iphone_menus.c @@ -844,9 +844,9 @@ void SaveTheGame() { LevelData_t copiedLevelData = levelData; for ( i = 0 ; i < copiedLevelData.Doors.doornum ; i++ ) { - int index = r_world->Doors.Doors[i] - &r_world->Doors.DoorMap[0][0]; + int index = (int)(r_world->Doors.Doors[i] - &r_world->Doors.DoorMap[0][0]); assert( index >= 0 && index < 4096 ); - copiedLevelData.Doors.Doors[i] = (void *)index; + copiedLevelData.Doors.Doors[i] = (void *)(intptr_t)index; } // this is only used for the mutant death face, so just @@ -963,7 +963,7 @@ int iphoneGetUserMapName(int mapNumber, char *mapName) struct dirent *ep; char mapBuffer[1024]; - int length = strlen(iphoneDocDirectory); + int length = (int)strlen(iphoneDocDirectory); strcpy(mapBuffer, iphoneDocDirectory); strcpy(mapBuffer + length, "/usermaps/"); @@ -1023,7 +1023,7 @@ int iphoneGetUserMapLevelByName(const char *mapName) struct dirent *ep; char mapBuffer[1024]; - int length = strlen(iphoneDocDirectory); + int length = (int)strlen(iphoneDocDirectory); strcpy(mapBuffer, iphoneDocDirectory); strcpy(mapBuffer + length, "/usermaps/"); @@ -3248,9 +3248,9 @@ void DrawIntermissionStats() { // ratios int correction = 8; - DrawRatio( 124+offset-1*correction, levelstate.killed_monsters, levelstate.total_monsters, "iphone/kills.tga" ); - DrawRatio( 189+offset-2*correction, levelstate.found_secrets, levelstate.total_secrets, "iphone/secrets.tga" ); - DrawRatio( 255+offset-3*correction, levelstate.found_treasure, levelstate.total_treasure, "iphone/treasure.tga" ); + DrawRatio( 124+offset-1*correction, (int)levelstate.killed_monsters, (int)levelstate.total_monsters, "iphone/kills.tga" ); + DrawRatio( 189+offset-2*correction, (int)levelstate.found_secrets, (int)levelstate.total_secrets, "iphone/secrets.tga" ); + DrawRatio( 255+offset-3*correction, (int)levelstate.found_treasure, (int)levelstate.total_treasure, "iphone/treasure.tga" ); } /* @@ -3525,7 +3525,7 @@ void iphoneOpenAutomap() { } // sort the tiles to be drawn by texture - numMapTiles = mt - mapTiles; + numMapTiles = (int)(mt - mapTiles); qsort( mapTiles, numMapTiles, sizeof( mapTiles[0] ), MapTileSort ); } @@ -3598,7 +3598,7 @@ void iphoneAutomap() { //touch down if ( numTouches == 1 && numPrevTouches == 0) { - timeTouchDown = Sys_Milliseconds(); + timeTouchDown = (int)Sys_Milliseconds(); prevTapX = tapX; prevTapY = tapY; tapX = touches[0][0]; @@ -3606,7 +3606,7 @@ void iphoneAutomap() { } //touch up if ( numTouches == 0 && numPrevTouches == 1 ) { - unsigned int currentTime = Sys_Milliseconds(); + unsigned int currentTime = (int)Sys_Milliseconds(); //check if time between last tap and current time is too long if (Sys_Milliseconds() - lastTapTime > 500 || zoom) @@ -3617,7 +3617,7 @@ void iphoneAutomap() { //record tap time if first tap if (numTaps < 1) - lastTapTime = Sys_Milliseconds(); + lastTapTime = (int)Sys_Milliseconds(); ++numTaps; /* @@ -3689,7 +3689,7 @@ void iphoneAutomap() { //Com_Printf("dist: %f\n\n", dist); float tolerance = 0.5f;//3; - if ( abs(mapOrigin[0] - TargetX) < tolerance && abs(mapOrigin[1] - TargetY) < tolerance && abs(scale - TargetZoom) < tolerance/2) + if ( abs((int)mapOrigin[0] - (int)TargetX) < tolerance && abs((int)mapOrigin[1] - (int)TargetY) < tolerance && abs((int)scale - (int)TargetZoom) < tolerance/2) { mapOrigin[0] = TargetX; mapOrigin[1] = TargetY; @@ -4401,7 +4401,7 @@ void iphoneDownloadInstructionsMenu() #endif //gsh -extern void iphoneSelectMapMenu(); +extern void iphoneSelectMapMenu(void); #if SPEARSTOREKIT extern void iphoneStoreKit(); #endif diff --git a/wolf3d/code/iphone/iphone_store.m b/wolf3d/code/iphone/iphone_store.m index b771539..dd21b6e 100644 --- a/wolf3d/code/iphone/iphone_store.m +++ b/wolf3d/code/iphone/iphone_store.m @@ -80,7 +80,7 @@ Called by the system when the application gets product information about an In-A // For now, immediately request payment for any items the user has requested. for (SKProduct *product in myProduct) { - SKPayment *payment = [SKPayment paymentWithProductIdentifier:[product productIdentifier]]; + SKPayment *payment = [SKPayment paymentWithProduct:product]; [[SKPaymentQueue defaultQueue] addPayment:payment]; } diff --git a/wolf3d/code/iphone/iphone_sys.m b/wolf3d/code/iphone/iphone_sys.m index 22948c0..6240d4d 100644 --- a/wolf3d/code/iphone/iphone_sys.m +++ b/wolf3d/code/iphone/iphone_sys.m @@ -37,27 +37,39 @@ void interruptionListener( void *inUserData, UInt32 inInterruption) if ( inInterruption == kAudioSessionEndInterruption ) { // make sure we are again the active session - UInt32 audioCategory = kAudioSessionCategory_AmbientSound; - AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory); - AudioSessionSetActive( true ); +// UInt32 audioCategory = kAudioSessionCategory_AmbientSound; +// AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory); +// AudioSessionSetActive( true ); // do we need to re-initialize the sound subsystem in this case? + + AVAudioSession *session = [AVAudioSession sharedInstance]; + + NSError *setCategoryError = nil; + if (![session setCategory:AVAudioSessionCategoryAmbient + error:&setCategoryError]) { + // handle error + } } } int otherAudioIsPlaying; void SysIPhoneInitAudioSession() { - OSStatus status = 0; - status = AudioSessionInitialize(NULL, NULL, interruptionListener, NULL); // else "couldn't initialize audio session" - UInt32 audioCategory = kAudioSessionCategory_AmbientSound; - status = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory); + +// OSStatus status = 0; + [[AVAudioSession sharedInstance] setActive:YES error:nil]; + NSString* audioCategory = AVAudioSessionCategoryAmbient; + [[AVAudioSession sharedInstance] setCategory:audioCategory error:nil]; +// status = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory); - AudioSessionPropertyID propOtherAudioIsPlaying = kAudioSessionProperty_OtherAudioIsPlaying; - UInt32 size = sizeof( otherAudioIsPlaying ); - AudioSessionGetProperty( propOtherAudioIsPlaying, &size, &otherAudioIsPlaying ); +// AudioSessionPropertyID propOtherAudioIsPlaying = kAudioSessionProperty_OtherAudioIsPlaying; +// UInt32 size = sizeof( otherAudioIsPlaying ); +// AudioSessionGetProperty( propOtherAudioIsPlaying, &size, &otherAudioIsPlaying ); + + otherAudioIsPlaying = [[AVAudioSession sharedInstance] isOtherAudioPlaying]; - status = AudioSessionSetActive(true); // else "couldn't set audio session active\n" -} +// status = AudioSessionSetActive(true); // else "couldn't set audio session active\n" +} int SysIPhoneOtherAudioIsPlaying() { static int called = 0; @@ -118,7 +130,7 @@ int SysIPhoneGetPathToMainBundleLength( void ) { NSString *path = [mainBundle bundlePath]; - return [path length]; + return (int)[path length]; } @@ -147,14 +159,26 @@ void SysIPhoneGetPathToMainBundle( char * outPath, int maxLength ) { ================== */ void iphoneRotateForLandscape() { - switch ( deviceOrientation ) { - case ORIENTATION_LANDSCAPE_LEFT: - pfglRotatef( 90.0f, 0.0f, 0.0f, 1.0f ); - break; - default: - pfglRotatef( -90.0f, 0.0f, 0.0f, 1.0f ); - break; - } + + // TODO: get this working after a rotate, or before one. + // could this be related to why we have to dink with the X touches? + +// switch ( deviceOrientation ) { +// case ORIENTATION_LANDSCAPE_LEFT: +// pfglRotatef( 0.0f, 0.0f, 0.0f, 1.0f ); +// break; +// default: +// pfglRotatef( -180.0f, 0.0f, 0.0f, 1.0f ); +// break; +// } +// switch ( deviceOrientation ) { +// case ORIENTATION_LANDSCAPE_LEFT: +// pfglRotatef( 90.0f, 0.0f, 0.0f, 1.0f ); +// break; +// default: +// pfglRotatef( -90.0f, 0.0f, 0.0f, 1.0f ); +// break; +// } } /* diff --git a/wolf3d/code/iphone/iphone_wolf.h b/wolf3d/code/iphone/iphone_wolf.h index e54335d..81254d9 100644 --- a/wolf3d/code/iphone/iphone_wolf.h +++ b/wolf3d/code/iphone/iphone_wolf.h @@ -59,7 +59,7 @@ typedef enum menuState { extern menuState_t menuState; -void iphoneDrawMenus(); +void iphoneDrawMenus(void); // bumped to 107 on moving powerups structure into leveldata // bumped to 108 with custom huds @@ -215,16 +215,16 @@ int iphoneDrawPicWithTouch( int x, int y, int w, int h, const char *pic ); int iphoneDrawPicRectWithTouch( rectFloat_t rect, const char *pic ); void iphoneDrawPicNum( int x, int y, int w, int h, int glTexNum ); void R_Draw_Blend( int x, int y, int w, int h, colour4_t c ); -void SaveTheGame(); -int LoadTheGame(); -void StartGame(); -void iphoneOpenAutomap(); -void iphoneDrawFace(); -void iphoneDrawNotifyText(); -void iphonePreloadBeforePlay(); +void SaveTheGame(void); +int LoadTheGame(void); +void StartGame(void); +void iphoneOpenAutomap(void); +void iphoneDrawFace(void); +void iphoneDrawNotifyText(void); +void iphonePreloadBeforePlay(void); -void InitImmediateModeGL(); -void iphoneRotateForLandscape(); +void InitImmediateModeGL(void); +void iphoneRotateForLandscape(void); void ScaleToScreen( int * value); void ScalePosition( float * x, float * y ); @@ -275,9 +275,9 @@ typedef struct { extern hud_t huds; void HudSetForScheme( int schemeNum ); -void HudSetTexnums(); -void HudEditFrame(); -void iphoneHudEditFrame(); +void HudSetTexnums(void); +void HudEditFrame(void); +void iphoneHudEditFrame(void); //--------------------------------------- @@ -291,51 +291,57 @@ typedef enum { //--------------------------------------- // interfaces from the original game code //--------------------------------------- -void iphoneStartBonusFlash(); +void iphoneStartBonusFlash(void); void iphoneStartDamageFlash( int points ); void iphoneSetAttackDirection( int dir ); void iphoneStartIntermission( int framesFromNow ); void iphoneSetNotifyText( const char *str, ... ); -void iphoneSetLevelNotifyText(); //gsh +void iphoneSetLevelNotifyText(void); //gsh //--------------------------------------- // interfaces to Objective-C land //--------------------------------------- -void SysIPhoneSwapBuffers(); -void SysIPhoneVibrate(); +void SysIPhoneSwapBuffers(void); +void SysIPhoneVibrate(void); void SysIPhoneOpenURL( const char *url ); void SysIPhoneLoadJPG( W8* jpegData, int jpegBytes, W8 **pic, W16 *width, W16 *height, W16 *bytes ); -const char * SysIPhoneGetConsoleTextField(); +const char * SysIPhoneGetConsoleTextField(void); void SysIPhoneSetConsoleTextField(const char *); -void SysIPhoneInitAudioSession(); -int SysIPhoneOtherAudioIsPlaying(); -const char *SysIPhoneGetOSVersion(); -contentVersion_t SysIPhoneGetContentVersion(); +void SysIPhoneInitAudioSession(void); +int SysIPhoneOtherAudioIsPlaying(void); +const char *SysIPhoneGetOSVersion(void); +contentVersion_t SysIPhoneGetContentVersion(void); int SysIPhoneGetPathToMainBundleLength( void ); void SysIPhoneGetPathToMainBundle( char * outPath, int maxLength ); -void iphoneStartPreviousMenu(); -void iphoneStartMainMenu(); -void iphonePromptToBuyPlatinum(); +void iphoneStartPreviousMenu(void); +void iphoneStartMainMenu(void); +void iphonePromptToBuyPlatinum(void); -void iphoneInitMenuMusic(); -void iphoneStartMenuMusic(); -void iphoneStopMenuMusic(); +void iphoneInitMenuMusic(void); +void iphoneStartMenuMusic(void); +void iphoneStopMenuMusic(void); //--------------------------------------- // interfaces from Objective-C land //--------------------------------------- -void iphoneStartup(); -void iphoneShutdown(); -void iphoneFrame(); +void iphoneStartup(void); +void iphoneShutdown(void); +void iphoneFrame(void); void iphoneTiltEvent( float *tilts ); void iphoneTouchEvent( int numTouches, int touches[16] ); -void iphoneActivateConsole(); -void iphoneDeactivateConsole(); -void iphoneExecuteCommandLine(); -void iphoneStartGameplay(); +void iphoneActivateConsole(void); +void iphoneDeactivateConsole(void); +void iphoneExecuteCommandLine(void); +void iphoneStartGameplay(void); +void iPhoneSetControllerConnected( bool _controllerConnected ); +void iPhoneSetLeftThumbstickXValue( float _leftThumbstickXAxis ); +void iPhoneSetLeftThumbstickYValue( float _leftThumbstickYAxis ); +void iPhoneSetRightThumbstickXValue( float _rightThumbstickXAxis ); +void iPhoneSetRightThumbstickYValue( float _rightThumbstickYAxis ); +void iPhoneSetRightTriggerPressed( bool _rightTriggerPressed ); -void iphoneResume(); +void iphoneResume(void); void LoadPNG( const char *filename, W8 **pic, W16 *width, W16 *height, W16 *bytes ); diff --git a/wolf3d/code/iphone/untgz.c b/wolf3d/code/iphone/untgz.c deleted file mode 100644 index e8ddd27..0000000 --- a/wolf3d/code/iphone/untgz.c +++ /dev/null @@ -1,703 +0,0 @@ -/* - * untgz.c -- Display contents and extract files from a gzip'd TAR file - * - * written by Pedro A. Aranda Gutierrez - * adaptation to Unix by Jean-loup Gailly - * various fixes by Cosmin Truta - */ - -// This file was originally authored by the people above. -// It has been modified for this program. - -#include -#include -#include -#include -#include - -#include "../wolfiphone.h" - -extern int chmod(const char *, mode_t) __DARWIN_ALIAS(chmod); -extern int mkdir(const char *, mode_t); -extern void Com_Printf( const char *fmt, ... ); - -#include "zlib.h" - -//Note: in order to link the zlib library into the build from usr/lib/libz.ylib -// the flag -lz was added to the OTHER_LDFLAGS under the build options. -// To get there: right click on the wolf3d project. choose get info. -// Click on build and scroll to "Other Link Flags" under "Linking" - - -#define unix - -#ifdef unix -# include -#else -# include -# include -#endif - -#ifdef WIN32 -#include -# ifndef F_OK -# define F_OK 0 -# endif -# define mkdir(dirname,mode) _mkdir(dirname) -# ifdef _MSC_VER -# define access(path,mode) _access(path,mode) -# define chmod(path,mode) _chmod(path,mode) -# define strdup(str) _strdup(str) -# endif -#else -# include -#endif - - -//extern int iphoneCenterText( int x, int y, const char *str ); - -/* values used in typeflag field */ - -#define REGTYPE '0' /* regular file */ -#define AREGTYPE '\0' /* regular file */ -#define LNKTYPE '1' /* link */ -#define SYMTYPE '2' /* reserved */ -#define CHRTYPE '3' /* character special */ -#define BLKTYPE '4' /* block special */ -#define DIRTYPE '5' /* directory */ -#define FIFOTYPE '6' /* FIFO special */ -#define CONTTYPE '7' /* reserved */ - -/* GNU tar extensions */ - -#define GNUTYPE_DUMPDIR 'D' /* file names from dumped directory */ -#define GNUTYPE_LONGLINK 'K' /* long link name */ -#define GNUTYPE_LONGNAME 'L' /* long file name */ -#define GNUTYPE_MULTIVOL 'M' /* continuation of file from another volume */ -#define GNUTYPE_NAMES 'N' /* file name that does not fit into main hdr */ -#define GNUTYPE_SPARSE 'S' /* sparse file */ -#define GNUTYPE_VOLHDR 'V' /* tape/volume header */ - - -/* tar header */ - -#define BLOCKSIZE 512 -#define SHORTNAMESIZE 100 - -struct tar_header -{ /* byte offset */ - char name[100]; /* 0 */ - char mode[8]; /* 100 */ - char uid[8]; /* 108 */ - char gid[8]; /* 116 */ - char size[12]; /* 124 */ - char mtime[12]; /* 136 */ - char chksum[8]; /* 148 */ - char typeflag; /* 156 */ - char linkname[100]; /* 157 */ - char magic[6]; /* 257 */ - char version[2]; /* 263 */ - char uname[32]; /* 265 */ - char gname[32]; /* 297 */ - char devmajor[8]; /* 329 */ - char devminor[8]; /* 337 */ - char prefix[155]; /* 345 */ - /* 500 */ -}; - -union tar_buffer -{ - char buffer[BLOCKSIZE]; - struct tar_header header; -}; - -struct attr_item -{ - struct attr_item *next; - char *fname; - int mode; - time_t time; -}; - -enum { TGZ_EXTRACT, TGZ_LIST, TGZ_INVALID }; - -char *TGZfname OF((const char *)); -void TGZnotfound OF((const char *)); - -int getoct OF((char *, int)); -char *strtime OF((time_t *)); -int setfiletime OF((char *, time_t)); -void push_attr OF((struct attr_item **, char *, int, time_t)); -void restore_attr OF((struct attr_item **)); - -int ExprMatch OF((char *, char *)); - -int makedir OF((char *)); -int matchname OF((int, int, char **, char *)); - -void error OF((const char *)); -int tar OF((gzFile, int, int, int, char **)); - -void help OF((int)); -int main OF((int, char **)); - -char *prog; - -const char *TGZsuffix[] = { "\0", ".tar", ".tar.gz", ".taz", ".tgz", NULL }; - -extern char iphoneDocDirectory[1024]; - -//returns the fname along with the appdocdirectory tagged onto the front -char *DirFName (const char* fname) -{ - static char buffer[1024]; - int origlen;//, i; - -// Com_Printf("iphone Doc Direct: %s\n", iphoneDocDirectory); - - //copy the directory into the buffer - strcpy(buffer, iphoneDocDirectory); - origlen = strlen(buffer); - - //add the '/' to the end of the iphoneDocDirectory - buffer[origlen] = '/'; - ++origlen; - buffer[origlen] = '\0'; - - //copy the file name into the buffer - strcpy(buffer+origlen, fname); - - Com_Printf("extracting file: %s\n", buffer); - -// colour4_t backgroundColor = { 10, 10, 10, 255 }; -// R_Draw_Blend( 40, 150, 4*100, 20, backgroundColor ); //this is not actually drawing. The draw thread is somehow pausing - - return buffer; -} - - -/* return the file name of the TGZ archive */ -/* or NULL if it does not exist */ - -char *TGZfname (const char *arcname) -{ - static char buffer[1024]; - int origlen,i; - - strcpy(buffer,arcname); - origlen = strlen(buffer); - - for (i=0; TGZsuffix[i]; i++) - { - strcpy(buffer+origlen,TGZsuffix[i]); - if (access(buffer,F_OK) == 0) - return buffer; - } - return NULL; -} - - -/* error message for the filename */ - -void TGZnotfound (const char *arcname) -{ - int i; - - fprintf(stderr,"%s: Couldn't find ",prog); - for (i=0;TGZsuffix[i];i++) - fprintf(stderr,(TGZsuffix[i+1]) ? "%s%s, " : "or %s%s\n", - arcname, - TGZsuffix[i]); - exit(1); -} - - -/* convert octal digits to int */ -/* on error return -1 */ - -int getoct (char *p,int width) -{ - int result = 0; - char c; - - while (width--) - { - c = *p++; - if (c == 0) - break; - if (c == ' ') - continue; - if (c < '0' || c > '7') - return -1; - result = result * 8 + (c - '0'); - } - return result; -} - - -/* convert time_t to string */ -/* use the "YYYY/MM/DD hh:mm:ss" format */ - -char *strtime (time_t *t) -{ - struct tm *local; - static char result[32]; - - local = localtime(t); - sprintf(result,"%4d/%02d/%02d %02d:%02d:%02d", - local->tm_year+1900, local->tm_mon+1, local->tm_mday, - local->tm_hour, local->tm_min, local->tm_sec); - return result; -} - - -/* set file time */ - -int setfiletime (char *fname,time_t ftime) -{ -#ifdef WIN32 - static int isWinNT = -1; - SYSTEMTIME st; - FILETIME locft, modft; - struct tm *loctm; - HANDLE hFile; - int result; - - loctm = localtime(&ftime); - if (loctm == NULL) - return -1; - - st.wYear = (WORD)loctm->tm_year + 1900; - st.wMonth = (WORD)loctm->tm_mon + 1; - st.wDayOfWeek = (WORD)loctm->tm_wday; - st.wDay = (WORD)loctm->tm_mday; - st.wHour = (WORD)loctm->tm_hour; - st.wMinute = (WORD)loctm->tm_min; - st.wSecond = (WORD)loctm->tm_sec; - st.wMilliseconds = 0; - if (!SystemTimeToFileTime(&st, &locft) || - !LocalFileTimeToFileTime(&locft, &modft)) - return -1; - - if (isWinNT < 0) - isWinNT = (GetVersion() < 0x80000000) ? 1 : 0; - hFile = CreateFile(fname, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, - (isWinNT ? FILE_FLAG_BACKUP_SEMANTICS : 0), - NULL); - if (hFile == INVALID_HANDLE_VALUE) - return -1; - result = SetFileTime(hFile, NULL, NULL, &modft) ? 0 : -1; - CloseHandle(hFile); - return result; -#else - struct utimbuf settime; - - settime.actime = settime.modtime = ftime; - return utime(fname,&settime); -#endif -} - - -/* push file attributes */ - -void push_attr(struct attr_item **list,char *fname,int mode,time_t time) -{ - struct attr_item *item; - - item = (struct attr_item *)malloc(sizeof(struct attr_item)); - if (item == NULL) - error("Out of memory"); - item->fname = strdup(fname); - item->mode = mode; - item->time = time; - item->next = *list; - *list = item; -} - - -/* restore file attributes */ - -void restore_attr(struct attr_item **list) -{ - struct attr_item *item, *prev; - - for (item = *list; item != NULL; ) - { - setfiletime(item->fname,item->time); - chmod(item->fname,item->mode); - prev = item; - item = item->next; - free(prev); - } - *list = NULL; -} - - -/* match regular expression */ - -#define ISSPECIAL(c) (((c) == '*') || ((c) == '/')) - -int ExprMatch (char *string,char *expr) -{ - while (1) - { - if (ISSPECIAL(*expr)) - { - if (*expr == '/') - { - if (*string != '\\' && *string != '/') - return 0; - string ++; expr++; - } - else if (*expr == '*') - { - if (*expr ++ == 0) - return 1; - while (*++string != *expr) - if (*string == 0) - return 0; - } - } - else - { - if (*string != *expr) - return 0; - if (*expr++ == 0) - return 1; - string++; - } - } -} - - -/* recursive mkdir */ -/* abort on ENOENT; ignore other errors like "directory already exists" */ -/* return 1 if OK */ -/* 0 on error */ - -int makedir (char *newdir) -{ - char *buffer = strdup(newdir); - char *p; - int len = strlen(buffer); - - if (len <= 0) { - free(buffer); - return 0; - } - if (buffer[len-1] == '/') { - buffer[len-1] = '\0'; - } - if (mkdir(buffer, 0755) == 0) - { - free(buffer); - return 1; - } - - p = buffer+1; - while (1) - { - char hold; - - while(*p && *p != '\\' && *p != '/') - p++; - hold = *p; - *p = 0; - if ((mkdir(buffer, 0755) == -1) && (errno == ENOENT)) - { - fprintf(stderr,"%s: Couldn't create directory %s\n",prog,buffer); - free(buffer); - return 0; - } - if (hold == 0) - break; - *p++ = hold; - } - free(buffer); - return 1; -} - - -int matchname (int arg,int argc,char **argv,char *fname) -{ - if (arg == argc) /* no arguments given (untgz tgzarchive) */ - return 1; - - while (arg < argc) - if (ExprMatch(fname,argv[arg++])) - return 1; - - return 0; /* ignore this for the moment being */ -} - - -/* tar file list or extract */ - - -int tar2 (gzFile in,int action) -{ - union tar_buffer buffer; - int len; - int err; - int getheader = 1; - int remaining = 0; - FILE *outfile = NULL; - char fname[BLOCKSIZE]; - //char dirfname; - int tarmode; - time_t tartime; - struct attr_item *attributes = NULL; - - if (action == TGZ_LIST) - printf(" date time size file\n" - " ---------- -------- --------- -------------------------------------\n"); - while (1) - { - len = gzread(in, &buffer, BLOCKSIZE); - if (len < 0) - error(gzerror(in, &err)); - /* - * Always expect complete blocks to process - * the tar information. - */ - if (len != BLOCKSIZE) - { - action = TGZ_INVALID; /* force error exit */ - remaining = 0; /* force I/O cleanup */ - } - - /* - * If we have to get a tar header - */ - if (getheader >= 1) - { - /* - * if we met the end of the tar - * or the end-of-tar block, - * we are done - */ - if (len == 0 || buffer.header.name[0] == 0) - break; - - tarmode = getoct(buffer.header.mode,8); - tartime = (time_t)getoct(buffer.header.mtime,12); - if (tarmode == -1 || tartime == (time_t)-1) - { - buffer.header.name[0] = 0; - action = TGZ_INVALID; - } - - if (getheader == 1) - { - strncpy(fname,buffer.header.name,SHORTNAMESIZE); - if (fname[SHORTNAMESIZE-1] != 0) - fname[SHORTNAMESIZE] = 0; - } - else - { - /* - * The file name is longer than SHORTNAMESIZE - */ - if (strncmp(fname,buffer.header.name,SHORTNAMESIZE-1) != 0) - error("bad long name"); - getheader = 1; - } - - /* - * Act according to the type flag - */ - switch (buffer.header.typeflag) - { - - case DIRTYPE: - if (action == TGZ_LIST) - { - printf(" %s

%s\n",strtime(&tartime),fname); - Com_Printf("case DIRTYPE: %s\n", DirFName(fname)); - } - if (action == TGZ_EXTRACT) - { - Com_Printf("blah blah DIRTYPE:action == TGZ_EXTRACT, make directory\n"); - makedir(fname); - //makedir(DirFName(fname)); - push_attr(&attributes,fname,tarmode,tartime); - } - break; - case REGTYPE: - case AREGTYPE: - remaining = getoct(buffer.header.size,12); - if (remaining == -1) - { - action = TGZ_INVALID; - break; - } - if (action == TGZ_LIST) - printf(" %s %9d %s\n",strtime(&tartime),remaining,fname); - else if (action == TGZ_EXTRACT) - { - if (1)//gsh matchname(arg,argc,argv,fname)) - { - //Com_Printf("call just before iphonedocdirectory\n"); - //Com_Printf("iphonedocdirect: %s\n", iphoneDocDirectory); - char* outname = DirFName(fname); - //Com_Printf("outname is: %s\n", outname); - outfile = fopen(outname,"wb"); - if (outfile == NULL) { - // try creating directory - char *p = strrchr(outname, '/'); - if (p != NULL) { - *p = '\0'; - makedir(outname); - *p = '/'; - outfile = fopen(outname,"wb"); - } - }/* - if (outfile != NULL) - Com_Printf("Extracting %s\n",fname); - else - Com_Printf("%s: Couldn't create %s",prog,fname);*/ - /* - outfile = fopen(fname,"wb"); - if (outfile == NULL) { - /* try creating directory * - char *p = strrchr(fname, '/'); - if (p != NULL) { - *p = '\0'; - makedir(fname); - *p = '/'; - outfile = fopen(fname,"wb"); - } - } - if (outfile != NULL) - printf("Extracting %s\n",fname); - else - fprintf(stderr, "%s: Couldn't create %s",prog,fname);*/ - } - else - outfile = NULL; - } - getheader = 0; - break; - case GNUTYPE_LONGLINK: - case GNUTYPE_LONGNAME: - remaining = getoct(buffer.header.size,12); - if (remaining < 0 || remaining >= BLOCKSIZE) - { - action = TGZ_INVALID; - break; - } - len = gzread(in, fname, BLOCKSIZE); - if (len < 0) - error(gzerror(in, &err)); - if (fname[BLOCKSIZE-1] != 0 || (int)strlen(fname) > remaining) - { - action = TGZ_INVALID; - break; - } - getheader = 2; - break; - default: - if (action == TGZ_LIST) - printf(" %s <---> %s\n",strtime(&tartime),fname); - break; - } - } - else - { - //Com_Printf("else called\n"); - unsigned int bytes = (remaining > BLOCKSIZE) ? BLOCKSIZE : remaining; - - if (outfile != NULL) - { - if (fwrite(&buffer,sizeof(char),bytes,outfile) != bytes) - { - fprintf(stderr, - "%s: Error writing %s -- skipping\n",prog,fname); - fclose(outfile); - outfile = NULL; - remove(fname); - } - } - remaining -= bytes; - } - - if (remaining == 0) - { - getheader = 1; - if (outfile != NULL) - { - fclose(outfile); - outfile = NULL; - if (action != TGZ_INVALID) - push_attr(&attributes,fname,tarmode,tartime); - } - } - - /* - * Abandon if errors are found - */ - if (action == TGZ_INVALID) - { - error("broken archive"); - break; - } - } - - /* - * Restore file modes and time stamps - */ - restore_attr(&attributes); - - if (gzclose(in) != Z_OK) - error("failed gzclose"); - - return 0; -} - - - -/* ============================================================ */ - -void help(int exitval) -{ - printf("untgz version 0.2.1\n" - " using zlib version %s\n\n", - zlibVersion()); - printf("Usage: untgz file.tgz extract all files\n" - " untgz file.tgz fname ... extract selected files\n" - " untgz -l file.tgz list archive contents\n" - " untgz -h display this help\n"); - exit(exitval); -} - -void error(const char *msg) -{ - fprintf(stderr, "%s: %s\n", prog, msg); - exit(1); -} - - -/* ============================================================ */ - -#if defined(WIN32) && defined(__GNUC__) -int _CRT_glob = 0; /* disable argument globbing in MinGW */ -#endif - - -int StartUntgz(char *TGZfile) -{ - int action = TGZ_EXTRACT; - gzFile *f; - f = gzopen(TGZfile,"rb"); - if (f == NULL) - { - Com_Printf("%s: Couldn't gzopen %s\n",prog,TGZfile); - return 1; - } - - return tar2(f, action); -} - - - - diff --git a/wolf3d/code/iphone/victory_wolf3dlite.tga b/wolf3d/code/iphone/victory_wolf3dlite.tga deleted file mode 100644 index f58fc0f02c11340ac853fe6fc4a720785b4f157d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262188 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 diff --git a/wolf3d/code/iphone/wolf3d.xcodeproj/project.pbxproj b/wolf3d/code/iphone/wolf3d.xcodeproj/project.pbxproj index b9f1ec0..c1d3a04 100644 --- a/wolf3d/code/iphone/wolf3d.xcodeproj/project.pbxproj +++ b/wolf3d/code/iphone/wolf3d.xcodeproj/project.pbxproj @@ -15,25 +15,17 @@ 35048AAD13E0A03A00516B10 /* credits_bg.png in Resources */ = {isa = PBXBuildFile; fileRef = 35048AAC13E0A03A00516B10 /* credits_bg.png */; }; 35048ABC13E0D2EA00516B10 /* wolf_bg.png in Resources */ = {isa = PBXBuildFile; fileRef = 35048ABB13E0D2EA00516B10 /* wolf_bg.png */; }; 35048AC113E0D51600516B10 /* iphone_preset_1.png in Resources */ = {isa = PBXBuildFile; fileRef = 35048ABD13E0D51600516B10 /* iphone_preset_1.png */; }; - 35048ADA13E0E98800516B10 /* difficulty_star1.png in Resources */ = {isa = PBXBuildFile; fileRef = 35048AD613E0E98800516B10 /* difficulty_star1.png */; }; - 35048ADB13E0E98800516B10 /* difficulty_star2.png in Resources */ = {isa = PBXBuildFile; fileRef = 35048AD713E0E98800516B10 /* difficulty_star2.png */; }; - 35048ADC13E0E98800516B10 /* difficulty_star3.png in Resources */ = {isa = PBXBuildFile; fileRef = 35048AD813E0E98800516B10 /* difficulty_star3.png */; }; - 35048ADD13E0E98800516B10 /* difficulty_star4.png in Resources */ = {isa = PBXBuildFile; fileRef = 35048AD913E0E98800516B10 /* difficulty_star4.png */; }; 350BA59813F34F7900FAE7E4 /* difficulty_head1.png in Resources */ = {isa = PBXBuildFile; fileRef = 350BA59413F34F7900FAE7E4 /* difficulty_head1.png */; }; 350BA59913F34F7900FAE7E4 /* difficulty_head2.png in Resources */ = {isa = PBXBuildFile; fileRef = 350BA59513F34F7900FAE7E4 /* difficulty_head2.png */; }; 350BA59A13F34F7900FAE7E4 /* difficulty_head3.png in Resources */ = {isa = PBXBuildFile; fileRef = 350BA59613F34F7900FAE7E4 /* difficulty_head3.png */; }; 350BA59B13F34F7900FAE7E4 /* difficulty_head4.png in Resources */ = {isa = PBXBuildFile; fileRef = 350BA59713F34F7900FAE7E4 /* difficulty_head4.png */; }; 350CCF9B13DF8B0E003303AB /* episode_bg.png in Resources */ = {isa = PBXBuildFile; fileRef = 350CCF9A13DF8B0E003303AB /* episode_bg.png */; }; 350CCF9F13DF8C47003303AB /* back_arrow.png in Resources */ = {isa = PBXBuildFile; fileRef = 350CCF9D13DF8C47003303AB /* back_arrow.png */; }; - 350CCFA013DF8C47003303AB /* difficulty_selection_box.png in Resources */ = {isa = PBXBuildFile; fileRef = 350CCF9E13DF8C47003303AB /* difficulty_selection_box.png */; }; - 350CCFCE13DF8DED003303AB /* mission_bg.png in Resources */ = {isa = PBXBuildFile; fileRef = 350CCFCD13DF8DED003303AB /* mission_bg.png */; }; 3534C87513E208F400740F63 /* CreditsView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3534C87313E208F400740F63 /* CreditsView~ipad.xib */; }; 3534C87613E208F400740F63 /* TriviaView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3534C87413E208F400740F63 /* TriviaView~ipad.xib */; }; 3534C88F13E220CE00740F63 /* LegalView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3534C88E13E220CE00740F63 /* LegalView~ipad.xib */; }; 3534C95C13E241AB00740F63 /* LevelSelectView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3534C95B13E241AB00740F63 /* LevelSelectView~ipad.xib */; }; 3534C95E13E241B100740F63 /* EpisodeView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3534C95D13E241B100740F63 /* EpisodeView~ipad.xib */; }; - 3534C96A13E2485F00740F63 /* adv_button_frame.png in Resources */ = {isa = PBXBuildFile; fileRef = 3534C96913E2485F00740F63 /* adv_button_frame.png */; }; - 3534C96C13E2486700740F63 /* preset_frame.png in Resources */ = {isa = PBXBuildFile; fileRef = 3534C96B13E2486700740F63 /* preset_frame.png */; }; 3534C97F13E24E0E00740F63 /* SettingsView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3534C97E13E24E0E00740F63 /* SettingsView~ipad.xib */; }; 3555CC4013E2001A006E7D2F /* button_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 3555CC3F13E2001A006E7D2F /* button_highlight.png */; }; 356D306D13F9820400EDDACE /* EpisodeCell~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 356D306C13F9820400EDDACE /* EpisodeCell~ipad.xib */; }; @@ -90,59 +82,17 @@ 3DDD3A2413DF231100967735 /* UIFontButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 3DDD3A2313DF231100967735 /* UIFontButton.m */; }; 3DE8828613E35E5000C95AE8 /* arialImageLAL_white-alpha.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8824713E35E5000C95AE8 /* arialImageLAL_white-alpha.png */; }; 3DE8828713E35E5000C95AE8 /* arialImageLAL.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8824813E35E5000C95AE8 /* arialImageLAL.png */; }; - 3DE8828813E35E5000C95AE8 /* button_back.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8824913E35E5000C95AE8 /* button_back.png */; }; - 3DE8828913E35E5000C95AE8 /* button_downloads.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8824A13E35E5000C95AE8 /* button_downloads.png */; }; - 3DE8828A13E35E5000C95AE8 /* button_knife.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8824B13E35E5000C95AE8 /* button_knife.png */; }; - 3DE8828B13E35E5000C95AE8 /* button_left.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8824C13E35E5000C95AE8 /* button_left.png */; }; - 3DE8828C13E35E5000C95AE8 /* button_more.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8824D13E35E5000C95AE8 /* button_more.png */; }; - 3DE8828D13E35E5000C95AE8 /* button_new.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8824E13E35E5000C95AE8 /* button_new.png */; }; - 3DE8828E13E35E5000C95AE8 /* button_pistol.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8824F13E35E5000C95AE8 /* button_pistol.png */; }; - 3DE8828F13E35E5000C95AE8 /* button_resume.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825013E35E5000C95AE8 /* button_resume.png */; }; - 3DE8829013E35E5000C95AE8 /* button_right.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825113E35E5000C95AE8 /* button_right.png */; }; - 3DE8829113E35E5000C95AE8 /* button_settings.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825213E35E5000C95AE8 /* button_settings.png */; }; - 3DE8829213E35E5000C95AE8 /* button_trivia.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825313E35E5000C95AE8 /* button_trivia.png */; }; - 3DE8829313E35E5000C95AE8 /* button_web.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825413E35E5000C95AE8 /* button_web.png */; }; - 3DE8829413E35E5000C95AE8 /* diractional_01.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825513E35E5000C95AE8 /* diractional_01.png */; }; - 3DE8829513E35E5000C95AE8 /* diractional_02.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825613E35E5000C95AE8 /* diractional_02.png */; }; - 3DE8829613E35E5000C95AE8 /* diractional_03.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825713E35E5000C95AE8 /* diractional_03.png */; }; - 3DE8829A13E35E5000C95AE8 /* GODMODEFACE0PIC.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825B13E35E5000C95AE8 /* GODMODEFACE0PIC.png */; }; - 3DE8829B13E35E5000C95AE8 /* GODMODEFACE1PIC.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825C13E35E5000C95AE8 /* GODMODEFACE1PIC.png */; }; - 3DE8829C13E35E5000C95AE8 /* GODMODEFACE2PIC.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825D13E35E5000C95AE8 /* GODMODEFACE2PIC.png */; }; - 3DE8829D13E35E5000C95AE8 /* header_advanced.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825E13E35E5000C95AE8 /* header_advanced.png */; }; - 3DE8829E13E35E5000C95AE8 /* header_ep1.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8825F13E35E5000C95AE8 /* header_ep1.png */; }; - 3DE8829F13E35E5000C95AE8 /* header_ep2.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826013E35E5000C95AE8 /* header_ep2.png */; }; - 3DE882A013E35E5000C95AE8 /* header_ep3.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826113E35E5000C95AE8 /* header_ep3.png */; }; - 3DE882A113E35E5000C95AE8 /* header_ep4.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826213E35E5000C95AE8 /* header_ep4.png */; }; - 3DE882A213E35E5000C95AE8 /* header_ep5.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826313E35E5000C95AE8 /* header_ep5.png */; }; - 3DE882A313E35E5000C95AE8 /* header_ep6.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826413E35E5000C95AE8 /* header_ep6.png */; }; - 3DE882A413E35E5000C95AE8 /* header_ep7.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826513E35E5000C95AE8 /* header_ep7.png */; }; - 3DE882A513E35E5000C95AE8 /* header_ep8.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826613E35E5000C95AE8 /* header_ep8.png */; }; - 3DE882A613E35E5000C95AE8 /* header_ep9.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826713E35E5000C95AE8 /* header_ep9.png */; }; - 3DE882A713E35E5000C95AE8 /* header_ep10.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826813E35E5000C95AE8 /* header_ep10.png */; }; - 3DE882A813E35E5000C95AE8 /* header_ep11.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826913E35E5000C95AE8 /* header_ep11.png */; }; 3DE882A913E35E5000C95AE8 /* intermission.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826A13E35E5000C95AE8 /* intermission.png */; }; 3DE882AA13E35E5000C95AE8 /* iphone_image.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826B13E35E5000C95AE8 /* iphone_image.png */; }; 3DE882AB13E35E5000C95AE8 /* kills_shadow.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826C13E35E5000C95AE8 /* kills_shadow.png */; }; 3DE882AC13E35E5000C95AE8 /* kills.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826D13E35E5000C95AE8 /* kills.png */; }; 3DE882AD13E35E5000C95AE8 /* map_background.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826E13E35E5000C95AE8 /* map_background.png */; }; - 3DE882AE13E35E5000C95AE8 /* map.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8826F13E35E5000C95AE8 /* map.png */; }; - 3DE882AF13E35E5000C95AE8 /* menu_bar.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827013E35E5000C95AE8 /* menu_bar.png */; }; - 3DE882B013E35E5000C95AE8 /* menu.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827113E35E5000C95AE8 /* menu.png */; }; - 3DE882B113E35E5000C95AE8 /* music_off.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827213E35E5000C95AE8 /* music_off.png */; }; - 3DE882B213E35E5000C95AE8 /* music_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827313E35E5000C95AE8 /* music_on.png */; }; 3DE882B313E35E5000C95AE8 /* partime_shadow.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827413E35E5000C95AE8 /* partime_shadow.png */; }; 3DE882B413E35E5000C95AE8 /* partime.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827513E35E5000C95AE8 /* partime.png */; }; 3DE882B513E35E5000C95AE8 /* secrets_shadow.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827613E35E5000C95AE8 /* secrets_shadow.png */; }; 3DE882B613E35E5000C95AE8 /* secrets.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827713E35E5000C95AE8 /* secrets.png */; }; - 3DE882B713E35E5000C95AE8 /* shoot.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827813E35E5000C95AE8 /* shoot.png */; }; - 3DE882B813E35E5000C95AE8 /* side_2_side.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827913E35E5000C95AE8 /* side_2_side.png */; }; - 3DE882B913E35E5000C95AE8 /* slider_bar_rainbow.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827A13E35E5000C95AE8 /* slider_bar_rainbow.png */; }; - 3DE882BA13E35E5000C95AE8 /* slider_bar_underlay.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827B13E35E5000C95AE8 /* slider_bar_underlay.png */; }; - 3DE882BB13E35E5000C95AE8 /* slider_bar.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827C13E35E5000C95AE8 /* slider_bar.png */; }; - 3DE882BC13E35E5000C95AE8 /* slider_knob.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827D13E35E5000C95AE8 /* slider_knob.png */; }; 3DE882BD13E35E5000C95AE8 /* stats_large.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827E13E35E5000C95AE8 /* stats_large.png */; }; 3DE882BE13E35E5000C95AE8 /* stats.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8827F13E35E5000C95AE8 /* stats.png */; }; - 3DE882BF13E35E5000C95AE8 /* status_hud.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8828013E35E5000C95AE8 /* status_hud.png */; }; 3DE882C013E35E5000C95AE8 /* submenus_background_image.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8828113E35E5000C95AE8 /* submenus_background_image.png */; }; 3DE882C113E35E5000C95AE8 /* treasure_shadow.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8828213E35E5000C95AE8 /* treasure_shadow.png */; }; 3DE882C213E35E5000C95AE8 /* treasure.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE8828313E35E5000C95AE8 /* treasure.png */; }; @@ -177,21 +127,21 @@ 7229CC570F6B3222004123C5 /* wolf_sprites.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC410F6B3222004123C5 /* wolf_sprites.c */; }; 7229CC580F6B3222004123C5 /* wolf_sv_ccmds.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC430F6B3222004123C5 /* wolf_sv_ccmds.c */; }; 7229CC590F6B3222004123C5 /* wolf_weapon.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC440F6B3222004123C5 /* wolf_weapon.c */; }; - 7229CC7D0F6B3295004123C5 /* bitwise.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC5D0F6B3295004123C5 /* bitwise.c */; }; - 7229CC7E0F6B3295004123C5 /* block.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC5E0F6B3295004123C5 /* block.c */; }; - 7229CC7F0F6B3295004123C5 /* codebook.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC600F6B3295004123C5 /* codebook.c */; }; - 7229CC800F6B3295004123C5 /* floor0.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC640F6B3295004123C5 /* floor0.c */; }; - 7229CC810F6B3295004123C5 /* floor1.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC650F6B3295004123C5 /* floor1.c */; }; - 7229CC820F6B3295004123C5 /* framing.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC660F6B3295004123C5 /* framing.c */; }; - 7229CC830F6B3295004123C5 /* info.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC670F6B3295004123C5 /* info.c */; }; - 7229CC850F6B3295004123C5 /* mapping0.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC6C0F6B3295004123C5 /* mapping0.c */; }; - 7229CC860F6B3295004123C5 /* mdct.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC6D0F6B3295004123C5 /* mdct.c */; }; - 7229CC870F6B3295004123C5 /* registry.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC740F6B3295004123C5 /* registry.c */; }; - 7229CC880F6B3295004123C5 /* res012.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC760F6B3295004123C5 /* res012.c */; }; - 7229CC890F6B3295004123C5 /* sharedbook.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC770F6B3295004123C5 /* sharedbook.c */; }; - 7229CC8A0F6B3295004123C5 /* synthesis.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC780F6B3295004123C5 /* synthesis.c */; }; - 7229CC8B0F6B3295004123C5 /* vorbisfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC790F6B3295004123C5 /* vorbisfile.c */; }; - 7229CC8C0F6B3295004123C5 /* window.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC7A0F6B3295004123C5 /* window.c */; }; + 7229CC7D0F6B3295004123C5 /* bitwise.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC5D0F6B3295004123C5 /* bitwise.c */; settings = {COMPILER_FLAGS = "-w"; }; }; + 7229CC7E0F6B3295004123C5 /* block.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC5E0F6B3295004123C5 /* block.c */; settings = {COMPILER_FLAGS = "-w"; }; }; + 7229CC7F0F6B3295004123C5 /* codebook.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC600F6B3295004123C5 /* codebook.c */; settings = {COMPILER_FLAGS = "-w"; }; }; + 7229CC800F6B3295004123C5 /* floor0.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC640F6B3295004123C5 /* floor0.c */; settings = {COMPILER_FLAGS = "-w"; }; }; + 7229CC810F6B3295004123C5 /* floor1.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC650F6B3295004123C5 /* floor1.c */; settings = {COMPILER_FLAGS = "-w"; }; }; + 7229CC820F6B3295004123C5 /* framing.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC660F6B3295004123C5 /* framing.c */; settings = {COMPILER_FLAGS = "-w"; }; }; + 7229CC830F6B3295004123C5 /* info.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC670F6B3295004123C5 /* info.c */; settings = {COMPILER_FLAGS = "-w"; }; }; + 7229CC850F6B3295004123C5 /* mapping0.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC6C0F6B3295004123C5 /* mapping0.c */; settings = {COMPILER_FLAGS = "-w"; }; }; + 7229CC860F6B3295004123C5 /* mdct.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC6D0F6B3295004123C5 /* mdct.c */; settings = {COMPILER_FLAGS = "-w"; }; }; + 7229CC870F6B3295004123C5 /* registry.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC740F6B3295004123C5 /* registry.c */; settings = {COMPILER_FLAGS = "-w"; }; }; + 7229CC880F6B3295004123C5 /* res012.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC760F6B3295004123C5 /* res012.c */; settings = {COMPILER_FLAGS = "-w"; }; }; + 7229CC890F6B3295004123C5 /* sharedbook.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC770F6B3295004123C5 /* sharedbook.c */; settings = {COMPILER_FLAGS = "-w"; }; }; + 7229CC8A0F6B3295004123C5 /* synthesis.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC780F6B3295004123C5 /* synthesis.c */; settings = {COMPILER_FLAGS = "-w"; }; }; + 7229CC8B0F6B3295004123C5 /* vorbisfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC790F6B3295004123C5 /* vorbisfile.c */; settings = {COMPILER_FLAGS = "-w"; }; }; + 7229CC8C0F6B3295004123C5 /* window.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC7A0F6B3295004123C5 /* window.c */; settings = {COMPILER_FLAGS = "-w"; }; }; 7229CE4A0F6C89F8004123C5 /* EAGLView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7229CE460F6C89F8004123C5 /* EAGLView.m */; }; 7229CE4C0F6C89F8004123C5 /* wolf3dAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7229CE490F6C89F8004123C5 /* wolf3dAppDelegate.m */; }; 7229CE550F6C8CDE004123C5 /* gles_glue.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CE540F6C8CDE004123C5 /* gles_glue.c */; }; @@ -230,9 +180,26 @@ 72935BA20F6B2D9D0085DD28 /* zmem.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B720F6B2D9D0085DD28 /* zmem.c */; }; 72A7E8F70F5F2063005B83C0 /* iphone_menus.c in Sources */ = {isa = PBXBuildFile; fileRef = 72A7E8F60F5F2063005B83C0 /* iphone_menus.c */; }; 72B5FF390F7E5C3D00C8A372 /* hud.c in Sources */ = {isa = PBXBuildFile; fileRef = 72B5FF380F7E5C3D00C8A372 /* hud.c */; }; + A1129052206A808100BEDEB5 /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A1129051206A808100BEDEB5 /* Launch Screen.storyboard */; }; + A112905E206DF0DB00BEDEB5 /* header_advanced.png in Resources */ = {isa = PBXBuildFile; fileRef = A112905D206DF0DA00BEDEB5 /* header_advanced.png */; }; + A19BF36A1FD6E4E100DAC4C1 /* base in Resources */ = {isa = PBXBuildFile; fileRef = A19BF3691FD6E4C800DAC4C1 /* base */; }; + A1B3746D2036A6CA00E1C7BE /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1B3746C2036A6CA00E1C7BE /* CoreMotion.framework */; }; + A1BB8B8D206DFC2E00D46B47 /* header_ep8.png in Resources */ = {isa = PBXBuildFile; fileRef = A1BB8B82206DFC2D00D46B47 /* header_ep8.png */; }; + A1BB8B8E206DFC2E00D46B47 /* header_ep10.png in Resources */ = {isa = PBXBuildFile; fileRef = A1BB8B83206DFC2D00D46B47 /* header_ep10.png */; }; + A1BB8B8F206DFC2E00D46B47 /* header_ep1.png in Resources */ = {isa = PBXBuildFile; fileRef = A1BB8B84206DFC2D00D46B47 /* header_ep1.png */; }; + A1BB8B90206DFC2E00D46B47 /* header_ep4.png in Resources */ = {isa = PBXBuildFile; fileRef = A1BB8B85206DFC2D00D46B47 /* header_ep4.png */; }; + A1BB8B91206DFC2E00D46B47 /* header_ep2.png in Resources */ = {isa = PBXBuildFile; fileRef = A1BB8B86206DFC2D00D46B47 /* header_ep2.png */; }; + A1BB8B92206DFC2E00D46B47 /* header_ep6.png in Resources */ = {isa = PBXBuildFile; fileRef = A1BB8B87206DFC2D00D46B47 /* header_ep6.png */; }; + A1BB8B93206DFC2E00D46B47 /* header_ep5.png in Resources */ = {isa = PBXBuildFile; fileRef = A1BB8B88206DFC2D00D46B47 /* header_ep5.png */; }; + A1BB8B94206DFC2E00D46B47 /* header_ep9.png in Resources */ = {isa = PBXBuildFile; fileRef = A1BB8B89206DFC2E00D46B47 /* header_ep9.png */; }; + A1BB8B95206DFC2E00D46B47 /* header_ep7.png in Resources */ = {isa = PBXBuildFile; fileRef = A1BB8B8A206DFC2E00D46B47 /* header_ep7.png */; }; + A1BB8B96206DFC2E00D46B47 /* header_ep3.png in Resources */ = {isa = PBXBuildFile; fileRef = A1BB8B8B206DFC2E00D46B47 /* header_ep3.png */; }; + A1BB8B97206DFC2E00D46B47 /* header_ep11.png in Resources */ = {isa = PBXBuildFile; fileRef = A1BB8B8C206DFC2E00D46B47 /* header_ep11.png */; }; + A1BB8B9B206E07C300D46B47 /* GODMODEFACE0PIC.png in Resources */ = {isa = PBXBuildFile; fileRef = A1BB8B98206E07C300D46B47 /* GODMODEFACE0PIC.png */; }; + A1BB8B9C206E07C300D46B47 /* GODMODEFACE1PIC.png in Resources */ = {isa = PBXBuildFile; fileRef = A1BB8B99206E07C300D46B47 /* GODMODEFACE1PIC.png */; }; + A1BB8B9D206E07C300D46B47 /* GODMODEFACE2PIC.png in Resources */ = {isa = PBXBuildFile; fileRef = A1BB8B9A206E07C300D46B47 /* GODMODEFACE2PIC.png */; }; + A1C78236203FBADE00F2D2DE /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1C78235203FBADE00F2D2DE /* GameController.framework */; }; C81E11A913E2112100B1049A /* SettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C81E11A813E2112100B1049A /* SettingsViewController.m */; }; - C81E121C13E225FB00B1049A /* slider.png in Resources */ = {isa = PBXBuildFile; fileRef = C81E121B13E225FB00B1049A /* slider.png */; }; - C8D1CFE013E22A6700F0EAC6 /* Default-Portrait~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = C8D1CFDF13E22A6700F0EAC6 /* Default-Portrait~ipad.png */; }; C8D1CFE413E22B5200F0EAC6 /* WOLF_57.png in Resources */ = {isa = PBXBuildFile; fileRef = C8D1CFE313E22B5200F0EAC6 /* WOLF_57.png */; }; C8D1CFE613E22B5B00F0EAC6 /* WOLF_114.png in Resources */ = {isa = PBXBuildFile; fileRef = C8D1CFE513E22B5B00F0EAC6 /* WOLF_114.png */; }; C8D1CFE813E22B6800F0EAC6 /* WOLF_72.png in Resources */ = {isa = PBXBuildFile; fileRef = C8D1CFE713E22B6800F0EAC6 /* WOLF_72.png */; }; @@ -254,25 +221,17 @@ 35048AAC13E0A03A00516B10 /* credits_bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = credits_bg.png; path = ../../menu_art/credits_bg.png; sourceTree = SOURCE_ROOT; }; 35048ABB13E0D2EA00516B10 /* wolf_bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = wolf_bg.png; path = ../../menu_art/wolf_bg.png; sourceTree = SOURCE_ROOT; }; 35048ABD13E0D51600516B10 /* iphone_preset_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iphone_preset_1.png; path = ../../menu_art/iphone_preset_1.png; sourceTree = SOURCE_ROOT; }; - 35048AD613E0E98800516B10 /* difficulty_star1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = difficulty_star1.png; path = ../../menu_art/difficulty_star1.png; sourceTree = SOURCE_ROOT; }; - 35048AD713E0E98800516B10 /* difficulty_star2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = difficulty_star2.png; path = ../../menu_art/difficulty_star2.png; sourceTree = SOURCE_ROOT; }; - 35048AD813E0E98800516B10 /* difficulty_star3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = difficulty_star3.png; path = ../../menu_art/difficulty_star3.png; sourceTree = SOURCE_ROOT; }; - 35048AD913E0E98800516B10 /* difficulty_star4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = difficulty_star4.png; path = ../../menu_art/difficulty_star4.png; sourceTree = SOURCE_ROOT; }; 350BA59413F34F7900FAE7E4 /* difficulty_head1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = difficulty_head1.png; path = ../../menu_art/difficulty_head1.png; sourceTree = SOURCE_ROOT; }; 350BA59513F34F7900FAE7E4 /* difficulty_head2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = difficulty_head2.png; path = ../../menu_art/difficulty_head2.png; sourceTree = SOURCE_ROOT; }; 350BA59613F34F7900FAE7E4 /* difficulty_head3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = difficulty_head3.png; path = ../../menu_art/difficulty_head3.png; sourceTree = SOURCE_ROOT; }; 350BA59713F34F7900FAE7E4 /* difficulty_head4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = difficulty_head4.png; path = ../../menu_art/difficulty_head4.png; sourceTree = SOURCE_ROOT; }; 350CCF9A13DF8B0E003303AB /* episode_bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = episode_bg.png; path = ../../menu_art/episode_bg.png; sourceTree = SOURCE_ROOT; }; 350CCF9D13DF8C47003303AB /* back_arrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = back_arrow.png; path = ../../menu_art/back_arrow.png; sourceTree = SOURCE_ROOT; }; - 350CCF9E13DF8C47003303AB /* difficulty_selection_box.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = difficulty_selection_box.png; path = ../../menu_art/difficulty_selection_box.png; sourceTree = SOURCE_ROOT; }; - 350CCFCD13DF8DED003303AB /* mission_bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = mission_bg.png; path = ../../menu_art/mission_bg.png; sourceTree = SOURCE_ROOT; }; 3534C87313E208F400740F63 /* CreditsView~ipad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "CreditsView~ipad.xib"; path = "Resources-iPad/CreditsView~ipad.xib"; sourceTree = ""; }; 3534C87413E208F400740F63 /* TriviaView~ipad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "TriviaView~ipad.xib"; path = "Resources-iPad/TriviaView~ipad.xib"; sourceTree = ""; }; 3534C88E13E220CE00740F63 /* LegalView~ipad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "LegalView~ipad.xib"; path = "Resources-iPad/LegalView~ipad.xib"; sourceTree = ""; }; 3534C95B13E241AB00740F63 /* LevelSelectView~ipad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "LevelSelectView~ipad.xib"; path = "Resources-iPad/LevelSelectView~ipad.xib"; sourceTree = ""; }; 3534C95D13E241B100740F63 /* EpisodeView~ipad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "EpisodeView~ipad.xib"; path = "Resources-iPad/EpisodeView~ipad.xib"; sourceTree = ""; }; - 3534C96913E2485F00740F63 /* adv_button_frame.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = adv_button_frame.png; path = ../../menu_art/adv_button_frame.png; sourceTree = SOURCE_ROOT; }; - 3534C96B13E2486700740F63 /* preset_frame.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = preset_frame.png; path = ../../menu_art/preset_frame.png; sourceTree = SOURCE_ROOT; }; 3534C97E13E24E0E00740F63 /* SettingsView~ipad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "SettingsView~ipad.xib"; path = "Resources-iPad/SettingsView~ipad.xib"; sourceTree = ""; }; 3555CC3F13E2001A006E7D2F /* button_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_highlight.png; path = ../../menu_art/button_highlight.png; sourceTree = SOURCE_ROOT; }; 356D306C13F9820400EDDACE /* EpisodeCell~ipad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "EpisodeCell~ipad.xib"; path = "Resources-iPad/EpisodeCell~ipad.xib"; sourceTree = ""; }; @@ -342,59 +301,17 @@ 3DDD3A2513DF232900967735 /* UIFontButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIFontButton.h; sourceTree = ""; }; 3DE8824713E35E5000C95AE8 /* arialImageLAL_white-alpha.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "arialImageLAL_white-alpha.png"; path = "../../menu_art/arialImageLAL_white-alpha.png"; sourceTree = SOURCE_ROOT; }; 3DE8824813E35E5000C95AE8 /* arialImageLAL.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = arialImageLAL.png; path = ../../menu_art/arialImageLAL.png; sourceTree = SOURCE_ROOT; }; - 3DE8824913E35E5000C95AE8 /* button_back.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_back.png; path = ../../menu_art/button_back.png; sourceTree = SOURCE_ROOT; }; - 3DE8824A13E35E5000C95AE8 /* button_downloads.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_downloads.png; path = ../../menu_art/button_downloads.png; sourceTree = SOURCE_ROOT; }; - 3DE8824B13E35E5000C95AE8 /* button_knife.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_knife.png; path = ../../menu_art/button_knife.png; sourceTree = SOURCE_ROOT; }; - 3DE8824C13E35E5000C95AE8 /* button_left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_left.png; path = ../../menu_art/button_left.png; sourceTree = SOURCE_ROOT; }; - 3DE8824D13E35E5000C95AE8 /* button_more.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_more.png; path = ../../menu_art/button_more.png; sourceTree = SOURCE_ROOT; }; - 3DE8824E13E35E5000C95AE8 /* button_new.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_new.png; path = ../../menu_art/button_new.png; sourceTree = SOURCE_ROOT; }; - 3DE8824F13E35E5000C95AE8 /* button_pistol.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_pistol.png; path = ../../menu_art/button_pistol.png; sourceTree = SOURCE_ROOT; }; - 3DE8825013E35E5000C95AE8 /* button_resume.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_resume.png; path = ../../menu_art/button_resume.png; sourceTree = SOURCE_ROOT; }; - 3DE8825113E35E5000C95AE8 /* button_right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_right.png; path = ../../menu_art/button_right.png; sourceTree = SOURCE_ROOT; }; - 3DE8825213E35E5000C95AE8 /* button_settings.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_settings.png; path = ../../menu_art/button_settings.png; sourceTree = SOURCE_ROOT; }; - 3DE8825313E35E5000C95AE8 /* button_trivia.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_trivia.png; path = ../../menu_art/button_trivia.png; sourceTree = SOURCE_ROOT; }; - 3DE8825413E35E5000C95AE8 /* button_web.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_web.png; path = ../../menu_art/button_web.png; sourceTree = SOURCE_ROOT; }; - 3DE8825513E35E5000C95AE8 /* diractional_01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = diractional_01.png; path = ../../menu_art/diractional_01.png; sourceTree = SOURCE_ROOT; }; - 3DE8825613E35E5000C95AE8 /* diractional_02.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = diractional_02.png; path = ../../menu_art/diractional_02.png; sourceTree = SOURCE_ROOT; }; - 3DE8825713E35E5000C95AE8 /* diractional_03.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = diractional_03.png; path = ../../menu_art/diractional_03.png; sourceTree = SOURCE_ROOT; }; - 3DE8825B13E35E5000C95AE8 /* GODMODEFACE0PIC.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = GODMODEFACE0PIC.png; path = ../../menu_art/GODMODEFACE0PIC.png; sourceTree = SOURCE_ROOT; }; - 3DE8825C13E35E5000C95AE8 /* GODMODEFACE1PIC.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = GODMODEFACE1PIC.png; path = ../../menu_art/GODMODEFACE1PIC.png; sourceTree = SOURCE_ROOT; }; - 3DE8825D13E35E5000C95AE8 /* GODMODEFACE2PIC.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = GODMODEFACE2PIC.png; path = ../../menu_art/GODMODEFACE2PIC.png; sourceTree = SOURCE_ROOT; }; - 3DE8825E13E35E5000C95AE8 /* header_advanced.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_advanced.png; path = ../../menu_art/header_advanced.png; sourceTree = SOURCE_ROOT; }; - 3DE8825F13E35E5000C95AE8 /* header_ep1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep1.png; path = ../../menu_art/header_ep1.png; sourceTree = SOURCE_ROOT; }; - 3DE8826013E35E5000C95AE8 /* header_ep2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep2.png; path = ../../menu_art/header_ep2.png; sourceTree = SOURCE_ROOT; }; - 3DE8826113E35E5000C95AE8 /* header_ep3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep3.png; path = ../../menu_art/header_ep3.png; sourceTree = SOURCE_ROOT; }; - 3DE8826213E35E5000C95AE8 /* header_ep4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep4.png; path = ../../menu_art/header_ep4.png; sourceTree = SOURCE_ROOT; }; - 3DE8826313E35E5000C95AE8 /* header_ep5.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep5.png; path = ../../menu_art/header_ep5.png; sourceTree = SOURCE_ROOT; }; - 3DE8826413E35E5000C95AE8 /* header_ep6.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep6.png; path = ../../menu_art/header_ep6.png; sourceTree = SOURCE_ROOT; }; - 3DE8826513E35E5000C95AE8 /* header_ep7.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep7.png; path = ../../menu_art/header_ep7.png; sourceTree = SOURCE_ROOT; }; - 3DE8826613E35E5000C95AE8 /* header_ep8.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep8.png; path = ../../menu_art/header_ep8.png; sourceTree = SOURCE_ROOT; }; - 3DE8826713E35E5000C95AE8 /* header_ep9.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep9.png; path = ../../menu_art/header_ep9.png; sourceTree = SOURCE_ROOT; }; - 3DE8826813E35E5000C95AE8 /* header_ep10.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep10.png; path = ../../menu_art/header_ep10.png; sourceTree = SOURCE_ROOT; }; - 3DE8826913E35E5000C95AE8 /* header_ep11.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep11.png; path = ../../menu_art/header_ep11.png; sourceTree = SOURCE_ROOT; }; 3DE8826A13E35E5000C95AE8 /* intermission.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = intermission.png; path = ../../menu_art/intermission.png; sourceTree = SOURCE_ROOT; }; 3DE8826B13E35E5000C95AE8 /* iphone_image.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iphone_image.png; path = ../../menu_art/iphone_image.png; sourceTree = SOURCE_ROOT; }; 3DE8826C13E35E5000C95AE8 /* kills_shadow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = kills_shadow.png; path = ../../menu_art/kills_shadow.png; sourceTree = SOURCE_ROOT; }; 3DE8826D13E35E5000C95AE8 /* kills.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = kills.png; path = ../../menu_art/kills.png; sourceTree = SOURCE_ROOT; }; 3DE8826E13E35E5000C95AE8 /* map_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = map_background.png; path = ../../menu_art/map_background.png; sourceTree = SOURCE_ROOT; }; - 3DE8826F13E35E5000C95AE8 /* map.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = map.png; path = ../../menu_art/map.png; sourceTree = SOURCE_ROOT; }; - 3DE8827013E35E5000C95AE8 /* menu_bar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = menu_bar.png; path = ../../menu_art/menu_bar.png; sourceTree = SOURCE_ROOT; }; - 3DE8827113E35E5000C95AE8 /* menu.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = menu.png; path = ../../menu_art/menu.png; sourceTree = SOURCE_ROOT; }; - 3DE8827213E35E5000C95AE8 /* music_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = music_off.png; path = ../../menu_art/music_off.png; sourceTree = SOURCE_ROOT; }; - 3DE8827313E35E5000C95AE8 /* music_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = music_on.png; path = ../../menu_art/music_on.png; sourceTree = SOURCE_ROOT; }; 3DE8827413E35E5000C95AE8 /* partime_shadow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = partime_shadow.png; path = ../../menu_art/partime_shadow.png; sourceTree = SOURCE_ROOT; }; 3DE8827513E35E5000C95AE8 /* partime.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = partime.png; path = ../../menu_art/partime.png; sourceTree = SOURCE_ROOT; }; 3DE8827613E35E5000C95AE8 /* secrets_shadow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = secrets_shadow.png; path = ../../menu_art/secrets_shadow.png; sourceTree = SOURCE_ROOT; }; 3DE8827713E35E5000C95AE8 /* secrets.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = secrets.png; path = ../../menu_art/secrets.png; sourceTree = SOURCE_ROOT; }; - 3DE8827813E35E5000C95AE8 /* shoot.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = shoot.png; path = ../../menu_art/shoot.png; sourceTree = SOURCE_ROOT; }; - 3DE8827913E35E5000C95AE8 /* side_2_side.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = side_2_side.png; path = ../../menu_art/side_2_side.png; sourceTree = SOURCE_ROOT; }; - 3DE8827A13E35E5000C95AE8 /* slider_bar_rainbow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = slider_bar_rainbow.png; path = ../../menu_art/slider_bar_rainbow.png; sourceTree = SOURCE_ROOT; }; - 3DE8827B13E35E5000C95AE8 /* slider_bar_underlay.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = slider_bar_underlay.png; path = ../../menu_art/slider_bar_underlay.png; sourceTree = SOURCE_ROOT; }; - 3DE8827C13E35E5000C95AE8 /* slider_bar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = slider_bar.png; path = ../../menu_art/slider_bar.png; sourceTree = SOURCE_ROOT; }; - 3DE8827D13E35E5000C95AE8 /* slider_knob.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = slider_knob.png; path = ../../menu_art/slider_knob.png; sourceTree = SOURCE_ROOT; }; 3DE8827E13E35E5000C95AE8 /* stats_large.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = stats_large.png; path = ../../menu_art/stats_large.png; sourceTree = SOURCE_ROOT; }; 3DE8827F13E35E5000C95AE8 /* stats.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = stats.png; path = ../../menu_art/stats.png; sourceTree = SOURCE_ROOT; }; - 3DE8828013E35E5000C95AE8 /* status_hud.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = status_hud.png; path = ../../menu_art/status_hud.png; sourceTree = SOURCE_ROOT; }; 3DE8828113E35E5000C95AE8 /* submenus_background_image.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = submenus_background_image.png; path = ../../menu_art/submenus_background_image.png; sourceTree = SOURCE_ROOT; }; 3DE8828213E35E5000C95AE8 /* treasure_shadow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = treasure_shadow.png; path = ../../menu_art/treasure_shadow.png; sourceTree = SOURCE_ROOT; }; 3DE8828313E35E5000C95AE8 /* treasure.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = treasure.png; path = ../../menu_art/treasure.png; sourceTree = SOURCE_ROOT; }; @@ -551,10 +468,31 @@ 72A7E8F60F5F2063005B83C0 /* iphone_menus.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = iphone_menus.c; sourceTree = ""; }; 72B5FF380F7E5C3D00C8A372 /* hud.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hud.c; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; + A1129051206A808100BEDEB5 /* Launch Screen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = ""; }; + A112905A206DA37A00BEDEB5 /* iphone_qgl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iphone_qgl.h; sourceTree = ""; }; + A112905B206DA37A00BEDEB5 /* gles_glue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gles_glue.h; sourceTree = ""; }; + A112905C206DA37A00BEDEB5 /* iphone_qgl_enumerants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iphone_qgl_enumerants.h; sourceTree = ""; }; + A112905D206DF0DA00BEDEB5 /* header_advanced.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_advanced.png; path = ../../menu_art/header_advanced.png; sourceTree = ""; }; + A19BF3691FD6E4C800DAC4C1 /* base */ = {isa = PBXFileReference; lastKnownFileType = folder; name = base; path = ../../base; sourceTree = ""; }; + A1B3746C2036A6CA00E1C7BE /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; }; + A1B3746E2036B0F100E1C7BE /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../../README.md; sourceTree = ""; }; + A1BB8B82206DFC2D00D46B47 /* header_ep8.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep8.png; path = ../../menu_art/header_ep8.png; sourceTree = ""; }; + A1BB8B83206DFC2D00D46B47 /* header_ep10.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep10.png; path = ../../menu_art/header_ep10.png; sourceTree = ""; }; + A1BB8B84206DFC2D00D46B47 /* header_ep1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep1.png; path = ../../menu_art/header_ep1.png; sourceTree = ""; }; + A1BB8B85206DFC2D00D46B47 /* header_ep4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep4.png; path = ../../menu_art/header_ep4.png; sourceTree = ""; }; + A1BB8B86206DFC2D00D46B47 /* header_ep2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep2.png; path = ../../menu_art/header_ep2.png; sourceTree = ""; }; + A1BB8B87206DFC2D00D46B47 /* header_ep6.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep6.png; path = ../../menu_art/header_ep6.png; sourceTree = ""; }; + A1BB8B88206DFC2D00D46B47 /* header_ep5.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep5.png; path = ../../menu_art/header_ep5.png; sourceTree = ""; }; + A1BB8B89206DFC2E00D46B47 /* header_ep9.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep9.png; path = ../../menu_art/header_ep9.png; sourceTree = ""; }; + A1BB8B8A206DFC2E00D46B47 /* header_ep7.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep7.png; path = ../../menu_art/header_ep7.png; sourceTree = ""; }; + A1BB8B8B206DFC2E00D46B47 /* header_ep3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep3.png; path = ../../menu_art/header_ep3.png; sourceTree = ""; }; + A1BB8B8C206DFC2E00D46B47 /* header_ep11.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = header_ep11.png; path = ../../menu_art/header_ep11.png; sourceTree = ""; }; + A1BB8B98206E07C300D46B47 /* GODMODEFACE0PIC.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = GODMODEFACE0PIC.png; path = ../../menu_art/GODMODEFACE0PIC.png; sourceTree = ""; }; + A1BB8B99206E07C300D46B47 /* GODMODEFACE1PIC.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = GODMODEFACE1PIC.png; path = ../../menu_art/GODMODEFACE1PIC.png; sourceTree = ""; }; + A1BB8B9A206E07C300D46B47 /* GODMODEFACE2PIC.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = GODMODEFACE2PIC.png; path = ../../menu_art/GODMODEFACE2PIC.png; sourceTree = ""; }; + A1C78235203FBADE00F2D2DE /* GameController.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameController.framework; path = System/Library/Frameworks/GameController.framework; sourceTree = SDKROOT; }; C81E11A713E2112100B1049A /* SettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsViewController.h; sourceTree = ""; }; C81E11A813E2112100B1049A /* SettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingsViewController.m; sourceTree = ""; }; - C81E121B13E225FB00B1049A /* slider.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = slider.png; path = ../../menu_art/slider.png; sourceTree = SOURCE_ROOT; }; - C8D1CFDF13E22A6700F0EAC6 /* Default-Portrait~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-Portrait~ipad.png"; sourceTree = ""; }; C8D1CFE313E22B5200F0EAC6 /* WOLF_57.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = WOLF_57.png; sourceTree = ""; }; C8D1CFE513E22B5B00F0EAC6 /* WOLF_114.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = WOLF_114.png; sourceTree = ""; }; C8D1CFE713E22B6800F0EAC6 /* WOLF_72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = WOLF_72.png; sourceTree = ""; }; @@ -573,6 +511,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + A1C78236203FBADE00F2D2DE /* GameController.framework in Frameworks */, + A1B3746D2036A6CA00E1C7BE /* CoreMotion.framework in Frameworks */, 43AE7E9F0F67387500B2F562 /* CoreGraphics.framework in Frameworks */, 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 3D3ED8D113BF775B00C5B1DF /* OpenAL.framework in Frameworks */, @@ -601,16 +541,18 @@ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( - C8D1CFE713E22B6800F0EAC6 /* WOLF_72.png */, - C8D1CFE513E22B5B00F0EAC6 /* WOLF_114.png */, - C8D1CFE313E22B5200F0EAC6 /* WOLF_57.png */, - C8D1CFDF13E22A6700F0EAC6 /* Default-Portrait~ipad.png */, - 3D86D68A13DF172B00186487 /* POSITYPE-idSettler10v2.otf */, + A1129051206A808100BEDEB5 /* Launch Screen.storyboard */, + A19BF3691FD6E4C800DAC4C1 /* base */, + 29B97323FDCFA39411CA2CEA /* Frameworks */, 29B97315FDCFA39411CA2CEA /* Other Sources */, + 3D86D68A13DF172B00186487 /* POSITYPE-idSettler10v2.otf */, + 19C28FACFE9D520D11CA2CBB /* Products */, + A1B3746E2036B0F100E1C7BE /* README.md */, 29B97317FDCFA39411CA2CEA /* Resources */, 3D15A41A13C6BA0B00FBFAA2 /* Resources-iPad */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - 19C28FACFE9D520D11CA2CBB /* Products */, + C8D1CFE313E22B5200F0EAC6 /* WOLF_57.png */, + C8D1CFE713E22B6800F0EAC6 /* WOLF_72.png */, + C8D1CFE513E22B5B00F0EAC6 /* WOLF_114.png */, ); name = CustomTemplate; sourceTree = ""; @@ -618,6 +560,9 @@ 29B97315FDCFA39411CA2CEA /* Other Sources */ = { isa = PBXGroup; children = ( + A112905B206DA37A00BEDEB5 /* gles_glue.h */, + A112905C206DA37A00BEDEB5 /* iphone_qgl_enumerants.h */, + A112905A206DA37A00BEDEB5 /* iphone_qgl.h */, ED0A8D0A1069ACA8001E0547 /* arialGlyphRects.h */, 3D5C0C7513DF8F78008ECBD1 /* controllers */, 7229CE450F6C89F8004123C5 /* EAGLView.h */, @@ -668,6 +613,8 @@ 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( + A1C78235203FBADE00F2D2DE /* GameController.framework */, + A1B3746C2036A6CA00E1C7BE /* CoreMotion.framework */, 3D3ED95A13BF77FA00C5B1DF /* AudioToolbox.framework */, 43AE7E9E0F67387500B2F562 /* CoreGraphics.framework */, 1D30AB110D05D00D00671497 /* Foundation.framework */, @@ -733,56 +680,35 @@ 3D5C0CFD13DF9ABF008ECBD1 /* menu_art */ = { isa = PBXGroup; children = ( + A1BB8B98206E07C300D46B47 /* GODMODEFACE0PIC.png */, + A1BB8B99206E07C300D46B47 /* GODMODEFACE1PIC.png */, + A1BB8B9A206E07C300D46B47 /* GODMODEFACE2PIC.png */, 35E6E15413F3172F0010F530 /* adv_btn.png */, - 3534C96913E2485F00740F63 /* adv_button_frame.png */, - 3DE8824813E35E5000C95AE8 /* arialImageLAL.png */, 3DE8824713E35E5000C95AE8 /* arialImageLAL_white-alpha.png */, + 3DE8824813E35E5000C95AE8 /* arialImageLAL.png */, 350CCF9D13DF8C47003303AB /* back_arrow.png */, - 3DE8824913E35E5000C95AE8 /* button_back.png */, - 3DE8824A13E35E5000C95AE8 /* button_downloads.png */, 3555CC3F13E2001A006E7D2F /* button_highlight.png */, - 3DE8824B13E35E5000C95AE8 /* button_knife.png */, - 3DE8824C13E35E5000C95AE8 /* button_left.png */, - 3DE8824D13E35E5000C95AE8 /* button_more.png */, - 3DE8824E13E35E5000C95AE8 /* button_new.png */, - 3DE8824F13E35E5000C95AE8 /* button_pistol.png */, - 3DE8825013E35E5000C95AE8 /* button_resume.png */, - 3DE8825113E35E5000C95AE8 /* button_right.png */, - 3DE8825213E35E5000C95AE8 /* button_settings.png */, - 3DE8825313E35E5000C95AE8 /* button_trivia.png */, - 3DE8825413E35E5000C95AE8 /* button_web.png */, 35048AAC13E0A03A00516B10 /* credits_bg.png */, 350BA59413F34F7900FAE7E4 /* difficulty_head1.png */, 350BA59513F34F7900FAE7E4 /* difficulty_head2.png */, 350BA59613F34F7900FAE7E4 /* difficulty_head3.png */, 350BA59713F34F7900FAE7E4 /* difficulty_head4.png */, - 350CCF9E13DF8C47003303AB /* difficulty_selection_box.png */, - 35048AD613E0E98800516B10 /* difficulty_star1.png */, - 35048AD713E0E98800516B10 /* difficulty_star2.png */, - 35048AD813E0E98800516B10 /* difficulty_star3.png */, - 35048AD913E0E98800516B10 /* difficulty_star4.png */, - 3DE8825513E35E5000C95AE8 /* diractional_01.png */, - 3DE8825613E35E5000C95AE8 /* diractional_02.png */, - 3DE8825713E35E5000C95AE8 /* diractional_03.png */, 35E6E16813F318A50010F530 /* down_arrow.png */, 350CCF9A13DF8B0E003303AB /* episode_bg.png */, 3DF1804213F44D6700ED668A /* episode_bracket.png */, 3DF1804313F44D6700ED668A /* episode_divider.png */, - 3DE8825B13E35E5000C95AE8 /* GODMODEFACE0PIC.png */, - 3DE8825C13E35E5000C95AE8 /* GODMODEFACE1PIC.png */, - 3DE8825D13E35E5000C95AE8 /* GODMODEFACE2PIC.png */, - 3DE8825E13E35E5000C95AE8 /* header_advanced.png */, - 3DE8825F13E35E5000C95AE8 /* header_ep1.png */, - 3DE8826813E35E5000C95AE8 /* header_ep10.png */, - 3DE8826913E35E5000C95AE8 /* header_ep11.png */, - 3DE8826013E35E5000C95AE8 /* header_ep2.png */, - 3DE8826113E35E5000C95AE8 /* header_ep3.png */, - 3DE8826213E35E5000C95AE8 /* header_ep4.png */, - 3DE8826313E35E5000C95AE8 /* header_ep5.png */, - 3DE8826413E35E5000C95AE8 /* header_ep6.png */, - 3DE8826513E35E5000C95AE8 /* header_ep7.png */, - 3DE8826613E35E5000C95AE8 /* header_ep8.png */, - 3DE8826713E35E5000C95AE8 /* header_ep9.png */, + A112905D206DF0DA00BEDEB5 /* header_advanced.png */, + A1BB8B84206DFC2D00D46B47 /* header_ep1.png */, + A1BB8B86206DFC2D00D46B47 /* header_ep2.png */, + A1BB8B8B206DFC2E00D46B47 /* header_ep3.png */, + A1BB8B85206DFC2D00D46B47 /* header_ep4.png */, + A1BB8B88206DFC2D00D46B47 /* header_ep5.png */, + A1BB8B87206DFC2D00D46B47 /* header_ep6.png */, + A1BB8B8A206DFC2E00D46B47 /* header_ep7.png */, + A1BB8B82206DFC2D00D46B47 /* header_ep8.png */, + A1BB8B89206DFC2E00D46B47 /* header_ep9.png */, + A1BB8B83206DFC2D00D46B47 /* header_ep10.png */, + A1BB8B8C206DFC2E00D46B47 /* header_ep11.png */, 35E6E16313F318600010F530 /* highlight_bracket.png */, 3DE8826A13E35E5000C95AE8 /* intermission.png */, 3DE8826B13E35E5000C95AE8 /* iphone_image.png */, @@ -790,24 +716,17 @@ 3D5C0F7F13E0FC46008ECBD1 /* iphone_preset_2.png */, 3D5C0F8013E0FC46008ECBD1 /* iphone_preset_3.png */, 3D5C0F8113E0FC46008ECBD1 /* iphone_preset_4.png */, - 3DE8826D13E35E5000C95AE8 /* kills.png */, 3DE8826C13E35E5000C95AE8 /* kills_shadow.png */, + 3DE8826D13E35E5000C95AE8 /* kills.png */, 35E6E15E13F318420010F530 /* left_chevron.png */, 3D5C0D0913DF9B41008ECBD1 /* main_bg.png */, - 3DE8826F13E35E5000C95AE8 /* map.png */, 3DE8826E13E35E5000C95AE8 /* map_background.png */, - 3DE8827113E35E5000C95AE8 /* menu.png */, - 3DE8827013E35E5000C95AE8 /* menu_bar.png */, - 350CCFCD13DF8DED003303AB /* mission_bg.png */, - 3DE8827213E35E5000C95AE8 /* music_off.png */, - 3DE8827313E35E5000C95AE8 /* music_on.png */, 35048AA913E07E7800516B10 /* next_arrow.png */, - 3DE8827513E35E5000C95AE8 /* partime.png */, 3DE8827413E35E5000C95AE8 /* partime_shadow.png */, - 3534C96B13E2486700740F63 /* preset_frame.png */, + 3DE8827513E35E5000C95AE8 /* partime.png */, 35E6E15F13F318420010F530 /* right_chevron.png */, - 3DE8827713E35E5000C95AE8 /* secrets.png */, 3DE8827613E35E5000C95AE8 /* secrets_shadow.png */, + 3DE8827713E35E5000C95AE8 /* secrets.png */, 35E6E15913F3182C0010F530 /* settings_divider.png */, 3DBC68E613F599B4002A8253 /* settings_line_art.png */, 35E6E19F13F321A50010F530 /* settings_slider_blue.png */, @@ -816,20 +735,12 @@ 3589EBA613F5E3DC005FBE56 /* settings_slider_grey~ipad.png */, 35E6E1A113F321A50010F530 /* settings_slider_white.png */, 3589EBA713F5E3DC005FBE56 /* settings_slider_white~ipad.png */, - 3DE8827813E35E5000C95AE8 /* shoot.png */, - 3DE8827913E35E5000C95AE8 /* side_2_side.png */, - C81E121B13E225FB00B1049A /* slider.png */, - 3DE8827C13E35E5000C95AE8 /* slider_bar.png */, - 3DE8827A13E35E5000C95AE8 /* slider_bar_rainbow.png */, - 3DE8827B13E35E5000C95AE8 /* slider_bar_underlay.png */, - 3DE8827D13E35E5000C95AE8 /* slider_knob.png */, 35E6E17413F3196A0010F530 /* star_icon.png */, - 3DE8827F13E35E5000C95AE8 /* stats.png */, 3DE8827E13E35E5000C95AE8 /* stats_large.png */, - 3DE8828013E35E5000C95AE8 /* status_hud.png */, + 3DE8827F13E35E5000C95AE8 /* stats.png */, 3DE8828113E35E5000C95AE8 /* submenus_background_image.png */, - 3DE8828313E35E5000C95AE8 /* treasure.png */, 3DE8828213E35E5000C95AE8 /* treasure_shadow.png */, + 3DE8828313E35E5000C95AE8 /* treasure.png */, 35E6E15A13F3182C0010F530 /* up_arrow.png */, 3DE8828413E35E5000C95AE8 /* up_down.png */, 3DE8828513E35E5000C95AE8 /* victory_256.png */, @@ -841,15 +752,15 @@ 3D5C0CFE13DF9AD5008ECBD1 /* views */ = { isa = PBXGroup; children = ( + 3D5C0D3013DFA0DF008ECBD1 /* CreditsView.xib */, + 3D10C37A13F310F700DF5856 /* EpisodeCell.xib */, 3D5C0C2613DF6701008ECBD1 /* EpisodeView.xib */, + 3D5C0D3213DFA0EA008ECBD1 /* LegalView.xib */, + 3D5C0C4C13DF8084008ECBD1 /* LevelSelectView.xib */, 3D86CF8A13DDE51800186487 /* MainMenuView.xib */, 3DDD3A2013DF228500967735 /* SettingsView.xib */, - 3D5C0C4C13DF8084008ECBD1 /* LevelSelectView.xib */, - 3D5C0D3013DFA0DF008ECBD1 /* CreditsView.xib */, - 3D5C0D3213DFA0EA008ECBD1 /* LegalView.xib */, - 3D5C0DF413E063F5008ECBD1 /* TriviaView.xib */, 3D10C3F113F33D3700DF5856 /* SkillView.xib */, - 3D10C37A13F310F700DF5856 /* EpisodeCell.xib */, + 3D5C0DF413E063F5008ECBD1 /* TriviaView.xib */, ); name = views; sourceTree = ""; @@ -857,15 +768,15 @@ 3D5C0D0F13DF9B82008ECBD1 /* views */ = { isa = PBXGroup; children = ( - 3534C97E13E24E0E00740F63 /* SettingsView~ipad.xib */, - 3534C95B13E241AB00740F63 /* LevelSelectView~ipad.xib */, - 3534C95D13E241B100740F63 /* EpisodeView~ipad.xib */, - 356D306C13F9820400EDDACE /* EpisodeCell~ipad.xib */, - 356D306E13F9820900EDDACE /* SkillView~ipad.xib */, - 3534C88E13E220CE00740F63 /* LegalView~ipad.xib */, 3534C87313E208F400740F63 /* CreditsView~ipad.xib */, - 3534C87413E208F400740F63 /* TriviaView~ipad.xib */, + 356D306C13F9820400EDDACE /* EpisodeCell~ipad.xib */, + 3534C95D13E241B100740F63 /* EpisodeView~ipad.xib */, + 3534C88E13E220CE00740F63 /* LegalView~ipad.xib */, + 3534C95B13E241AB00740F63 /* LevelSelectView~ipad.xib */, 3D5C0D2B13DF9D9B008ECBD1 /* MainMenuView~ipad.xib */, + 3534C97E13E24E0E00740F63 /* SettingsView~ipad.xib */, + 356D306E13F9820900EDDACE /* SkillView~ipad.xib */, + 3534C87413E208F400740F63 /* TriviaView~ipad.xib */, ); name = views; sourceTree = ""; @@ -1032,7 +943,6 @@ 1D60588D0D05DD3D006BFB54 /* Resources */, 1D60588E0D05DD3D006BFB54 /* Sources */, 1D60588F0D05DD3D006BFB54 /* Frameworks */, - 435F41A90F532CA300887552 /* ShellScript */, ); buildRules = ( ); @@ -1048,6 +958,9 @@ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; + attributes = { + LastUpgradeCheck = 0930; + }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "wolf3d" */; compatibilityVersion = "Xcode 3.1"; developmentRegion = English; @@ -1072,6 +985,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + A19BF36A1FD6E4E100DAC4C1 /* base in Resources */, 43CF02ED0F56955F00E4A23D /* wolf3d_icon.png in Resources */, 43CF02FF0F56974E00E4A23D /* Default.png in Resources */, 4364BF3F0F5CB25900F29317 /* dist.plist in Resources */, @@ -1083,8 +997,6 @@ 3D5C0C4D13DF8084008ECBD1 /* LevelSelectView.xib in Resources */, 350CCF9B13DF8B0E003303AB /* episode_bg.png in Resources */, 350CCF9F13DF8C47003303AB /* back_arrow.png in Resources */, - 350CCFA013DF8C47003303AB /* difficulty_selection_box.png in Resources */, - 350CCFCE13DF8DED003303AB /* mission_bg.png in Resources */, 3D5C0D0A13DF9B41008ECBD1 /* main_bg.png in Resources */, 3D5C0D2C13DF9D9B008ECBD1 /* MainMenuView~ipad.xib in Resources */, 3D5C0D3113DFA0DF008ECBD1 /* CreditsView.xib in Resources */, @@ -1092,12 +1004,9 @@ 3D5C0DF513E063F5008ECBD1 /* TriviaView.xib in Resources */, 35048AAA13E07E7800516B10 /* next_arrow.png in Resources */, 35048AAD13E0A03A00516B10 /* credits_bg.png in Resources */, + A112905E206DF0DB00BEDEB5 /* header_advanced.png in Resources */, 35048ABC13E0D2EA00516B10 /* wolf_bg.png in Resources */, 35048AC113E0D51600516B10 /* iphone_preset_1.png in Resources */, - 35048ADA13E0E98800516B10 /* difficulty_star1.png in Resources */, - 35048ADB13E0E98800516B10 /* difficulty_star2.png in Resources */, - 35048ADC13E0E98800516B10 /* difficulty_star3.png in Resources */, - 35048ADD13E0E98800516B10 /* difficulty_star4.png in Resources */, 3D5C0F8213E0FC46008ECBD1 /* iphone_preset_2.png in Resources */, 3D5C0F8313E0FC46008ECBD1 /* iphone_preset_3.png in Resources */, 3D5C0F8413E0FC46008ECBD1 /* iphone_preset_4.png in Resources */, @@ -1105,71 +1014,35 @@ 3534C87513E208F400740F63 /* CreditsView~ipad.xib in Resources */, 3534C87613E208F400740F63 /* TriviaView~ipad.xib in Resources */, 3534C88F13E220CE00740F63 /* LegalView~ipad.xib in Resources */, - C81E121C13E225FB00B1049A /* slider.png in Resources */, - C8D1CFE013E22A6700F0EAC6 /* Default-Portrait~ipad.png in Resources */, C8D1CFE413E22B5200F0EAC6 /* WOLF_57.png in Resources */, C8D1CFE613E22B5B00F0EAC6 /* WOLF_114.png in Resources */, C8D1CFE813E22B6800F0EAC6 /* WOLF_72.png in Resources */, + A1BB8B9B206E07C300D46B47 /* GODMODEFACE0PIC.png in Resources */, 3534C95C13E241AB00740F63 /* LevelSelectView~ipad.xib in Resources */, + A1BB8B8F206DFC2E00D46B47 /* header_ep1.png in Resources */, + A1BB8B8E206DFC2E00D46B47 /* header_ep10.png in Resources */, + A1129052206A808100BEDEB5 /* Launch Screen.storyboard in Resources */, 3534C95E13E241B100740F63 /* EpisodeView~ipad.xib in Resources */, - 3534C96A13E2485F00740F63 /* adv_button_frame.png in Resources */, - 3534C96C13E2486700740F63 /* preset_frame.png in Resources */, 3534C97F13E24E0E00740F63 /* SettingsView~ipad.xib in Resources */, + A1BB8B93206DFC2E00D46B47 /* header_ep5.png in Resources */, 3DE8828613E35E5000C95AE8 /* arialImageLAL_white-alpha.png in Resources */, + A1BB8B90206DFC2E00D46B47 /* header_ep4.png in Resources */, 3DE8828713E35E5000C95AE8 /* arialImageLAL.png in Resources */, - 3DE8828813E35E5000C95AE8 /* button_back.png in Resources */, - 3DE8828913E35E5000C95AE8 /* button_downloads.png in Resources */, - 3DE8828A13E35E5000C95AE8 /* button_knife.png in Resources */, - 3DE8828B13E35E5000C95AE8 /* button_left.png in Resources */, - 3DE8828C13E35E5000C95AE8 /* button_more.png in Resources */, - 3DE8828D13E35E5000C95AE8 /* button_new.png in Resources */, - 3DE8828E13E35E5000C95AE8 /* button_pistol.png in Resources */, - 3DE8828F13E35E5000C95AE8 /* button_resume.png in Resources */, - 3DE8829013E35E5000C95AE8 /* button_right.png in Resources */, - 3DE8829113E35E5000C95AE8 /* button_settings.png in Resources */, - 3DE8829213E35E5000C95AE8 /* button_trivia.png in Resources */, - 3DE8829313E35E5000C95AE8 /* button_web.png in Resources */, - 3DE8829413E35E5000C95AE8 /* diractional_01.png in Resources */, - 3DE8829513E35E5000C95AE8 /* diractional_02.png in Resources */, - 3DE8829613E35E5000C95AE8 /* diractional_03.png in Resources */, - 3DE8829A13E35E5000C95AE8 /* GODMODEFACE0PIC.png in Resources */, - 3DE8829B13E35E5000C95AE8 /* GODMODEFACE1PIC.png in Resources */, - 3DE8829C13E35E5000C95AE8 /* GODMODEFACE2PIC.png in Resources */, - 3DE8829D13E35E5000C95AE8 /* header_advanced.png in Resources */, - 3DE8829E13E35E5000C95AE8 /* header_ep1.png in Resources */, - 3DE8829F13E35E5000C95AE8 /* header_ep2.png in Resources */, - 3DE882A013E35E5000C95AE8 /* header_ep3.png in Resources */, - 3DE882A113E35E5000C95AE8 /* header_ep4.png in Resources */, - 3DE882A213E35E5000C95AE8 /* header_ep5.png in Resources */, - 3DE882A313E35E5000C95AE8 /* header_ep6.png in Resources */, - 3DE882A413E35E5000C95AE8 /* header_ep7.png in Resources */, - 3DE882A513E35E5000C95AE8 /* header_ep8.png in Resources */, - 3DE882A613E35E5000C95AE8 /* header_ep9.png in Resources */, - 3DE882A713E35E5000C95AE8 /* header_ep10.png in Resources */, - 3DE882A813E35E5000C95AE8 /* header_ep11.png in Resources */, 3DE882A913E35E5000C95AE8 /* intermission.png in Resources */, 3DE882AA13E35E5000C95AE8 /* iphone_image.png in Resources */, 3DE882AB13E35E5000C95AE8 /* kills_shadow.png in Resources */, 3DE882AC13E35E5000C95AE8 /* kills.png in Resources */, 3DE882AD13E35E5000C95AE8 /* map_background.png in Resources */, - 3DE882AE13E35E5000C95AE8 /* map.png in Resources */, - 3DE882AF13E35E5000C95AE8 /* menu_bar.png in Resources */, - 3DE882B013E35E5000C95AE8 /* menu.png in Resources */, - 3DE882B113E35E5000C95AE8 /* music_off.png in Resources */, - 3DE882B213E35E5000C95AE8 /* music_on.png in Resources */, + A1BB8B97206DFC2E00D46B47 /* header_ep11.png in Resources */, 3DE882B313E35E5000C95AE8 /* partime_shadow.png in Resources */, + A1BB8B9C206E07C300D46B47 /* GODMODEFACE1PIC.png in Resources */, 3DE882B413E35E5000C95AE8 /* partime.png in Resources */, + A1BB8B9D206E07C300D46B47 /* GODMODEFACE2PIC.png in Resources */, 3DE882B513E35E5000C95AE8 /* secrets_shadow.png in Resources */, 3DE882B613E35E5000C95AE8 /* secrets.png in Resources */, - 3DE882B713E35E5000C95AE8 /* shoot.png in Resources */, - 3DE882B813E35E5000C95AE8 /* side_2_side.png in Resources */, - 3DE882B913E35E5000C95AE8 /* slider_bar_rainbow.png in Resources */, - 3DE882BA13E35E5000C95AE8 /* slider_bar_underlay.png in Resources */, - 3DE882BB13E35E5000C95AE8 /* slider_bar.png in Resources */, - 3DE882BC13E35E5000C95AE8 /* slider_knob.png in Resources */, + A1BB8B92206DFC2E00D46B47 /* header_ep6.png in Resources */, 3DE882BD13E35E5000C95AE8 /* stats_large.png in Resources */, 3DE882BE13E35E5000C95AE8 /* stats.png in Resources */, - 3DE882BF13E35E5000C95AE8 /* status_hud.png in Resources */, 3DE882C013E35E5000C95AE8 /* submenus_background_image.png in Resources */, 3DE882C113E35E5000C95AE8 /* treasure_shadow.png in Resources */, 3DE882C213E35E5000C95AE8 /* treasure.png in Resources */, @@ -1177,8 +1050,11 @@ 3DE882C413E35E5000C95AE8 /* victory_256.png in Resources */, 35E6E15513F3172F0010F530 /* adv_btn.png in Resources */, 35E6E15B13F3182C0010F530 /* settings_divider.png in Resources */, + A1BB8B96206DFC2E00D46B47 /* header_ep3.png in Resources */, 35E6E15C13F3182C0010F530 /* up_arrow.png in Resources */, + A1BB8B94206DFC2E00D46B47 /* header_ep9.png in Resources */, 35E6E16013F318420010F530 /* left_chevron.png in Resources */, + A1BB8B91206DFC2E00D46B47 /* header_ep2.png in Resources */, 35E6E16113F318420010F530 /* right_chevron.png in Resources */, 35E6E16413F318600010F530 /* highlight_bracket.png in Resources */, 35E6E16913F318A50010F530 /* down_arrow.png in Resources */, @@ -1192,6 +1068,8 @@ 350BA59913F34F7900FAE7E4 /* difficulty_head2.png in Resources */, 350BA59A13F34F7900FAE7E4 /* difficulty_head3.png in Resources */, 350BA59B13F34F7900FAE7E4 /* difficulty_head4.png in Resources */, + A1BB8B95206DFC2E00D46B47 /* header_ep7.png in Resources */, + A1BB8B8D206DFC2E00D46B47 /* header_ep8.png in Resources */, 3DF1804413F44D6700ED668A /* episode_bracket.png in Resources */, 3DF1804513F44D6700ED668A /* episode_divider.png in Resources */, 3DBC68E713F599B4002A8253 /* settings_line_art.png in Resources */, @@ -1206,22 +1084,6 @@ }; /* End PBXResourcesBuildPhase section */ -/* Begin PBXShellScriptBuildPhase section */ - 435F41A90F532CA300887552 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = "/bin/sh -x"; - shellScript = "PBXCP=${DEVELOPER_DIR}/Library/PrivateFrameworks/DevToolsCore.framework/Resources/pbxcp\nBASE=${PROJECT_DIR}/../../base\nDST=${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\n${PBXCP} -exclude .svn ${BASE} ${DST}\n# \"${PROJECT_DIR}/../../base\" \"${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/\"\nSCRIPTS=${PROJECT_DIR}/../../scripts\n/usr/bin/perl ${SCRIPTS}/scrubBase.pl ${BASE} ${DST}\n\n"; - }; -/* End PBXShellScriptBuildPhase section */ - /* Begin PBXSourcesBuildPhase section */ 1D60588E0D05DD3D006BFB54 /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -1332,16 +1194,23 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_WEAK = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; + DEVELOPMENT_TEAM = 9UY8SFDNQ8; GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = wolf3d_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = IPHONE; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.idsoftware.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = wolf3d; PROFILE_PREFIX = nu.r3; + PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -1351,15 +1220,22 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_WEAK = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = YES; + DEVELOPMENT_TEAM = 9UY8SFDNQ8; + GCC_NO_COMMON_BLOCKS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = wolf3d_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = IPHONE; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.idsoftware.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = wolf3d; PROFILE_PREFIX = nu.r3; + PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -1368,15 +1244,38 @@ 431181700F994C5400FF9351 /* AdHocDistLite */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_ENTITLEMENTS = dist.plist; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Cass Everitt"; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = c99; + GCC_NO_COMMON_BLOCKS = YES; GCC_THUMB_SUPPORT = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 3.2; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; PREBINDING = NO; "PROVISIONING_PROFILE[sdk=iphoneos*]" = "E2E91433-8CD1-46DB-9DC5-B7E4C84FD1C2"; SDKROOT = iphoneos; @@ -1388,8 +1287,12 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_WEAK = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = YES; + DEVELOPMENT_TEAM = 9UY8SFDNQ8; + GCC_NO_COMMON_BLOCKS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = wolf3d_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -1398,8 +1301,11 @@ ); HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.idsoftware.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = wolf3dlite; PROFILE_PREFIX = nu.r3; + PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -1408,15 +1314,38 @@ 4364BF480F5CB27300F29317 /* AdHocDist */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_ENTITLEMENTS = dist.plist; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: id Software"; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = c99; + GCC_NO_COMMON_BLOCKS = YES; GCC_THUMB_SUPPORT = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 3.2; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; PREBINDING = NO; "PROVISIONING_PROFILE[sdk=iphoneos*]" = "E2E91433-8CD1-46DB-9DC5-B7E4C84FD1C2"; SDKROOT = iphoneos; @@ -1428,15 +1357,22 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_WEAK = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = YES; + DEVELOPMENT_TEAM = 9UY8SFDNQ8; + GCC_NO_COMMON_BLOCKS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = wolf3d_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = IPHONE; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.idsoftware.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = wolf3d; PROFILE_PREFIX = nu.r3; + PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -1445,14 +1381,37 @@ 43AE7CA40F61EC4E00B2F562 /* ReleaseLite */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = c99; + GCC_NO_COMMON_BLOCKS = YES; GCC_THUMB_SUPPORT = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 3.2; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; PREBINDING = NO; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; @@ -1464,8 +1423,12 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_WEAK = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = YES; + DEVELOPMENT_TEAM = 9UY8SFDNQ8; + GCC_NO_COMMON_BLOCKS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = wolf3d_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -1474,8 +1437,11 @@ ); HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.idsoftware.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = wolf3dlite; PROFILE_PREFIX = nu.r3; + PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -1484,15 +1450,40 @@ 43AE7CAE0F61FC9200B2F562 /* DebugLite */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = c99; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = "-DDEBUG"; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 3.2; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + ONLY_ACTIVE_ARCH = YES; PREBINDING = NO; SDKROOT = iphoneos; SYMROOT = ../../build; @@ -1503,9 +1494,13 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_WEAK = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; + DEVELOPMENT_TEAM = 9UY8SFDNQ8; GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = wolf3d_Prefix.pch; @@ -1515,8 +1510,11 @@ ); HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.idsoftware.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = wolf3dlite; PROFILE_PREFIX = nu.r3; + PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -1525,16 +1523,41 @@ C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = c99; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = "-DDEBUG"; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 3.2; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + ONLY_ACTIVE_ARCH = YES; PREBINDING = NO; SDKROOT = iphoneos; SYMROOT = ../../build; @@ -1544,18 +1567,41 @@ C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_DYNAMIC_NO_PIC = YES; GCC_ENABLE_OBJC_EXCEPTIONS = NO; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 3; GCC_THUMB_SUPPORT = NO; GCC_UNROLL_LOOPS = YES; - GCC_VERSION = 4.2; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 3.2; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; PREBINDING = NO; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; @@ -1566,14 +1612,37 @@ C8139B6B13FC40750094C2C0 /* DistributionLite */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: id Software"; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = c99; + GCC_NO_COMMON_BLOCKS = YES; GCC_THUMB_SUPPORT = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 3.2; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; PREBINDING = NO; "PROVISIONING_PROFILE[sdk=iphoneos*]" = "31C73095-0DD9-4ABA-BB25-8D23F661F10F"; SDKROOT = iphoneos; @@ -1585,8 +1654,12 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_WEAK = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = YES; + DEVELOPMENT_TEAM = 9UY8SFDNQ8; + GCC_NO_COMMON_BLOCKS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = wolf3d_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -1595,8 +1668,11 @@ ); HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.idsoftware.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = wolf3dlite; PROFILE_PREFIX = nu.r3; + PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -1605,14 +1681,37 @@ ED2751531083BE8C009C891E /* Distribution */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: id Software"; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = c99; + GCC_NO_COMMON_BLOCKS = YES; GCC_THUMB_SUPPORT = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 3.2; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; PREBINDING = NO; "PROVISIONING_PROFILE[sdk=iphoneos*]" = "31C73095-0DD9-4ABA-BB25-8D23F661F10F"; SDKROOT = iphoneos; @@ -1624,15 +1723,22 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_WEAK = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = YES; + DEVELOPMENT_TEAM = 9UY8SFDNQ8; + GCC_NO_COMMON_BLOCKS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = wolf3d_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = IPHONE; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.idsoftware.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = wolf3d; PROFILE_PREFIX = nu.r3; + PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; diff --git a/wolf3d/code/iphone/wolf3dAppDelegate.h b/wolf3d/code/iphone/wolf3dAppDelegate.h index 1ade451..7480ce1 100644 --- a/wolf3d/code/iphone/wolf3dAppDelegate.h +++ b/wolf3d/code/iphone/wolf3dAppDelegate.h @@ -24,6 +24,7 @@ #import #import #import +#import #import "iphone_store.h" @@ -46,6 +47,7 @@ @property (nonatomic, retain) UINavigationController *navigationController; @property (nonatomic, retain) UIView *waitingView; @property (nonatomic, retain) AVAudioPlayer *player; +@property (nonatomic, strong) CMMotionManager * motionManager; - (void)initMenuMusicPlayer; @@ -53,7 +55,7 @@ - (void)stopMenuMusic; -- (void)restartAccelerometerIfNeeded; +//- (void)restartAccelerometerIfNeeded; - (void)showOpenGL; - (void)GLtoMainMenu; - (void)GLtoPreviousMenu; diff --git a/wolf3d/code/iphone/wolf3dAppDelegate.m b/wolf3d/code/iphone/wolf3dAppDelegate.m index fe927c2..de79d62 100644 --- a/wolf3d/code/iphone/wolf3dAppDelegate.m +++ b/wolf3d/code/iphone/wolf3dAppDelegate.m @@ -37,7 +37,7 @@ extern void AppendUserDataToFile(NSData* data); //extern void SaveData(); //used for downloading custom made map -extern void FinalizeUserDownload(); +extern void FinalizeUserDownload(void); yesNoBoxType_t currentYesNoBox = YESNO_NONE; @@ -52,7 +52,7 @@ extern void GetSpear(); extern void DownloadURLConnection(char *url); -extern void iphoneSet2D(); +extern void iphoneSet2D(void); //extern bool isAlive; @@ -70,7 +70,6 @@ extern void iphoneSet2D(); char iphoneDocDirectory[1024]; char iphoneAppDirectory[1024]; - void SysIPhoneVibrate() { AudioServicesPlaySystemSound( kSystemSoundID_Vibrate ); } @@ -138,9 +137,18 @@ void SysIPhoneVibrate() { encoding: NSASCIIStringEncoding ]; // start the flow of accelerometer events - UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer]; - accelerometer.delegate = self; - accelerometer.updateInterval = 1.0 / 30.0; +// UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer]; +// accelerometer.delegate = self; +// accelerometer.updateInterval = 1.0 / 30.0; + + [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(updateDeviceMotion) userInfo:nil repeats:YES]; + + self.motionManager = [[CMMotionManager alloc] init]; +// self.motionManager.accelerometerActive = YES; + self.motionManager.deviceMotionUpdateInterval = 1.0 / 30.0; + [self.motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryCorrectedZVertical]; + + [self.motionManager startAccelerometerUpdates]; // do all the game startup work //iphoneStartup(); @@ -178,7 +186,16 @@ void SysIPhoneVibrate() { // BEWARE! For UI*Interface*Orientation, Left/Right refers to the location of the home button. // BUT, for UI*Device*Orientation, Left/Right refers to the location of the side OPPOSITE the home button!! [self setScreenForOrientation:UIDeviceOrientationLandscapeRight]; - + + CGRect screenBound = [[UIScreen mainScreen] bounds]; + CGSize screenSize = screenBound.size; + + CGFloat screenHeight = screenSize.height; + CGFloat screenWidth = screenSize.width; + + window = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, screenWidth, screenHeight)]; + window.bounds = CGRectMake(0, 0, screenWidth, screenHeight); + // Create the window programmatically instead of loading from a nib file. self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; @@ -195,6 +212,7 @@ void SysIPhoneVibrate() { [rootController release]; [window addSubview:navigationController.view]; + [window setRootViewController:self.navigationController]; [window makeKeyAndVisible]; return YES; @@ -208,7 +226,7 @@ void SysIPhoneVibrate() { [[navigationController view] removeFromSuperview]; [self.viewController setActive:YES]; - [window addSubview:[self.viewController view]]; + [window addSubview:[self.viewController view]]; [self.viewController startAnimation]; } @@ -220,19 +238,24 @@ void SysIPhoneVibrate() { } - (void)setScreenForOrientation:(UIDeviceOrientation) orientation { + // Note the the UIDeviceOrientations are REVERSED from the UIInterface orientations! - switch (orientation) { + switch (orientation) { case UIDeviceOrientationLandscapeLeft: - deviceOrientation = ORIENTATION_LANDSCAPE_RIGHT; - viddef.width = [UIScreen mainScreen].bounds.size.height * deviceScale; - viddef.height = [UIScreen mainScreen].bounds.size.width * deviceScale; + deviceOrientation = ORIENTATION_LANDSCAPE_RIGHT; +// viddef.width = [UIScreen mainScreen].bounds.size.height * deviceScale; +// viddef.height = [UIScreen mainScreen].bounds.size.width * deviceScale; + viddef.width = [UIScreen mainScreen].bounds.size.width * deviceScale; + viddef.height = [UIScreen mainScreen].bounds.size.height * deviceScale; //[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeRight; break; case UIDeviceOrientationLandscapeRight: deviceOrientation = ORIENTATION_LANDSCAPE_LEFT; - viddef.width = [UIScreen mainScreen].bounds.size.height * deviceScale; - viddef.height = [UIScreen mainScreen].bounds.size.width * deviceScale; +// viddef.width = [UIScreen mainScreen].bounds.size.height * deviceScale; +// viddef.height = [UIScreen mainScreen].bounds.size.width * deviceScale; + viddef.width = [UIScreen mainScreen].bounds.size.width * deviceScale; + viddef.height = [UIScreen mainScreen].bounds.size.height * deviceScale; //[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeLeft; break; @@ -418,29 +441,52 @@ extern char urlbuffer[1024]; [super dealloc]; } -- (void)restartAccelerometerIfNeeded { +//- (void)restartAccelerometerIfNeeded { +// +// // I have no idea why this seems to happen sometimes... +// if ( Sys_Milliseconds() - lastAccelUpdateMsec > 1000 ) { +// static int count; +// if ( ++count < 5 ) { +// printf( "Restarting accelerometer updates.\n" ); +// } +// UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer]; +// accelerometer.delegate = self; +// accelerometer.updateInterval = 1.0 / 30.0; +// } +//} - // I have no idea why this seems to happen sometimes... - if ( Sys_Milliseconds() - lastAccelUpdateMsec > 1000 ) { - static int count; - if ( ++count < 5 ) { - printf( "Restarting accelerometer updates.\n" ); - } - UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer]; - accelerometer.delegate = self; - accelerometer.updateInterval = 1.0 / 30.0; - } -} +//- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration +//{ +// float acc[4]; +// acc[0] = acceleration.x; +// acc[1] = acceleration.y; +// acc[2] = acceleration.z; +// acc[3] = acceleration.timestamp; +// iphoneTiltEvent( acc ); +// lastAccelUpdateMsec = (int)Sys_Milliseconds(); +//// Com_Printf("acc: x: %f y: %f z: %f\n", acceleration.x, acceleration.y, acceleration.z); +// +//} -- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration -{ - float acc[4]; - acc[0] = acceleration.x; - acc[1] = acceleration.y; - acc[2] = acceleration.z; - acc[3] = acceleration.timestamp; - iphoneTiltEvent( acc ); - lastAccelUpdateMsec = Sys_Milliseconds(); +-(void)updateDeviceMotion +{ + CMAccelerometerData *deviceMotion = self.motionManager.accelerometerData; + + if(deviceMotion == nil) + { + return; + } + +// CMAcceleration acceleration = deviceMotion.acceleration; +// Com_Printf("cmm:x: %f y: %f z: %f\n", acceleration.x, acceleration.y, acceleration.z); + + float acc[4]; + acc[0] = deviceMotion.acceleration.x; + acc[1] = deviceMotion.acceleration.y; + acc[2] = deviceMotion.acceleration.z; + acc[3] = deviceMotion.timestamp; + iphoneTiltEvent( acc ); + lastAccelUpdateMsec = (int)Sys_Milliseconds(); } //------------------------------------------------------------ diff --git a/wolf3d/code/iphone/wolf3dViewController.m b/wolf3d/code/iphone/wolf3dViewController.m index 1f42394..84a905b 100644 --- a/wolf3d/code/iphone/wolf3dViewController.m +++ b/wolf3d/code/iphone/wolf3dViewController.m @@ -28,9 +28,12 @@ #import "wolfiphone.h" //#import "wolf3dAppDelegate.h" +#import + @interface wolf3dViewController () @property (nonatomic, retain) EAGLContext *context; @property (nonatomic, assign) CADisplayLink *displayLink; +@property (strong, nonatomic) GCController *mainController; @end @implementation wolf3dViewController @@ -40,11 +43,31 @@ - (id)initWithNibName:(NSString*)file bundle:(NSBundle*)bundle { + [super initWithNibName:file bundle:bundle]; + // Get the application's window dimensions. - EAGLView *glView = [[EAGLView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; + //EAGLView *glView = [[EAGLView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; + +// CGRect rect; +// if (self.view.frame.size.width < self.view.frame.size.height) +// rect = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height); +// else +// rect = CGRectMake(self.view.frame.origin.y, self.view.frame.origin.x, self.view.frame.size.height, self.view.frame.size.width); + + CGRect screenBound = [[UIScreen mainScreen] bounds]; + CGSize screenSize = screenBound.size; + + CGFloat screenHeight = screenSize.height; + CGFloat screenWidth = screenSize.width; + + EAGLView *glView = [[EAGLView alloc] initWithFrame:CGRectMake(0, 0, screenWidth, screenHeight)]; + glView.bounds = CGRectMake(0, 0, screenWidth, screenHeight); + + NSLog(@"initWithNibName glView.bounds: %f %f", glView.bounds.size.width, glView.bounds.size.height); + self.view = glView; [glView release]; - + EAGLContext *aContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; if (!aContext) @@ -61,7 +84,17 @@ animating = FALSE; animationFrameInterval = DEFAULT_FRAME_INTERVAL; self.displayLink = nil; - + + // notifications for controller (dis)connect + [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(controllerWasConnected:) name:GCControllerDidConnectNotification object:nil]; + [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(controllerWasDisconnected:) name:GCControllerDidDisconnectNotification object:nil]; + + if (IS_IPHONE_X) { + isiPhoneX = true; + } else { + isiPhoneX = false; + } + // Now that we have a context, we can init the render system. iphoneStartup(); @@ -72,7 +105,28 @@ - (void)awakeFromNib { - EAGLView *glView = [[EAGLView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; + [super awakeFromNib]; + +// EAGLView *glView = [[EAGLView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; + +// CGRect rect; +// if (self.view.frame.size.width < self.view.frame.size.height) +// rect = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height); +// else +// rect = CGRectMake(self.view.frame.origin.y, self.view.frame.origin.x, self.view.frame.size.height, self.view.frame.size.width); +// + + CGRect screenBound = [[UIScreen mainScreen] bounds]; + CGSize screenSize = screenBound.size; + + CGFloat screenHeight = screenSize.height; + CGFloat screenWidth = screenSize.width; + + EAGLView *glView = [[EAGLView alloc] initWithFrame:CGRectMake(0, 0, screenWidth, screenHeight)]; + glView.bounds = CGRectMake(0, 0, screenWidth, screenHeight); + + NSLog(@"awakeFromNib glView.bounds: %f %f", glView.bounds.size.width, glView.bounds.size.height); + self.view = glView; [glView release]; @@ -98,7 +152,13 @@ // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; - // Release any cached data, images, etc. that aren't in use. + + [self stopAnimation]; + + // Tear down context. + if ([EAGLContext currentContext] == context) + [EAGLContext setCurrentContext:nil]; + self.context = nil; } - (void)dealloc { @@ -128,18 +188,6 @@ [super viewWillDisappear:animated]; } -- (void)viewDidUnload -{ - [super viewDidUnload]; - - [self stopAnimation]; - - // Tear down context. - if ([EAGLContext currentContext] == context) - [EAGLContext setCurrentContext:nil]; - self.context = nil; -} - - (NSInteger)animationFrameInterval { return animationFrameInterval; @@ -234,4 +282,154 @@ [(EAGLView *)self.view presentFramebuffer]; } +- (void)controllerWasConnected:(NSNotification *)notification { + + // a controller was connected + GCController *controller = (GCController *)notification.object; + NSString *status = [NSString stringWithFormat:@"Controller connected\nName: %@\n", controller.vendorName]; + NSLog(@"%@", status); + + self.mainController = controller; + + iPhoneSetControllerConnected(true); + [self reactToInput]; +} + +- (void)controllerWasDisconnected:(NSNotification *)notification { + + // a controller was disconnected + GCController *controller = (GCController *)notification.object; + NSString *status = [NSString stringWithFormat:@"Controller disconnected:\n%@", controller.vendorName]; + NSLog(@"%@", status); + +// self.mainController = nil; + iPhoneSetControllerConnected(false); +} + +- (void)reactToInput { + + NSLog(@"%s", "reactToInput"); + + // register block for input change detection + GCExtendedGamepad *profile = self.mainController.extendedGamepad; + profile.valueChangedHandler = ^(GCExtendedGamepad *gamepad, GCControllerElement *element) + { + NSString *message = @""; + CGPoint position = CGPointMake(0, 0); + + // left trigger + if (gamepad.leftTrigger == element && gamepad.leftTrigger.isPressed) { + message = [message stringByAppendingString:@"Left Trigger"]; + } + + // right trigger + if (gamepad.rightTrigger == element) { + iPhoneSetRightTriggerPressed(gamepad.rightTrigger.isPressed); + } + + // left shoulder button + if (gamepad.leftShoulder == element && gamepad.leftShoulder.isPressed) { + message = [message stringByAppendingString:@"Left Shoulder Button"]; + } + + // right shoulder button + if (gamepad.rightShoulder == element && gamepad.rightShoulder.isPressed) { + message = [message stringByAppendingString:@"Right Shoulder Button"]; + } + + // A button + if (gamepad.buttonA == element && gamepad.buttonA.isPressed) { + message = [message stringByAppendingString:@"A Button"]; + } + + // B button + if (gamepad.buttonB == element && gamepad.buttonB.isPressed) { + message = [message stringByAppendingString:@"B Button"]; + } + + // X button + if (gamepad.buttonX == element && gamepad.buttonX.isPressed) { + message = [message stringByAppendingString:@"X Button"]; + } + + // Y button + if (gamepad.buttonY == element && gamepad.buttonY.isPressed) { + message = [message stringByAppendingString:@"Y Button"]; + } + + // d-pad + if (gamepad.dpad == element) { + if (gamepad.dpad.up.isPressed) { + message = [message stringByAppendingString:@"D-Pad Up"]; + } + if (gamepad.dpad.down.isPressed) { + message = [message stringByAppendingString:@"D-Pad Down"]; + } + if (gamepad.dpad.left.isPressed) { + message = [message stringByAppendingString:@"D-Pad Left"]; + } + if (gamepad.dpad.right.isPressed) { + message = [message stringByAppendingString:@"D-Pad Right"]; + } + } + + // left stick + if (gamepad.leftThumbstick == element) { + if (gamepad.leftThumbstick.up.isPressed || gamepad.leftThumbstick.down.isPressed) { + iPhoneSetLeftThumbstickYValue(gamepad.leftThumbstick.yAxis.value); + } else { + iPhoneSetLeftThumbstickYValue(0); + } + + if (gamepad.leftThumbstick.left.isPressed || gamepad.leftThumbstick.right.isPressed) { + iPhoneSetLeftThumbstickXValue(gamepad.leftThumbstick.xAxis.value); + } else { + iPhoneSetLeftThumbstickXValue(0); + } + + position = CGPointMake(gamepad.leftThumbstick.xAxis.value, gamepad.leftThumbstick.yAxis.value); + } + + // right stick + if (gamepad.rightThumbstick == element) { + if (gamepad.rightThumbstick.up.isPressed || gamepad.rightThumbstick.down.isPressed) { + iPhoneSetRightThumbstickYValue(gamepad.rightThumbstick.yAxis.value); + } else { + iPhoneSetRightThumbstickYValue(0); + } + + if (gamepad.rightThumbstick.left.isPressed || gamepad.rightThumbstick.right.isPressed) { + iPhoneSetRightThumbstickXValue(gamepad.rightThumbstick.xAxis.value); + } else { + iPhoneSetRightThumbstickXValue(0); + } + + position = CGPointMake(gamepad.rightThumbstick.xAxis.value, gamepad.rightThumbstick.yAxis.value); + } + + //NSLog(@"%@", message); + + }; + + // we need a weak self here for in-block access +// __weak typeof(self) weakSelf = self; +// +// self.mainController.controllerPausedHandler = ^(GCController *controller){ +// +// // check if we're currently paused or not +// // then bring up or remove the paused view controller +// if (weakSelf.currentlyPaused) { +// +// weakSelf.currentlyPaused = NO; +// [weakSelf dismissViewControllerAnimated:YES completion:nil]; +// +// } else { +// +// weakSelf.currentlyPaused = YES; +// [weakSelf presentViewController:weakSelf.pausedViewController animated:YES completion:nil]; +// } +// +// }; +} + @end diff --git a/wolf3d/code/iphone/wondering.caf b/wolf3d/code/iphone/wondering.caf new file mode 100755 index 0000000000000000000000000000000000000000..6566ae48b080643c15fa3a309c5ac8290cc4616d GIT binary patch literal 279287 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

OggVorbis_File

- -

declared in "ivorbisfile.h"

- -

-The OggVorbis_File structure defines an Ogg Vorbis file. -

- -This structure is used in all libvorbisidec routines. Before it can be used, -it must be initialized by ov_open() or ov_open_callbacks(). - -

-After use, the OggVorbis_File structure must be deallocated with a -call to ov_clear(). - -

-Once a file or data source is opened successfully by libvorbisidec -(using ov_open() or ov_open_callbacks()), it is owned by -libvorbisidec. The file should not be used by any other applications or -functions outside of the libvorbisidec API. The file must not be closed -directly by the application at any time after a successful open; -libvorbisidec expects to close the file within ov_clear(). -

-If the call to ov_open() or ov_open_callbacks() fails, -libvorbisidec does not assume ownership of the file and the -application is expected to close it if necessary. - -

- - - - -
-
typedef struct {
-  void             *datasource; /* Pointer to a FILE *, etc. */
-  int              seekable;
-  ogg_int64_t      offset;
-  ogg_int64_t      end;
-  ogg_sync_state   oy; 
-
-  /* If the FILE handle isn't seekable (eg, a pipe), only the current
-     stream appears */
-  int              links;
-  ogg_int64_t      *offsets;
-  ogg_int64_t      *dataoffsets;
-  long             *serialnos;
-  ogg_int64_t      *pcmlengths;
-  vorbis_info      *vi;
-  vorbis_comment   *vc;
-
-  /* Decoding working state local storage */
-  ogg_int64_t      pcm_offset;
-  int              ready_state;
-  long             current_serialno;
-  int              current_link;
-
-  ogg_int64_t      bittrack;
-  ogg_int64_t      samptrack;
-
-  ogg_stream_state os; /* take physical pages, weld into a logical
-                          stream of packets */
-  vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */
-  vorbis_block     vb; /* local working space for packet->PCM decode */
-
-  ov_callbacks callbacks;
-
-} OggVorbis_File;
-
- -

Relevant Struct Members

-
-
datasource
- -
Pointer to file or other ogg source. When using stdio based -file/stream access, this field contains a FILE pointer. When using -custom IO via callbacks, libvorbisidec treats this void pointer as a -black box only to be passed to the callback routines provided by the -application.
- -
seekable
-
Read-only int indicating whether file is seekable. E.g., a physical file is seekable, a pipe isn't.
-
links
-
Read-only int indicating the number of logical bitstreams within the physical bitstream.
-
ov_callbacks
-
Collection of file manipulation routines to be used on this data source. When using stdio/FILE access via ov_open(), the callbacks will be filled in with stdio calls or wrappers to stdio calls.
-
- -

Notes

- -

Tremor requires a native 64 bit integer type to compile and -function; The GNU build system will locate and typedef -ogg_int64_t to the appropriate native type. If not using the -GNU build tools, you will need to define ogg_int64_t as a -64-bit type inside your system's project file/Makefile, etc. On win32, -for example, this should be defined as __int64. -

- - -

-


- - - - - - - - -

copyright © 2002 Xiph.org

Ogg Vorbis

Tremor documentation

Tremor version 1.0 - 20020403

- - - - diff --git a/wolf3d/newCode/Tremor/doc/build.html b/wolf3d/newCode/Tremor/doc/build.html deleted file mode 100644 index 6f0f4ee..0000000 --- a/wolf3d/newCode/Tremor/doc/build.html +++ /dev/null @@ -1,111 +0,0 @@ - - - -Tremor - Build - - - - - - - - - -

Tremor documentation

Tremor version 1.0 - 20020403

- -

Tremor: Building libvorbisidec

- -

- -The C source in the Tremor package will build on any ANSI C compiler -and function completely and properly on any platform. The included -build system assumes GNU build system and make tools (m4, automake, -autoconf, libtool and gmake). GCC is not required, although GCC is -the most tested compiler. To build using GNU tools, type in the -source directory: - -

-


-./autogen.sh
-gmake
-
-

-or if GNU make is the standard make on the build system: -


-./autogen.sh
-make
-
- -

-Currently, the source implements playback in pure C on all platforms -except ARM, where a [currently] small amount of assembly (see the file -asm_arm.h) is used to implement 64 bit math operations and -fast LSP computation. If building on ARM without the benefit of GNU -build system tools, be sure that _ARM_ASSEM_ is #defined by -the build system if this assembly is desired, else the resulting -library will use whatever 64 bit math builtins the compiler -implements. - -

-No math library is required by this source. No floating point -operations are used at any point in either setup or decode. This -decoder library will properly decode any past, current or future -Vorbis I file or stream. - -

-The GNU build system produces static and, when supported by the OS, -dynamic libraries named 'libvorbisidec'. This library exposes an API -nearly identical to the BSD reference library's 'libvorbisfile', -including all the features familiar to users of vorbisfile. This API -is similar enough that the proper header file to include is named -'ivorbisfile.h', included in the source build directory. -Lower level libvorbis-style headers and structures are -in 'ivorbiscodec.h', also included in the source build directory. A -simple example program, ivorbisfile_example.c, can be built with 'make -ivorbisfile_example'. -

-(We've summarized differences between the free, -reference vorbisfile library and Tremor's libvorbisidec in a separate -document.) - -

Notes

- -

Tremor requires a native 64 bit integer type to compile and -function; The GNU build system will locate and typedef -ogg_int64_t to the appropriate native type. If not using the -GNU build tools, you will need to define ogg_int64_t as a -64-bit type inside your system's project file/Makefile, etc. On win32, -for example, this should be defined as __int64. -

- -

-


- - - - - - - - -

copyright © 2002 Xiph.org

Ogg Vorbis

Tremor documentation

Tremor version 1.0 - 20020403

- - - - - - - - - - - - - - - - - - - - diff --git a/wolf3d/newCode/Tremor/doc/callbacks.html b/wolf3d/newCode/Tremor/doc/callbacks.html deleted file mode 100644 index 9a6d392..0000000 --- a/wolf3d/newCode/Tremor/doc/callbacks.html +++ /dev/null @@ -1,113 +0,0 @@ - - - -Tremor - Callbacks and non-stdio I/O - - - - - - - - - -

Tremor documentation

Tremor version 1.0 - 20020403

- -

Callbacks and non-stdio I/O

- -Although stdio is convenient and nearly universally implemented as per -ANSI C, it is not suited to all or even most potential uses of Vorbis. -For additional flexibility, embedded applications may provide their -own I/O functions for use with Tremor when stdio is unavailable or not -suitable. One common example is decoding a Vorbis stream from a -memory buffer.

- -Use custom I/O functions by populating an ov_callbacks structure and calling ov_open_callbacks() or ov_test_callbacks() rather than the -typical ov_open() or ov_test(). Past the open call, use of -libvorbisidec is identical to using it with stdio. - -

Read function

- -The read-like function provided in the read_func field is -used to fetch the requested amount of data. It expects the fetch -operation to function similar to file-access, that is, a multiple read -operations will retrieve contiguous sequential pieces of data, -advancing a position cursor after each read.

- -The following behaviors are also expected:

-

    -
  • a return of '0' indicates end-of-data (if the by-thread errno is unset) -
  • short reads mean nothing special (short reads are not treated as error conditions) -
  • a return of zero with the by-thread errno set to nonzero indicates a read error -
-

- -

Seek function

- -The seek-like function provided in the seek_func field is -used to request non-sequential data access by libvorbisidec, moving -the access cursor to the requested position.

- -libvorbisidec expects the following behavior: -

    -
  • The seek function must always return -1 (failure) if the given -data abstraction is not seekable. It may choose to always return -1 -if the application desires libvorbisidec to treat the Vorbis data -strictly as a stream (which makes for a less expensive open -operation).

    - -

  • If the seek function initially indicates seekability, it must -always succeed upon being given a valid seek request.

    - -

  • The seek function must implement all of SEEK_SET, SEEK_CUR and -SEEK_END. The implementation of SEEK_END should set the access cursor -one past the last byte of accessible data, as would stdio -fseek()

    -

- -

Close function

- -The close function should deallocate any access state used by the -passed in instance of the data access abstraction and invalidate the -instance handle. The close function is assumed to succeed.

- -One common use of callbacks and the close function is to change the -behavior of libvorbisidec with respect to file closure for applications -that must fclose data files themselves. By passing -the normal stdio calls as callback functions, but passing a -close_func that does nothing, an application may call ov_clear() and then fclose() the -file originally passed to libvorbisidec. - -

Tell function

- -The tell function is intended to mimic the -behavior of ftell() and must return the byte position of the -next data byte that would be read. If the data access cursor is at -the end of the 'file' (pointing to one past the last byte of data, as -it would be after calling fseek(file,SEEK_END,0)), the tell -function must return the data position (and thus the total file size), -not an error.

- -The tell function need not be provided if the data IO abstraction is -not seekable.
-


- - - - - - - - -

copyright © 2002 Xiph.org

Ogg Vorbis

Tremor documentation

Tremor version 1.0 - 20020403

- - - - diff --git a/wolf3d/newCode/Tremor/doc/datastructures.html b/wolf3d/newCode/Tremor/doc/datastructures.html deleted file mode 100644 index 2b3da07..0000000 --- a/wolf3d/newCode/Tremor/doc/datastructures.html +++ /dev/null @@ -1,61 +0,0 @@ - - - -Tremor - Base Data Structures - - - - - - - - - -

Tremor documentation

Tremor version 1.0 - 20020403

- -

Base Data Structures

-

There are several data structures used to hold file and bitstream information during libvorbisidec decoding. These structures are declared in "ivorbisfile.h" and "ivorbiscodec.h". -

-

When using libvorbisidec, it's not necessary to know about most of the contents of these data structures, but it may be helpful to understand what they contain. -

- - - - - - - - - - - - - - - - - - - - - - -
datatypepurpose
OggVorbis_FileThis structure represents the basic file information. It contains - a pointer to the physical file or bitstream and various information about that bitstream.
vorbis_commentThis structure contains the file comments. It contains - a pointer to unlimited user comments, information about the number of comments, and a vendor description.
vorbis_infoThis structure contains encoder-related information about the bitstream. It includes encoder info, channel info, and bitrate limits.
ov_callbacksThis structure contains pointers to the application-specified file manipulation routines set for use by ov_open_callbacks(). See also the provided document on using application-provided callbacks instead of stdio.
- -

-


- - - - - - - - -

copyright © 2002 Xiph.org

Ogg Vorbis

Tremor documentation

Tremor version 1.0 - 20020403

- - - - diff --git a/wolf3d/newCode/Tremor/doc/decoding.html b/wolf3d/newCode/Tremor/doc/decoding.html deleted file mode 100644 index 1f61b47..0000000 --- a/wolf3d/newCode/Tremor/doc/decoding.html +++ /dev/null @@ -1,82 +0,0 @@ - - - -Tremor - Decoding - - - - - - - - - -

Tremor documentation

Tremor version 1.0 - 20020403

- -

Decoding

- -

-All libivorbisdec decoding routines are declared in "ivorbisfile.h". -

- -After initialization, decoding audio -is as simple as calling ov_read(). This -function works similarly to reading from a normal file using -read().

- -However, a few differences are worth noting: - -

multiple stream links

- -A Vorbis stream may consist of multiple sections (called links) that -encode differing numbers of channels or sample rates. It is vitally -important to pay attention to the link numbers returned by ov_read and handle audio changes that may -occur at link boundaries. Such multi-section files do exist in the -wild and are not merely a specification curiosity. - -

returned data amount

- -ov_read does not attempt to completely fill -a large, passed in data buffer; it merely guarantees that the passed -back data does not overflow the passed in buffer size. Large buffers -may be filled by iteratively looping over calls to ov_read (incrementing the buffer pointer) -until the original buffer is filled. - -

file cursor position

- -Vorbis files do not necessarily start at a sample number or time offset -of zero. Do not be surprised if a file begins at a positive offset of -several minutes or hours, such as would happen if a large stream (such -as a concert recording) is chopped into multiple seperate files. - -

- - - - - - - - - -
functionpurpose
ov_readThis function makes up the main chunk of a decode loop. It takes an -OggVorbis_File structure, which must have been initialized by a previous -call to ov_open().
- -

-


- - - - - - - - -

copyright © 2002 Xiph.org

Ogg Vorbis

Tremor documentation

Tremor version 1.0 - 20020403

- - - - diff --git a/wolf3d/newCode/Tremor/doc/diff.html b/wolf3d/newCode/Tremor/doc/diff.html deleted file mode 100644 index ae0b908..0000000 --- a/wolf3d/newCode/Tremor/doc/diff.html +++ /dev/null @@ -1,67 +0,0 @@ - - - -Tremor - Vorbisfile Differences - - - - - - - - - -

Tremor documentation

Tremor version 1.0 - 20020403

- -

Tremor / Vorbisfile API Differences

- -

- -The Tremor libvorbisidec library exposes an API intended to be as -similar as possible to the familiar 'vorbisfile' library included with -the open source Vorbis reference libraries distributed for free by -Xiph.org. Differences are summarized below.

- -

OggVorbis_File structure

- -The bittrack and samptrack fields in the OggVorbis_File structure are changed to -64 bit integers in Tremor, from doubles in vorbisfile. - -

Time-related seek and tell function calls

- -The ov_time_total() and ov_time_tell() functions return milliseconds as -64 bit integers in Tremor. In vorbisfile, these functions returned -seconds as doubles.

- -In Tremor, the ov_time_seek() and ov_time_seek_page() calls take -seeking positions in milliseconds as 64 bit integers, rather than in -seconds as doubles as in Vorbisfile.

- -

Reading decoded data

- -Tremor ov_read() always returns data as -signed 16 bit interleaved PCM in host byte order. As such, it does not -take arguments to request specific signedness, byte order or bit depth -as in Vorbisfile.

- -Tremor does not implement ov_read_float().

- - -

-


- - - - - - - - -

copyright © 2002 Xiph.org

Ogg Vorbis

Tremor documentation

Tremor version 1.0 - 20020403

- - - - diff --git a/wolf3d/newCode/Tremor/doc/example.html b/wolf3d/newCode/Tremor/doc/example.html deleted file mode 100644 index 2b9a1dd..0000000 --- a/wolf3d/newCode/Tremor/doc/example.html +++ /dev/null @@ -1,205 +0,0 @@ - - - -Tremor - Example Code - - - - - - - - - -

Tremor documentation

Tremor version 1.0 - 20020403

- -

Example Code

- -

-The following is a run-through of the decoding example program supplied -with libvorbisidec, ivorbisfile_example.c. -This program takes a vorbis bitstream from stdin and writes raw pcm to stdout. - -

-First, relevant headers, including vorbis-specific "ivorbiscodec.h" and "ivorbisfile.h" have to be included. - -

- - - - -
-

-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-#include "ivorbiscodec.h"
-#include "ivorbisfile.h"
-
-
-

-We also have to make a concession to Windows users here. If we are using windows for decoding, we must declare these libraries so that we can set stdin/stdout to binary. -

- - - - -
-

-#ifdef _WIN32
-#include <io.h>
-#include <fcntl.h>
-#endif
-
-
-

-Next, a buffer for the pcm audio output is declared. - -

- - - - -
-

-char pcmout[4096];
-
-
- -

Inside main(), we declare our primary OggVorbis_File structure. We also declare a few other helpful variables to track out progress within the file. -Also, we make our final concession to Windows users by setting the stdin and stdout to binary mode. -

- - - - -
-

-int main(int argc, char **argv){
-  OggVorbis_File vf;
-  int eof=0;
-  int current_section;
-
-#ifdef _WIN32
-  _setmode( _fileno( stdin ), _O_BINARY );
-  _setmode( _fileno( stdout ), _O_BINARY );
-#endif
-
-
- -

ov_open() must be -called to initialize the OggVorbis_File structure with default values. -ov_open() also checks to ensure that we're reading Vorbis format and not something else. - -

- - - - -
-

-  if(ov_open(stdin, &vf, NULL, 0) < 0) {
-      fprintf(stderr,"Input does not appear to be an Ogg bitstream.\n");
-      exit(1);
-  }
-
-
-
- -

-We're going to pull the channel and bitrate info from the file using ov_info() and show them to the user. -We also want to pull out and show the user a comment attached to the file using ov_comment(). - -

- - - - -
-

-  {
-    char **ptr=ov_comment(&vf,-1)->user_comments;
-    vorbis_info *vi=ov_info(&vf,-1);
-    while(*ptr){
-      fprintf(stderr,"%s\n",*ptr);
-      ++ptr;
-    }
-    fprintf(stderr,"\nBitstream is %d channel, %ldHz\n",vi->channels,vi->rate);
-    fprintf(stderr,"\nDecoded length: %ld samples\n",
-            (long)ov_pcm_total(&vf,-1));
-    fprintf(stderr,"Encoded by: %s\n\n",ov_comment(&vf,-1)->vendor);
-  }
-  
-
-
- -

-Here's the read loop: - -

- - - - -
-

-
-  while(!eof){
-    long ret=ov_read(&vf,pcmout,sizeof(pcmout),¤t_section);
-    if (ret == 0) {
-      /* EOF */
-      eof=1;
-    } else if (ret < 0) {
-      /* error in the stream.  Not a problem, just reporting it in
-	 case we (the app) cares.  In this case, we don't. */
-    } else {
-      /* we don't bother dealing with sample rate changes, etc, but
-	 you'll have to*/
-      fwrite(pcmout,1,ret,stdout);
-    }
-  }
-
-  
-
-
- -

-The code is reading blocks of data using ov_read(). -Based on the value returned, we know if we're at the end of the file or have invalid data. If we have valid data, we write it to the pcm output. - -

-Now that we've finished playing, we can pack up and go home. It's important to call ov_clear() when we're finished. - -

- - - - -
-

-
-  ov_clear(&vf);
-    
-  fprintf(stderr,"Done.\n");
-  return(0);
-}
-
-
- -

- -

-


- - - - - - - - -

copyright © 2002 Xiph.org

Ogg Vorbis

Tremor documentation

Tremor version 1.0 - 20020403

- - - - diff --git a/wolf3d/newCode/Tremor/doc/fileinfo.html b/wolf3d/newCode/Tremor/doc/fileinfo.html deleted file mode 100644 index 53dfd38..0000000 --- a/wolf3d/newCode/Tremor/doc/fileinfo.html +++ /dev/null @@ -1,95 +0,0 @@ - - - -Tremor - File Information - - - - - - - - - -

Tremor documentation

Tremor version 1.0 - 20020403

- -

File Information

-

Libvorbisidec contains many functions to get information about bitstream attributes and decoding status. -

-All libvorbisidec file information routines are declared in "ivorbisfile.h". -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
functionpurpose
ov_bitrateReturns the average bitrate of the current logical bitstream.
ov_bitrate_instantReturns the exact bitrate since the last call of this function, or -1 if at the beginning of the bitream or no new information is available.
ov_streamsGives the number of logical bitstreams within the current physical bitstream.
ov_seekableIndicates whether the bitstream is seekable.
ov_serialnumberReturns the unique serial number of the specified logical bitstream.
ov_raw_totalReturns the total (compressed) bytes in a physical or logical seekable bitstream.
ov_pcm_totalReturns the total number of samples in a physical or logical seekable bitstream.
ov_time_totalReturns the total time length in seconds of a physical or logical seekable bitstream.
ov_raw_tellReturns the byte location of the next sample to be read, giving the approximate location in the stream that the decoding engine has reached.
ov_pcm_tellReturns the sample location of the next sample to be read, giving the approximate location in the stream that the decoding engine has reached.
ov_time_tellReturns the time location of the next sample to be read, giving the approximate location in the stream that the decoding engine has reached.
ov_infoReturns the vorbis_info struct for a specific bitstream section.
ov_commentReturns attached comments for the current bitstream.
- -

-


- - - - - - - - -

copyright © 2002 Xiph.org

Ogg Vorbis

Tremor documentation

Tremor version 1.0 - 20020403

- - - - diff --git a/wolf3d/newCode/Tremor/doc/index.html b/wolf3d/newCode/Tremor/doc/index.html deleted file mode 100644 index 671f13f..0000000 --- a/wolf3d/newCode/Tremor/doc/index.html +++ /dev/null @@ -1,53 +0,0 @@ - - - -Tremor - Documentation - - - - - - - - - -

Tremor documentation

Tremor version 1.0 - 20020403

- -

Tremor Documentation

- -

- -The Tremor Vorbis I stream and file decoder provides an embeddable, -integer-only library [libvorbisidec] intended for decoding all current -and future Vorbis I compliant streams. The Tremor libvorbisidec -library exposes an API intended to be as similar as possible to the -familiar 'vorbisfile' library included with the open source Vorbis -reference libraries distributed for free by Xiph.org.

- -Tremor can be used along with any ANSI compliant stdio implementation -for file/stream access, or use custom stream i/o routines provided by -the embedded environment. Both uses are described in detail in this -documentation. - -

-Building libvorbisidec
-API overview
-API reference
-Example code
-Tremor / vorbisfile API differences
- -

-


- - - - - - - - -

copyright © 2002 Xiph.org

Ogg Vorbis

Tremor documentation

Tremor version 1.0 - 20020403

- - - - diff --git a/wolf3d/newCode/Tremor/doc/initialization.html b/wolf3d/newCode/Tremor/doc/initialization.html deleted file mode 100644 index f9f6807..0000000 --- a/wolf3d/newCode/Tremor/doc/initialization.html +++ /dev/null @@ -1,101 +0,0 @@ - - - -Tremor - Setup/Teardown - - - - - - - - - -

Tremor documentation

Tremor version 1.0 - 20020403

- -

Setup/Teardown

In order to decode audio using -libvorbisidec, a bitstream containing Vorbis audio must be properly -initialized before decoding and cleared when decoding is finished. -The simplest possible case is to use fopen() to open a Vorbis -file and then pass the FILE * to an ov_open() call. A successful return code from ov_open() indicates the file is ready for use. -Once the file is no longer needed, ov_clear() is used to close the file and -deallocate decoding resources. Do not call fclose() on the -file; libvorbisidec does this in the ov_clear() call. - -

-All libvorbisidec initialization and deallocation routines are declared in "ivorbisfile.h". -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
functionpurpose
ov_openInitializes the Ogg Vorbis bitstream with a pointer to a bitstream and default values. This must be called before other functions in the library may be - used.
ov_open_callbacksInitializes the Ogg Vorbis bitstream with a pointer to a bitstream, default values, and custom file/bitstream manipulation routines. Used instead of ov_open() when working with other than stdio based I/O.
ov_testPartially opens a file just far enough to determine if the file -is an Ogg Vorbis file or not. A successful return indicates that the -file appears to be an Ogg Vorbis file, but the OggVorbis_File struct is not yet fully -initialized for actual decoding. After a successful return, the file -may be closed using ov_clear() or fully -opened for decoding using ov_test_open().

This call is intended to -be used as a less expensive file open test than a full ov_open().

-Note that libvorbisidec owns the passed in file resource is it returns success; do not fclose() files owned by libvorbisidec.

ov_test_callbacksAs above but allowing application-define I/O callbacks.

-Note that libvorbisidec owns the passed in file resource is it returns success; do not fclose() files owned by libvorbisidec.

ov_test_open -Finish opening a file after a successful call to ov_test() or ov_test_callbacks().
ov_clear Closes the - bitstream and cleans up loose ends. Must be called when - finished with the bitstream. After return, the OggVorbis_File struct is - invalid and may not be used before being initialized again - before begin reinitialized. - -
- -

-


- - - - - - - - -

copyright © 2002 Xiph.org

Ogg Vorbis

Tremor documentation

Tremor version 1.0 - 20020403

- - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_bitrate.html b/wolf3d/newCode/Tremor/doc/ov_bitrate.html deleted file mode 100644 index 65ebfc3..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_bitrate.html +++ /dev/null @@ -1,72 +0,0 @@ - - - -Tremor - function - ov_bitrate - - - - - - - - - -

Tremor documentation

Tremor version 1.0 - 20020403

- -

ov_bitrate

- -

declared in "ivorbisfile.h";

- -

This function returns the average bitrate for the specified logical bitstream. This may be different from the ov_info->nominal_bitrate value, as it is based on the actual average for this bitstream if the file is seekable. -

Nonseekable files will return the nominal bitrate setting or the average of the upper and lower bounds, if any of these values are set. -

- -

- - - - -
-

-long ov_bitrate(OggVorbis_File *vf,int i);
-
-
- -

Parameters

-
-
vf
-
A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions.
-
i
-
Link to the desired logical bitstream. For nonseekable files, this argument is ignored. To retrieve the bitrate for the entire bitstream, this parameter should be set to -1.
-
- - -

Return Values

-
-
  • OV_EINVAL indicates that an invalid argument value was submitted or that the stream represented by vf is not open.
  • -
  • OV_FALSE means the call returned a 'false' status, which in this case most likely indicates that the file is nonseekable and the upper, lower, and nominal bitrates were unset. -
  • n indicates the bitrate for the given logical bitstream or the entire - physical bitstream. If the file is open for random (seekable) access, it will - find the *actual* average bitrate. If the file is streaming (nonseekable), it - returns the nominal bitrate (if set) or else the average of the - upper/lower bounds (if set).
  • -
    -

    - - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_bitrate_instant.html b/wolf3d/newCode/Tremor/doc/ov_bitrate_instant.html deleted file mode 100644 index 874671f..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_bitrate_instant.html +++ /dev/null @@ -1,65 +0,0 @@ - - - -Tremor - function - ov_bitrate - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_bitrate_instant

    - -

    declared in "ivorbisfile.h";

    - -

    Used to find the most recent bitrate played back within the file. Will return 0 if the bitrate has not changed or it is the beginning of the file. - -

    - - - - -
    -
    
    -long ov_bitrate_instant(OggVorbis_File *vf);
    -
    -
    - -

    Parameters

    -
    -
    vf
    -
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions. -
    - - -

    Return Values

    -
    -
  • 0 indicates the beginning of the file or unchanged bitrate info.
  • -
  • n indicates the actual bitrate since the last call.
  • -
  • OV_FALSE indicates that playback is not in progress, and thus there is no instantaneous bitrate information to report.
  • -
  • OV_EINVAL indicates that the stream represented by vf is not open.
  • -
    -

    - - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_callbacks.html b/wolf3d/newCode/Tremor/doc/ov_callbacks.html deleted file mode 100644 index 776352d..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_callbacks.html +++ /dev/null @@ -1,78 +0,0 @@ - - - -Tremor - datatype - ov_callbacks - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_callbacks

    - -

    declared in "ivorbiscodec.h"

    - -

    -The ov_callbacks structure contains file manipulation function prototypes necessary for opening, closing, seeking, and location. - -

    -The ov_callbacks structure does not need to be user-defined if you are -working with stdio-based file manipulation; the ov_open() call provides default callbacks for -stdio. ov_callbacks are defined and passed to ov_open_callbacks() when -implementing non-stdio based stream manipulation (such as playback -from a memory buffer). -

    - - - - - -
    -
    typedef struct {
    -  size_t (*read_func)  (void *ptr, size_t size, size_t nmemb, void *datasource);
    -  int    (*seek_func)  (void *datasource, ogg_int64_t offset, int whence);
    -  int    (*close_func) (void *datasource);
    -  long   (*tell_func)  (void *datasource);
    -} ov_callbacks;
    -
    - -

    Relevant Struct Members

    -
    -
    read_func
    -
    Pointer to custom data reading function.
    -
    seek_func
    -
    Pointer to custom data seeking function. If the data source is not seekable (or the application wants the data source to be treated as unseekable at all times), the provided seek callback should always return -1 (failure).
    -
    close_func
    -
    Pointer to custom data source closure function.
    -
    tell_func
    -
    Pointer to custom data location function.
    -
    - -

    - -See the callbacks and non-stdio I/O document for more -detailed information on required behavior of the various callback -functions.

    - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_clear.html b/wolf3d/newCode/Tremor/doc/ov_clear.html deleted file mode 100644 index 7c51bb7..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_clear.html +++ /dev/null @@ -1,64 +0,0 @@ - - - -Tremor - function - ov_clear - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_clear

    - -

    declared in "ivorbisfile.h";

    - -

    After a bitstream has been opened using ov_open()/ov_open_callbacks() and decoding is complete, the application must call ov_clear() to clear -the decoder's buffers and close the file.

    - -ov_clear() must also be called after a successful call to ov_test() or ov_test_callbacks().

    - -

    - - - - -
    -
    
    -int ov_clear(OggVorbis_File *vf);
    -
    -
    - -

    Parameters

    -
    -
    vf
    -
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions. After ov_clear has been called, the structure is deallocated and can no longer be used.
    -
    - - -

    Return Values

    -
    -
  • 0 for success
  • -
    - - -

    -
    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_comment.html b/wolf3d/newCode/Tremor/doc/ov_comment.html deleted file mode 100644 index 5d9cc0b..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_comment.html +++ /dev/null @@ -1,66 +0,0 @@ - - - -Tremor - function - ov_bitrate - - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_comment

    - -

    declared in "ivorbisfile.h";

    - -

    Returns a pointer to the vorbis_comment struct for the specified bitstream. For nonseekable streams, returns the struct for the current bitstream. -

    - -

    - - - - -
    -
    
    -vorbis_comment *ov_comment(OggVorbis_File *vf,int link);
    -
    -
    - -

    Parameters

    -
    -
    vf
    -
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions.
    -
    i
    -
    Link to the desired logical bitstream. For nonseekable files, this argument is ignored. To retrieve the vorbis_comment struct for the current bitstream, this parameter should be set to -1.
    -
    - - -

    Return Values

    -
    -
  • Returns the vorbis_comment struct for the specified bitstream.
  • -
  • NULL if the specified bitstream does not exist or the file has been initialized improperly.
  • -
    -

    - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_info.html b/wolf3d/newCode/Tremor/doc/ov_info.html deleted file mode 100644 index d783bf3..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_info.html +++ /dev/null @@ -1,64 +0,0 @@ - - - -Tremor - function - ov_info - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_info

    - -

    declared in "ivorbisfile.h";

    - -

    Returns the vorbis_info struct for the specified bitstream. For nonseekable files, always returns the current vorbis_info struct. - -

    - - - - -
    -
    
    -vorbis_info *ov_info(OggVorbis_File *vf,int link);
    -
    -
    - -

    Parameters

    -
    -
    vf
    -
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions.
    -
    i
    -
    Link to the desired logical bitstream. For nonseekable files, this argument is ignored. To retrieve the vorbis_info struct for the current bitstream, this parameter should be set to -1.
    -
    - - -

    Return Values

    -
    -
  • Returns the vorbis_info struct for the specified bitstream. Returns vorbis_info for current bitstream if the file is nonseekable or i=-1.
  • -
  • NULL if the specified bitstream does not exist or the file has been initialized improperly.
  • -
    -

    - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_open.html b/wolf3d/newCode/Tremor/doc/ov_open.html deleted file mode 100644 index 654cae8..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_open.html +++ /dev/null @@ -1,115 +0,0 @@ - - - -Tremor - function - ov_open - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_open

    - -

    declared in "ivorbisfile.h";

    - -

    This is the main function used to open and initialize an OggVorbis_File -structure. It sets up all the related decoding structure. -

    The first argument must be a file pointer to an already opened file -or pipe (it need not be seekable--though this obviously restricts what -can be done with the bitstream). vf should be a pointer to the -OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions. Once this has been called, the same OggVorbis_File -struct should be passed to all the libvorbisidec functions. -

    Also, you should be aware that ov_open(), once successful, takes complete possession of the file resource. After you have opened a file using ov_open(), you MUST close it using ov_clear(), not fclose() or any other function. -

    -It is often useful to call ov_open() -simply to determine whether a given file is a vorbis bitstream. If the -ov_open() -call fails, then the file is not recognizable as such. -When you use ov_open() -for -this, you should fclose() the file pointer if, and only if, the -ov_open() -call fails. If it succeeds, you must call ov_clear() to clear -the decoder's buffers and close the file for you.

    - -(Note that ov_test() provides a less expensive way to test a file for Vorbisness.)

    - -

    - - - - -
    -
    
    -int ov_open(FILE *f,OggVorbis_File *vf,char *initial,long ibytes);
    -
    -
    - -

    Parameters

    -
    -
    f
    -
    File pointer to an already opened file -or pipe (it need not be seekable--though this obviously restricts what -can be done with the bitstream).
    -
    vf
    -
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions. Once this has been called, the same OggVorbis_File -struct should be passed to all the libvorbisidec functions.
    -
    initial
    -
    Typically set to NULL. This parameter is useful if some data has already been -read from the file and the stream is not seekable. It is used in conjunction with ibytes. In this case, initial -should be a pointer to a buffer containing the data read.
    -
    ibytes
    -
    Typically set to 0. This parameter is useful if some data has already been -read from the file and the stream is not seekable. In this case, ibytes -should contain the length (in bytes) of the buffer. Used together with initial
    -
    - - -

    Return Values

    -
    -
  • 0 indicates success
  • - -
  • less than zero for failure:
  • -
      -
    • OV_EREAD - A read from media returned an error.
    • -
    • OV_ENOTVORBIS - Bitstream is not Vorbis data.
    • -
    • OV_EVERSION - Vorbis version mismatch.
    • -
    • OV_EBADHEADER - Invalid Vorbis bitstream header.
    • -
    • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack corruption.
    • -
    -
    -

    - -

    Notes

    -

    If your decoder is threaded, it is recommended that you NOT call -ov_open() -in the main control thread--instead, call ov_open() IN your decode/playback -thread. This is important because ov_open() may be a fairly time-consuming -call, given that the full structure of the file is determined at this point, -which may require reading large parts of the file under certain circumstances -(determining all the logical bitstreams in one physical bitstream, for -example). See Thread Safety for other information on using libvorbisidec with threads. - - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_open_callbacks.html b/wolf3d/newCode/Tremor/doc/ov_open_callbacks.html deleted file mode 100644 index 64a2a92..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_open_callbacks.html +++ /dev/null @@ -1,110 +0,0 @@ - - - -Tremor - function - ov_open_callbacks - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_open_callbacks

    - -

    declared in "ivorbisfile.h";

    - -

    This is an alternative function used to open and initialize an OggVorbis_File -structure when using a data source other than a file. It allows you to specify custom file manipulation routines and sets up all the related decoding structure. -

    Once this has been called, the same OggVorbis_File -struct should be passed to all the libvorbisidec functions. -

    -It is often useful to call ov_open_callbacks() -simply to determine whether a given file is a vorbis bitstream. If the -ov_open_callbacks() -call fails, then the file is not recognizable as such. When you use ov_open_callbacks() -for -this, you should fclose() the file pointer if, and only if, the -ov_open_callbacks() -call fails. If it succeeds, you must call ov_clear() to clear -the decoder's buffers and close the file for you.

    - -See also Callbacks and Non-stdio I/O for information on designing and specifying the required callback functions.

    - -

    - - - - -
    -
    
    -int ov_open_callbacks(void *datasource, OggVorbis_File *vf, char *initial, long ibytes, ov_callbacks callbacks);
    -
    -
    - -

    Parameters

    -
    -
    f
    -
    File pointer to an already opened file -or pipe (it need not be seekable--though this obviously restricts what -can be done with the bitstream).
    -
    vf
    -
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions. Once this has been called, the same OggVorbis_File -struct should be passed to all the libvorbisidec functions.
    -
    initial
    -
    Typically set to NULL. This parameter is useful if some data has already been -read from the file and the stream is not seekable. It is used in conjunction with ibytes. In this case, initial -should be a pointer to a buffer containing the data read.
    -
    ibytes
    -
    Typically set to 0. This parameter is useful if some data has already been -read from the file and the stream is not seekable. In this case, ibytes -should contain the length (in bytes) of the buffer. Used together with initial.
    -
    callbacks
    -
    Pointer to a completed ov_callbacks struct which indicates desired custom file manipulation routines.
    -
    - - -

    Return Values

    -
    -
  • 0 for success
  • -
  • less than zero for failure:
  • -
      -
    • OV_EREAD - A read from media returned an error.
    • -
    • OV_ENOTVORBIS - Bitstream is not Vorbis data.
    • -
    • OV_EVERSION - Vorbis version mismatch.
    • -
    • OV_EBADHEADER - Invalid Vorbis bitstream header.
    • -
    • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack corruption.
    • -
    -
    -

    - -

    Notes

    -

    If your decoder is threaded, it is recommended that you NOT call -ov_open_callbacks() -in the main control thread--instead, call ov_open_callbacks() IN your decode/playback -thread. This is important because ov_open_callbacks() may be a fairly time-consuming -call, given that the full structure of the file is determined at this point, -which may require reading large parts of the file under certain circumstances -(determining all the logical bitstreams in one physical bitstream, for -example). -See Thread Safety for other information on using libvorbisidec with threads. - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_pcm_seek.html b/wolf3d/newCode/Tremor/doc/ov_pcm_seek.html deleted file mode 100644 index cf0351e..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_pcm_seek.html +++ /dev/null @@ -1,81 +0,0 @@ - - - -Tremor - function - ov_pcm_seek - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_pcm_seek

    - -

    declared in "ivorbisfile.h";

    - -

    Seeks to the offset specified (in pcm samples) within the physical bitstream. This function only works for seekable streams. -

    This also updates everything needed within the -decoder, so you can immediately call ov_read() and get data from -the newly seeked to position. -

    - -

    - - - - -
    -
    
    -int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos);
    -
    -
    - -

    Parameters

    -
    -
    vf
    -
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions.
    -
    pos
    -
    Position in pcm samples to seek to in the bitstream.
    -
    - - -

    Return Values

    -
    -
  • 0 for success
  • - -
  • -nonzero indicates failure, described by several error codes:
  • -
      -
    • OV_ENOSEEK - Bitstream is not seekable. -
    • -
    • OV_EINVAL - Invalid argument value. -
    • -
    • OV_EREAD - A read from media returned an error. -
    • -
    • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack - corruption. -
    • -
    • OV_EBADLINK - Invalid stream section supplied to libvorbisidec, or the requested link is corrupt. -
    • -
    - -

    -
    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_pcm_seek_page.html b/wolf3d/newCode/Tremor/doc/ov_pcm_seek_page.html deleted file mode 100644 index 44468a8..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_pcm_seek_page.html +++ /dev/null @@ -1,83 +0,0 @@ - - - -Tremor - function - ov_pcm_seek_page - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_pcm_seek_page

    - -

    declared in "ivorbisfile.h";

    - -

    Seeks to the closest page preceding the specified location (in pcm samples) within the physical bitstream. This function only works for seekable streams. -

    This function is faster than ov_pcm_seek because the function can begin decoding at a page boundary rather than seeking through any remaining samples before the specified location. However, it is less accurate. -

    This also updates everything needed within the -decoder, so you can immediately call ov_read() and get data from -the newly seeked to position. -

    - -

    - - - - -
    -
    
    -int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos);
    -
    -
    - -

    Parameters

    -
    -
    vf
    -
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions.
    -
    pos
    -
    Position in pcm samples to seek to in the bitstream.
    -
    - - -

    Return Values

    -
    -
  • -0 for success
  • - -
  • -nonzero indicates failure, described by several error codes:
  • -
      -
    • OV_ENOSEEK - Bitstream is not seekable. -
    • -
    • OV_EINVAL - Invalid argument value. -
    • -
    • OV_EREAD - A read from media returned an error. -
    • -
    • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack - corruption. -
    • -
    • OV_EBADLINK - Invalid stream section supplied to libvorbisidec, or the requested link is corrupt. -
    • -
    - -

    -
    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_pcm_tell.html b/wolf3d/newCode/Tremor/doc/ov_pcm_tell.html deleted file mode 100644 index 0bb98d7..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_pcm_tell.html +++ /dev/null @@ -1,63 +0,0 @@ - - - -Tremor - function - ov_pcm_tell - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_pcm_tell

    - -

    declared in "ivorbisfile.h";

    - -

    Returns the current offset in samples. - -

    - - - - -
    -
    
    -ogg_int64_t ov_pcm_tell(OggVorbis_File *vf);
    -
    -
    - -

    Parameters

    -
    -
    vf
    -
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions.
    -
    - - -

    Return Values

    -
    -
  • n indicates the current offset in samples.
  • -
  • OV_EINVAL means that the argument was invalid. In this case, the requested bitstream did not exist.
  • -
    -

    - - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_pcm_total.html b/wolf3d/newCode/Tremor/doc/ov_pcm_total.html deleted file mode 100644 index a19744a..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_pcm_total.html +++ /dev/null @@ -1,67 +0,0 @@ - - - -Tremor - function - ov_pcm_total - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_pcm_total

    - -

    declared in "ivorbisfile.h";

    - -

    Returns the total pcm samples of the physical bitstream or a specified logical bitstream. - -

    - - - - -
    -
    
    -ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i);
    -
    -
    - -

    Parameters

    -
    -
    vf
    -
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions.
    -
    i
    -
    Link to the desired logical bitstream. To retrieve the total pcm samples for the entire physical bitstream, this parameter should be set to -1.
    -
    - - -

    Return Values

    -
    -
  • OV_EINVAL means that the argument was invalid. In this case, the requested bitstream did not exist or the bitstream is unseekable.
  • -
  • -total length in pcm samples of content if i=-1.
  • -
  • length in pcm samples of logical bitstream if i=1 to n.
  • -
    -

    - - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_raw_seek.html b/wolf3d/newCode/Tremor/doc/ov_raw_seek.html deleted file mode 100644 index e7f0bd3..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_raw_seek.html +++ /dev/null @@ -1,75 +0,0 @@ - - - -Tremor - function - ov_raw_seek - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_raw_seek

    - -

    declared in "ivorbisfile.h";

    - -

    Seeks to the offset specified (in compressed raw bytes) within the physical bitstream. This function only works for seekable streams. -

    This also updates everything needed within the -decoder, so you can immediately call ov_read() and get data from -the newly seeked to position. -

    When seek speed is a priority, this is the best seek funtion to use. -

    - - - - -
    -
    
    -int ov_raw_seek(OggVorbis_File *vf,long pos);
    -
    -
    - -

    Parameters

    -
    -
    vf
    -
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions.
    -
    pos
    -
    Position in compressed bytes to seek to in the bitstream.
    -
    - - -

    Return Values

    -
    -
  • 0 indicates success
  • -
  • nonzero indicates failure, described by several error codes:
  • -
      -
    • OV_ENOSEEK - Bitstream is not seekable. -
    • -
    • OV_EINVAL - Invalid argument value. -
    • -
    • OV_EBADLINK - Invalid stream section supplied to libvorbisidec, or the requested link is corrupt. -
    • -
    -
    -

    - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_raw_tell.html b/wolf3d/newCode/Tremor/doc/ov_raw_tell.html deleted file mode 100644 index f0d1f6a..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_raw_tell.html +++ /dev/null @@ -1,63 +0,0 @@ - - - -Tremor - function - ov_raw_tell - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_raw_tell

    - -

    declared in "ivorbisfile.h";

    - -

    Returns the current offset in raw compressed bytes. - -

    - - - - -
    -
    
    -ogg_int64_t ov_raw_tell(OggVorbis_File *vf);
    -
    -
    - -

    Parameters

    -
    -
    vf
    -
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions.
    -
    - - -

    Return Values

    -
    -
  • n indicates the current offset in bytes.
  • -
  • OV_EINVAL means that the argument was invalid. In this case, the requested bitstream did not exist.
  • -
    -

    - - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_raw_total.html b/wolf3d/newCode/Tremor/doc/ov_raw_total.html deleted file mode 100644 index d0af35f..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_raw_total.html +++ /dev/null @@ -1,68 +0,0 @@ - - - -Tremor - function - ov_raw_total - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_raw_total

    - -

    declared in "ivorbisfile.h";

    - -

    Returns the total (compressed) bytes of the physical bitstream or a specified logical bitstream. - -

    - - - - -
    -
    
    -ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i);
    -
    -
    - -

    Parameters

    -
    -
    vf
    -
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions.
    -
    i
    -
    Link to the desired logical bitstream. To retrieve the total bytes for the entire physical bitstream, this parameter should be set to -1.
    -
    - - -

    Return Values

    -
    -
  • OV_EINVAL means that the argument was invalid. In this case, the requested bitstream did not exist or the bitstream is nonseekable
  • -
  • n -total length in compressed bytes of content if i=-1.
  • -
  • n length in compressed bytes of logical bitstream if i=1 to n.
  • -
    -

    - - - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_read.html b/wolf3d/newCode/Tremor/doc/ov_read.html deleted file mode 100644 index 208ef18..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_read.html +++ /dev/null @@ -1,115 +0,0 @@ - - - -Tremor - function - ov_read - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_read()

    - -

    declared in "ivorbisfile.h";

    - -

    - This is the main function used to decode a Vorbis file within a - loop. It returns up to the specified number of bytes of decoded audio - in host-endian, signed 16 bit PCM format. If the audio is - multichannel, the channels are interleaved in the output buffer. - If the passed in buffer is large, ov_read() will not fill - it; the passed in buffer size is treated as a limit and - not a request. -

    - -Note that up to this point, the Tremor API could more or less hide the - multiple logical bitstream nature of chaining from the toplevel - application if the toplevel application didn't particularly care. - However, when reading audio back, the application must be aware - that multiple bitstream sections do not necessarily use the same - number of channels or sampling rate.

    ov_read() passes - back the index of the sequential logical bitstream currently being - decoded (in *bitstream) along with the PCM data in order - that the toplevel application can handle channel and/or sample - rate changes. This number will be incremented at chaining - boundaries even for non-seekable streams. For seekable streams, it - represents the actual chaining index within the physical bitstream. -

    - -

    - - - - -
    -
    
    -long ov_read(OggVorbis_File *vf, char *buffer, int length, int *bitstream);
    -
    -
    - -

    Parameters

    -
    -
    vf
    -
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions.
    -
    buffer
    -
    A pointer to an output buffer. The decoded output is inserted into this buffer.
    -
    length
    -
    Number of bytes to be read into the buffer. Should be the same size as the buffer. A typical value is 4096.
    -
    bitstream
    -
    A pointer to the number of the current logical bitstream.
    -
    - - -

    Return Values

    -
    -
    -
    OV_HOLE
    -
    indicates there was an interruption in the data. -
    (one of: garbage between pages, loss of sync followed by - recapture, or a corrupt page)
    -
    OV_EBADLINK
    -
    indicates that an invalid stream section was supplied to - libvorbisidec, or the requested link is corrupt.
    -
    0
    -
    indicates EOF
    -
    n
    -
    indicates actual number of bytes read. ov_read() will - decode at most one vorbis packet per invocation, so the value - returned will generally be less than length. -
    -
    - -

    Notes

    -

    Typical usage: -

    -bytes_read = ov_read(&vf, -buffer, 4096,&current_section) -
    - -This reads up to 4096 bytes into a buffer, with signed 16-bit -little-endian samples. -

    - - - -

    -
    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_seekable.html b/wolf3d/newCode/Tremor/doc/ov_seekable.html deleted file mode 100644 index 9bd7fc3..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_seekable.html +++ /dev/null @@ -1,63 +0,0 @@ - - - -Tremor - function - ov_seekable - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_seekable

    - -

    declared in "ivorbisfile.h";

    - -

    This indicates whether or not the bitstream is seekable. - - -

    - - - - -
    -
    
    -long ov_seekable(OggVorbis_File *vf);
    -
    -
    - -

    Parameters

    -
    -
    vf
    -
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions.
    -
    - - -

    Return Values

    -
    -
  • 0 indicates that the file is not seekable.
  • -
  • nonzero indicates that the file is seekable.
  • -
    -

    - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_serialnumber.html b/wolf3d/newCode/Tremor/doc/ov_serialnumber.html deleted file mode 100644 index d7d7c62..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_serialnumber.html +++ /dev/null @@ -1,67 +0,0 @@ - - - -Tremor - function - ov_serialnumber - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_serialnumber

    - -

    declared in "ivorbisfile.h";

    - -

    Returns the serialnumber of the specified logical bitstream link number within the overall physical bitstream. - -

    - - - - -
    -
    
    -long ov_serialnumber(OggVorbis_File *vf,int i);
    -
    -
    - -

    Parameters

    -
    -
    vf
    -
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions.
    -
    i
    -
    Link to the desired logical bitstream. For nonseekable files, this argument is ignored. To retrieve the serial number of the current bitstream, this parameter should be set to -1.
    -
    - - -

    Return Values

    -
    -
  • --1 if the specified logical bitstream i does not exist.
  • - -
  • Returns the serial number of the logical bitstream i or the serial number of the current bitstream if the file is nonseekable.
  • -
    -

    - - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_streams.html b/wolf3d/newCode/Tremor/doc/ov_streams.html deleted file mode 100644 index 7ffee42..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_streams.html +++ /dev/null @@ -1,64 +0,0 @@ - - - -Tremor - function - ov_streams - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_streams

    - -

    declared in "ivorbisfile.h";

    - -

    Returns the number of logical bitstreams within our physical bitstream. - -

    - - - - -
    -
    
    -long ov_streams(OggVorbis_File *vf);
    -
    -
    - -

    Parameters

    -
    -
    vf
    -
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions.
    -
    - - -

    Return Values

    -
    -
  • -1 indicates a single logical bitstream or an unseekable file.
  • -
  • n indicates the number of logical bitstreams.
  • -
    -

    - - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_test.html b/wolf3d/newCode/Tremor/doc/ov_test.html deleted file mode 100644 index 96a9af0..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_test.html +++ /dev/null @@ -1,89 +0,0 @@ - - - -Tremor - function - ov_test - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_test

    - -

    declared in "ivorbisfile.h";

    - -

    -This partially opens a vorbis file to test for Vorbis-ness. It loads -the headers for the first chain, and tests for seekability (but does not seek). -Use ov_test_open() to finish opening the file -or ov_clear to close/free it. -

    - - - - - -
    -
    
    -int ov_test(FILE *f,OggVorbis_File *vf,char *initial,long ibytes);
    -
    -
    - -

    Parameters

    -
    -
    f
    -
    File pointer to an already opened file -or pipe (it need not be seekable--though this obviously restricts what -can be done with the bitstream).
    -
    vf
    -
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions. Once this has been called, the same OggVorbis_File -struct should be passed to all the libvorbisidec functions.
    -
    initial
    -
    Typically set to NULL. This parameter is useful if some data has already been -read from the file and the stream is not seekable. It is used in conjunction with ibytes. In this case, initial -should be a pointer to a buffer containing the data read.
    -
    ibytes
    -
    Typically set to 0. This parameter is useful if some data has already been -read from the file and the stream is not seekable. In this case, ibytes -should contain the length (in bytes) of the buffer. Used together with initial
    -
    - - -

    Return Values

    -
    -
  • 0 for success
  • - -
  • less than zero for failure:
  • -
      -
    • OV_EREAD - A read from media returned an error.
    • -
    • OV_ENOTVORBIS - Bitstream is not Vorbis data.
    • -
    • OV_EVERSION - Vorbis version mismatch.
    • -
    • OV_EBADHEADER - Invalid Vorbis bitstream header.
    • -
    • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack corruption.
    • -
    -
    -

    - - - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_test_callbacks.html b/wolf3d/newCode/Tremor/doc/ov_test_callbacks.html deleted file mode 100644 index 4049548..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_test_callbacks.html +++ /dev/null @@ -1,90 +0,0 @@ - - - -Tremor - function - ov_test_callbacks - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_test_callbacks

    - -

    declared in "ivorbisfile.h";

    - -

    This is an alternative function used to open and test an OggVorbis_File -structure when using a data source other than a file. It allows you to specify custom file manipulation routines and sets up all the related decoding structures. -

    Once this has been called, the same OggVorbis_File -struct should be passed to all the libvorbisidec functions. -

    -

    - - - - -
    -
    
    -int ov_test_callbacks(void *datasource, OggVorbis_File *vf, char *initial, long ibytes, ov_callbacks callbacks);
    -
    -
    - -

    Parameters

    -
    -
    f
    -
    File pointer to an already opened file -or pipe (it need not be seekable--though this obviously restricts what -can be done with the bitstream).
    -
    vf
    -
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions. Once this has been called, the same OggVorbis_File -struct should be passed to all the libvorbisidec functions.
    -
    initial
    -
    Typically set to NULL. This parameter is useful if some data has already been -read from the file and the stream is not seekable. It is used in conjunction with ibytes. In this case, initial -should be a pointer to a buffer containing the data read.
    -
    ibytes
    -
    Typically set to 0. This parameter is useful if some data has already been -read from the file and the stream is not seekable. In this case, ibytes -should contain the length (in bytes) of the buffer. Used together with initial.
    -
    callbacks
    -
    Pointer to a completed ov_callbacks struct which indicates desired custom file manipulation routines.
    -
    - - -

    Return Values

    -
    -
  • 0 for success
  • -
  • less than zero for failure:
  • -
      -
    • OV_EREAD - A read from media returned an error.
    • -
    • OV_ENOTVORBIS - Bitstream is not Vorbis data.
    • -
    • OV_EVERSION - Vorbis version mismatch.
    • -
    • OV_EBADHEADER - Invalid Vorbis bitstream header.
    • -
    • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack corruption.
    • -
    -
    -

    - - - - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_test_open.html b/wolf3d/newCode/Tremor/doc/ov_test_open.html deleted file mode 100644 index 74f4410..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_test_open.html +++ /dev/null @@ -1,82 +0,0 @@ - - - -Tremor - function - ov_test_open - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_test_open

    - -

    declared in "ivorbisfile.h";

    - -

    -Finish opening a file partially opened with ov_test() -or ov_test_callbacks(). -

    - - - - - -
    -
    
    -int ov_test_open(OggVorbis_File *vf);
    -
    -
    - -

    Parameters

    -
    -
    vf
    -
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions. Once this has been called, the same OggVorbis_File -struct should be passed to all the libvorbisidec functions.
    -
    - - -

    Return Values

    -
    -
  • -0 for success
  • - -
  • less than zero for failure:
  • -
      -
    • OV_EREAD - A read from media returned an error.
    • -
    • OV_ENOTVORBIS - Bitstream is not Vorbis data.
    • -
    • OV_EVERSION - Vorbis version mismatch.
    • -
    • OV_EBADHEADER - Invalid Vorbis bitstream header.
    • -
    • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack corruption.
    • -
    -
    -

    - - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - - - - - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_time_seek.html b/wolf3d/newCode/Tremor/doc/ov_time_seek.html deleted file mode 100644 index 6dfa130..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_time_seek.html +++ /dev/null @@ -1,70 +0,0 @@ - - - -Tremor - function - ov_time_seek - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_time_seek

    - -

    declared in "ivorbisfile.h";

    - -

    For seekable -streams, this seeks to the given time. For implementing seeking in a player, -this is the only function generally needed. This also updates everything needed within the -decoder, so you can immediately call ov_read() and get data from -the newly seeked to position. This function does not work for unseekable streams. - -

    - - - - -
    -
    
    -int ov_time_seek(OggVorbis_File *vf, ogg_int64_t ms);
    -
    -
    - -

    Parameters

    -
    -
    vf
    -
    Pointer to our already opened and initialized OggVorbis_File structure.
    -
    ms
    -
    Location to seek to within the file, specified in milliseconds.
    -
    - - -

    Return Values

    -
    -
  • -0 for success
  • - -
  • -Nonzero for failure
  • -
    - - -

    -
    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_time_seek_page.html b/wolf3d/newCode/Tremor/doc/ov_time_seek_page.html deleted file mode 100644 index 83cfefb..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_time_seek_page.html +++ /dev/null @@ -1,83 +0,0 @@ - - - -Tremor - function - ov_time_seek_page - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_time_seek_page

    - -

    declared in "ivorbisfile.h";

    - -

    For seekable -streams, this seeks to closest full page preceding the given time. This function is faster than ov_time_seek because it doesn't seek through the last few samples to reach an exact time, but it is also less accurate. This should be used when speed is important. -

    This function also updates everything needed within the -decoder, so you can immediately call ov_read() and get data from -the newly seeked to position. -

    This function does not work for unseekable streams. - -

    - - - - -
    -
    
    -int ov_time_seek_page(OggVorbis_File *vf, ogg_int64_t ms);
    -
    -
    - -

    Parameters

    -
    -
    vf
    -
    Pointer to our already opened and initialized OggVorbis_File structure.
    -
    ms
    -
    Location to seek to within the file, specified in milliseconds.
    -
    - - -

    Return Values

    -
    -
  • -0 for success
  • - -
  • -nonzero indicates failure, described by several error codes:
  • -
      -
    • OV_ENOSEEK - Bitstream is not seekable. -
    • -
    • OV_EINVAL - Invalid argument value. -
    • -
    • OV_EREAD - A read from media returned an error. -
    • -
    • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack - corruption. -
    • -
    • OV_EBADLINK - Invalid stream section supplied to libvorbisidec, or the requested link is corrupt. -
    • -
    - - -

    -
    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_time_tell.html b/wolf3d/newCode/Tremor/doc/ov_time_tell.html deleted file mode 100644 index 25d159b..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_time_tell.html +++ /dev/null @@ -1,63 +0,0 @@ - - - -Tremor - function - ov_bitrate - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_time_tell

    - -

    declared in "ivorbisfile.h";

    - -

    Returns the current decoding offset in milliseconds. - -

    - - - - -
    -
    
    -ogg_int64_t ov_time_tell(OggVorbis_File *vf);
    -
    -
    - -

    Parameters

    -
    -
    vf
    -
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions.
    -
    - - -

    Return Values

    -
    -
  • n indicates the current decoding time offset in milliseconds.
  • -
  • OV_EINVAL means that the argument was invalid. In this case, the requested bitstream did not exist.
  • -
    -

    - - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/ov_time_total.html b/wolf3d/newCode/Tremor/doc/ov_time_total.html deleted file mode 100644 index 7c26b92..0000000 --- a/wolf3d/newCode/Tremor/doc/ov_time_total.html +++ /dev/null @@ -1,67 +0,0 @@ - - - -Tremor - function - ov_time_total - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    ov_time_total

    - -

    declared in "ivorbisfile.h";

    - - -

    Returns the total time in seconds of the physical bitstream or a specified logical bitstream. - - -

    - - - - -
    -
    
    -ogg_int64_t ov_time_total(OggVorbis_File *vf,int i);
    -
    -
    - -

    Parameters

    -
    -
    vf
    -
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisidec -functions.
    -
    i
    -
    Link to the desired logical bitstream. To retrieve the time total for the entire physical bitstream, this parameter should be set to -1.
    -
    - - -

    Return Values

    -
    -
  • OV_EINVAL means that the argument was invalid. In this case, the requested bitstream did not exist or the bitstream is nonseekable.
  • -
  • n total length in milliseconds of content if i=-1.
  • -
  • n length in milliseconds of logical bitstream if i=1 to n.
  • -
    -

    - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/overview.html b/wolf3d/newCode/Tremor/doc/overview.html deleted file mode 100644 index 0c82cb2..0000000 --- a/wolf3d/newCode/Tremor/doc/overview.html +++ /dev/null @@ -1,61 +0,0 @@ - - - -Tremor - API Overview - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    Tremor API Overview

    - -

    The makeup of the Tremor libvorbisidec library API is relatively -simple. It revolves around a single file resource. This file resource is -passed to libvorbisidec, where it is opened, manipulated, and closed, -in the form of an OggVorbis_File -struct. -

    -The Tremor API consists of the following functional categories: -

    -

    -

    -In addition, the following subjects deserve attention additional to -the above general overview: -

    -

    -

    - - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - - diff --git a/wolf3d/newCode/Tremor/doc/reference.html b/wolf3d/newCode/Tremor/doc/reference.html deleted file mode 100644 index 20e0a5f..0000000 --- a/wolf3d/newCode/Tremor/doc/reference.html +++ /dev/null @@ -1,75 +0,0 @@ - - - -Tremor API Reference - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    Tremor API Reference

    - -

    -Data Structures
    -OggVorbis_File
    -vorbis_comment
    -vorbis_info
    -ov_callbacks
    -
    -Setup/Teardown
    -ov_open()
    -ov_open_callbacks()
    -ov_clear()
    -ov_test()
    -ov_test_callbacks()
    -ov_test_open()
    -
    -Decoding
    -ov_read()
    -
    -Seeking
    -ov_raw_seek()
    -ov_pcm_seek()
    -ov_time_seek()
    -ov_pcm_seek_page()
    -ov_time_seek_page()
    -
    -File Information
    -ov_bitrate()
    -ov_bitrate_instant()
    -ov_streams()
    -ov_seekable()
    -ov_serialnumber()
    -ov_raw_total()
    -ov_pcm_total()
    -ov_time_total()
    -ov_raw_tell()
    -ov_pcm_tell()
    -ov_time_tell()
    -ov_info()
    -ov_comment()
    -
    -Return Codes
    - - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/return.html b/wolf3d/newCode/Tremor/doc/return.html deleted file mode 100644 index 0a3f96c..0000000 --- a/wolf3d/newCode/Tremor/doc/return.html +++ /dev/null @@ -1,77 +0,0 @@ - - - -Tremor - Return Codes - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    Return Codes

    - -

    - -The following return codes are #defined in "ivorbiscodec.h" -may be returned by libvorbisidec. Descriptions of a code relevant to -a specific function are found in the reference description of that -function. - -

    - -
    OV_FALSE
    -
    Not true, or no data available
    - -
    OV_HOLE
    -
    Tremor encoutered missing or corrupt data in the bitstream. Recovery -is normally automatic and this return code is for informational purposes only.
    - -
    OV_EREAD
    -
    Read error while fetching compressed data for decode
    - -
    OV_EFAULT
    -
    Internal inconsistency in decode state. Continuing is likely not possible.
    - -
    OV_EIMPL
    -
    Feature not implemented
    - -
    OV_EINVAL
    -
    Either an invalid argument, or incompletely initialized argument passed to libvorbisidec call
    - -
    OV_ENOTVORBIS
    -
    The given file/data was not recognized as Ogg Vorbis data.
    - -
    OV_EBADHEADER
    -
    The file/data is apparently an Ogg Vorbis stream, but contains a corrupted or undecipherable header.
    - -
    OV_EVERSION
    -
    The bitstream format revision of the given stream is not supported.
    - -
    OV_EBADLINK
    -
    The given link exists in the Vorbis data stream, but is not decipherable due to garbacge or corruption.
    - -
    OV_ENOSEEK
    -
    The given stream is not seekable
    - -
    - -

    -
    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/seeking.html b/wolf3d/newCode/Tremor/doc/seeking.html deleted file mode 100644 index 652368a..0000000 --- a/wolf3d/newCode/Tremor/doc/seeking.html +++ /dev/null @@ -1,74 +0,0 @@ - - - -Tremor - Seeking - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    Seeking

    -

    Seeking functions allow you to specify a specific point in the stream to begin or continue decoding. -

    -All libvorbisidec seeking routines are declared in "ivorbisfile.h". - -

    Certain seeking functions are best suited to different situations. -When speed is important and exact positioning isn't required, -page-level seeking should be used. Note also that Vorbis files do not -necessarily start at a sample number or time offset of zero. Do not -be surprised if a file begins at a positive offset of several minutes -or hours, such as would happen if a large stream (such as a concert -recording) is chopped into multiple separate files. Requesting to -seek to a position before the beginning of such a file will seek to -the position where audio begins.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    functionpurpose
    ov_raw_seekThis function seeks to a position specified in the compressed bitstream, specified in bytes.
    ov_pcm_seekThis function seeks to a specific audio sample number, specified in pcm samples.
    ov_pcm_seek_pageThis function seeks to the closest page preceding the specified audio sample number, specified in pcm samples.
    ov_time_seekThis function seeks to the specific time location in the bitstream, specified in integer milliseconds. Note that this differs from the reference vorbisfile implementation, which takes seconds as a float.
    ov_time_seek_pageThis function seeks to the closest page preceding the specified time position in the bitstream, specified in integer milliseconds.
    - -

    -


    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/style.css b/wolf3d/newCode/Tremor/doc/style.css deleted file mode 100644 index 81cf417..0000000 --- a/wolf3d/newCode/Tremor/doc/style.css +++ /dev/null @@ -1,7 +0,0 @@ -BODY { font-family: Helvetica, sans-serif } -TD { font-family: Helvetica, sans-serif } -P { font-family: Helvetica, sans-serif } -H1 { font-family: Helvetica, sans-serif } -H2 { font-family: Helvetica, sans-serif } -H4 { font-family: Helvetica, sans-serif } -P.tiny { font-size: 8pt } diff --git a/wolf3d/newCode/Tremor/doc/threads.html b/wolf3d/newCode/Tremor/doc/threads.html deleted file mode 100644 index 53ed76a..0000000 --- a/wolf3d/newCode/Tremor/doc/threads.html +++ /dev/null @@ -1,50 +0,0 @@ - - - -Tremor - Thread Safety - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    Thread Safety

    - -Tremor's libvorbisidec may be used safely in a threading environment -so long as thread access to individual OggVorbis_File instances is serialized. -
      - -
    • Only one thread at a time may enter a function that takes a given OggVorbis_File instance, even if the -functions involved appear to be read-only.

      - -

    • Multiple threads may enter -libvorbisidec at a given time, so long as each thread's function calls -are using different OggVorbis_File -instances.

      - -

    • Any one OggVorbis_File instance may be used safely from multiple threads so long as only one thread at a time is making calls using that instance.

      -

    - -

    -
    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/vorbis_comment.html b/wolf3d/newCode/Tremor/doc/vorbis_comment.html deleted file mode 100644 index 3232d96..0000000 --- a/wolf3d/newCode/Tremor/doc/vorbis_comment.html +++ /dev/null @@ -1,70 +0,0 @@ - - - -Tremor - datatype - vorbis_comment - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    vorbis_comment

    - -

    declared in "ivorbiscodec.h"

    - -

    -The vorbis_comment structure defines an Ogg Vorbis comment. -

    -Only the fields the program needs must be defined. If a field isn't -defined by the application, it will either be blank (if it's a string value) -or set to some reasonable default (usually 0). -

    - - - - - -
    -
    typedef struct vorbis_comment{
    -  /* unlimited user comment fields. */
    -  char **user_comments;
    -  int  *comment_lengths;
    -  int  comments;
    -  char *vendor;
    -
    -} vorbis_comment;
    -
    - -

    Parameters

    -
    -
    user_comments
    -
    Unlimited user comment array. The individual strings in the array are 8 bit clean, by the Vorbis specification, and as such the comment_lengths array should be consulted to determine string length. For convenience, each string is also NULL-terminated by the decode library (although Vorbis comments are not NULL terminated within the bitstream itself).
    -
    comment_lengths
    -
    An int array that stores the length of each comment string
    -
    comments
    -
    Int signifying number of user comments in user_comments field.
    -
    vendor
    -
    Information about the creator of the file. Stored in a standard C 0-terminated string.
    -
    - - -

    -
    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/doc/vorbis_info.html b/wolf3d/newCode/Tremor/doc/vorbis_info.html deleted file mode 100644 index bd938cd..0000000 --- a/wolf3d/newCode/Tremor/doc/vorbis_info.html +++ /dev/null @@ -1,80 +0,0 @@ - - - -Tremor - datatype - vorbis_info - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    vorbis_info

    - -

    declared in "ivorbiscodec.h"

    - -

    -The vorbis_info structure contains basic information about the audio in a vorbis bitstream. -

    - - - - - -
    -
    typedef struct vorbis_info{
    -  int version;
    -  int channels;
    -  long rate;
    -  
    -  long bitrate_upper;
    -  long bitrate_nominal;
    -  long bitrate_lower;
    -  long bitrate_window;
    -
    -  void *codec_setup;
    -
    -} vorbis_info;
    -
    - -

    Relevant Struct Members

    -
    -
    version
    -
    Vorbis encoder version used to create this bitstream.
    -
    channels
    -
    Int signifying number of channels in bitstream.
    -
    rate
    -
    Sampling rate of the bitstream.
    -
    bitrate_upper
    -
    Specifies the upper limit in a VBR bitstream. If the value matches the bitrate_nominal and bitrate_lower parameters, the stream is fixed bitrate. May be unset if no limit exists.
    -
    bitrate_nominal
    -
    Specifies the average bitrate for a VBR bitstream. May be unset. If the bitrate_upper and bitrate_lower parameters match, the stream is fixed bitrate.
    -
    bitrate_lower
    -
    Specifies the lower limit in a VBR bitstream. If the value matches the bitrate_nominal and bitrate_upper parameters, the stream is fixed bitrate. May be unset if no limit exists.
    -
    bitrate_window
    -
    Currently unset.
    - -
    codec_setup
    -
    Internal structure that contains the detailed/unpacked configuration for decoding the current Vorbis bitstream.
    -
    - - -

    -
    - - - - - - - - -

    copyright © 2002 Xiph.org

    Ogg Vorbis

    Tremor documentation

    Tremor version 1.0 - 20020403

    - - - - diff --git a/wolf3d/newCode/Tremor/floor0.c b/wolf3d/newCode/Tremor/floor0.c deleted file mode 100644 index bdb83b8..0000000 --- a/wolf3d/newCode/Tremor/floor0.c +++ /dev/null @@ -1,435 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: floor backend 0 implementation - - ********************************************************************/ - -#include -#include -#include -#include "ogg.h" -#include "ivorbiscodec.h" -#include "codec_internal.h" -#include "registry.h" -#include "codebook.h" -#include "misc.h" -#include "block.h" - -#define LSP_FRACBITS 14 - -typedef struct { - long n; - int ln; - int m; - int *linearmap; - - vorbis_info_floor0 *vi; - ogg_int32_t *lsp_look; - -} vorbis_look_floor0; - -/*************** LSP decode ********************/ - -#include "lsp_lookup.h" - -/* interpolated 1./sqrt(p) where .5 <= a < 1. (.100000... to .111111...) in - 16.16 format - returns in m.8 format */ - -static long ADJUST_SQRT2[2]={8192,5792}; -STIN ogg_int32_t vorbis_invsqlook_i(long a,long e){ - long i=(a&0x7fff)>>(INVSQ_LOOKUP_I_SHIFT-1); - long d=a&INVSQ_LOOKUP_I_MASK; /* 0.10 */ - long val=INVSQ_LOOKUP_I[i]- /* 1.16 */ - ((INVSQ_LOOKUP_IDel[i]*d)>>INVSQ_LOOKUP_I_SHIFT); /* result 1.16 */ - val*=ADJUST_SQRT2[e&1]; - e=(e>>1)+21; - return(val>>e); -} - -/* interpolated lookup based fromdB function, domain -140dB to 0dB only */ -/* a is in n.12 format */ -STIN ogg_int32_t vorbis_fromdBlook_i(long a){ - int i=(-a)>>(12-FROMdB2_SHIFT); - if(i<0) return 0x7fffffff; - if(i>=(FROMdB_LOOKUP_SZ<>FROMdB_SHIFT] * FROMdB2_LOOKUP[i&FROMdB2_MASK]; -} - -/* interpolated lookup based cos function, domain 0 to PI only */ -/* a is in 0.16 format, where 0==0, 2^^16-1==PI, return 0.14 */ -STIN ogg_int32_t vorbis_coslook_i(long a){ - int i=a>>COS_LOOKUP_I_SHIFT; - int d=a&COS_LOOKUP_I_MASK; - return COS_LOOKUP_I[i]- ((d*(COS_LOOKUP_I[i]-COS_LOOKUP_I[i+1]))>> - COS_LOOKUP_I_SHIFT); -} - -/* interpolated lookup based cos function */ -/* a is in 0.16 format, where 0==0, 2^^16==PI, return .LSP_FRACBITS */ -STIN ogg_int32_t vorbis_coslook2_i(long a){ - a=a&0x1ffff; - - if(a>0x10000)a=0x20000-a; - { - int i=a>>COS_LOOKUP_I_SHIFT; - int d=a&COS_LOOKUP_I_MASK; - a=((COS_LOOKUP_I[i]<> - (COS_LOOKUP_I_SHIFT-LSP_FRACBITS+14); - } - - return(a); -} - -static const int barklook[28]={ - 0,100,200,301, 405,516,635,766, - 912,1077,1263,1476, 1720,2003,2333,2721, - 3184,3742,4428,5285, 6376,7791,9662,12181, - 15624,20397,27087,36554 -}; - -/* used in init only; interpolate the long way */ -STIN ogg_int32_t toBARK(int n){ - int i; - for(i=0;i<27;i++) - if(n>=barklook[i] && n>10)*0x517d)>>14; -#endif - - /* safeguard against a malicious stream */ - if(val<0 || (val>>COS_LOOKUP_I_SHIFT)>=COS_LOOKUP_I_SZ){ - memset(curve,0,sizeof(*curve)*n); - return; - } - - ilsp[i]=vorbis_coslook_i(val); - } - - i=0; - while(i>16); - qi=((qi*qi)>>16); - - if(m&1){ - qexp= qexp*2-28*((m+1)>>1)+m; - pi*=(1<<14)-((wi*wi)>>14); - qi+=pi>>14; - }else{ - qexp= qexp*2-13*m; - - pi*=(1<<14)-wi; - qi*=(1<<14)+wi; - - qi=(qi+pi)>>14; - } - - if(qi&0xffff0000){ /* checks for 1.xxxxxxxxxxxxxxxx */ - qi>>=1; qexp++; - }else - lsp_norm_asm(&qi,&qexp); - -#else - - qi*=labs(ilsp[0]-wi); - pi*=labs(ilsp[1]-wi); - - for(j=3;j>25])) - if(!(shift=MLOOP_2[(pi|qi)>>19])) - shift=MLOOP_3[(pi|qi)>>16]; - qi=(qi>>shift)*labs(ilsp[j-1]-wi); - pi=(pi>>shift)*labs(ilsp[j]-wi); - qexp+=shift; - } - if(!(shift=MLOOP_1[(pi|qi)>>25])) - if(!(shift=MLOOP_2[(pi|qi)>>19])) - shift=MLOOP_3[(pi|qi)>>16]; - - /* pi,qi normalized collectively, both tracked using qexp */ - - if(m&1){ - /* odd order filter; slightly assymetric */ - /* the last coefficient */ - qi=(qi>>shift)*labs(ilsp[j-1]-wi); - pi=(pi>>shift)<<14; - qexp+=shift; - - if(!(shift=MLOOP_1[(pi|qi)>>25])) - if(!(shift=MLOOP_2[(pi|qi)>>19])) - shift=MLOOP_3[(pi|qi)>>16]; - - pi>>=shift; - qi>>=shift; - qexp+=shift-14*((m+1)>>1); - - pi=((pi*pi)>>16); - qi=((qi*qi)>>16); - qexp=qexp*2+m; - - pi*=(1<<14)-((wi*wi)>>14); - qi+=pi>>14; - - }else{ - /* even order filter; still symmetric */ - - /* p*=p(1-w), q*=q(1+w), let normalization drift because it isn't - worth tracking step by step */ - - pi>>=shift; - qi>>=shift; - qexp+=shift-7*m; - - pi=((pi*pi)>>16); - qi=((qi*qi)>>16); - qexp=qexp*2+m; - - pi*=(1<<14)-wi; - qi*=(1<<14)+wi; - qi=(qi+pi)>>14; - - } - - - /* we've let the normalization drift because it wasn't important; - however, for the lookup, things must be normalized again. We - need at most one right shift or a number of left shifts */ - - if(qi&0xffff0000){ /* checks for 1.xxxxxxxxxxxxxxxx */ - qi>>=1; qexp++; - }else - while(qi && !(qi&0x8000)){ /* checks for 0.0xxxxxxxxxxxxxxx or less*/ - qi<<=1; qexp--; - } - -#endif - - amp=vorbis_fromdBlook_i(ampi* /* n.4 */ - vorbis_invsqlook_i(qi,qexp)- - /* m.8, m+n<=8 */ - ampoffseti); /* 8.12[0] */ - -#ifdef _LOW_ACCURACY_ - amp>>=9; -#endif - curve[i]= MULT31_SHIFT15(curve[i],amp); - while(map[++i]==k) curve[i]= MULT31_SHIFT15(curve[i],amp); - } -} - -/*************** vorbis decode glue ************/ - -static void floor0_free_info(vorbis_info_floor *i){ - vorbis_info_floor0 *info=(vorbis_info_floor0 *)i; - if(info){ - memset(info,0,sizeof(*info)); - _ogg_free(info); - } -} - -static void floor0_free_look(vorbis_look_floor *i){ - vorbis_look_floor0 *look=(vorbis_look_floor0 *)i; - if(look){ - - if(look->linearmap)_ogg_free(look->linearmap); - if(look->lsp_look)_ogg_free(look->lsp_look); - memset(look,0,sizeof(*look)); - _ogg_free(look); - } -} - -static vorbis_info_floor *floor0_unpack (vorbis_info *vi,oggpack_buffer *opb){ - codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; - int j; - - vorbis_info_floor0 *info=(vorbis_info_floor0 *)_ogg_malloc(sizeof(*info)); - info->order=oggpack_read(opb,8); - info->rate=oggpack_read(opb,16); - info->barkmap=oggpack_read(opb,16); - info->ampbits=oggpack_read(opb,6); - info->ampdB=oggpack_read(opb,8); - info->numbooks=oggpack_read(opb,4)+1; - - if(info->order<1)goto err_out; - if(info->rate<1)goto err_out; - if(info->barkmap<1)goto err_out; - if(info->numbooks<1)goto err_out; - - for(j=0;jnumbooks;j++){ - info->books[j]=oggpack_read(opb,8); - if(info->books[j]<0 || info->books[j]>=ci->books)goto err_out; - } - return(info); - - err_out: - floor0_free_info(info); - return(NULL); -} - -/* initialize Bark scale and normalization lookups. We could do this - with static tables, but Vorbis allows a number of possible - combinations, so it's best to do it computationally. - - The below is authoritative in terms of defining scale mapping. - Note that the scale depends on the sampling rate as well as the - linear block and mapping sizes */ - -static vorbis_look_floor *floor0_look (vorbis_dsp_state *vd,vorbis_info_mode *mi, - vorbis_info_floor *i){ - int j; - vorbis_info *vi=vd->vi; - codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; - vorbis_info_floor0 *info=(vorbis_info_floor0 *)i; - vorbis_look_floor0 *look=(vorbis_look_floor0 *)_ogg_calloc(1,sizeof(*look)); - look->m=info->order; - look->n=ci->blocksizes[mi->blockflag]/2; - look->ln=info->barkmap; - look->vi=info; - - /* the mapping from a linear scale to a smaller bark scale is - straightforward. We do *not* make sure that the linear mapping - does not skip bark-scale bins; the decoder simply skips them and - the encoder may do what it wishes in filling them. They're - necessary in some mapping combinations to keep the scale spacing - accurate */ - look->linearmap=(int *)_ogg_malloc((look->n+1)*sizeof(*look->linearmap)); - for(j=0;jn;j++){ - - int val=(look->ln* - ((toBARK(info->rate/2*j/look->n)<<11)/toBARK(info->rate/2)))>>11; - - if(val>=look->ln)val=look->ln-1; /* guard against the approximation */ - look->linearmap[j]=val; - } - look->linearmap[j]=-1; - - look->lsp_look=(ogg_int32_t *)_ogg_malloc(look->ln*sizeof(*look->lsp_look)); - for(j=0;jln;j++) - look->lsp_look[j]=vorbis_coslook2_i(0x10000*j/look->ln); - - return look; -} - -static void *floor0_inverse1(vorbis_block *vb,vorbis_look_floor *i){ - vorbis_look_floor0 *look=(vorbis_look_floor0 *)i; - vorbis_info_floor0 *info=look->vi; - int j,k; - - int ampraw=oggpack_read(&vb->opb,info->ampbits); - if(ampraw>0){ /* also handles the -1 out of data case */ - long maxval=(1<ampbits)-1; - int amp=((ampraw*info->ampdB)<<4)/maxval; - int booknum=oggpack_read(&vb->opb,_ilog(info->numbooks)); - - if(booknum!=-1 && booknumnumbooks){ /* be paranoid */ - codec_setup_info *ci=(codec_setup_info *)vb->vd->vi->codec_setup; - codebook *b=ci->fullbooks+info->books[booknum]; - ogg_int32_t last=0; - ogg_int32_t *lsp=(ogg_int32_t *)_vorbis_block_alloc(vb,sizeof(*lsp)*(look->m+1)); - - for(j=0;jm;j+=b->dim) - if(vorbis_book_decodev_set(b,lsp+j,&vb->opb,b->dim,-24)==-1)goto eop; - for(j=0;jm;){ - for(k=0;kdim;k++,j++)lsp[j]+=last; - last=lsp[j-1]; - } - - lsp[look->m]=amp; - return(lsp); - } - } - eop: - return(NULL); -} - -static int floor0_inverse2(vorbis_block *vb,vorbis_look_floor *i, - void *memo,ogg_int32_t *out){ - vorbis_look_floor0 *look=(vorbis_look_floor0 *)i; - vorbis_info_floor0 *info=look->vi; - - if(memo){ - ogg_int32_t *lsp=(ogg_int32_t *)memo; - ogg_int32_t amp=lsp[look->m]; - - /* take the coefficients back to a spectral envelope curve */ - vorbis_lsp_to_curve(out,look->linearmap,look->n,look->ln, - lsp,look->m,amp,info->ampdB,look->lsp_look); - return(1); - } - memset(out,0,sizeof(*out)*look->n); - return(0); -} - -/* export hooks */ -vorbis_func_floor floor0_exportbundle={ - &floor0_unpack,&floor0_look,&floor0_free_info, - &floor0_free_look,&floor0_inverse1,&floor0_inverse2 -}; - - diff --git a/wolf3d/newCode/Tremor/floor1.c b/wolf3d/newCode/Tremor/floor1.c deleted file mode 100644 index 276ed8d..0000000 --- a/wolf3d/newCode/Tremor/floor1.c +++ /dev/null @@ -1,441 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: floor backend 1 implementation - - ********************************************************************/ - -#include -#include -#include -#include "ogg.h" -#include "ivorbiscodec.h" -#include "codec_internal.h" -#include "registry.h" -#include "codebook.h" -#include "misc.h" -#include "block.h" - -#define floor1_rangedB 140 /* floor 1 fixed at -140dB to 0dB range */ - -typedef struct { - int forward_index[VIF_POSIT+2]; - - int hineighbor[VIF_POSIT]; - int loneighbor[VIF_POSIT]; - int posts; - - int n; - int quant_q; - vorbis_info_floor1 *vi; - -} vorbis_look_floor1; - -/***********************************************/ - -static void floor1_free_info(vorbis_info_floor *i){ - vorbis_info_floor1 *info=(vorbis_info_floor1 *)i; - if(info){ - memset(info,0,sizeof(*info)); - _ogg_free(info); - } -} - -static void floor1_free_look(vorbis_look_floor *i){ - vorbis_look_floor1 *look=(vorbis_look_floor1 *)i; - if(look){ - memset(look,0,sizeof(*look)); - _ogg_free(look); - } -} - -static int ilog(unsigned int v){ - int ret=0; - while(v){ - ret++; - v>>=1; - } - return(ret); -} - -static vorbis_info_floor *floor1_unpack (vorbis_info *vi,oggpack_buffer *opb){ - codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; - int j,k,count=0,maxclass=-1,rangebits; - - vorbis_info_floor1 *info=(vorbis_info_floor1 *)_ogg_calloc(1,sizeof(*info)); - /* read partitions */ - info->partitions=oggpack_read(opb,5); /* only 0 to 31 legal */ - for(j=0;jpartitions;j++){ - info->partitionclass[j]=oggpack_read(opb,4); /* only 0 to 15 legal */ - if(maxclasspartitionclass[j])maxclass=info->partitionclass[j]; - } - - /* read partition classes */ - for(j=0;jclass_dim[j]=oggpack_read(opb,3)+1; /* 1 to 8 */ - info->class_subs[j]=oggpack_read(opb,2); /* 0,1,2,3 bits */ - if(info->class_subs[j]<0) - goto err_out; - if(info->class_subs[j])info->class_book[j]=oggpack_read(opb,8); - if(info->class_book[j]<0 || info->class_book[j]>=ci->books) - goto err_out; - for(k=0;k<(1<class_subs[j]);k++){ - info->class_subbook[j][k]=oggpack_read(opb,8)-1; - if(info->class_subbook[j][k]<-1 || info->class_subbook[j][k]>=ci->books) - goto err_out; - } - } - - /* read the post list */ - info->mult=oggpack_read(opb,2)+1; /* only 1,2,3,4 legal now */ - rangebits=oggpack_read(opb,4); - - for(j=0,k=0;jpartitions;j++){ - count+=info->class_dim[info->partitionclass[j]]; - for(;kpostlist[k+2]=oggpack_read(opb,rangebits); - if(t<0 || t>=(1<postlist[0]=0; - info->postlist[1]=1<vi=info; - look->n=info->postlist[1]; - - /* we drop each position value in-between already decoded values, - and use linear interpolation to predict each new value past the - edges. The positions are read in the order of the position - list... we precompute the bounding positions in the lookup. Of - course, the neighbors can change (if a position is declined), but - this is an initial mapping */ - - for(i=0;ipartitions;i++)n+=info->class_dim[info->partitionclass[i]]; - n+=2; - look->posts=n; - - /* also store a sorted position index */ - for(i=0;ipostlist+i; - qsort(sortpointer,n,sizeof(*sortpointer),icomp); - - /* points from sort order back to range number */ - for(i=0;iforward_index[i]=sortpointer[i]-info->postlist; - - /* quantize values to multiplier spec */ - switch(info->mult){ - case 1: /* 1024 -> 256 */ - look->quant_q=256; - break; - case 2: /* 1024 -> 128 */ - look->quant_q=128; - break; - case 3: /* 1024 -> 86 */ - look->quant_q=86; - break; - case 4: /* 1024 -> 64 */ - look->quant_q=64; - break; - } - - /* discover our neighbors for decode where we don't use fit flags - (that would push the neighbors outward) */ - for(i=0;in; - int currentx=info->postlist[i+2]; - for(j=0;jpostlist[j]; - if(x>lx && xcurrentx){ - hi=j; - hx=x; - } - } - look->loneighbor[i]=lo; - look->hineighbor[i]=hi; - } - - return(look); -} - -static int render_point(int x0,int x1,int y0,int y1,int x){ - y0&=0x7fff; /* mask off flag */ - y1&=0x7fff; - - { - int dy=y1-y0; - int adx=x1-x0; - int ady=abs(dy); - int err=ady*(x-x0); - - int off=err/adx; - if(dy<0)return(y0-off); - return(y0+off); - } -} - -#ifdef _LOW_ACCURACY_ -# define XdB(n) ((((n)>>8)+1)>>1) -#else -# define XdB(n) (n) -#endif - -static const ogg_int32_t FLOOR_fromdB_LOOKUP[256]={ - XdB(0x000000e5), XdB(0x000000f4), XdB(0x00000103), XdB(0x00000114), - XdB(0x00000126), XdB(0x00000139), XdB(0x0000014e), XdB(0x00000163), - XdB(0x0000017a), XdB(0x00000193), XdB(0x000001ad), XdB(0x000001c9), - XdB(0x000001e7), XdB(0x00000206), XdB(0x00000228), XdB(0x0000024c), - XdB(0x00000272), XdB(0x0000029b), XdB(0x000002c6), XdB(0x000002f4), - XdB(0x00000326), XdB(0x0000035a), XdB(0x00000392), XdB(0x000003cd), - XdB(0x0000040c), XdB(0x00000450), XdB(0x00000497), XdB(0x000004e4), - XdB(0x00000535), XdB(0x0000058c), XdB(0x000005e8), XdB(0x0000064a), - XdB(0x000006b3), XdB(0x00000722), XdB(0x00000799), XdB(0x00000818), - XdB(0x0000089e), XdB(0x0000092e), XdB(0x000009c6), XdB(0x00000a69), - XdB(0x00000b16), XdB(0x00000bcf), XdB(0x00000c93), XdB(0x00000d64), - XdB(0x00000e43), XdB(0x00000f30), XdB(0x0000102d), XdB(0x0000113a), - XdB(0x00001258), XdB(0x0000138a), XdB(0x000014cf), XdB(0x00001629), - XdB(0x0000179a), XdB(0x00001922), XdB(0x00001ac4), XdB(0x00001c82), - XdB(0x00001e5c), XdB(0x00002055), XdB(0x0000226f), XdB(0x000024ac), - XdB(0x0000270e), XdB(0x00002997), XdB(0x00002c4b), XdB(0x00002f2c), - XdB(0x0000323d), XdB(0x00003581), XdB(0x000038fb), XdB(0x00003caf), - XdB(0x000040a0), XdB(0x000044d3), XdB(0x0000494c), XdB(0x00004e10), - XdB(0x00005323), XdB(0x0000588a), XdB(0x00005e4b), XdB(0x0000646b), - XdB(0x00006af2), XdB(0x000071e5), XdB(0x0000794c), XdB(0x0000812e), - XdB(0x00008993), XdB(0x00009283), XdB(0x00009c09), XdB(0x0000a62d), - XdB(0x0000b0f9), XdB(0x0000bc79), XdB(0x0000c8b9), XdB(0x0000d5c4), - XdB(0x0000e3a9), XdB(0x0000f274), XdB(0x00010235), XdB(0x000112fd), - XdB(0x000124dc), XdB(0x000137e4), XdB(0x00014c29), XdB(0x000161bf), - XdB(0x000178bc), XdB(0x00019137), XdB(0x0001ab4a), XdB(0x0001c70e), - XdB(0x0001e4a1), XdB(0x0002041f), XdB(0x000225aa), XdB(0x00024962), - XdB(0x00026f6d), XdB(0x000297f0), XdB(0x0002c316), XdB(0x0002f109), - XdB(0x000321f9), XdB(0x00035616), XdB(0x00038d97), XdB(0x0003c8b4), - XdB(0x000407a7), XdB(0x00044ab2), XdB(0x00049218), XdB(0x0004de23), - XdB(0x00052f1e), XdB(0x0005855c), XdB(0x0005e135), XdB(0x00064306), - XdB(0x0006ab33), XdB(0x00071a24), XdB(0x0007904b), XdB(0x00080e20), - XdB(0x00089422), XdB(0x000922da), XdB(0x0009bad8), XdB(0x000a5cb6), - XdB(0x000b091a), XdB(0x000bc0b1), XdB(0x000c8436), XdB(0x000d5471), - XdB(0x000e3233), XdB(0x000f1e5f), XdB(0x001019e4), XdB(0x001125c1), - XdB(0x00124306), XdB(0x001372d5), XdB(0x0014b663), XdB(0x00160ef7), - XdB(0x00177df0), XdB(0x001904c1), XdB(0x001aa4f9), XdB(0x001c603d), - XdB(0x001e384f), XdB(0x00202f0f), XdB(0x0022467a), XdB(0x002480b1), - XdB(0x0026dff7), XdB(0x002966b3), XdB(0x002c1776), XdB(0x002ef4fc), - XdB(0x0032022d), XdB(0x00354222), XdB(0x0038b828), XdB(0x003c67c2), - XdB(0x004054ae), XdB(0x004482e8), XdB(0x0048f6af), XdB(0x004db488), - XdB(0x0052c142), XdB(0x005821ff), XdB(0x005ddc33), XdB(0x0063f5b0), - XdB(0x006a74a7), XdB(0x00715faf), XdB(0x0078bdce), XdB(0x0080967f), - XdB(0x0088f1ba), XdB(0x0091d7f9), XdB(0x009b5247), XdB(0x00a56a41), - XdB(0x00b02a27), XdB(0x00bb9ce2), XdB(0x00c7ce12), XdB(0x00d4ca17), - XdB(0x00e29e20), XdB(0x00f15835), XdB(0x0101074b), XdB(0x0111bb4e), - XdB(0x01238531), XdB(0x01367704), XdB(0x014aa402), XdB(0x016020a7), - XdB(0x017702c3), XdB(0x018f6190), XdB(0x01a955cb), XdB(0x01c4f9cf), - XdB(0x01e269a8), XdB(0x0201c33b), XdB(0x0223265a), XdB(0x0246b4ea), - XdB(0x026c9302), XdB(0x0294e716), XdB(0x02bfda13), XdB(0x02ed9793), - XdB(0x031e4e09), XdB(0x03522ee4), XdB(0x03896ed0), XdB(0x03c445e2), - XdB(0x0402efd6), XdB(0x0445ac4b), XdB(0x048cbefc), XdB(0x04d87013), - XdB(0x05290c67), XdB(0x057ee5ca), XdB(0x05da5364), XdB(0x063bb204), - XdB(0x06a36485), XdB(0x0711d42b), XdB(0x0787710e), XdB(0x0804b299), - XdB(0x088a17ef), XdB(0x0918287e), XdB(0x09af747c), XdB(0x0a50957e), - XdB(0x0afc2f19), XdB(0x0bb2ef7f), XdB(0x0c759034), XdB(0x0d44d6ca), - XdB(0x0e2195bc), XdB(0x0f0cad0d), XdB(0x10070b62), XdB(0x1111aeea), - XdB(0x122da66c), XdB(0x135c120f), XdB(0x149e24d9), XdB(0x15f525b1), - XdB(0x176270e3), XdB(0x18e7794b), XdB(0x1a85c9ae), XdB(0x1c3f06d1), - XdB(0x1e14f07d), XdB(0x200963d7), XdB(0x221e5ccd), XdB(0x2455f870), - XdB(0x26b2770b), XdB(0x29363e2b), XdB(0x2be3db5c), XdB(0x2ebe06b6), - XdB(0x31c7a55b), XdB(0x3503ccd4), XdB(0x3875c5aa), XdB(0x3c210f44), - XdB(0x4009632b), XdB(0x4432b8cf), XdB(0x48a149bc), XdB(0x4d59959e), - XdB(0x52606733), XdB(0x57bad899), XdB(0x5d6e593a), XdB(0x6380b298), - XdB(0x69f80e9a), XdB(0x70dafda8), XdB(0x78307d76), XdB(0x7fffffff), -}; - -static void render_line(int n, int x0,int x1,int y0,int y1,ogg_int32_t *d){ - int dy=y1-y0; - int adx=x1-x0; - int ady=abs(dy); - int base=dy/adx; - int sy=(dy<0?base-1:base+1); - int x=x0; - int y=y0; - int err=0; - - if(n>x1)n=x1; - ady-=abs(base*adx); - - if(x=adx){ - err-=adx; - y+=sy; - }else{ - y+=base; - } - d[x]= MULT31_SHIFT15(d[x],FLOOR_fromdB_LOOKUP[y]); - } -} - -static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){ - vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; - vorbis_info_floor1 *info=look->vi; - codec_setup_info *ci=(codec_setup_info *)vb->vd->vi->codec_setup; - - int i,j,k; - codebook *books=ci->fullbooks; - - /* unpack wrapped/predicted values from stream */ - if(oggpack_read(&vb->opb,1)==1){ - int *fit_value=(int *)_vorbis_block_alloc(vb,(look->posts)*sizeof(*fit_value)); - - fit_value[0]=oggpack_read(&vb->opb,ilog(look->quant_q-1)); - fit_value[1]=oggpack_read(&vb->opb,ilog(look->quant_q-1)); - - /* partition by partition */ - /* partition by partition */ - for(i=0,j=2;ipartitions;i++){ - int classv=info->partitionclass[i]; - int cdim=info->class_dim[classv]; - int csubbits=info->class_subs[classv]; - int csub=1<class_book[classv],&vb->opb); - - if(cval==-1)goto eop; - } - - for(k=0;kclass_subbook[classv][cval&(csub-1)]; - cval>>=csubbits; - if(book>=0){ - if((fit_value[j+k]=vorbis_book_decode(books+book,&vb->opb))==-1) - goto eop; - }else{ - fit_value[j+k]=0; - } - } - j+=cdim; - } - - /* unwrap positive values and reconsitute via linear interpolation */ - for(i=2;iposts;i++){ - int predicted=render_point(info->postlist[look->loneighbor[i-2]], - info->postlist[look->hineighbor[i-2]], - fit_value[look->loneighbor[i-2]], - fit_value[look->hineighbor[i-2]], - info->postlist[i]); - int hiroom=look->quant_q-predicted; - int loroom=predicted; - int room=(hiroom=room){ - if(hiroom>loroom){ - val = val-loroom; - }else{ - val = -1-(val-hiroom); - } - }else{ - if(val&1){ - val= -((val+1)>>1); - }else{ - val>>=1; - } - } - - fit_value[i]=val+predicted; - fit_value[look->loneighbor[i-2]]&=0x7fff; - fit_value[look->hineighbor[i-2]]&=0x7fff; - - }else{ - fit_value[i]=predicted|0x8000; - } - - } - - return(fit_value); - } - eop: - return(NULL); -} - -static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo, - ogg_int32_t *out){ - vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; - vorbis_info_floor1 *info=look->vi; - - codec_setup_info *ci=(codec_setup_info *)vb->vd->vi->codec_setup; - int n=ci->blocksizes[vb->W]/2; - int j; - - if(memo){ - /* render the lines */ - int *fit_value=(int *)memo; - int hx=0; - int lx=0; - int ly=fit_value[0]*info->mult; - for(j=1;jposts;j++){ - int current=look->forward_index[j]; - int hy=fit_value[current]&0x7fff; - if(hy==fit_value[current]){ - - hy*=info->mult; - hx=info->postlist[current]; - - render_line(n,lx,hx,ly,hy,out); - - lx=hx; - ly=hy; - } - } - for(j=hx;j -#include -#include "ogg.h" -#include "misc.h" - - -/* A complete description of Ogg framing exists in docs/framing.html */ - -/* basic, centralized Ogg memory management based on linked lists of - references to refcounted memory buffers. References and buffers - are both recycled. Buffers are passed around and consumed in - reference form. */ - -static ogg_buffer_state *ogg_buffer_create(void){ - ogg_buffer_state *bs=_ogg_calloc(1,sizeof(*bs)); - return bs; -} - -/* destruction is 'lazy'; there may be memory references outstanding, - and yanking the buffer state out from underneath would be - antisocial. Dealloc what is currently unused and have - _release_one watch for the stragglers to come in. When they do, - finish destruction. */ - -/* call the helper while holding lock */ -static void _ogg_buffer_destroy(ogg_buffer_state *bs){ - ogg_buffer *bt; - ogg_reference *rt; - - if(bs->shutdown){ - - bt=bs->unused_buffers; - rt=bs->unused_references; - - while(bt){ - ogg_buffer *b=bt; - bt=b->ptr.next; - if(b->data)_ogg_free(b->data); - _ogg_free(b); - } - bs->unused_buffers=0; - while(rt){ - ogg_reference *r=rt; - rt=r->next; - _ogg_free(r); - } - bs->unused_references=0; - - if(!bs->outstanding) - _ogg_free(bs); - - } -} - -static void ogg_buffer_destroy(ogg_buffer_state *bs){ - bs->shutdown=1; - _ogg_buffer_destroy(bs); -} - -static ogg_buffer *_fetch_buffer(ogg_buffer_state *bs,long bytes){ - ogg_buffer *ob; - bs->outstanding++; - - /* do we have an unused buffer sitting in the pool? */ - if(bs->unused_buffers){ - ob=bs->unused_buffers; - bs->unused_buffers=ob->ptr.next; - - /* if the unused buffer is too small, grow it */ - if(ob->sizedata=_ogg_realloc(ob->data,bytes); - ob->size=bytes; - } - }else{ - /* allocate a new buffer */ - ob=_ogg_malloc(sizeof(*ob)); - ob->data=_ogg_malloc(bytes<16?16:bytes); - ob->size=bytes; - } - - ob->refcount=1; - ob->ptr.owner=bs; - return ob; -} - -static ogg_reference *_fetch_ref(ogg_buffer_state *bs){ - ogg_reference *or; - bs->outstanding++; - - /* do we have an unused reference sitting in the pool? */ - if(bs->unused_references){ - or=bs->unused_references; - bs->unused_references=or->next; - }else{ - /* allocate a new reference */ - or=_ogg_malloc(sizeof(*or)); - } - - or->begin=0; - or->length=0; - or->next=0; - return or; -} - -/* fetch a reference pointing to a fresh, initially continguous buffer - of at least [bytes] length */ -static ogg_reference *ogg_buffer_alloc(ogg_buffer_state *bs,long bytes){ - ogg_buffer *ob=_fetch_buffer(bs,bytes); - ogg_reference *or=_fetch_ref(bs); - or->buffer=ob; - return or; -} - -/* enlarge the data buffer in the current link */ -static void ogg_buffer_realloc(ogg_reference *or,long bytes){ - ogg_buffer *ob=or->buffer; - - /* if the unused buffer is too small, grow it */ - if(ob->sizedata=_ogg_realloc(ob->data,bytes); - ob->size=bytes; - } -} - -static void _ogg_buffer_mark_one(ogg_reference *or){ - or->buffer->refcount++; -} - -/* increase the refcount of the buffers to which the reference points */ -static void ogg_buffer_mark(ogg_reference *or){ - while(or){ - _ogg_buffer_mark_one(or); - or=or->next; - } -} - -/* duplicate a reference (pointing to the same actual buffer memory) - and increment buffer refcount. If the desired segment begins out - of range, NULL is returned; if the desired segment is simply zero - length, a zero length ref is returned. Partial range overlap - returns the overlap of the ranges */ -static ogg_reference *ogg_buffer_sub(ogg_reference *or,long begin,long length){ - ogg_reference *ret=0,*head=0; - - /* walk past any preceeding fragments we don't want */ - while(or && begin>=or->length){ - begin-=or->length; - or=or->next; - } - - /* duplicate the reference chain; increment refcounts */ - while(or && length){ - ogg_reference *temp=_fetch_ref(or->buffer->ptr.owner); - if(head) - head->next=temp; - else - ret=temp; - head=temp; - head->buffer=or->buffer; - head->begin=or->begin+begin; - head->length=length; - if(head->length>or->length-begin) - head->length=or->length-begin; - - begin=0; - length-=head->length; - or=or->next; - } - - ogg_buffer_mark(ret); - return ret; -} - -ogg_reference *ogg_buffer_dup(ogg_reference *or){ - ogg_reference *ret=0,*head=0; - /* duplicate the reference chain; increment refcounts */ - while(or){ - ogg_reference *temp=_fetch_ref(or->buffer->ptr.owner); - if(head) - head->next=temp; - else - ret=temp; - head=temp; - head->buffer=or->buffer; - head->begin=or->begin; - head->length=or->length; - or=or->next; - } - - ogg_buffer_mark(ret); - return ret; -} - -/* split a reference into two references; 'return' is a reference to - the buffer preceeding pos and 'head'/'tail' are the buffer past the - split. If pos is at or past the end of the passed in segment, - 'head/tail' are NULL */ -static ogg_reference *ogg_buffer_split(ogg_reference **tail, - ogg_reference **head,long pos){ - - /* walk past any preceeding fragments to one of: - a) the exact boundary that seps two fragments - b) the fragment that needs split somewhere in the middle */ - ogg_reference *ret=*tail; - ogg_reference *or=*tail; - - while(or && pos>or->length){ - pos-=or->length; - or=or->next; - } - - if(!or || pos==0){ - - return 0; - - }else{ - - if(pos>=or->length){ - /* exact split, or off the end? */ - if(or->next){ - - /* a split */ - *tail=or->next; - or->next=0; - - }else{ - - /* off or at the end */ - *tail=*head=0; - - } - }else{ - - /* split within a fragment */ - long lengthA=pos; - long beginB=or->begin+pos; - long lengthB=or->length-pos; - - /* make a new reference to tail the second piece */ - *tail=_fetch_ref(or->buffer->ptr.owner); - - (*tail)->buffer=or->buffer; - (*tail)->begin=beginB; - (*tail)->length=lengthB; - (*tail)->next=or->next; - _ogg_buffer_mark_one(*tail); - if(head && or==*head)*head=*tail; - - /* update the first piece */ - or->next=0; - or->length=lengthA; - - } - } - return ret; -} - -static void ogg_buffer_release_one(ogg_reference *or){ - ogg_buffer *ob=or->buffer; - ogg_buffer_state *bs=ob->ptr.owner; - - ob->refcount--; - if(ob->refcount==0){ - bs->outstanding--; /* for the returned buffer */ - ob->ptr.next=bs->unused_buffers; - bs->unused_buffers=ob; - } - - bs->outstanding--; /* for the returned reference */ - or->next=bs->unused_references; - bs->unused_references=or; - - _ogg_buffer_destroy(bs); /* lazy cleanup (if needed) */ - -} - -/* release the references, decrease the refcounts of buffers to which - they point, release any buffers with a refcount that drops to zero */ -static void ogg_buffer_release(ogg_reference *or){ - while(or){ - ogg_reference *next=or->next; - ogg_buffer_release_one(or); - or=next; - } -} - -static ogg_reference *ogg_buffer_pretruncate(ogg_reference *or,long pos){ - /* release preceeding fragments we don't want */ - while(or && pos>=or->length){ - ogg_reference *next=or->next; - pos-=or->length; - ogg_buffer_release_one(or); - or=next; - } - if (or) { - or->begin+=pos; - or->length-=pos; - } - return or; -} - -static ogg_reference *ogg_buffer_walk(ogg_reference *or){ - if(!or)return NULL; - while(or->next){ - or=or->next; - } - return(or); -} - -/* *head is appended to the front end (head) of *tail; both continue to - be valid pointers, with *tail at the tail and *head at the head */ -static ogg_reference *ogg_buffer_cat(ogg_reference *tail, ogg_reference *head){ - if(!tail)return head; - - while(tail->next){ - tail=tail->next; - } - tail->next=head; - return ogg_buffer_walk(head); -} - -static void _positionB(oggbyte_buffer *b,int pos){ - if(pospos){ - /* start at beginning, scan forward */ - b->ref=b->baseref; - b->pos=0; - b->end=b->pos+b->ref->length; - b->ptr=b->ref->buffer->data+b->ref->begin; - } -} - -static void _positionF(oggbyte_buffer *b,int pos){ - /* scan forward for position */ - while(pos>=b->end){ - /* just seek forward */ - b->pos+=b->ref->length; - b->ref=b->ref->next; - b->end=b->ref->length+b->pos; - b->ptr=b->ref->buffer->data+b->ref->begin; - } -} - -static int oggbyte_init(oggbyte_buffer *b,ogg_reference *or){ - memset(b,0,sizeof(*b)); - if(or){ - b->ref=b->baseref=or; - b->pos=0; - b->end=b->ref->length; - b->ptr=b->ref->buffer->data+b->ref->begin; - return 0; - }else - return -1; -} - -static void oggbyte_set4(oggbyte_buffer *b,ogg_uint32_t val,int pos){ - int i; - _positionB(b,pos); - for(i=0;i<4;i++){ - _positionF(b,pos); - b->ptr[pos-b->pos]=val; - val>>=8; - ++pos; - } -} - -static unsigned char oggbyte_read1(oggbyte_buffer *b,int pos){ - _positionB(b,pos); - _positionF(b,pos); - return b->ptr[pos-b->pos]; -} - -static ogg_uint32_t oggbyte_read4(oggbyte_buffer *b,int pos){ - ogg_uint32_t ret; - _positionB(b,pos); - _positionF(b,pos); - ret=b->ptr[pos-b->pos]; - _positionF(b,++pos); - ret|=b->ptr[pos-b->pos]<<8; - _positionF(b,++pos); - ret|=b->ptr[pos-b->pos]<<16; - _positionF(b,++pos); - ret|=b->ptr[pos-b->pos]<<24; - return ret; -} - -static ogg_int64_t oggbyte_read8(oggbyte_buffer *b,int pos){ - ogg_int64_t ret; - unsigned char t[7]; - int i; - _positionB(b,pos); - for(i=0;i<7;i++){ - _positionF(b,pos); - t[i]=b->ptr[pos++ -b->pos]; - } - - _positionF(b,pos); - ret=b->ptr[pos-b->pos]; - - for(i=6;i>=0;--i) - ret= ret<<8 | t[i]; - - return ret; -} - -/* Now we get to the actual framing code */ - -int ogg_page_version(ogg_page *og){ - oggbyte_buffer ob; - oggbyte_init(&ob,og->header); - return oggbyte_read1(&ob,4); -} - -int ogg_page_continued(ogg_page *og){ - oggbyte_buffer ob; - oggbyte_init(&ob,og->header); - return oggbyte_read1(&ob,5)&0x01; -} - -int ogg_page_bos(ogg_page *og){ - oggbyte_buffer ob; - oggbyte_init(&ob,og->header); - return oggbyte_read1(&ob,5)&0x02; -} - -int ogg_page_eos(ogg_page *og){ - oggbyte_buffer ob; - oggbyte_init(&ob,og->header); - return oggbyte_read1(&ob,5)&0x04; -} - -ogg_int64_t ogg_page_granulepos(ogg_page *og){ - oggbyte_buffer ob; - oggbyte_init(&ob,og->header); - return oggbyte_read8(&ob,6); -} - -ogg_uint32_t ogg_page_serialno(ogg_page *og){ - oggbyte_buffer ob; - oggbyte_init(&ob,og->header); - return oggbyte_read4(&ob,14); -} - -ogg_uint32_t ogg_page_pageno(ogg_page *og){ - oggbyte_buffer ob; - oggbyte_init(&ob,og->header); - return oggbyte_read4(&ob,18); -} - -/* returns the number of packets that are completed on this page (if - the leading packet is begun on a previous page, but ends on this - page, it's counted */ - -/* NOTE: -If a page consists of a packet begun on a previous page, and a new -packet begun (but not completed) on this page, the return will be: - ogg_page_packets(page) ==1, - ogg_page_continued(page) !=0 - -If a page happens to be a single packet that was begun on a -previous page, and spans to the next page (in the case of a three or -more page packet), the return will be: - ogg_page_packets(page) ==0, - ogg_page_continued(page) !=0 -*/ - -int ogg_page_packets(ogg_page *og){ - int i; - int n; - int count=0; - oggbyte_buffer ob; - oggbyte_init(&ob,og->header); - - n=oggbyte_read1(&ob,26); - for(i=0;ibufferpool=ogg_buffer_create(); - return oy; -} - -int ogg_sync_destroy(ogg_sync_state *oy){ - if(oy){ - ogg_sync_reset(oy); - ogg_buffer_destroy(oy->bufferpool); - memset(oy,0,sizeof(*oy)); - _ogg_free(oy); - } - return OGG_SUCCESS; -} - -unsigned char *ogg_sync_bufferin(ogg_sync_state *oy, long bytes){ - - /* [allocate and] expose a buffer for data submission. - - If there is no head fragment - allocate one and expose it - else - if the current head fragment has sufficient unused space - expose it - else - if the current head fragment is unused - resize and expose it - else - allocate new fragment and expose it - */ - - /* base case; fifo uninitialized */ - if(!oy->fifo_head){ - oy->fifo_head=oy->fifo_tail=ogg_buffer_alloc(oy->bufferpool,bytes); - return oy->fifo_head->buffer->data; - } - - /* space left in current fragment case */ - if(oy->fifo_head->buffer->size- - oy->fifo_head->length- - oy->fifo_head->begin >= bytes) - return oy->fifo_head->buffer->data+ - oy->fifo_head->length+oy->fifo_head->begin; - - /* current fragment is unused, but too small */ - if(!oy->fifo_head->length){ - ogg_buffer_realloc(oy->fifo_head,bytes); - return oy->fifo_head->buffer->data+oy->fifo_head->begin; - } - - /* current fragment used/full; get new fragment */ - { - ogg_reference *new=ogg_buffer_alloc(oy->bufferpool,bytes); - oy->fifo_head->next=new; - oy->fifo_head=new; - } - return oy->fifo_head->buffer->data; -} - -int ogg_sync_wrote(ogg_sync_state *oy, long bytes){ - if(!oy->fifo_head)return OGG_EINVAL; - if(oy->fifo_head->buffer->size-oy->fifo_head->length-oy->fifo_head->begin < - bytes)return OGG_EINVAL; - oy->fifo_head->length+=bytes; - oy->fifo_fill+=bytes; - return OGG_SUCCESS; -} - -static ogg_uint32_t _checksum(ogg_reference *or, int bytes){ - ogg_uint32_t crc_reg=0; - int j,post; - - while(or){ - unsigned char *data=or->buffer->data+or->begin; - post=(byteslength?bytes:or->length); - for(j=0;j> 24)&0xff)^data[j]]; - bytes-=j; - or=or->next; - } - - return crc_reg; -} - - -/* sync the stream. This is meant to be useful for finding page - boundaries. - - return values for this: - -n) skipped n bytes - 0) page not ready; more data (no bytes skipped) - n) page synced at current location; page length n bytes - -*/ - -long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og){ - oggbyte_buffer page; - long bytes,ret=0; - - ogg_page_release(og); - - bytes=oy->fifo_fill; - oggbyte_init(&page,oy->fifo_tail); - - if(oy->headerbytes==0){ - if(bytes<27)goto sync_out; /* not enough for even a minimal header */ - - /* verify capture pattern */ - if(oggbyte_read1(&page,0)!=(int)'O' || - oggbyte_read1(&page,1)!=(int)'g' || - oggbyte_read1(&page,2)!=(int)'g' || - oggbyte_read1(&page,3)!=(int)'S' ) goto sync_fail; - - oy->headerbytes=oggbyte_read1(&page,26)+27; - } - if(bytesheaderbytes)goto sync_out; /* not enough for header + - seg table */ - if(oy->bodybytes==0){ - int i; - /* count up body length in the segment table */ - for(i=0;iheaderbytes-27;i++) - oy->bodybytes+=oggbyte_read1(&page,27+i); - } - - if(oy->bodybytes+oy->headerbytes>bytes)goto sync_out; - - /* we have what appears to be a complete page; last test: verify - checksum */ - { - ogg_uint32_t chksum=oggbyte_read4(&page,22); - oggbyte_set4(&page,0,22); - - /* Compare checksums; memory continues to be common access */ - if(chksum!=_checksum(oy->fifo_tail,oy->bodybytes+oy->headerbytes)){ - - /* D'oh. Mismatch! Corrupt page (or miscapture and not a page - at all). replace the computed checksum with the one actually - read in; remember all the memory is common access */ - - oggbyte_set4(&page,chksum,22); - goto sync_fail; - } - oggbyte_set4(&page,chksum,22); - } - - /* We have a page. Set up page return. */ - if(og){ - /* set up page output */ - og->header=ogg_buffer_split(&oy->fifo_tail,&oy->fifo_head,oy->headerbytes); - og->header_len=oy->headerbytes; - og->body=ogg_buffer_split(&oy->fifo_tail,&oy->fifo_head,oy->bodybytes); - og->body_len=oy->bodybytes; - }else{ - /* simply advance */ - oy->fifo_tail= - ogg_buffer_pretruncate(oy->fifo_tail,oy->headerbytes+oy->bodybytes); - if(!oy->fifo_tail)oy->fifo_head=0; - } - - ret=oy->headerbytes+oy->bodybytes; - oy->unsynced=0; - oy->headerbytes=0; - oy->bodybytes=0; - oy->fifo_fill-=ret; - - return ret; - - sync_fail: - - oy->headerbytes=0; - oy->bodybytes=0; - oy->fifo_tail=ogg_buffer_pretruncate(oy->fifo_tail,1); - ret--; - - /* search forward through fragments for possible capture */ - while(oy->fifo_tail){ - /* invariant: fifo_cursor points to a position in fifo_tail */ - unsigned char *now=oy->fifo_tail->buffer->data+oy->fifo_tail->begin; - unsigned char *next=memchr(now, 'O', oy->fifo_tail->length); - - if(next){ - /* possible capture in this segment */ - long bytes=next-now; - oy->fifo_tail=ogg_buffer_pretruncate(oy->fifo_tail,bytes); - ret-=bytes; - break; - }else{ - /* no capture. advance to next segment */ - long bytes=oy->fifo_tail->length; - ret-=bytes; - oy->fifo_tail=ogg_buffer_pretruncate(oy->fifo_tail,bytes); - } - } - if(!oy->fifo_tail)oy->fifo_head=0; - oy->fifo_fill+=ret; - - sync_out: - return ret; -} - -/* sync the stream and get a page. Keep trying until we find a page. - Supress 'sync errors' after reporting the first. - - return values: - OGG_HOLE) recapture (hole in data) - 0) need more data - 1) page returned - - Returns pointers into buffered data; invalidated by next call to - _stream, _clear, _init, or _buffer */ - -int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og){ - - /* all we need to do is verify a page at the head of the stream - buffer. If it doesn't verify, we look for the next potential - frame */ - - while(1){ - long ret=ogg_sync_pageseek(oy,og); - if(ret>0){ - /* have a page */ - return 1; - } - if(ret==0){ - /* need more data */ - return 0; - } - - /* head did not start a synced page... skipped some bytes */ - if(!oy->unsynced){ - oy->unsynced=1; - return OGG_HOLE; - } - - /* loop. keep looking */ - - } -} - -/* clear things to an initial state. Good to call, eg, before seeking */ -int ogg_sync_reset(ogg_sync_state *oy){ - - ogg_buffer_release(oy->fifo_tail); - oy->fifo_tail=0; - oy->fifo_head=0; - oy->fifo_fill=0; - - oy->unsynced=0; - oy->headerbytes=0; - oy->bodybytes=0; - return OGG_SUCCESS; -} - -ogg_stream_state *ogg_stream_create(int serialno){ - ogg_stream_state *os=_ogg_calloc(1,sizeof(*os)); - os->serialno=serialno; - os->pageno=-1; - return os; -} - -int ogg_stream_destroy(ogg_stream_state *os){ - if(os){ - ogg_buffer_release(os->header_tail); - ogg_buffer_release(os->body_tail); - memset(os,0,sizeof(*os)); - _ogg_free(os); - } - return OGG_SUCCESS; -} - - -#define FINFLAG 0x80000000UL -#define FINMASK 0x7fffffffUL - -static void _next_lace(oggbyte_buffer *ob,ogg_stream_state *os){ - /* search ahead one lace */ - os->body_fill_next=0; - while(os->laceptrlacing_fill){ - int val=oggbyte_read1(ob,27+os->laceptr++); - os->body_fill_next+=val; - if(val<255){ - os->body_fill_next|=FINFLAG; - os->clearflag=1; - break; - } - } -} - -static void _span_queued_page(ogg_stream_state *os){ - while( !(os->body_fill&FINFLAG) ){ - - if(!os->header_tail)break; - - /* first flush out preceeding page header (if any). Body is - flushed as it's consumed, so that's not done here. */ - - if(os->lacing_fill>=0) - os->header_tail=ogg_buffer_pretruncate(os->header_tail, - os->lacing_fill+27); - os->lacing_fill=0; - os->laceptr=0; - os->clearflag=0; - - if(!os->header_tail){ - os->header_head=0; - break; - }else{ - - /* process/prepare next page, if any */ - - long pageno; - oggbyte_buffer ob; - ogg_page og; /* only for parsing header values */ - og.header=os->header_tail; /* only for parsing header values */ - pageno=ogg_page_pageno(&og); - - oggbyte_init(&ob,os->header_tail); - os->lacing_fill=oggbyte_read1(&ob,26); - - /* are we in sequence? */ - if(pageno!=os->pageno){ - if(os->pageno==-1) /* indicates seek or reset */ - os->holeflag=1; /* set for internal use */ - else - os->holeflag=2; /* set for external reporting */ - - os->body_tail=ogg_buffer_pretruncate(os->body_tail, - os->body_fill); - if(os->body_tail==0)os->body_head=0; - os->body_fill=0; - - } - - if(ogg_page_continued(&og)){ - if(os->body_fill==0){ - /* continued packet, but no preceeding data to continue */ - /* dump the first partial packet on the page */ - _next_lace(&ob,os); - os->body_tail= - ogg_buffer_pretruncate(os->body_tail,os->body_fill_next&FINMASK); - if(os->body_tail==0)os->body_head=0; - /* set span flag */ - if(!os->spanflag && !os->holeflag)os->spanflag=2; - } - }else{ - if(os->body_fill>0){ - /* preceeding data to continue, but not a continued page */ - /* dump body_fill */ - os->body_tail=ogg_buffer_pretruncate(os->body_tail, - os->body_fill); - if(os->body_tail==0)os->body_head=0; - os->body_fill=0; - - /* set espan flag */ - if(!os->spanflag && !os->holeflag)os->spanflag=2; - } - } - - if(os->laceptrlacing_fill){ - os->granulepos=ogg_page_granulepos(&og); - - /* get current packet size & flag */ - _next_lace(&ob,os); - os->body_fill+=os->body_fill_next; /* addition handles the flag fine; - unsigned on purpose */ - /* ...and next packet size & flag */ - _next_lace(&ob,os); - - } - - os->pageno=pageno+1; - os->e_o_s=ogg_page_eos(&og); - os->b_o_s=ogg_page_bos(&og); - - } - } -} - -/* add the incoming page to the stream state; we decompose the page - into packet segments here as well. */ - -int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og){ - - int serialno=ogg_page_serialno(og); - int version=ogg_page_version(og); - - /* check the serial number */ - if(serialno!=os->serialno){ - ogg_page_release(og); - return OGG_ESERIAL; - } - if(version>0){ - ogg_page_release(og); - return OGG_EVERSION; - } - - /* add to fifos */ - if(!os->body_tail){ - os->body_tail=og->body; - os->body_head=ogg_buffer_walk(og->body); - }else{ - os->body_head=ogg_buffer_cat(os->body_head,og->body); - } - if(!os->header_tail){ - os->header_tail=og->header; - os->header_head=ogg_buffer_walk(og->header); - os->lacing_fill=-27; - }else{ - os->header_head=ogg_buffer_cat(os->header_head,og->header); - } - - memset(og,0,sizeof(*og)); - return OGG_SUCCESS; -} - -int ogg_stream_reset(ogg_stream_state *os){ - - ogg_buffer_release(os->header_tail); - ogg_buffer_release(os->body_tail); - os->header_tail=os->header_head=0; - os->body_tail=os->body_head=0; - - os->e_o_s=0; - os->b_o_s=0; - os->pageno=-1; - os->packetno=0; - os->granulepos=0; - - os->body_fill=0; - os->lacing_fill=0; - - os->holeflag=0; - os->spanflag=0; - os->clearflag=0; - os->laceptr=0; - os->body_fill_next=0; - - return OGG_SUCCESS; -} - -int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno){ - ogg_stream_reset(os); - os->serialno=serialno; - return OGG_SUCCESS; -} - -static int _packetout(ogg_stream_state *os,ogg_packet *op,int adv){ - - ogg_packet_release(op); - _span_queued_page(os); - - if(os->holeflag){ - int temp=os->holeflag; - if(os->clearflag) - os->holeflag=0; - else - os->holeflag=1; - if(temp==2){ - os->packetno++; - return OGG_HOLE; - } - } - if(os->spanflag){ - int temp=os->spanflag; - if(os->clearflag) - os->spanflag=0; - else - os->spanflag=1; - if(temp==2){ - os->packetno++; - return OGG_SPAN; - } - } - - if(!(os->body_fill&FINFLAG)) return 0; - if(!op && !adv)return 1; /* just using peek as an inexpensive way - to ask if there's a whole packet - waiting */ - if(op){ - op->b_o_s=os->b_o_s; - if(os->e_o_s && os->body_fill_next==0) - op->e_o_s=os->e_o_s; - else - op->e_o_s=0; - if( (os->body_fill&FINFLAG) && !(os->body_fill_next&FINFLAG) ) - op->granulepos=os->granulepos; - else - op->granulepos=-1; - op->packetno=os->packetno; - } - - if(adv){ - oggbyte_buffer ob; - oggbyte_init(&ob,os->header_tail); - - /* split the body contents off */ - if(op){ - op->packet=ogg_buffer_split(&os->body_tail,&os->body_head, - os->body_fill&FINMASK); - op->bytes=os->body_fill&FINMASK; - }else{ - os->body_tail=ogg_buffer_pretruncate(os->body_tail, - os->body_fill&FINMASK); - if(os->body_tail==0)os->body_head=0; - } - - /* update lacing pointers */ - os->body_fill=os->body_fill_next; - _next_lace(&ob,os); - }else{ - if(op){ - op->packet=ogg_buffer_sub(os->body_tail,0,os->body_fill&FINMASK); - op->bytes=os->body_fill&FINMASK; - } - } - - if(adv){ - os->packetno++; - os->b_o_s=0; - } - - return 1; -} - -int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op){ - return _packetout(os,op,1); -} - -int ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op){ - return _packetout(os,op,0); -} - -int ogg_packet_release(ogg_packet *op) { - if(op){ - ogg_buffer_release(op->packet); - memset(op, 0, sizeof(*op)); - } - return OGG_SUCCESS; -} - -int ogg_page_release(ogg_page *og) { - if(og){ - ogg_buffer_release(og->header); - ogg_buffer_release(og->body); - memset(og, 0, sizeof(*og)); - } - return OGG_SUCCESS; -} - -void ogg_page_dup(ogg_page *dup,ogg_page *orig){ - dup->header_len=orig->header_len; - dup->body_len=orig->body_len; - dup->header=ogg_buffer_dup(orig->header); - dup->body=ogg_buffer_dup(orig->body); -} - diff --git a/wolf3d/newCode/Tremor/info.c b/wolf3d/newCode/Tremor/info.c deleted file mode 100644 index 33acf16..0000000 --- a/wolf3d/newCode/Tremor/info.c +++ /dev/null @@ -1,356 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2003 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: maintain the info structure, info <-> header packets - - ********************************************************************/ - -/* general handling of the header and the vorbis_info structure (and - substructures) */ - -#include -#include -#include -#include "ogg.h" -#include "ivorbiscodec.h" -#include "codec_internal.h" -#include "codebook.h" -#include "registry.h" -#include "window.h" -#include "misc.h" - -/* helpers */ -static void _v_readstring(oggpack_buffer *o,char *buf,int bytes){ - while(bytes--){ - *buf++=oggpack_read(o,8); - } -} - -void vorbis_comment_init(vorbis_comment *vc){ - memset(vc,0,sizeof(*vc)); -} - -/* This is more or less the same as strncasecmp - but that doesn't exist - * everywhere, and this is a fairly trivial function, so we include it */ -static int tagcompare(const char *s1, const char *s2, int n){ - int c=0; - while(c < n){ - if(toupper(s1[c]) != toupper(s2[c])) - return !0; - c++; - } - return 0; -} - -char *vorbis_comment_query(vorbis_comment *vc, char *tag, int count){ - long i; - int found = 0; - int taglen = strlen(tag)+1; /* +1 for the = we append */ - char *fulltag = (char *)alloca(taglen+ 1); - - strcpy(fulltag, tag); - strcat(fulltag, "="); - - for(i=0;icomments;i++){ - if(!tagcompare(vc->user_comments[i], fulltag, taglen)){ - if(count == found) - /* We return a pointer to the data, not a copy */ - return vc->user_comments[i] + taglen; - else - found++; - } - } - return NULL; /* didn't find anything */ -} - -int vorbis_comment_query_count(vorbis_comment *vc, char *tag){ - int i,count=0; - int taglen = strlen(tag)+1; /* +1 for the = we append */ - char *fulltag = (char *)alloca(taglen+1); - strcpy(fulltag,tag); - strcat(fulltag, "="); - - for(i=0;icomments;i++){ - if(!tagcompare(vc->user_comments[i], fulltag, taglen)) - count++; - } - - return count; -} - -void vorbis_comment_clear(vorbis_comment *vc){ - if(vc){ - long i; - for(i=0;icomments;i++) - if(vc->user_comments[i])_ogg_free(vc->user_comments[i]); - if(vc->user_comments)_ogg_free(vc->user_comments); - if(vc->comment_lengths)_ogg_free(vc->comment_lengths); - if(vc->vendor)_ogg_free(vc->vendor); - memset(vc,0,sizeof(*vc)); - } -} - -/* blocksize 0 is guaranteed to be short, 1 is guarantted to be long. - They may be equal, but short will never ge greater than long */ -int vorbis_info_blocksize(vorbis_info *vi,int zo){ - codec_setup_info *ci = (codec_setup_info *)vi->codec_setup; - return ci ? ci->blocksizes[zo] : -1; -} - -/* used by synthesis, which has a full, alloced vi */ -void vorbis_info_init(vorbis_info *vi){ - memset(vi,0,sizeof(*vi)); - vi->codec_setup=(codec_setup_info *)_ogg_calloc(1,sizeof(codec_setup_info)); -} - -void vorbis_info_clear(vorbis_info *vi){ - codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; - int i; - - if(ci){ - - for(i=0;imodes;i++) - if(ci->mode_param[i])_ogg_free(ci->mode_param[i]); - - for(i=0;imaps;i++) /* unpack does the range checking */ - if(ci->map_param[i]) - _mapping_P[ci->map_type[i]]->free_info(ci->map_param[i]); - - for(i=0;ifloors;i++) /* unpack does the range checking */ - if(ci->floor_param[i]) - _floor_P[ci->floor_type[i]]->free_info(ci->floor_param[i]); - - for(i=0;iresidues;i++) /* unpack does the range checking */ - if(ci->residue_param[i]) - _residue_P[ci->residue_type[i]]->free_info(ci->residue_param[i]); - - for(i=0;ibooks;i++){ - if(ci->book_param[i]){ - /* knows if the book was not alloced */ - vorbis_staticbook_destroy(ci->book_param[i]); - } - if(ci->fullbooks) - vorbis_book_clear(ci->fullbooks+i); - } - if(ci->fullbooks) - _ogg_free(ci->fullbooks); - - _ogg_free(ci); - } - - memset(vi,0,sizeof(*vi)); -} - -/* Header packing/unpacking ********************************************/ - -static int _vorbis_unpack_info(vorbis_info *vi,oggpack_buffer *opb){ - codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; - if(!ci)return(OV_EFAULT); - - vi->version=oggpack_read(opb,32); - if(vi->version!=0)return(OV_EVERSION); - - vi->channels=oggpack_read(opb,8); - vi->rate=oggpack_read(opb,32); - - vi->bitrate_upper=oggpack_read(opb,32); - vi->bitrate_nominal=oggpack_read(opb,32); - vi->bitrate_lower=oggpack_read(opb,32); - - ci->blocksizes[0]=1<blocksizes[1]=1<rate<1)goto err_out; - if(vi->channels<1)goto err_out; - if(ci->blocksizes[0]<64)goto err_out; - if(ci->blocksizes[1]blocksizes[0])goto err_out; - if(ci->blocksizes[1]>8192)goto err_out; - - if(oggpack_read(opb,1)!=1)goto err_out; /* EOP check */ - - return(0); - err_out: - vorbis_info_clear(vi); - return(OV_EBADHEADER); -} - -static int _vorbis_unpack_comment(vorbis_comment *vc,oggpack_buffer *opb){ - int i; - int vendorlen=oggpack_read(opb,32); - if(vendorlen<0)goto err_out; - vc->vendor=(char *)_ogg_calloc(vendorlen+1,1); - _v_readstring(opb,vc->vendor,vendorlen); - vc->comments=oggpack_read(opb,32); - if(vc->comments<0)goto err_out; - vc->user_comments=(char **)_ogg_calloc(vc->comments+1,sizeof(*vc->user_comments)); - vc->comment_lengths=(int *)_ogg_calloc(vc->comments+1, sizeof(*vc->comment_lengths)); - - for(i=0;icomments;i++){ - int len=oggpack_read(opb,32); - if(len<0)goto err_out; - vc->comment_lengths[i]=len; - vc->user_comments[i]=(char *)_ogg_calloc(len+1,1); - _v_readstring(opb,vc->user_comments[i],len); - } - if(oggpack_read(opb,1)!=1)goto err_out; /* EOP check */ - - return(0); - err_out: - vorbis_comment_clear(vc); - return(OV_EBADHEADER); -} - -/* all of the real encoding details are here. The modes, books, - everything */ -static int _vorbis_unpack_books(vorbis_info *vi,oggpack_buffer *opb){ - codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; - int i; - if(!ci)return(OV_EFAULT); - - /* codebooks */ - ci->books=oggpack_read(opb,8)+1; - /*ci->book_param=_ogg_calloc(ci->books,sizeof(*ci->book_param));*/ - for(i=0;ibooks;i++){ - ci->book_param[i]=(static_codebook *)_ogg_calloc(1,sizeof(*ci->book_param[i])); - if(vorbis_staticbook_unpack(opb,ci->book_param[i]))goto err_out; - } - - /* time backend settings */ - ci->times=oggpack_read(opb,6)+1; - /*ci->time_type=_ogg_malloc(ci->times*sizeof(*ci->time_type));*/ - /*ci->time_param=_ogg_calloc(ci->times,sizeof(void *));*/ - for(i=0;itimes;i++){ - ci->time_type[i]=oggpack_read(opb,16); - if(ci->time_type[i]<0 || ci->time_type[i]>=VI_TIMEB)goto err_out; - /* ci->time_param[i]=_time_P[ci->time_type[i]]->unpack(vi,opb); - Vorbis I has no time backend */ - /*if(!ci->time_param[i])goto err_out;*/ - } - - /* floor backend settings */ - ci->floors=oggpack_read(opb,6)+1; - /*ci->floor_type=_ogg_malloc(ci->floors*sizeof(*ci->floor_type));*/ - /*ci->floor_param=_ogg_calloc(ci->floors,sizeof(void *));*/ - for(i=0;ifloors;i++){ - ci->floor_type[i]=oggpack_read(opb,16); - if(ci->floor_type[i]<0 || ci->floor_type[i]>=VI_FLOORB)goto err_out; - ci->floor_param[i]=_floor_P[ci->floor_type[i]]->unpack(vi,opb); - if(!ci->floor_param[i])goto err_out; - } - - /* residue backend settings */ - ci->residues=oggpack_read(opb,6)+1; - /*ci->residue_type=_ogg_malloc(ci->residues*sizeof(*ci->residue_type));*/ - /*ci->residue_param=_ogg_calloc(ci->residues,sizeof(void *));*/ - for(i=0;iresidues;i++){ - ci->residue_type[i]=oggpack_read(opb,16); - if(ci->residue_type[i]<0 || ci->residue_type[i]>=VI_RESB)goto err_out; - ci->residue_param[i]=_residue_P[ci->residue_type[i]]->unpack(vi,opb); - if(!ci->residue_param[i])goto err_out; - } - - /* map backend settings */ - ci->maps=oggpack_read(opb,6)+1; - /*ci->map_type=_ogg_malloc(ci->maps*sizeof(*ci->map_type));*/ - /*ci->map_param=_ogg_calloc(ci->maps,sizeof(void *));*/ - for(i=0;imaps;i++){ - ci->map_type[i]=oggpack_read(opb,16); - if(ci->map_type[i]<0 || ci->map_type[i]>=VI_MAPB)goto err_out; - ci->map_param[i]=_mapping_P[ci->map_type[i]]->unpack(vi,opb); - if(!ci->map_param[i])goto err_out; - } - - /* mode settings */ - ci->modes=oggpack_read(opb,6)+1; - /*vi->mode_param=_ogg_calloc(vi->modes,sizeof(void *));*/ - for(i=0;imodes;i++){ - ci->mode_param[i]=(vorbis_info_mode *)_ogg_calloc(1,sizeof(*ci->mode_param[i])); - ci->mode_param[i]->blockflag=oggpack_read(opb,1); - ci->mode_param[i]->windowtype=oggpack_read(opb,16); - ci->mode_param[i]->transformtype=oggpack_read(opb,16); - ci->mode_param[i]->mapping=oggpack_read(opb,8); - - if(ci->mode_param[i]->windowtype>=VI_WINDOWB)goto err_out; - if(ci->mode_param[i]->transformtype>=VI_WINDOWB)goto err_out; - if(ci->mode_param[i]->mapping>=ci->maps)goto err_out; - } - - if(oggpack_read(opb,1)!=1)goto err_out; /* top level EOP check */ - - return(0); - err_out: - vorbis_info_clear(vi); - return(OV_EBADHEADER); -} - -/* The Vorbis header is in three packets; the initial small packet in - the first page that identifies basic parameters, a second packet - with bitstream comments and a third packet that holds the - codebook. */ - -int vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc,ogg_packet *op){ - oggpack_buffer opb; - - if(op){ - oggpack_readinit(&opb,op->packet); - - /* Which of the three types of header is this? */ - /* Also verify header-ness, vorbis */ - { - char buffer[6]; - int packtype=oggpack_read(&opb,8); - memset(buffer,0,6); - _v_readstring(&opb,buffer,6); - if(memcmp(buffer,"vorbis",6)){ - /* not a vorbis header */ - return(OV_ENOTVORBIS); - } - switch(packtype){ - case 0x01: /* least significant *bit* is read first */ - if(!op->b_o_s){ - /* Not the initial packet */ - return(OV_EBADHEADER); - } - if(vi->rate!=0){ - /* previously initialized info header */ - return(OV_EBADHEADER); - } - - return(_vorbis_unpack_info(vi,&opb)); - - case 0x03: /* least significant *bit* is read first */ - if(vi->rate==0){ - /* um... we didn't get the initial header */ - return(OV_EBADHEADER); - } - - return(_vorbis_unpack_comment(vc,&opb)); - - case 0x05: /* least significant *bit* is read first */ - if(vi->rate==0 || vc->vendor==NULL){ - /* um... we didn;t get the initial header or comments yet */ - return(OV_EBADHEADER); - } - - return(_vorbis_unpack_books(vi,&opb)); - - default: - /* Not a valid vorbis header type */ - return(OV_EBADHEADER); - break; - } - } - } - return(OV_EBADHEADER); -} - diff --git a/wolf3d/newCode/Tremor/ivorbiscodec.h b/wolf3d/newCode/Tremor/ivorbiscodec.h deleted file mode 100644 index d4de1fd..0000000 --- a/wolf3d/newCode/Tremor/ivorbiscodec.h +++ /dev/null @@ -1,202 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: libvorbis codec headers - - ********************************************************************/ - -#ifndef _vorbis_codec_h_ -#define _vorbis_codec_h_ - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#include "ogg.h" - -typedef struct vorbis_info{ - int version; - int channels; - long rate; - - /* The below bitrate declarations are *hints*. - Combinations of the three values carry the following implications: - - all three set to the same value: - implies a fixed rate bitstream - only nominal set: - implies a VBR stream that averages the nominal bitrate. No hard - upper/lower limit - upper and or lower set: - implies a VBR bitstream that obeys the bitrate limits. nominal - may also be set to give a nominal rate. - none set: - the coder does not care to speculate. - */ - - long bitrate_upper; - long bitrate_nominal; - long bitrate_lower; - long bitrate_window; - - void *codec_setup; -} vorbis_info; - -/* vorbis_dsp_state buffers the current vorbis audio - analysis/synthesis state. The DSP state belongs to a specific - logical bitstream ****************************************************/ -typedef struct vorbis_dsp_state{ - int analysisp; - vorbis_info *vi; - - ogg_int32_t **pcm; - ogg_int32_t **pcmret; - int pcm_storage; - int pcm_current; - int pcm_returned; - - int preextrapolate; - int eofflag; - - long lW; - long W; - long nW; - long centerW; - - ogg_int64_t granulepos; - ogg_int64_t sequence; - - void *backend_state; -} vorbis_dsp_state; - -typedef struct vorbis_block{ - /* necessary stream state for linking to the framing abstraction */ - ogg_int32_t **pcm; /* this is a pointer into local storage */ - oggpack_buffer opb; - - long lW; - long W; - long nW; - int pcmend; - int mode; - - int eofflag; - ogg_int64_t granulepos; - ogg_int64_t sequence; - vorbis_dsp_state *vd; /* For read-only access of configuration */ - - /* local storage to avoid remallocing; it's up to the mapping to - structure it */ - void *localstore; - long localtop; - long localalloc; - long totaluse; - struct alloc_chain *reap; - -} vorbis_block; - -/* vorbis_block is a single block of data to be processed as part of -the analysis/synthesis stream; it belongs to a specific logical -bitstream, but is independant from other vorbis_blocks belonging to -that logical bitstream. *************************************************/ - -struct alloc_chain{ - void *ptr; - struct alloc_chain *next; -}; - -/* vorbis_info contains all the setup information specific to the - specific compression/decompression mode in progress (eg, - psychoacoustic settings, channel setup, options, codebook - etc). vorbis_info and substructures are in backends.h. -*********************************************************************/ - -/* the comments are not part of vorbis_info so that vorbis_info can be - static storage */ -typedef struct vorbis_comment{ - /* unlimited user comment fields. libvorbis writes 'libvorbis' - whatever vendor is set to in encode */ - char **user_comments; - int *comment_lengths; - int comments; - char *vendor; - -} vorbis_comment; - - -/* libvorbis encodes in two abstraction layers; first we perform DSP - and produce a packet (see docs/analysis.txt). The packet is then - coded into a framed OggSquish bitstream by the second layer (see - docs/framing.txt). Decode is the reverse process; we sync/frame - the bitstream and extract individual packets, then decode the - packet back into PCM audio. - - The extra framing/packetizing is used in streaming formats, such as - files. Over the net (such as with UDP), the framing and - packetization aren't necessary as they're provided by the transport - and the streaming layer is not used */ - -/* Vorbis PRIMITIVES: general ***************************************/ - -extern void vorbis_info_init(vorbis_info *vi); -extern void vorbis_info_clear(vorbis_info *vi); -extern int vorbis_info_blocksize(vorbis_info *vi,int zo); -extern void vorbis_comment_init(vorbis_comment *vc); -extern void vorbis_comment_add(vorbis_comment *vc, char *comment); -extern void vorbis_comment_add_tag(vorbis_comment *vc, - char *tag, char *contents); -extern char *vorbis_comment_query(vorbis_comment *vc, char *tag, int count); -extern int vorbis_comment_query_count(vorbis_comment *vc, char *tag); -extern void vorbis_comment_clear(vorbis_comment *vc); - -extern int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb); -extern int vorbis_block_clear(vorbis_block *vb); -extern void vorbis_dsp_clear(vorbis_dsp_state *v); - -/* Vorbis PRIMITIVES: synthesis layer *******************************/ -extern int vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc, - ogg_packet *op); - -extern int vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi); -extern int vorbis_synthesis_restart(vorbis_dsp_state *v); -extern int vorbis_synthesis(vorbis_block *vb,ogg_packet *op,int decodep); -extern int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb); -extern int vorbis_synthesis_pcmout(vorbis_dsp_state *v,ogg_int32_t ***pcm); -extern int vorbis_synthesis_read(vorbis_dsp_state *v,int samples); -extern long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op); - -/* Vorbis ERRORS and return codes ***********************************/ - -#define OV_FALSE -1 -#define OV_EOF -2 -#define OV_HOLE -3 - -#define OV_EREAD -128 -#define OV_EFAULT -129 -#define OV_EIMPL -130 -#define OV_EINVAL -131 -#define OV_ENOTVORBIS -132 -#define OV_EBADHEADER -133 -#define OV_EVERSION -134 -#define OV_ENOTAUDIO -135 -#define OV_EBADPACKET -136 -#define OV_EBADLINK -137 -#define OV_ENOSEEK -138 - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif - diff --git a/wolf3d/newCode/Tremor/ivorbisfile.h b/wolf3d/newCode/Tremor/ivorbisfile.h deleted file mode 100644 index dd77378..0000000 --- a/wolf3d/newCode/Tremor/ivorbisfile.h +++ /dev/null @@ -1,130 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: stdio-based convenience library for opening/seeking/decoding - - ********************************************************************/ - -#ifndef _OV_FILE_H_ -#define _OV_FILE_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#include -#include "ivorbiscodec.h" - -#define CHUNKSIZE 1024 -/* The function prototypes for the callbacks are basically the same as for - * the stdio functions fread, fseek, fclose, ftell. - * The one difference is that the FILE * arguments have been replaced with - * a void * - this is to be used as a pointer to whatever internal data these - * functions might need. In the stdio case, it's just a FILE * cast to a void * - * - * If you use other functions, check the docs for these functions and return - * the right values. For seek_func(), you *MUST* return -1 if the stream is - * unseekable - */ -typedef struct { - size_t (*read_func) (void *ptr, size_t size, size_t nmemb, void *datasource); - int (*seek_func) (void *datasource, ogg_int64_t offset, int whence); - int (*close_func) (void *datasource); - long (*tell_func) (void *datasource); -} ov_callbacks; - -#define NOTOPEN 0 -#define PARTOPEN 1 -#define OPENED 2 -#define STREAMSET 3 -#define INITSET 4 - -typedef struct OggVorbis_File { - void *datasource; /* Pointer to a FILE *, etc. */ - int seekable; - ogg_int64_t offset; - ogg_int64_t end; - ogg_sync_state *oy; - - /* If the FILE handle isn't seekable (eg, a pipe), only the current - stream appears */ - int links; - ogg_int64_t *offsets; - ogg_int64_t *dataoffsets; - ogg_uint32_t *serialnos; - ogg_int64_t *pcmlengths; - vorbis_info *vi; - vorbis_comment *vc; - - /* Decoding working state local storage */ - ogg_int64_t pcm_offset; - int ready_state; - ogg_uint32_t current_serialno; - int current_link; - - ogg_int64_t bittrack; - ogg_int64_t samptrack; - - ogg_stream_state *os; /* take physical pages, weld into a logical - stream of packets */ - vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */ - vorbis_block vb; /* local working space for packet->PCM decode */ - - ov_callbacks callbacks; - -} OggVorbis_File; - -extern int ov_clear(OggVorbis_File *vf); -extern int ov_open(FILE *f,OggVorbis_File *vf,char *initial,long ibytes); -extern int ov_open_callbacks(void *datasource, OggVorbis_File *vf, - char *initial, long ibytes, ov_callbacks callbacks); - -extern int ov_test(FILE *f,OggVorbis_File *vf,char *initial,long ibytes); -extern int ov_test_callbacks(void *datasource, OggVorbis_File *vf, - char *initial, long ibytes, ov_callbacks callbacks); -extern int ov_test_open(OggVorbis_File *vf); - -extern long ov_bitrate(OggVorbis_File *vf,int i); -extern long ov_bitrate_instant(OggVorbis_File *vf); -extern long ov_streams(OggVorbis_File *vf); -extern long ov_seekable(OggVorbis_File *vf); -extern long ov_serialnumber(OggVorbis_File *vf,int i); - -extern ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i); -extern ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i); -extern ogg_int64_t ov_time_total(OggVorbis_File *vf,int i); - -extern int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos); -extern int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos); -extern int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos); -extern int ov_time_seek(OggVorbis_File *vf,ogg_int64_t pos); -extern int ov_time_seek_page(OggVorbis_File *vf,ogg_int64_t pos); - -extern ogg_int64_t ov_raw_tell(OggVorbis_File *vf); -extern ogg_int64_t ov_pcm_tell(OggVorbis_File *vf); -extern ogg_int64_t ov_time_tell(OggVorbis_File *vf); - -extern vorbis_info *ov_info(OggVorbis_File *vf,int link); -extern vorbis_comment *ov_comment(OggVorbis_File *vf,int link); - -extern long ov_read(OggVorbis_File *vf,char *buffer,int length, - int *bitstream); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif - - diff --git a/wolf3d/newCode/Tremor/ivorbisfile_example.c b/wolf3d/newCode/Tremor/ivorbisfile_example.c deleted file mode 100644 index c99cfd2..0000000 --- a/wolf3d/newCode/Tremor/ivorbisfile_example.c +++ /dev/null @@ -1,86 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: simple example decoder using vorbisidec - - ********************************************************************/ - -/* Takes a vorbis bitstream from stdin and writes raw stereo PCM to - stdout using vorbisfile. Using vorbisfile is much simpler than - dealing with libvorbis. */ - -#include -#include -#include "ivorbiscodec.h" -#include "ivorbisfile.h" - -#ifdef _WIN32 /* We need the following two to set stdin/stdout to binary */ -#include -#include -#endif - -char pcmout[4096]; /* take 4k out of the data segment, not the stack */ - -int main(){ - OggVorbis_File vf; - int eof=0; - int current_section; - -#ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */ - /* Beware the evil ifdef. We avoid these where we can, but this one we - cannot. Don't add any more, you'll probably go to hell if you do. */ - _setmode( _fileno( stdin ), _O_BINARY ); - _setmode( _fileno( stdout ), _O_BINARY ); -#endif - - if(ov_open(stdin, &vf, NULL, 0) < 0) { - fprintf(stderr,"Input does not appear to be an Ogg bitstream.\n"); - exit(1); - } - - /* Throw the comments plus a few lines about the bitstream we're - decoding */ - { - char **ptr=ov_comment(&vf,-1)->user_comments; - vorbis_info *vi=ov_info(&vf,-1); - while(*ptr){ - fprintf(stderr,"%s\n",*ptr); - ++ptr; - } - fprintf(stderr,"\nBitstream is %d channel, %ldHz\n",vi->channels,vi->rate); - fprintf(stderr,"\nDecoded length: %ld samples\n", - (long)ov_pcm_total(&vf,-1)); - fprintf(stderr,"Encoded by: %s\n\n",ov_comment(&vf,-1)->vendor); - } - - while(!eof){ - long ret=ov_read(&vf,pcmout,sizeof(pcmout),¤t_section); - if (ret == 0) { - /* EOF */ - eof=1; - } else if (ret < 0) { - /* error in the stream. Not a problem, just reporting it in - case we (the app) cares. In this case, we don't. */ - } else { - /* we don't bother dealing with sample rate changes, etc, but - you'll have to*/ - fwrite(pcmout,1,ret,stdout); - } - } - - /* cleanup */ - ov_clear(&vf); - - fprintf(stderr,"Done.\n"); - return(0); -} diff --git a/wolf3d/newCode/Tremor/lsp_lookup.h b/wolf3d/newCode/Tremor/lsp_lookup.h deleted file mode 100644 index fa84851..0000000 --- a/wolf3d/newCode/Tremor/lsp_lookup.h +++ /dev/null @@ -1,136 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: lookup data - - ********************************************************************/ - -#ifndef _V_LOOKUP_DATA_H_ -#define _V_LOOKUP_DATA_H_ - -#include "os_types.h" - -#define FROMdB_LOOKUP_SZ 35 -#define FROMdB2_LOOKUP_SZ 32 -#define FROMdB_SHIFT 5 -#define FROMdB2_SHIFT 3 -#define FROMdB2_MASK 31 - -static const ogg_int32_t FROMdB_LOOKUP[FROMdB_LOOKUP_SZ]={ - 0x003fffff, 0x0028619b, 0x00197a96, 0x0010137a, - 0x000a24b0, 0x00066666, 0x000409c3, 0x00028c42, - 0x00019b8c, 0x000103ab, 0x0000a3d7, 0x00006760, - 0x0000413a, 0x00002928, 0x000019f8, 0x00001062, - 0x00000a56, 0x00000686, 0x0000041e, 0x00000299, - 0x000001a3, 0x00000109, 0x000000a7, 0x00000069, - 0x00000042, 0x0000002a, 0x0000001a, 0x00000011, - 0x0000000b, 0x00000007, 0x00000004, 0x00000003, - 0x00000002, 0x00000001, 0x00000001}; - -static const ogg_int32_t FROMdB2_LOOKUP[FROMdB2_LOOKUP_SZ]={ - 0x000001fc, 0x000001f5, 0x000001ee, 0x000001e7, - 0x000001e0, 0x000001d9, 0x000001d2, 0x000001cc, - 0x000001c5, 0x000001bf, 0x000001b8, 0x000001b2, - 0x000001ac, 0x000001a6, 0x000001a0, 0x0000019a, - 0x00000194, 0x0000018e, 0x00000188, 0x00000183, - 0x0000017d, 0x00000178, 0x00000172, 0x0000016d, - 0x00000168, 0x00000163, 0x0000015e, 0x00000159, - 0x00000154, 0x0000014f, 0x0000014a, 0x00000145, -}; - -#define INVSQ_LOOKUP_I_SHIFT 10 -#define INVSQ_LOOKUP_I_MASK 1023 -static const long INVSQ_LOOKUP_I[64+1]={ - 92682, 91966, 91267, 90583, - 89915, 89261, 88621, 87995, - 87381, 86781, 86192, 85616, - 85051, 84497, 83953, 83420, - 82897, 82384, 81880, 81385, - 80899, 80422, 79953, 79492, - 79039, 78594, 78156, 77726, - 77302, 76885, 76475, 76072, - 75674, 75283, 74898, 74519, - 74146, 73778, 73415, 73058, - 72706, 72359, 72016, 71679, - 71347, 71019, 70695, 70376, - 70061, 69750, 69444, 69141, - 68842, 68548, 68256, 67969, - 67685, 67405, 67128, 66855, - 66585, 66318, 66054, 65794, - 65536, -}; - -static const long INVSQ_LOOKUP_IDel[64]={ - 716, 699, 684, 668, - 654, 640, 626, 614, - 600, 589, 576, 565, - 554, 544, 533, 523, - 513, 504, 495, 486, - 477, 469, 461, 453, - 445, 438, 430, 424, - 417, 410, 403, 398, - 391, 385, 379, 373, - 368, 363, 357, 352, - 347, 343, 337, 332, - 328, 324, 319, 315, - 311, 306, 303, 299, - 294, 292, 287, 284, - 280, 277, 273, 270, - 267, 264, 260, 258, -}; - -#define COS_LOOKUP_I_SHIFT 9 -#define COS_LOOKUP_I_MASK 511 -#define COS_LOOKUP_I_SZ 128 -static const ogg_int32_t COS_LOOKUP_I[COS_LOOKUP_I_SZ+1]={ - 16384, 16379, 16364, 16340, - 16305, 16261, 16207, 16143, - 16069, 15986, 15893, 15791, - 15679, 15557, 15426, 15286, - 15137, 14978, 14811, 14635, - 14449, 14256, 14053, 13842, - 13623, 13395, 13160, 12916, - 12665, 12406, 12140, 11866, - 11585, 11297, 11003, 10702, - 10394, 10080, 9760, 9434, - 9102, 8765, 8423, 8076, - 7723, 7366, 7005, 6639, - 6270, 5897, 5520, 5139, - 4756, 4370, 3981, 3590, - 3196, 2801, 2404, 2006, - 1606, 1205, 804, 402, - 0, -401, -803, -1204, - -1605, -2005, -2403, -2800, - -3195, -3589, -3980, -4369, - -4755, -5138, -5519, -5896, - -6269, -6638, -7004, -7365, - -7722, -8075, -8422, -8764, - -9101, -9433, -9759, -10079, - -10393, -10701, -11002, -11296, - -11584, -11865, -12139, -12405, - -12664, -12915, -13159, -13394, - -13622, -13841, -14052, -14255, - -14448, -14634, -14810, -14977, - -15136, -15285, -15425, -15556, - -15678, -15790, -15892, -15985, - -16068, -16142, -16206, -16260, - -16304, -16339, -16363, -16378, - -16383, -}; - -#endif - - - - - diff --git a/wolf3d/newCode/Tremor/mapping0.c b/wolf3d/newCode/Tremor/mapping0.c deleted file mode 100644 index c54c896..0000000 --- a/wolf3d/newCode/Tremor/mapping0.c +++ /dev/null @@ -1,322 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: channel mapping 0 implementation - - ********************************************************************/ - -#include -#include -#include -#include -#include "ogg.h" -#include "ivorbiscodec.h" -#include "mdct.h" -#include "codec_internal.h" -#include "codebook.h" -#include "window.h" -#include "registry.h" -#include "misc.h" - -/* simplistic, wasteful way of doing this (unique lookup for each - mode/submapping); there should be a central repository for - identical lookups. That will require minor work, so I'm putting it - off as low priority. - - Why a lookup for each backend in a given mode? Because the - blocksize is set by the mode, and low backend lookups may require - parameters from other areas of the mode/mapping */ - -typedef struct { - vorbis_info_mode *mode; - vorbis_info_mapping0 *map; - - vorbis_look_floor **floor_look; - - vorbis_look_residue **residue_look; - - vorbis_func_floor **floor_func; - vorbis_func_residue **residue_func; - - int ch; - long lastframe; /* if a different mode is called, we need to - invalidate decay */ -} vorbis_look_mapping0; - -static void mapping0_free_info(vorbis_info_mapping *i){ - vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)i; - if(info){ - memset(info,0,sizeof(*info)); - _ogg_free(info); - } -} - -static void mapping0_free_look(vorbis_look_mapping *look){ - int i; - vorbis_look_mapping0 *l=(vorbis_look_mapping0 *)look; - if(l){ - - for(i=0;imap->submaps;i++){ - l->floor_func[i]->free_look(l->floor_look[i]); - l->residue_func[i]->free_look(l->residue_look[i]); - } - - _ogg_free(l->floor_func); - _ogg_free(l->residue_func); - _ogg_free(l->floor_look); - _ogg_free(l->residue_look); - memset(l,0,sizeof(*l)); - _ogg_free(l); - } -} - -static vorbis_look_mapping *mapping0_look(vorbis_dsp_state *vd,vorbis_info_mode *vm, - vorbis_info_mapping *m){ - int i; - vorbis_info *vi=vd->vi; - codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; - vorbis_look_mapping0 *look=(vorbis_look_mapping0 *)_ogg_calloc(1,sizeof(*look)); - vorbis_info_mapping0 *info=look->map=(vorbis_info_mapping0 *)m; - look->mode=vm; - - look->floor_look=(vorbis_look_floor **)_ogg_calloc(info->submaps,sizeof(*look->floor_look)); - - look->residue_look=(vorbis_look_residue **)_ogg_calloc(info->submaps,sizeof(*look->residue_look)); - - look->floor_func=(vorbis_func_floor **)_ogg_calloc(info->submaps,sizeof(*look->floor_func)); - look->residue_func=(vorbis_func_residue **)_ogg_calloc(info->submaps,sizeof(*look->residue_func)); - - for(i=0;isubmaps;i++){ - int floornum=info->floorsubmap[i]; - int resnum=info->residuesubmap[i]; - - look->floor_func[i]=_floor_P[ci->floor_type[floornum]]; - look->floor_look[i]=look->floor_func[i]-> - look(vd,vm,ci->floor_param[floornum]); - look->residue_func[i]=_residue_P[ci->residue_type[resnum]]; - look->residue_look[i]=look->residue_func[i]-> - look(vd,vm,ci->residue_param[resnum]); - - } - - look->ch=vi->channels; - - return(look); -} - -static int ilog(unsigned int v){ - int ret=0; - if(v)--v; - while(v){ - ret++; - v>>=1; - } - return(ret); -} - -/* also responsible for range checking */ -static vorbis_info_mapping *mapping0_unpack(vorbis_info *vi,oggpack_buffer *opb){ - int i; - vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)_ogg_calloc(1,sizeof(*info)); - codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; - memset(info,0,sizeof(*info)); - - if(oggpack_read(opb,1)) - info->submaps=oggpack_read(opb,4)+1; - else - info->submaps=1; - - if(oggpack_read(opb,1)){ - info->coupling_steps=oggpack_read(opb,8)+1; - - for(i=0;icoupling_steps;i++){ - int testM=info->coupling_mag[i]=oggpack_read(opb,ilog(vi->channels)); - int testA=info->coupling_ang[i]=oggpack_read(opb,ilog(vi->channels)); - - if(testM<0 || - testA<0 || - testM==testA || - testM>=vi->channels || - testA>=vi->channels) goto err_out; - } - - } - - if(oggpack_read(opb,2)>0)goto err_out; /* 2,3:reserved */ - - if(info->submaps>1){ - for(i=0;ichannels;i++){ - info->chmuxlist[i]=oggpack_read(opb,4); - if(info->chmuxlist[i]>=info->submaps)goto err_out; - } - } - for(i=0;isubmaps;i++){ - int temp=oggpack_read(opb,8); - if(temp>=ci->times)goto err_out; - info->floorsubmap[i]=oggpack_read(opb,8); - if(info->floorsubmap[i]>=ci->floors)goto err_out; - info->residuesubmap[i]=oggpack_read(opb,8); - if(info->residuesubmap[i]>=ci->residues)goto err_out; - } - - return info; - - err_out: - mapping0_free_info(info); - return(NULL); -} - -static int seq=0; -static int mapping0_inverse(vorbis_block *vb,vorbis_look_mapping *l){ - vorbis_dsp_state *vd=vb->vd; - vorbis_info *vi=vd->vi; - codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; - private_state *b=(private_state *)vd->backend_state; - vorbis_look_mapping0 *look=(vorbis_look_mapping0 *)l; - vorbis_info_mapping0 *info=look->map; - - int i,j; - long n=vb->pcmend=ci->blocksizes[vb->W]; - - ogg_int32_t **pcmbundle=(ogg_int32_t **)alloca(sizeof(*pcmbundle)*vi->channels); - int *zerobundle=(int *)alloca(sizeof(*zerobundle)*vi->channels); - - int *nonzero =(int *)alloca(sizeof(*nonzero)*vi->channels); - void **floormemo=(void **)alloca(sizeof(*floormemo)*vi->channels); - - /* time domain information decode (note that applying the - information would have to happen later; we'll probably add a - function entry to the harness for that later */ - /* NOT IMPLEMENTED */ - - /* recover the spectral envelope; store it in the PCM vector for now */ - for(i=0;ichannels;i++){ - int submap=info->chmuxlist[i]; - floormemo[i]=look->floor_func[submap]-> - inverse1(vb,look->floor_look[submap]); - if(floormemo[i]) - nonzero[i]=1; - else - nonzero[i]=0; - memset(vb->pcm[i],0,sizeof(*vb->pcm[i])*n/2); - } - - /* channel coupling can 'dirty' the nonzero listing */ - for(i=0;icoupling_steps;i++){ - if(nonzero[info->coupling_mag[i]] || - nonzero[info->coupling_ang[i]]){ - nonzero[info->coupling_mag[i]]=1; - nonzero[info->coupling_ang[i]]=1; - } - } - - /* recover the residue into our working vectors */ - for(i=0;isubmaps;i++){ - int ch_in_bundle=0; - for(j=0;jchannels;j++){ - if(info->chmuxlist[j]==i){ - if(nonzero[j]) - zerobundle[ch_in_bundle]=1; - else - zerobundle[ch_in_bundle]=0; - pcmbundle[ch_in_bundle++]=vb->pcm[j]; - } - } - - look->residue_func[i]->inverse(vb,look->residue_look[i], - pcmbundle,zerobundle,ch_in_bundle); - } - - //for(j=0;jchannels;j++) - //_analysis_output("coupled",seq+j,vb->pcm[j],-8,n/2,0,0); - - - /* channel coupling */ - for(i=info->coupling_steps-1;i>=0;i--){ - ogg_int32_t *pcmM=vb->pcm[info->coupling_mag[i]]; - ogg_int32_t *pcmA=vb->pcm[info->coupling_ang[i]]; - - for(j=0;j0) - if(ang>0){ - pcmM[j]=mag; - pcmA[j]=mag-ang; - }else{ - pcmA[j]=mag; - pcmM[j]=mag+ang; - } - else - if(ang>0){ - pcmM[j]=mag; - pcmA[j]=mag+ang; - }else{ - pcmA[j]=mag; - pcmM[j]=mag-ang; - } - } - } - - //for(j=0;jchannels;j++) - //_analysis_output("residue",seq+j,vb->pcm[j],-8,n/2,0,0); - - /* compute and apply spectral envelope */ - for(i=0;ichannels;i++){ - ogg_int32_t *pcm=vb->pcm[i]; - int submap=info->chmuxlist[i]; - look->floor_func[submap]-> - inverse2(vb,look->floor_look[submap],floormemo[i],pcm); - } - - //for(j=0;jchannels;j++) - //_analysis_output("mdct",seq+j,vb->pcm[j],-24,n/2,0,1); - - /* transform the PCM data; takes PCM vector, vb; modifies PCM vector */ - /* only MDCT right now.... */ - for(i=0;ichannels;i++){ - ogg_int32_t *pcm=vb->pcm[i]; - mdct_backward(n,pcm,pcm); - } - - //for(j=0;jchannels;j++) - //_analysis_output("imdct",seq+j,vb->pcm[j],-24,n,0,0); - - /* window the data */ - for(i=0;ichannels;i++){ - ogg_int32_t *pcm=vb->pcm[i]; - if(nonzero[i]) - _vorbis_apply_window(pcm,b->window,ci->blocksizes,vb->lW,vb->W,vb->nW); - else - for(j=0;jchannels;j++) - //_analysis_output("window",seq+j,vb->pcm[j],-24,n,0,0); - - seq+=vi->channels; - /* all done! */ - return(0); -} - -/* export hooks */ -vorbis_func_mapping mapping0_exportbundle={ - &mapping0_unpack, - &mapping0_look, - &mapping0_free_info, - &mapping0_free_look, - &mapping0_inverse -}; diff --git a/wolf3d/newCode/Tremor/mdct.c b/wolf3d/newCode/Tremor/mdct.c deleted file mode 100644 index 4f39e7d..0000000 --- a/wolf3d/newCode/Tremor/mdct.c +++ /dev/null @@ -1,510 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: normalized modified discrete cosine transform - power of two length transform only [64 <= n ] - last mod: $Id: mdct.c,v 1.9 2002/10/16 09:17:39 xiphmont Exp $ - - Original algorithm adapted long ago from _The use of multirate filter - banks for coding of high quality digital audio_, by T. Sporer, - K. Brandenburg and B. Edler, collection of the European Signal - Processing Conference (EUSIPCO), Amsterdam, June 1992, Vol.1, pp - 211-214 - - The below code implements an algorithm that no longer looks much like - that presented in the paper, but the basic structure remains if you - dig deep enough to see it. - - This module DOES NOT INCLUDE code to generate/apply the window - function. Everybody has their own weird favorite including me... I - happen to like the properties of y=sin(.5PI*sin^2(x)), but others may - vehemently disagree. - - ********************************************************************/ - -#include "ivorbiscodec.h" -#include "codebook.h" -#include "misc.h" -#include "mdct.h" -#include "mdct_lookup.h" - - -/* 8 point butterfly (in place) */ -STIN void mdct_butterfly_8(DATA_TYPE *x){ - - REG_TYPE r0 = x[4] + x[0]; - REG_TYPE r1 = x[4] - x[0]; - REG_TYPE r2 = x[5] + x[1]; - REG_TYPE r3 = x[5] - x[1]; - REG_TYPE r4 = x[6] + x[2]; - REG_TYPE r5 = x[6] - x[2]; - REG_TYPE r6 = x[7] + x[3]; - REG_TYPE r7 = x[7] - x[3]; - - x[0] = r5 + r3; - x[1] = r7 - r1; - x[2] = r5 - r3; - x[3] = r7 + r1; - x[4] = r4 - r0; - x[5] = r6 - r2; - x[6] = r4 + r0; - x[7] = r6 + r2; - MB(); -} - -/* 16 point butterfly (in place, 4 register) */ -STIN void mdct_butterfly_16(DATA_TYPE *x){ - - REG_TYPE r0, r1; - - r0 = x[ 0] - x[ 8]; x[ 8] += x[ 0]; - r1 = x[ 1] - x[ 9]; x[ 9] += x[ 1]; - x[ 0] = MULT31((r0 + r1) , cPI2_8); - x[ 1] = MULT31((r1 - r0) , cPI2_8); - MB(); - - r0 = x[10] - x[ 2]; x[10] += x[ 2]; - r1 = x[ 3] - x[11]; x[11] += x[ 3]; - x[ 2] = r1; x[ 3] = r0; - MB(); - - r0 = x[12] - x[ 4]; x[12] += x[ 4]; - r1 = x[13] - x[ 5]; x[13] += x[ 5]; - x[ 4] = MULT31((r0 - r1) , cPI2_8); - x[ 5] = MULT31((r0 + r1) , cPI2_8); - MB(); - - r0 = x[14] - x[ 6]; x[14] += x[ 6]; - r1 = x[15] - x[ 7]; x[15] += x[ 7]; - x[ 6] = r0; x[ 7] = r1; - MB(); - - mdct_butterfly_8(x); - mdct_butterfly_8(x+8); -} - -/* 32 point butterfly (in place, 4 register) */ -STIN void mdct_butterfly_32(DATA_TYPE *x){ - - REG_TYPE r0, r1; - - r0 = x[30] - x[14]; x[30] += x[14]; - r1 = x[31] - x[15]; x[31] += x[15]; - x[14] = r0; x[15] = r1; - MB(); - - r0 = x[28] - x[12]; x[28] += x[12]; - r1 = x[29] - x[13]; x[29] += x[13]; - XNPROD31( r0, r1, cPI1_8, cPI3_8, &x[12], &x[13] ); - MB(); - - r0 = x[26] - x[10]; x[26] += x[10]; - r1 = x[27] - x[11]; x[27] += x[11]; - x[10] = MULT31((r0 - r1) , cPI2_8); - x[11] = MULT31((r0 + r1) , cPI2_8); - MB(); - - r0 = x[24] - x[ 8]; x[24] += x[ 8]; - r1 = x[25] - x[ 9]; x[25] += x[ 9]; - XNPROD31( r0, r1, cPI3_8, cPI1_8, &x[ 8], &x[ 9] ); - MB(); - - r0 = x[22] - x[ 6]; x[22] += x[ 6]; - r1 = x[ 7] - x[23]; x[23] += x[ 7]; - x[ 6] = r1; x[ 7] = r0; - MB(); - - r0 = x[ 4] - x[20]; x[20] += x[ 4]; - r1 = x[ 5] - x[21]; x[21] += x[ 5]; - XPROD31 ( r0, r1, cPI3_8, cPI1_8, &x[ 4], &x[ 5] ); - MB(); - - r0 = x[ 2] - x[18]; x[18] += x[ 2]; - r1 = x[ 3] - x[19]; x[19] += x[ 3]; - x[ 2] = MULT31((r1 + r0) , cPI2_8); - x[ 3] = MULT31((r1 - r0) , cPI2_8); - MB(); - - r0 = x[ 0] - x[16]; x[16] += x[ 0]; - r1 = x[ 1] - x[17]; x[17] += x[ 1]; - XPROD31 ( r0, r1, cPI1_8, cPI3_8, &x[ 0], &x[ 1] ); - MB(); - - mdct_butterfly_16(x); - mdct_butterfly_16(x+16); -} - -/* N/stage point generic N stage butterfly (in place, 2 register) */ -STIN void mdct_butterfly_generic(DATA_TYPE *x,int points,int step){ - - LOOKUP_T *T = sincos_lookup0; - DATA_TYPE *x1 = x + points - 8; - DATA_TYPE *x2 = x + (points>>1) - 8; - REG_TYPE r0; - REG_TYPE r1; - - do{ - r0 = x1[6] - x2[6]; x1[6] += x2[6]; - r1 = x2[7] - x1[7]; x1[7] += x2[7]; - XPROD31( r1, r0, T[0], T[1], &x2[6], &x2[7] ); T+=step; - - r0 = x1[4] - x2[4]; x1[4] += x2[4]; - r1 = x2[5] - x1[5]; x1[5] += x2[5]; - XPROD31( r1, r0, T[0], T[1], &x2[4], &x2[5] ); T+=step; - - r0 = x1[2] - x2[2]; x1[2] += x2[2]; - r1 = x2[3] - x1[3]; x1[3] += x2[3]; - XPROD31( r1, r0, T[0], T[1], &x2[2], &x2[3] ); T+=step; - - r0 = x1[0] - x2[0]; x1[0] += x2[0]; - r1 = x2[1] - x1[1]; x1[1] += x2[1]; - XPROD31( r1, r0, T[0], T[1], &x2[0], &x2[1] ); T+=step; - - x1-=8; x2-=8; - }while(Tsincos_lookup0); - do{ - r0 = x2[6] - x1[6]; x1[6] += x2[6]; - r1 = x2[7] - x1[7]; x1[7] += x2[7]; - XPROD31( r0, r1, T[0], T[1], &x2[6], &x2[7] ); T+=step; - - r0 = x2[4] - x1[4]; x1[4] += x2[4]; - r1 = x2[5] - x1[5]; x1[5] += x2[5]; - XPROD31( r0, r1, T[0], T[1], &x2[4], &x2[5] ); T+=step; - - r0 = x2[2] - x1[2]; x1[2] += x2[2]; - r1 = x2[3] - x1[3]; x1[3] += x2[3]; - XPROD31( r0, r1, T[0], T[1], &x2[2], &x2[3] ); T+=step; - - r0 = x2[0] - x1[0]; x1[0] += x2[0]; - r1 = x2[1] - x1[1]; x1[1] += x2[1]; - XPROD31( r0, r1, T[0], T[1], &x2[0], &x2[1] ); T+=step; - - x1-=8; x2-=8; - }while(Tsincos_lookup0); -} - -STIN void mdct_butterflies(DATA_TYPE *x,int points,int shift){ - - int stages=8-shift; - int i,j; - - for(i=0;--stages>0;i++){ - for(j=0;j<(1<>i)*j,points>>i,4<<(i+shift)); - } - - for(j=0;j>8]|(bitrev[(x&0x0f0)>>4]<<4)|(((int)bitrev[x&0x00f])<<8); -} - -STIN void mdct_bitreverse(DATA_TYPE *x,int n,int step,int shift){ - - int bit = 0; - DATA_TYPE *w0 = x; - DATA_TYPE *w1 = x = w0+(n>>1); - LOOKUP_T *T = (step>=4)?(sincos_lookup0+(step>>1)):sincos_lookup1; - LOOKUP_T *Ttop = T+1024; - DATA_TYPE r2; - - do{ - DATA_TYPE r3 = bitrev12(bit++); - DATA_TYPE *x0 = x + ((r3 ^ 0xfff)>>shift) -1; - DATA_TYPE *x1 = x + (r3>>shift); - - REG_TYPE r0 = x0[0] + x1[0]; - REG_TYPE r1 = x1[1] - x0[1]; - - XPROD32( r0, r1, T[1], T[0], &r2, &r3 ); T+=step; - - w1 -= 4; - - r0 = (x0[1] + x1[1])>>1; - r1 = (x0[0] - x1[0])>>1; - w0[0] = r0 + r2; - w0[1] = r1 + r3; - w1[2] = r0 - r2; - w1[3] = r3 - r1; - - r3 = bitrev12(bit++); - x0 = x + ((r3 ^ 0xfff)>>shift) -1; - x1 = x + (r3>>shift); - - r0 = x0[0] + x1[0]; - r1 = x1[1] - x0[1]; - - XPROD32( r0, r1, T[1], T[0], &r2, &r3 ); T+=step; - - r0 = (x0[1] + x1[1])>>1; - r1 = (x0[0] - x1[0])>>1; - w0[2] = r0 + r2; - w0[3] = r1 + r3; - w1[0] = r0 - r2; - w1[1] = r3 - r1; - - w0 += 4; - }while(T>shift) -1; - DATA_TYPE *x1 = x + (r3>>shift); - - REG_TYPE r0 = x0[0] + x1[0]; - REG_TYPE r1 = x1[1] - x0[1]; - - T-=step; XPROD32( r0, r1, T[0], T[1], &r2, &r3 ); - - w1 -= 4; - - r0 = (x0[1] + x1[1])>>1; - r1 = (x0[0] - x1[0])>>1; - w0[0] = r0 + r2; - w0[1] = r1 + r3; - w1[2] = r0 - r2; - w1[3] = r3 - r1; - - r3 = bitrev12(bit++); - x0 = x + ((r3 ^ 0xfff)>>shift) -1; - x1 = x + (r3>>shift); - - r0 = x0[0] + x1[0]; - r1 = x1[1] - x0[1]; - - T-=step; XPROD32( r0, r1, T[0], T[1], &r2, &r3 ); - - r0 = (x0[1] + x1[1])>>1; - r1 = (x0[0] - x1[0])>>1; - w0[2] = r0 + r2; - w0[3] = r1 + r3; - w1[0] = r0 - r2; - w1[1] = r3 - r1; - - w0 += 4; - }while(w0>1; - int n4=n>>2; - DATA_TYPE *iX; - DATA_TYPE *oX; - LOOKUP_T *T; - LOOKUP_T *V; - int shift; - int step; - - for (shift=6;!(n&(1<=in+n4); - do{ - oX-=4; - XPROD31( iX[4], iX[6], T[1], T[0], &oX[2], &oX[3] ); T-=step; - XPROD31( iX[0], iX[2], T[1], T[0], &oX[0], &oX[1] ); T-=step; - iX-=8; - }while(iX>=in); - - iX = in+n2-8; - oX = out+n2+n4; - T = sincos_lookup0; - - do{ - T+=step; XNPROD31( iX[6], iX[4], T[0], T[1], &oX[0], &oX[1] ); - T+=step; XNPROD31( iX[2], iX[0], T[0], T[1], &oX[2], &oX[3] ); - iX-=8; - oX+=4; - }while(iX>=in+n4); - do{ - T-=step; XNPROD31( iX[6], iX[4], T[1], T[0], &oX[0], &oX[1] ); - T-=step; XNPROD31( iX[2], iX[0], T[1], T[0], &oX[2], &oX[3] ); - iX-=8; - oX+=4; - }while(iX>=in); - - mdct_butterflies(out+n2,n2,shift); - mdct_bitreverse(out,n,step,shift); - - /* rotate + window */ - - step>>=2; - { - DATA_TYPE *oX1=out+n2+n4; - DATA_TYPE *oX2=out+n2+n4; - DATA_TYPE *iX =out; - - switch(step) { - default: { - T=(step>=4)?(sincos_lookup0+(step>>1)):sincos_lookup1; - do{ - oX1-=4; - XPROD31( iX[0], -iX[1], T[0], T[1], &oX1[3], &oX2[0] ); T+=step; - XPROD31( iX[2], -iX[3], T[0], T[1], &oX1[2], &oX2[1] ); T+=step; - XPROD31( iX[4], -iX[5], T[0], T[1], &oX1[1], &oX2[2] ); T+=step; - XPROD31( iX[6], -iX[7], T[0], T[1], &oX1[0], &oX2[3] ); T+=step; - oX2+=4; - iX+=8; - }while(iX>1; - t1 = (*T++)>>1; - do{ - oX1-=4; - - t0 += (v0 = (*V++)>>1); - t1 += (v1 = (*V++)>>1); - XPROD31( iX[0], -iX[1], t0, t1, &oX1[3], &oX2[0] ); - v0 += (t0 = (*T++)>>1); - v1 += (t1 = (*T++)>>1); - XPROD31( iX[2], -iX[3], v0, v1, &oX1[2], &oX2[1] ); - t0 += (v0 = (*V++)>>1); - t1 += (v1 = (*V++)>>1); - XPROD31( iX[4], -iX[5], t0, t1, &oX1[1], &oX2[2] ); - v0 += (t0 = (*T++)>>1); - v1 += (t1 = (*T++)>>1); - XPROD31( iX[6], -iX[7], v0, v1, &oX1[0], &oX2[3] ); - - oX2+=4; - iX+=8; - }while(iX>2); - t1 += (q1 = (v1-t1)>>2); - XPROD31( iX[0], -iX[1], t0, t1, &oX1[3], &oX2[0] ); - t0 = v0-q0; - t1 = v1-q1; - XPROD31( iX[2], -iX[3], t0, t1, &oX1[2], &oX2[1] ); - - t0 = *T++; - t1 = *T++; - v0 += (q0 = (t0-v0)>>2); - v1 += (q1 = (t1-v1)>>2); - XPROD31( iX[4], -iX[5], v0, v1, &oX1[1], &oX2[2] ); - v0 = t0-q0; - v1 = t1-q1; - XPROD31( iX[6], -iX[7], v0, v1, &oX1[0], &oX2[3] ); - - oX2+=4; - iX+=8; - }while(iXoX2); - } -} - diff --git a/wolf3d/newCode/Tremor/mdct.h b/wolf3d/newCode/Tremor/mdct.h deleted file mode 100644 index 6d88907..0000000 --- a/wolf3d/newCode/Tremor/mdct.h +++ /dev/null @@ -1,52 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: modified discrete cosine transform prototypes - - ********************************************************************/ - -#ifndef _OGG_mdct_H_ -#define _OGG_mdct_H_ - -#include "ivorbiscodec.h" -#include "misc.h" - -#define DATA_TYPE ogg_int32_t -#define REG_TYPE register ogg_int32_t - -#ifdef _LOW_ACCURACY_ -#define cPI3_8 (0x0062) -#define cPI2_8 (0x00b5) -#define cPI1_8 (0x00ed) -#else -#define cPI3_8 (0x30fbc54d) -#define cPI2_8 (0x5a82799a) -#define cPI1_8 (0x7641af3d) -#endif - -extern void mdct_forward(int n, DATA_TYPE *in, DATA_TYPE *out); -extern void mdct_backward(int n, DATA_TYPE *in, DATA_TYPE *out); - -#endif - - - - - - - - - - - - diff --git a/wolf3d/newCode/Tremor/mdct_lookup.h b/wolf3d/newCode/Tremor/mdct_lookup.h deleted file mode 100644 index 970e199..0000000 --- a/wolf3d/newCode/Tremor/mdct_lookup.h +++ /dev/null @@ -1,540 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: sin,cos lookup tables - - ********************************************************************/ - -#include "os_types.h" - -/* {sin(2*i*PI/4096), cos(2*i*PI/4096)}, with i = 0 to 512 */ -static LOOKUP_T sincos_lookup0[1026] = { - X(0x00000000), X(0x7fffffff), X(0x003243f5), X(0x7ffff621), - X(0x006487e3), X(0x7fffd886), X(0x0096cbc1), X(0x7fffa72c), - X(0x00c90f88), X(0x7fff6216), X(0x00fb5330), X(0x7fff0943), - X(0x012d96b1), X(0x7ffe9cb2), X(0x015fda03), X(0x7ffe1c65), - X(0x01921d20), X(0x7ffd885a), X(0x01c45ffe), X(0x7ffce093), - X(0x01f6a297), X(0x7ffc250f), X(0x0228e4e2), X(0x7ffb55ce), - X(0x025b26d7), X(0x7ffa72d1), X(0x028d6870), X(0x7ff97c18), - X(0x02bfa9a4), X(0x7ff871a2), X(0x02f1ea6c), X(0x7ff75370), - X(0x03242abf), X(0x7ff62182), X(0x03566a96), X(0x7ff4dbd9), - X(0x0388a9ea), X(0x7ff38274), X(0x03bae8b2), X(0x7ff21553), - X(0x03ed26e6), X(0x7ff09478), X(0x041f6480), X(0x7feeffe1), - X(0x0451a177), X(0x7fed5791), X(0x0483ddc3), X(0x7feb9b85), - X(0x04b6195d), X(0x7fe9cbc0), X(0x04e8543e), X(0x7fe7e841), - X(0x051a8e5c), X(0x7fe5f108), X(0x054cc7b1), X(0x7fe3e616), - X(0x057f0035), X(0x7fe1c76b), X(0x05b137df), X(0x7fdf9508), - X(0x05e36ea9), X(0x7fdd4eec), X(0x0615a48b), X(0x7fdaf519), - X(0x0647d97c), X(0x7fd8878e), X(0x067a0d76), X(0x7fd6064c), - X(0x06ac406f), X(0x7fd37153), X(0x06de7262), X(0x7fd0c8a3), - X(0x0710a345), X(0x7fce0c3e), X(0x0742d311), X(0x7fcb3c23), - X(0x077501be), X(0x7fc85854), X(0x07a72f45), X(0x7fc560cf), - X(0x07d95b9e), X(0x7fc25596), X(0x080b86c2), X(0x7fbf36aa), - X(0x083db0a7), X(0x7fbc040a), X(0x086fd947), X(0x7fb8bdb8), - X(0x08a2009a), X(0x7fb563b3), X(0x08d42699), X(0x7fb1f5fc), - X(0x09064b3a), X(0x7fae7495), X(0x09386e78), X(0x7faadf7c), - X(0x096a9049), X(0x7fa736b4), X(0x099cb0a7), X(0x7fa37a3c), - X(0x09cecf89), X(0x7f9faa15), X(0x0a00ece8), X(0x7f9bc640), - X(0x0a3308bd), X(0x7f97cebd), X(0x0a6522fe), X(0x7f93c38c), - X(0x0a973ba5), X(0x7f8fa4b0), X(0x0ac952aa), X(0x7f8b7227), - X(0x0afb6805), X(0x7f872bf3), X(0x0b2d7baf), X(0x7f82d214), - X(0x0b5f8d9f), X(0x7f7e648c), X(0x0b919dcf), X(0x7f79e35a), - X(0x0bc3ac35), X(0x7f754e80), X(0x0bf5b8cb), X(0x7f70a5fe), - X(0x0c27c389), X(0x7f6be9d4), X(0x0c59cc68), X(0x7f671a05), - X(0x0c8bd35e), X(0x7f62368f), X(0x0cbdd865), X(0x7f5d3f75), - X(0x0cefdb76), X(0x7f5834b7), X(0x0d21dc87), X(0x7f531655), - X(0x0d53db92), X(0x7f4de451), X(0x0d85d88f), X(0x7f489eaa), - X(0x0db7d376), X(0x7f434563), X(0x0de9cc40), X(0x7f3dd87c), - X(0x0e1bc2e4), X(0x7f3857f6), X(0x0e4db75b), X(0x7f32c3d1), - X(0x0e7fa99e), X(0x7f2d1c0e), X(0x0eb199a4), X(0x7f2760af), - X(0x0ee38766), X(0x7f2191b4), X(0x0f1572dc), X(0x7f1baf1e), - X(0x0f475bff), X(0x7f15b8ee), X(0x0f7942c7), X(0x7f0faf25), - X(0x0fab272b), X(0x7f0991c4), X(0x0fdd0926), X(0x7f0360cb), - X(0x100ee8ad), X(0x7efd1c3c), X(0x1040c5bb), X(0x7ef6c418), - X(0x1072a048), X(0x7ef05860), X(0x10a4784b), X(0x7ee9d914), - X(0x10d64dbd), X(0x7ee34636), X(0x11082096), X(0x7edc9fc6), - X(0x1139f0cf), X(0x7ed5e5c6), X(0x116bbe60), X(0x7ecf1837), - X(0x119d8941), X(0x7ec8371a), X(0x11cf516a), X(0x7ec14270), - X(0x120116d5), X(0x7eba3a39), X(0x1232d979), X(0x7eb31e78), - X(0x1264994e), X(0x7eabef2c), X(0x1296564d), X(0x7ea4ac58), - X(0x12c8106f), X(0x7e9d55fc), X(0x12f9c7aa), X(0x7e95ec1a), - X(0x132b7bf9), X(0x7e8e6eb2), X(0x135d2d53), X(0x7e86ddc6), - X(0x138edbb1), X(0x7e7f3957), X(0x13c0870a), X(0x7e778166), - X(0x13f22f58), X(0x7e6fb5f4), X(0x1423d492), X(0x7e67d703), - X(0x145576b1), X(0x7e5fe493), X(0x148715ae), X(0x7e57dea7), - X(0x14b8b17f), X(0x7e4fc53e), X(0x14ea4a1f), X(0x7e47985b), - X(0x151bdf86), X(0x7e3f57ff), X(0x154d71aa), X(0x7e37042a), - X(0x157f0086), X(0x7e2e9cdf), X(0x15b08c12), X(0x7e26221f), - X(0x15e21445), X(0x7e1d93ea), X(0x16139918), X(0x7e14f242), - X(0x16451a83), X(0x7e0c3d29), X(0x1676987f), X(0x7e0374a0), - X(0x16a81305), X(0x7dfa98a8), X(0x16d98a0c), X(0x7df1a942), - X(0x170afd8d), X(0x7de8a670), X(0x173c6d80), X(0x7ddf9034), - X(0x176dd9de), X(0x7dd6668f), X(0x179f429f), X(0x7dcd2981), - X(0x17d0a7bc), X(0x7dc3d90d), X(0x1802092c), X(0x7dba7534), - X(0x183366e9), X(0x7db0fdf8), X(0x1864c0ea), X(0x7da77359), - X(0x18961728), X(0x7d9dd55a), X(0x18c7699b), X(0x7d9423fc), - X(0x18f8b83c), X(0x7d8a5f40), X(0x192a0304), X(0x7d808728), - X(0x195b49ea), X(0x7d769bb5), X(0x198c8ce7), X(0x7d6c9ce9), - X(0x19bdcbf3), X(0x7d628ac6), X(0x19ef0707), X(0x7d58654d), - X(0x1a203e1b), X(0x7d4e2c7f), X(0x1a517128), X(0x7d43e05e), - X(0x1a82a026), X(0x7d3980ec), X(0x1ab3cb0d), X(0x7d2f0e2b), - X(0x1ae4f1d6), X(0x7d24881b), X(0x1b161479), X(0x7d19eebf), - X(0x1b4732ef), X(0x7d0f4218), X(0x1b784d30), X(0x7d048228), - X(0x1ba96335), X(0x7cf9aef0), X(0x1bda74f6), X(0x7ceec873), - X(0x1c0b826a), X(0x7ce3ceb2), X(0x1c3c8b8c), X(0x7cd8c1ae), - X(0x1c6d9053), X(0x7ccda169), X(0x1c9e90b8), X(0x7cc26de5), - X(0x1ccf8cb3), X(0x7cb72724), X(0x1d00843d), X(0x7cabcd28), - X(0x1d31774d), X(0x7ca05ff1), X(0x1d6265dd), X(0x7c94df83), - X(0x1d934fe5), X(0x7c894bde), X(0x1dc4355e), X(0x7c7da505), - X(0x1df5163f), X(0x7c71eaf9), X(0x1e25f282), X(0x7c661dbc), - X(0x1e56ca1e), X(0x7c5a3d50), X(0x1e879d0d), X(0x7c4e49b7), - X(0x1eb86b46), X(0x7c4242f2), X(0x1ee934c3), X(0x7c362904), - X(0x1f19f97b), X(0x7c29fbee), X(0x1f4ab968), X(0x7c1dbbb3), - X(0x1f7b7481), X(0x7c116853), X(0x1fac2abf), X(0x7c0501d2), - X(0x1fdcdc1b), X(0x7bf88830), X(0x200d888d), X(0x7bebfb70), - X(0x203e300d), X(0x7bdf5b94), X(0x206ed295), X(0x7bd2a89e), - X(0x209f701c), X(0x7bc5e290), X(0x20d0089c), X(0x7bb9096b), - X(0x21009c0c), X(0x7bac1d31), X(0x21312a65), X(0x7b9f1de6), - X(0x2161b3a0), X(0x7b920b89), X(0x219237b5), X(0x7b84e61f), - X(0x21c2b69c), X(0x7b77ada8), X(0x21f3304f), X(0x7b6a6227), - X(0x2223a4c5), X(0x7b5d039e), X(0x225413f8), X(0x7b4f920e), - X(0x22847de0), X(0x7b420d7a), X(0x22b4e274), X(0x7b3475e5), - X(0x22e541af), X(0x7b26cb4f), X(0x23159b88), X(0x7b190dbc), - X(0x2345eff8), X(0x7b0b3d2c), X(0x23763ef7), X(0x7afd59a4), - X(0x23a6887f), X(0x7aef6323), X(0x23d6cc87), X(0x7ae159ae), - X(0x24070b08), X(0x7ad33d45), X(0x243743fa), X(0x7ac50dec), - X(0x24677758), X(0x7ab6cba4), X(0x2497a517), X(0x7aa8766f), - X(0x24c7cd33), X(0x7a9a0e50), X(0x24f7efa2), X(0x7a8b9348), - X(0x25280c5e), X(0x7a7d055b), X(0x2558235f), X(0x7a6e648a), - X(0x2588349d), X(0x7a5fb0d8), X(0x25b84012), X(0x7a50ea47), - X(0x25e845b6), X(0x7a4210d8), X(0x26184581), X(0x7a332490), - X(0x26483f6c), X(0x7a24256f), X(0x26783370), X(0x7a151378), - X(0x26a82186), X(0x7a05eead), X(0x26d809a5), X(0x79f6b711), - X(0x2707ebc7), X(0x79e76ca7), X(0x2737c7e3), X(0x79d80f6f), - X(0x27679df4), X(0x79c89f6e), X(0x27976df1), X(0x79b91ca4), - X(0x27c737d3), X(0x79a98715), X(0x27f6fb92), X(0x7999dec4), - X(0x2826b928), X(0x798a23b1), X(0x2856708d), X(0x797a55e0), - X(0x288621b9), X(0x796a7554), X(0x28b5cca5), X(0x795a820e), - X(0x28e5714b), X(0x794a7c12), X(0x29150fa1), X(0x793a6361), - X(0x2944a7a2), X(0x792a37fe), X(0x29743946), X(0x7919f9ec), - X(0x29a3c485), X(0x7909a92d), X(0x29d34958), X(0x78f945c3), - X(0x2a02c7b8), X(0x78e8cfb2), X(0x2a323f9e), X(0x78d846fb), - X(0x2a61b101), X(0x78c7aba2), X(0x2a911bdc), X(0x78b6fda8), - X(0x2ac08026), X(0x78a63d11), X(0x2aefddd8), X(0x789569df), - X(0x2b1f34eb), X(0x78848414), X(0x2b4e8558), X(0x78738bb3), - X(0x2b7dcf17), X(0x786280bf), X(0x2bad1221), X(0x7851633b), - X(0x2bdc4e6f), X(0x78403329), X(0x2c0b83fa), X(0x782ef08b), - X(0x2c3ab2b9), X(0x781d9b65), X(0x2c69daa6), X(0x780c33b8), - X(0x2c98fbba), X(0x77fab989), X(0x2cc815ee), X(0x77e92cd9), - X(0x2cf72939), X(0x77d78daa), X(0x2d263596), X(0x77c5dc01), - X(0x2d553afc), X(0x77b417df), X(0x2d843964), X(0x77a24148), - X(0x2db330c7), X(0x7790583e), X(0x2de2211e), X(0x777e5cc3), - X(0x2e110a62), X(0x776c4edb), X(0x2e3fec8b), X(0x775a2e89), - X(0x2e6ec792), X(0x7747fbce), X(0x2e9d9b70), X(0x7735b6af), - X(0x2ecc681e), X(0x77235f2d), X(0x2efb2d95), X(0x7710f54c), - X(0x2f29ebcc), X(0x76fe790e), X(0x2f58a2be), X(0x76ebea77), - X(0x2f875262), X(0x76d94989), X(0x2fb5fab2), X(0x76c69647), - X(0x2fe49ba7), X(0x76b3d0b4), X(0x30133539), X(0x76a0f8d2), - X(0x3041c761), X(0x768e0ea6), X(0x30705217), X(0x767b1231), - X(0x309ed556), X(0x76680376), X(0x30cd5115), X(0x7654e279), - X(0x30fbc54d), X(0x7641af3d), X(0x312a31f8), X(0x762e69c4), - X(0x3158970e), X(0x761b1211), X(0x3186f487), X(0x7607a828), - X(0x31b54a5e), X(0x75f42c0b), X(0x31e39889), X(0x75e09dbd), - X(0x3211df04), X(0x75ccfd42), X(0x32401dc6), X(0x75b94a9c), - X(0x326e54c7), X(0x75a585cf), X(0x329c8402), X(0x7591aedd), - X(0x32caab6f), X(0x757dc5ca), X(0x32f8cb07), X(0x7569ca99), - X(0x3326e2c3), X(0x7555bd4c), X(0x3354f29b), X(0x75419de7), - X(0x3382fa88), X(0x752d6c6c), X(0x33b0fa84), X(0x751928e0), - X(0x33def287), X(0x7504d345), X(0x340ce28b), X(0x74f06b9e), - X(0x343aca87), X(0x74dbf1ef), X(0x3468aa76), X(0x74c7663a), - X(0x34968250), X(0x74b2c884), X(0x34c4520d), X(0x749e18cd), - X(0x34f219a8), X(0x7489571c), X(0x351fd918), X(0x74748371), - X(0x354d9057), X(0x745f9dd1), X(0x357b3f5d), X(0x744aa63f), - X(0x35a8e625), X(0x74359cbd), X(0x35d684a6), X(0x74208150), - X(0x36041ad9), X(0x740b53fb), X(0x3631a8b8), X(0x73f614c0), - X(0x365f2e3b), X(0x73e0c3a3), X(0x368cab5c), X(0x73cb60a8), - X(0x36ba2014), X(0x73b5ebd1), X(0x36e78c5b), X(0x73a06522), - X(0x3714f02a), X(0x738acc9e), X(0x37424b7b), X(0x73752249), - X(0x376f9e46), X(0x735f6626), X(0x379ce885), X(0x73499838), - X(0x37ca2a30), X(0x7333b883), X(0x37f76341), X(0x731dc70a), - X(0x382493b0), X(0x7307c3d0), X(0x3851bb77), X(0x72f1aed9), - X(0x387eda8e), X(0x72db8828), X(0x38abf0ef), X(0x72c54fc1), - X(0x38d8fe93), X(0x72af05a7), X(0x39060373), X(0x7298a9dd), - X(0x3932ff87), X(0x72823c67), X(0x395ff2c9), X(0x726bbd48), - X(0x398cdd32), X(0x72552c85), X(0x39b9bebc), X(0x723e8a20), - X(0x39e6975e), X(0x7227d61c), X(0x3a136712), X(0x7211107e), - X(0x3a402dd2), X(0x71fa3949), X(0x3a6ceb96), X(0x71e35080), - X(0x3a99a057), X(0x71cc5626), X(0x3ac64c0f), X(0x71b54a41), - X(0x3af2eeb7), X(0x719e2cd2), X(0x3b1f8848), X(0x7186fdde), - X(0x3b4c18ba), X(0x716fbd68), X(0x3b78a007), X(0x71586b74), - X(0x3ba51e29), X(0x71410805), X(0x3bd19318), X(0x7129931f), - X(0x3bfdfecd), X(0x71120cc5), X(0x3c2a6142), X(0x70fa74fc), - X(0x3c56ba70), X(0x70e2cbc6), X(0x3c830a50), X(0x70cb1128), - X(0x3caf50da), X(0x70b34525), X(0x3cdb8e09), X(0x709b67c0), - X(0x3d07c1d6), X(0x708378ff), X(0x3d33ec39), X(0x706b78e3), - X(0x3d600d2c), X(0x70536771), X(0x3d8c24a8), X(0x703b44ad), - X(0x3db832a6), X(0x7023109a), X(0x3de4371f), X(0x700acb3c), - X(0x3e10320d), X(0x6ff27497), X(0x3e3c2369), X(0x6fda0cae), - X(0x3e680b2c), X(0x6fc19385), X(0x3e93e950), X(0x6fa90921), - X(0x3ebfbdcd), X(0x6f906d84), X(0x3eeb889c), X(0x6f77c0b3), - X(0x3f1749b8), X(0x6f5f02b2), X(0x3f430119), X(0x6f463383), - X(0x3f6eaeb8), X(0x6f2d532c), X(0x3f9a5290), X(0x6f1461b0), - X(0x3fc5ec98), X(0x6efb5f12), X(0x3ff17cca), X(0x6ee24b57), - X(0x401d0321), X(0x6ec92683), X(0x40487f94), X(0x6eaff099), - X(0x4073f21d), X(0x6e96a99d), X(0x409f5ab6), X(0x6e7d5193), - X(0x40cab958), X(0x6e63e87f), X(0x40f60dfb), X(0x6e4a6e66), - X(0x4121589b), X(0x6e30e34a), X(0x414c992f), X(0x6e174730), - X(0x4177cfb1), X(0x6dfd9a1c), X(0x41a2fc1a), X(0x6de3dc11), - X(0x41ce1e65), X(0x6dca0d14), X(0x41f93689), X(0x6db02d29), - X(0x42244481), X(0x6d963c54), X(0x424f4845), X(0x6d7c3a98), - X(0x427a41d0), X(0x6d6227fa), X(0x42a5311b), X(0x6d48047e), - X(0x42d0161e), X(0x6d2dd027), X(0x42faf0d4), X(0x6d138afb), - X(0x4325c135), X(0x6cf934fc), X(0x4350873c), X(0x6cdece2f), - X(0x437b42e1), X(0x6cc45698), X(0x43a5f41e), X(0x6ca9ce3b), - X(0x43d09aed), X(0x6c8f351c), X(0x43fb3746), X(0x6c748b3f), - X(0x4425c923), X(0x6c59d0a9), X(0x4450507e), X(0x6c3f055d), - X(0x447acd50), X(0x6c242960), X(0x44a53f93), X(0x6c093cb6), - X(0x44cfa740), X(0x6bee3f62), X(0x44fa0450), X(0x6bd3316a), - X(0x452456bd), X(0x6bb812d1), X(0x454e9e80), X(0x6b9ce39b), - X(0x4578db93), X(0x6b81a3cd), X(0x45a30df0), X(0x6b66536b), - X(0x45cd358f), X(0x6b4af279), X(0x45f7526b), X(0x6b2f80fb), - X(0x4621647d), X(0x6b13fef5), X(0x464b6bbe), X(0x6af86c6c), - X(0x46756828), X(0x6adcc964), X(0x469f59b4), X(0x6ac115e2), - X(0x46c9405c), X(0x6aa551e9), X(0x46f31c1a), X(0x6a897d7d), - X(0x471cece7), X(0x6a6d98a4), X(0x4746b2bc), X(0x6a51a361), - X(0x47706d93), X(0x6a359db9), X(0x479a1d67), X(0x6a1987b0), - X(0x47c3c22f), X(0x69fd614a), X(0x47ed5be6), X(0x69e12a8c), - X(0x4816ea86), X(0x69c4e37a), X(0x48406e08), X(0x69a88c19), - X(0x4869e665), X(0x698c246c), X(0x48935397), X(0x696fac78), - X(0x48bcb599), X(0x69532442), X(0x48e60c62), X(0x69368bce), - X(0x490f57ee), X(0x6919e320), X(0x49389836), X(0x68fd2a3d), - X(0x4961cd33), X(0x68e06129), X(0x498af6df), X(0x68c387e9), - X(0x49b41533), X(0x68a69e81), X(0x49dd282a), X(0x6889a4f6), - X(0x4a062fbd), X(0x686c9b4b), X(0x4a2f2be6), X(0x684f8186), - X(0x4a581c9e), X(0x683257ab), X(0x4a8101de), X(0x68151dbe), - X(0x4aa9dba2), X(0x67f7d3c5), X(0x4ad2a9e2), X(0x67da79c3), - X(0x4afb6c98), X(0x67bd0fbd), X(0x4b2423be), X(0x679f95b7), - X(0x4b4ccf4d), X(0x67820bb7), X(0x4b756f40), X(0x676471c0), - X(0x4b9e0390), X(0x6746c7d8), X(0x4bc68c36), X(0x67290e02), - X(0x4bef092d), X(0x670b4444), X(0x4c177a6e), X(0x66ed6aa1), - X(0x4c3fdff4), X(0x66cf8120), X(0x4c6839b7), X(0x66b187c3), - X(0x4c9087b1), X(0x66937e91), X(0x4cb8c9dd), X(0x6675658c), - X(0x4ce10034), X(0x66573cbb), X(0x4d092ab0), X(0x66390422), - X(0x4d31494b), X(0x661abbc5), X(0x4d595bfe), X(0x65fc63a9), - X(0x4d8162c4), X(0x65ddfbd3), X(0x4da95d96), X(0x65bf8447), - X(0x4dd14c6e), X(0x65a0fd0b), X(0x4df92f46), X(0x65826622), - X(0x4e210617), X(0x6563bf92), X(0x4e48d0dd), X(0x6545095f), - X(0x4e708f8f), X(0x6526438f), X(0x4e984229), X(0x65076e25), - X(0x4ebfe8a5), X(0x64e88926), X(0x4ee782fb), X(0x64c99498), - X(0x4f0f1126), X(0x64aa907f), X(0x4f369320), X(0x648b7ce0), - X(0x4f5e08e3), X(0x646c59bf), X(0x4f857269), X(0x644d2722), - X(0x4faccfab), X(0x642de50d), X(0x4fd420a4), X(0x640e9386), - X(0x4ffb654d), X(0x63ef3290), X(0x50229da1), X(0x63cfc231), - X(0x5049c999), X(0x63b0426d), X(0x5070e92f), X(0x6390b34a), - X(0x5097fc5e), X(0x637114cc), X(0x50bf031f), X(0x635166f9), - X(0x50e5fd6d), X(0x6331a9d4), X(0x510ceb40), X(0x6311dd64), - X(0x5133cc94), X(0x62f201ac), X(0x515aa162), X(0x62d216b3), - X(0x518169a5), X(0x62b21c7b), X(0x51a82555), X(0x6292130c), - X(0x51ced46e), X(0x6271fa69), X(0x51f576ea), X(0x6251d298), - X(0x521c0cc2), X(0x62319b9d), X(0x524295f0), X(0x6211557e), - X(0x5269126e), X(0x61f1003f), X(0x528f8238), X(0x61d09be5), - X(0x52b5e546), X(0x61b02876), X(0x52dc3b92), X(0x618fa5f7), - X(0x53028518), X(0x616f146c), X(0x5328c1d0), X(0x614e73da), - X(0x534ef1b5), X(0x612dc447), X(0x537514c2), X(0x610d05b7), - X(0x539b2af0), X(0x60ec3830), X(0x53c13439), X(0x60cb5bb7), - X(0x53e73097), X(0x60aa7050), X(0x540d2005), X(0x60897601), - X(0x5433027d), X(0x60686ccf), X(0x5458d7f9), X(0x604754bf), - X(0x547ea073), X(0x60262dd6), X(0x54a45be6), X(0x6004f819), - X(0x54ca0a4b), X(0x5fe3b38d), X(0x54efab9c), X(0x5fc26038), - X(0x55153fd4), X(0x5fa0fe1f), X(0x553ac6ee), X(0x5f7f8d46), - X(0x556040e2), X(0x5f5e0db3), X(0x5585adad), X(0x5f3c7f6b), - X(0x55ab0d46), X(0x5f1ae274), X(0x55d05faa), X(0x5ef936d1), - X(0x55f5a4d2), X(0x5ed77c8a), X(0x561adcb9), X(0x5eb5b3a2), - X(0x56400758), X(0x5e93dc1f), X(0x566524aa), X(0x5e71f606), - X(0x568a34a9), X(0x5e50015d), X(0x56af3750), X(0x5e2dfe29), - X(0x56d42c99), X(0x5e0bec6e), X(0x56f9147e), X(0x5de9cc33), - X(0x571deefa), X(0x5dc79d7c), X(0x5742bc06), X(0x5da5604f), - X(0x57677b9d), X(0x5d8314b1), X(0x578c2dba), X(0x5d60baa7), - X(0x57b0d256), X(0x5d3e5237), X(0x57d5696d), X(0x5d1bdb65), - X(0x57f9f2f8), X(0x5cf95638), X(0x581e6ef1), X(0x5cd6c2b5), - X(0x5842dd54), X(0x5cb420e0), X(0x58673e1b), X(0x5c9170bf), - X(0x588b9140), X(0x5c6eb258), X(0x58afd6bd), X(0x5c4be5b0), - X(0x58d40e8c), X(0x5c290acc), X(0x58f838a9), X(0x5c0621b2), - X(0x591c550e), X(0x5be32a67), X(0x594063b5), X(0x5bc024f0), - X(0x59646498), X(0x5b9d1154), X(0x598857b2), X(0x5b79ef96), - X(0x59ac3cfd), X(0x5b56bfbd), X(0x59d01475), X(0x5b3381ce), - X(0x59f3de12), X(0x5b1035cf), X(0x5a1799d1), X(0x5aecdbc5), - X(0x5a3b47ab), X(0x5ac973b5), X(0x5a5ee79a), X(0x5aa5fda5), - X(0x5a82799a), X(0x5a82799a) - }; - - /* {sin((2*i+1)*PI/4096), cos((2*i+1)*PI/4096)}, with i = 0 to 511 */ -static LOOKUP_T sincos_lookup1[1024] = { - X(0x001921fb), X(0x7ffffd88), X(0x004b65ee), X(0x7fffe9cb), - X(0x007da9d4), X(0x7fffc251), X(0x00afeda8), X(0x7fff8719), - X(0x00e23160), X(0x7fff3824), X(0x011474f6), X(0x7ffed572), - X(0x0146b860), X(0x7ffe5f03), X(0x0178fb99), X(0x7ffdd4d7), - X(0x01ab3e97), X(0x7ffd36ee), X(0x01dd8154), X(0x7ffc8549), - X(0x020fc3c6), X(0x7ffbbfe6), X(0x024205e8), X(0x7ffae6c7), - X(0x027447b0), X(0x7ff9f9ec), X(0x02a68917), X(0x7ff8f954), - X(0x02d8ca16), X(0x7ff7e500), X(0x030b0aa4), X(0x7ff6bcf0), - X(0x033d4abb), X(0x7ff58125), X(0x036f8a51), X(0x7ff4319d), - X(0x03a1c960), X(0x7ff2ce5b), X(0x03d407df), X(0x7ff1575d), - X(0x040645c7), X(0x7fefcca4), X(0x04388310), X(0x7fee2e30), - X(0x046abfb3), X(0x7fec7c02), X(0x049cfba7), X(0x7feab61a), - X(0x04cf36e5), X(0x7fe8dc78), X(0x05017165), X(0x7fe6ef1c), - X(0x0533ab20), X(0x7fe4ee06), X(0x0565e40d), X(0x7fe2d938), - X(0x05981c26), X(0x7fe0b0b1), X(0x05ca5361), X(0x7fde7471), - X(0x05fc89b8), X(0x7fdc247a), X(0x062ebf22), X(0x7fd9c0ca), - X(0x0660f398), X(0x7fd74964), X(0x06932713), X(0x7fd4be46), - X(0x06c5598a), X(0x7fd21f72), X(0x06f78af6), X(0x7fcf6ce8), - X(0x0729bb4e), X(0x7fcca6a7), X(0x075bea8c), X(0x7fc9ccb2), - X(0x078e18a7), X(0x7fc6df08), X(0x07c04598), X(0x7fc3dda9), - X(0x07f27157), X(0x7fc0c896), X(0x08249bdd), X(0x7fbd9fd0), - X(0x0856c520), X(0x7fba6357), X(0x0888ed1b), X(0x7fb7132b), - X(0x08bb13c5), X(0x7fb3af4e), X(0x08ed3916), X(0x7fb037bf), - X(0x091f5d06), X(0x7facac7f), X(0x09517f8f), X(0x7fa90d8e), - X(0x0983a0a7), X(0x7fa55aee), X(0x09b5c048), X(0x7fa1949e), - X(0x09e7de6a), X(0x7f9dbaa0), X(0x0a19fb04), X(0x7f99ccf4), - X(0x0a4c1610), X(0x7f95cb9a), X(0x0a7e2f85), X(0x7f91b694), - X(0x0ab0475c), X(0x7f8d8de1), X(0x0ae25d8d), X(0x7f895182), - X(0x0b147211), X(0x7f850179), X(0x0b4684df), X(0x7f809dc5), - X(0x0b7895f0), X(0x7f7c2668), X(0x0baaa53b), X(0x7f779b62), - X(0x0bdcb2bb), X(0x7f72fcb4), X(0x0c0ebe66), X(0x7f6e4a5e), - X(0x0c40c835), X(0x7f698461), X(0x0c72d020), X(0x7f64aabf), - X(0x0ca4d620), X(0x7f5fbd77), X(0x0cd6da2d), X(0x7f5abc8a), - X(0x0d08dc3f), X(0x7f55a7fa), X(0x0d3adc4e), X(0x7f507fc7), - X(0x0d6cda53), X(0x7f4b43f2), X(0x0d9ed646), X(0x7f45f47b), - X(0x0dd0d01f), X(0x7f409164), X(0x0e02c7d7), X(0x7f3b1aad), - X(0x0e34bd66), X(0x7f359057), X(0x0e66b0c3), X(0x7f2ff263), - X(0x0e98a1e9), X(0x7f2a40d2), X(0x0eca90ce), X(0x7f247ba5), - X(0x0efc7d6b), X(0x7f1ea2dc), X(0x0f2e67b8), X(0x7f18b679), - X(0x0f604faf), X(0x7f12b67c), X(0x0f923546), X(0x7f0ca2e7), - X(0x0fc41876), X(0x7f067bba), X(0x0ff5f938), X(0x7f0040f6), - X(0x1027d784), X(0x7ef9f29d), X(0x1059b352), X(0x7ef390ae), - X(0x108b8c9b), X(0x7eed1b2c), X(0x10bd6356), X(0x7ee69217), - X(0x10ef377d), X(0x7edff570), X(0x11210907), X(0x7ed94538), - X(0x1152d7ed), X(0x7ed28171), X(0x1184a427), X(0x7ecbaa1a), - X(0x11b66dad), X(0x7ec4bf36), X(0x11e83478), X(0x7ebdc0c6), - X(0x1219f880), X(0x7eb6aeca), X(0x124bb9be), X(0x7eaf8943), - X(0x127d7829), X(0x7ea85033), X(0x12af33ba), X(0x7ea1039b), - X(0x12e0ec6a), X(0x7e99a37c), X(0x1312a230), X(0x7e922fd6), - X(0x13445505), X(0x7e8aa8ac), X(0x137604e2), X(0x7e830dff), - X(0x13a7b1bf), X(0x7e7b5fce), X(0x13d95b93), X(0x7e739e1d), - X(0x140b0258), X(0x7e6bc8eb), X(0x143ca605), X(0x7e63e03b), - X(0x146e4694), X(0x7e5be40c), X(0x149fe3fc), X(0x7e53d462), - X(0x14d17e36), X(0x7e4bb13c), X(0x1503153a), X(0x7e437a9c), - X(0x1534a901), X(0x7e3b3083), X(0x15663982), X(0x7e32d2f4), - X(0x1597c6b7), X(0x7e2a61ed), X(0x15c95097), X(0x7e21dd73), - X(0x15fad71b), X(0x7e194584), X(0x162c5a3b), X(0x7e109a24), - X(0x165dd9f0), X(0x7e07db52), X(0x168f5632), X(0x7dff0911), - X(0x16c0cef9), X(0x7df62362), X(0x16f2443e), X(0x7ded2a47), - X(0x1723b5f9), X(0x7de41dc0), X(0x17552422), X(0x7ddafdce), - X(0x17868eb3), X(0x7dd1ca75), X(0x17b7f5a3), X(0x7dc883b4), - X(0x17e958ea), X(0x7dbf298d), X(0x181ab881), X(0x7db5bc02), - X(0x184c1461), X(0x7dac3b15), X(0x187d6c82), X(0x7da2a6c6), - X(0x18aec0db), X(0x7d98ff17), X(0x18e01167), X(0x7d8f4409), - X(0x19115e1c), X(0x7d85759f), X(0x1942a6f3), X(0x7d7b93da), - X(0x1973ebe6), X(0x7d719eba), X(0x19a52ceb), X(0x7d679642), - X(0x19d669fc), X(0x7d5d7a74), X(0x1a07a311), X(0x7d534b50), - X(0x1a38d823), X(0x7d4908d9), X(0x1a6a0929), X(0x7d3eb30f), - X(0x1a9b361d), X(0x7d3449f5), X(0x1acc5ef6), X(0x7d29cd8c), - X(0x1afd83ad), X(0x7d1f3dd6), X(0x1b2ea43a), X(0x7d149ad5), - X(0x1b5fc097), X(0x7d09e489), X(0x1b90d8bb), X(0x7cff1af5), - X(0x1bc1ec9e), X(0x7cf43e1a), X(0x1bf2fc3a), X(0x7ce94dfb), - X(0x1c240786), X(0x7cde4a98), X(0x1c550e7c), X(0x7cd333f3), - X(0x1c861113), X(0x7cc80a0f), X(0x1cb70f43), X(0x7cbcccec), - X(0x1ce80906), X(0x7cb17c8d), X(0x1d18fe54), X(0x7ca618f3), - X(0x1d49ef26), X(0x7c9aa221), X(0x1d7adb73), X(0x7c8f1817), - X(0x1dabc334), X(0x7c837ad8), X(0x1ddca662), X(0x7c77ca65), - X(0x1e0d84f5), X(0x7c6c06c0), X(0x1e3e5ee5), X(0x7c602fec), - X(0x1e6f342c), X(0x7c5445e9), X(0x1ea004c1), X(0x7c4848ba), - X(0x1ed0d09d), X(0x7c3c3860), X(0x1f0197b8), X(0x7c3014de), - X(0x1f325a0b), X(0x7c23de35), X(0x1f63178f), X(0x7c179467), - X(0x1f93d03c), X(0x7c0b3777), X(0x1fc4840a), X(0x7bfec765), - X(0x1ff532f2), X(0x7bf24434), X(0x2025dcec), X(0x7be5ade6), - X(0x205681f1), X(0x7bd9047c), X(0x208721f9), X(0x7bcc47fa), - X(0x20b7bcfe), X(0x7bbf7860), X(0x20e852f6), X(0x7bb295b0), - X(0x2118e3dc), X(0x7ba59fee), X(0x21496fa7), X(0x7b989719), - X(0x2179f64f), X(0x7b8b7b36), X(0x21aa77cf), X(0x7b7e4c45), - X(0x21daf41d), X(0x7b710a49), X(0x220b6b32), X(0x7b63b543), - X(0x223bdd08), X(0x7b564d36), X(0x226c4996), X(0x7b48d225), - X(0x229cb0d5), X(0x7b3b4410), X(0x22cd12bd), X(0x7b2da2fa), - X(0x22fd6f48), X(0x7b1feee5), X(0x232dc66d), X(0x7b1227d3), - X(0x235e1826), X(0x7b044dc7), X(0x238e646a), X(0x7af660c2), - X(0x23beab33), X(0x7ae860c7), X(0x23eeec78), X(0x7ada4dd8), - X(0x241f2833), X(0x7acc27f7), X(0x244f5e5c), X(0x7abdef25), - X(0x247f8eec), X(0x7aafa367), X(0x24afb9da), X(0x7aa144bc), - X(0x24dfdf20), X(0x7a92d329), X(0x250ffeb7), X(0x7a844eae), - X(0x25401896), X(0x7a75b74f), X(0x25702cb7), X(0x7a670d0d), - X(0x25a03b11), X(0x7a584feb), X(0x25d0439f), X(0x7a497feb), - X(0x26004657), X(0x7a3a9d0f), X(0x26304333), X(0x7a2ba75a), - X(0x26603a2c), X(0x7a1c9ece), X(0x26902b39), X(0x7a0d836d), - X(0x26c01655), X(0x79fe5539), X(0x26effb76), X(0x79ef1436), - X(0x271fda96), X(0x79dfc064), X(0x274fb3ae), X(0x79d059c8), - X(0x277f86b5), X(0x79c0e062), X(0x27af53a6), X(0x79b15435), - X(0x27df1a77), X(0x79a1b545), X(0x280edb23), X(0x79920392), - X(0x283e95a1), X(0x79823f20), X(0x286e49ea), X(0x797267f2), - X(0x289df7f8), X(0x79627e08), X(0x28cd9fc1), X(0x79528167), - X(0x28fd4140), X(0x79427210), X(0x292cdc6d), X(0x79325006), - X(0x295c7140), X(0x79221b4b), X(0x298bffb2), X(0x7911d3e2), - X(0x29bb87bc), X(0x790179cd), X(0x29eb0957), X(0x78f10d0f), - X(0x2a1a847b), X(0x78e08dab), X(0x2a49f920), X(0x78cffba3), - X(0x2a796740), X(0x78bf56f9), X(0x2aa8ced3), X(0x78ae9fb0), - X(0x2ad82fd2), X(0x789dd5cb), X(0x2b078a36), X(0x788cf94c), - X(0x2b36ddf7), X(0x787c0a36), X(0x2b662b0e), X(0x786b088c), - X(0x2b957173), X(0x7859f44f), X(0x2bc4b120), X(0x7848cd83), - X(0x2bf3ea0d), X(0x7837942b), X(0x2c231c33), X(0x78264849), - X(0x2c52478a), X(0x7814e9df), X(0x2c816c0c), X(0x780378f1), - X(0x2cb089b1), X(0x77f1f581), X(0x2cdfa071), X(0x77e05f91), - X(0x2d0eb046), X(0x77ceb725), X(0x2d3db928), X(0x77bcfc3f), - X(0x2d6cbb10), X(0x77ab2ee2), X(0x2d9bb5f6), X(0x77994f11), - X(0x2dcaa9d5), X(0x77875cce), X(0x2df996a3), X(0x7775581d), - X(0x2e287c5a), X(0x776340ff), X(0x2e575af3), X(0x77511778), - X(0x2e863267), X(0x773edb8b), X(0x2eb502ae), X(0x772c8d3a), - X(0x2ee3cbc1), X(0x771a2c88), X(0x2f128d99), X(0x7707b979), - X(0x2f41482e), X(0x76f5340e), X(0x2f6ffb7a), X(0x76e29c4b), - X(0x2f9ea775), X(0x76cff232), X(0x2fcd4c19), X(0x76bd35c7), - X(0x2ffbe95d), X(0x76aa670d), X(0x302a7f3a), X(0x76978605), - X(0x30590dab), X(0x768492b4), X(0x308794a6), X(0x76718d1c), - X(0x30b61426), X(0x765e7540), X(0x30e48c22), X(0x764b4b23), - X(0x3112fc95), X(0x76380ec8), X(0x31416576), X(0x7624c031), - X(0x316fc6be), X(0x76115f63), X(0x319e2067), X(0x75fdec60), - X(0x31cc7269), X(0x75ea672a), X(0x31fabcbd), X(0x75d6cfc5), - X(0x3228ff5c), X(0x75c32634), X(0x32573a3f), X(0x75af6a7b), - X(0x32856d5e), X(0x759b9c9b), X(0x32b398b3), X(0x7587bc98), - X(0x32e1bc36), X(0x7573ca75), X(0x330fd7e1), X(0x755fc635), - X(0x333debab), X(0x754bafdc), X(0x336bf78f), X(0x7537876c), - X(0x3399fb85), X(0x75234ce8), X(0x33c7f785), X(0x750f0054), - X(0x33f5eb89), X(0x74faa1b3), X(0x3423d78a), X(0x74e63108), - X(0x3451bb81), X(0x74d1ae55), X(0x347f9766), X(0x74bd199f), - X(0x34ad6b32), X(0x74a872e8), X(0x34db36df), X(0x7493ba34), - X(0x3508fa66), X(0x747eef85), X(0x3536b5be), X(0x746a12df), - X(0x356468e2), X(0x74552446), X(0x359213c9), X(0x744023bc), - X(0x35bfb66e), X(0x742b1144), X(0x35ed50c9), X(0x7415ece2), - X(0x361ae2d3), X(0x7400b69a), X(0x36486c86), X(0x73eb6e6e), - X(0x3675edd9), X(0x73d61461), X(0x36a366c6), X(0x73c0a878), - X(0x36d0d746), X(0x73ab2ab4), X(0x36fe3f52), X(0x73959b1b), - X(0x372b9ee3), X(0x737ff9ae), X(0x3758f5f2), X(0x736a4671), - X(0x37864477), X(0x73548168), X(0x37b38a6d), X(0x733eaa96), - X(0x37e0c7cc), X(0x7328c1ff), X(0x380dfc8d), X(0x7312c7a5), - X(0x383b28a9), X(0x72fcbb8c), X(0x38684c19), X(0x72e69db7), - X(0x389566d6), X(0x72d06e2b), X(0x38c278d9), X(0x72ba2cea), - X(0x38ef821c), X(0x72a3d9f7), X(0x391c8297), X(0x728d7557), - X(0x39497a43), X(0x7276ff0d), X(0x39766919), X(0x7260771b), - X(0x39a34f13), X(0x7249dd86), X(0x39d02c2a), X(0x72333251), - X(0x39fd0056), X(0x721c7580), X(0x3a29cb91), X(0x7205a716), - X(0x3a568dd4), X(0x71eec716), X(0x3a834717), X(0x71d7d585), - X(0x3aaff755), X(0x71c0d265), X(0x3adc9e86), X(0x71a9bdba), - X(0x3b093ca3), X(0x71929789), X(0x3b35d1a5), X(0x717b5fd3), - X(0x3b625d86), X(0x7164169d), X(0x3b8ee03e), X(0x714cbbeb), - X(0x3bbb59c7), X(0x71354fc0), X(0x3be7ca1a), X(0x711dd220), - X(0x3c143130), X(0x7106430e), X(0x3c408f03), X(0x70eea28e), - X(0x3c6ce38a), X(0x70d6f0a4), X(0x3c992ec0), X(0x70bf2d53), - X(0x3cc5709e), X(0x70a7589f), X(0x3cf1a91c), X(0x708f728b), - X(0x3d1dd835), X(0x70777b1c), X(0x3d49fde1), X(0x705f7255), - X(0x3d761a19), X(0x70475839), X(0x3da22cd7), X(0x702f2ccd), - X(0x3dce3614), X(0x7016f014), X(0x3dfa35c8), X(0x6ffea212), - X(0x3e262bee), X(0x6fe642ca), X(0x3e52187f), X(0x6fcdd241), - X(0x3e7dfb73), X(0x6fb5507a), X(0x3ea9d4c3), X(0x6f9cbd79), - X(0x3ed5a46b), X(0x6f841942), X(0x3f016a61), X(0x6f6b63d8), - X(0x3f2d26a0), X(0x6f529d40), X(0x3f58d921), X(0x6f39c57d), - X(0x3f8481dd), X(0x6f20dc92), X(0x3fb020ce), X(0x6f07e285), - X(0x3fdbb5ec), X(0x6eeed758), X(0x40074132), X(0x6ed5bb10), - X(0x4032c297), X(0x6ebc8db0), X(0x405e3a16), X(0x6ea34f3d), - X(0x4089a7a8), X(0x6e89ffb9), X(0x40b50b46), X(0x6e709f2a), - X(0x40e064ea), X(0x6e572d93), X(0x410bb48c), X(0x6e3daaf8), - X(0x4136fa27), X(0x6e24175c), X(0x416235b2), X(0x6e0a72c5), - X(0x418d6729), X(0x6df0bd35), X(0x41b88e84), X(0x6dd6f6b1), - X(0x41e3abbc), X(0x6dbd1f3c), X(0x420ebecb), X(0x6da336dc), - X(0x4239c7aa), X(0x6d893d93), X(0x4264c653), X(0x6d6f3365), - X(0x428fbabe), X(0x6d551858), X(0x42baa4e6), X(0x6d3aec6e), - X(0x42e584c3), X(0x6d20afac), X(0x43105a50), X(0x6d066215), - X(0x433b2585), X(0x6cec03af), X(0x4365e65b), X(0x6cd1947c), - X(0x43909ccd), X(0x6cb71482), X(0x43bb48d4), X(0x6c9c83c3), - X(0x43e5ea68), X(0x6c81e245), X(0x44108184), X(0x6c67300b), - X(0x443b0e21), X(0x6c4c6d1a), X(0x44659039), X(0x6c319975), - X(0x449007c4), X(0x6c16b521), X(0x44ba74bd), X(0x6bfbc021), - X(0x44e4d71c), X(0x6be0ba7b), X(0x450f2edb), X(0x6bc5a431), - X(0x45397bf4), X(0x6baa7d49), X(0x4563be60), X(0x6b8f45c7), - X(0x458df619), X(0x6b73fdae), X(0x45b82318), X(0x6b58a503), - X(0x45e24556), X(0x6b3d3bcb), X(0x460c5cce), X(0x6b21c208), - X(0x46366978), X(0x6b0637c1), X(0x46606b4e), X(0x6aea9cf8), - X(0x468a624a), X(0x6acef1b2), X(0x46b44e65), X(0x6ab335f4), - X(0x46de2f99), X(0x6a9769c1), X(0x470805df), X(0x6a7b8d1e), - X(0x4731d131), X(0x6a5fa010), X(0x475b9188), X(0x6a43a29a), - X(0x478546de), X(0x6a2794c1), X(0x47aef12c), X(0x6a0b7689), - X(0x47d8906d), X(0x69ef47f6), X(0x48022499), X(0x69d3090e), - X(0x482badab), X(0x69b6b9d3), X(0x48552b9b), X(0x699a5a4c), - X(0x487e9e64), X(0x697dea7b), X(0x48a805ff), X(0x69616a65), - X(0x48d16265), X(0x6944da10), X(0x48fab391), X(0x6928397e), - X(0x4923f97b), X(0x690b88b5), X(0x494d341e), X(0x68eec7b9), - X(0x49766373), X(0x68d1f68f), X(0x499f8774), X(0x68b5153a), - X(0x49c8a01b), X(0x689823bf), X(0x49f1ad61), X(0x687b2224), - X(0x4a1aaf3f), X(0x685e106c), X(0x4a43a5b0), X(0x6840ee9b), - X(0x4a6c90ad), X(0x6823bcb7), X(0x4a957030), X(0x68067ac3), - X(0x4abe4433), X(0x67e928c5), X(0x4ae70caf), X(0x67cbc6c0), - X(0x4b0fc99d), X(0x67ae54ba), X(0x4b387af9), X(0x6790d2b6), - X(0x4b6120bb), X(0x677340ba), X(0x4b89badd), X(0x67559eca), - X(0x4bb24958), X(0x6737ecea), X(0x4bdacc28), X(0x671a2b20), - X(0x4c034345), X(0x66fc596f), X(0x4c2baea9), X(0x66de77dc), - X(0x4c540e4e), X(0x66c0866d), X(0x4c7c622d), X(0x66a28524), - X(0x4ca4aa41), X(0x66847408), X(0x4ccce684), X(0x6666531d), - X(0x4cf516ee), X(0x66482267), X(0x4d1d3b7a), X(0x6629e1ec), - X(0x4d455422), X(0x660b91af), X(0x4d6d60df), X(0x65ed31b5), - X(0x4d9561ac), X(0x65cec204), X(0x4dbd5682), X(0x65b0429f), - X(0x4de53f5a), X(0x6591b38c), X(0x4e0d1c30), X(0x657314cf), - X(0x4e34ecfc), X(0x6554666d), X(0x4e5cb1b9), X(0x6535a86b), - X(0x4e846a60), X(0x6516dacd), X(0x4eac16eb), X(0x64f7fd98), - X(0x4ed3b755), X(0x64d910d1), X(0x4efb4b96), X(0x64ba147d), - X(0x4f22d3aa), X(0x649b08a0), X(0x4f4a4f89), X(0x647bed3f), - X(0x4f71bf2e), X(0x645cc260), X(0x4f992293), X(0x643d8806), - X(0x4fc079b1), X(0x641e3e38), X(0x4fe7c483), X(0x63fee4f8), - X(0x500f0302), X(0x63df7c4d), X(0x50363529), X(0x63c0043b), - X(0x505d5af1), X(0x63a07cc7), X(0x50847454), X(0x6380e5f6), - X(0x50ab814d), X(0x63613fcd), X(0x50d281d5), X(0x63418a50), - X(0x50f975e6), X(0x6321c585), X(0x51205d7b), X(0x6301f171), - X(0x5147388c), X(0x62e20e17), X(0x516e0715), X(0x62c21b7e), - X(0x5194c910), X(0x62a219aa), X(0x51bb7e75), X(0x628208a1), - X(0x51e22740), X(0x6261e866), X(0x5208c36a), X(0x6241b8ff), - X(0x522f52ee), X(0x62217a72), X(0x5255d5c5), X(0x62012cc2), - X(0x527c4bea), X(0x61e0cff5), X(0x52a2b556), X(0x61c06410), - X(0x52c91204), X(0x619fe918), X(0x52ef61ee), X(0x617f5f12), - X(0x5315a50e), X(0x615ec603), X(0x533bdb5d), X(0x613e1df0), - X(0x536204d7), X(0x611d66de), X(0x53882175), X(0x60fca0d2), - X(0x53ae3131), X(0x60dbcbd1), X(0x53d43406), X(0x60bae7e1), - X(0x53fa29ed), X(0x6099f505), X(0x542012e1), X(0x6078f344), - X(0x5445eedb), X(0x6057e2a2), X(0x546bbdd7), X(0x6036c325), - X(0x54917fce), X(0x601594d1), X(0x54b734ba), X(0x5ff457ad), - X(0x54dcdc96), X(0x5fd30bbc), X(0x5502775c), X(0x5fb1b104), - X(0x55280505), X(0x5f90478a), X(0x554d858d), X(0x5f6ecf53), - X(0x5572f8ed), X(0x5f4d4865), X(0x55985f20), X(0x5f2bb2c5), - X(0x55bdb81f), X(0x5f0a0e77), X(0x55e303e6), X(0x5ee85b82), - X(0x5608426e), X(0x5ec699e9), X(0x562d73b2), X(0x5ea4c9b3), - X(0x565297ab), X(0x5e82eae5), X(0x5677ae54), X(0x5e60fd84), - X(0x569cb7a8), X(0x5e3f0194), X(0x56c1b3a1), X(0x5e1cf71c), - X(0x56e6a239), X(0x5dfade20), X(0x570b8369), X(0x5dd8b6a7), - X(0x5730572e), X(0x5db680b4), X(0x57551d80), X(0x5d943c4e), - X(0x5779d65b), X(0x5d71e979), X(0x579e81b8), X(0x5d4f883b), - X(0x57c31f92), X(0x5d2d189a), X(0x57e7afe4), X(0x5d0a9a9a), - X(0x580c32a7), X(0x5ce80e41), X(0x5830a7d6), X(0x5cc57394), - X(0x58550f6c), X(0x5ca2ca99), X(0x58796962), X(0x5c801354), - X(0x589db5b3), X(0x5c5d4dcc), X(0x58c1f45b), X(0x5c3a7a05), - X(0x58e62552), X(0x5c179806), X(0x590a4893), X(0x5bf4a7d2), - X(0x592e5e19), X(0x5bd1a971), X(0x595265df), X(0x5bae9ce7), - X(0x59765fde), X(0x5b8b8239), X(0x599a4c12), X(0x5b68596d), - X(0x59be2a74), X(0x5b452288), X(0x59e1faff), X(0x5b21dd90), - X(0x5a05bdae), X(0x5afe8a8b), X(0x5a29727b), X(0x5adb297d), - X(0x5a4d1960), X(0x5ab7ba6c), X(0x5a70b258), X(0x5a943d5e), -}; - diff --git a/wolf3d/newCode/Tremor/misc.h b/wolf3d/newCode/Tremor/misc.h deleted file mode 100644 index a4bc82f..0000000 --- a/wolf3d/newCode/Tremor/misc.h +++ /dev/null @@ -1,244 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: miscellaneous math and prototypes - - ********************************************************************/ - -#ifndef _V_RANDOM_H_ -#define _V_RANDOM_H_ -#include "ivorbiscodec.h" -#include "os.h" - -#include "asm_arm.h" -#include /* for abs() */ - -#ifndef _V_WIDE_MATH -#define _V_WIDE_MATH - -#ifndef _LOW_ACCURACY_ -/* 64 bit multiply */ - -#if !(defined WIN32 && defined WINCE) -#include -#endif - -#if BYTE_ORDER==LITTLE_ENDIAN -union magic { - struct { - ogg_int32_t lo; - ogg_int32_t hi; - } halves; - ogg_int64_t whole; -}; -#endif - -#if BYTE_ORDER==BIG_ENDIAN -union magic { - struct { - ogg_int32_t hi; - ogg_int32_t lo; - } halves; - ogg_int64_t whole; -}; -#endif - -STIN ogg_int32_t MULT32(ogg_int32_t x, ogg_int32_t y) { - union magic magic; - magic.whole = (ogg_int64_t)x * y; - return magic.halves.hi; -} - -STIN ogg_int32_t MULT31(ogg_int32_t x, ogg_int32_t y) { - return MULT32(x,y)<<1; -} - -STIN ogg_int32_t MULT31_SHIFT15(ogg_int32_t x, ogg_int32_t y) { - union magic magic; - magic.whole = (ogg_int64_t)x * y; - return ((ogg_uint32_t)(magic.halves.lo)>>15) | ((magic.halves.hi)<<17); -} - -#else -/* 32 bit multiply, more portable but less accurate */ - -/* - * Note: Precision is biased towards the first argument therefore ordering - * is important. Shift values were chosen for the best sound quality after - * many listening tests. - */ - -/* - * For MULT32 and MULT31: The second argument is always a lookup table - * value already preshifted from 31 to 8 bits. We therefore take the - * opportunity to save on text space and use unsigned char for those - * tables in this case. - */ - -STIN ogg_int32_t MULT32(ogg_int32_t x, ogg_int32_t y) { - return (x >> 9) * y; /* y preshifted >>23 */ -} - -STIN ogg_int32_t MULT31(ogg_int32_t x, ogg_int32_t y) { - return (x >> 8) * y; /* y preshifted >>23 */ -} - -STIN ogg_int32_t MULT31_SHIFT15(ogg_int32_t x, ogg_int32_t y) { - return (x >> 6) * y; /* y preshifted >>9 */ -} - -#endif - -/* - * This should be used as a memory barrier, forcing all cached values in - * registers to wr writen back to memory. Might or might not be beneficial - * depending on the architecture and compiler. - */ -#define MB() - -/* - * The XPROD functions are meant to optimize the cross products found all - * over the place in mdct.c by forcing memory operation ordering to avoid - * unnecessary register reloads as soon as memory is being written to. - * However this is only beneficial on CPUs with a sane number of general - * purpose registers which exclude the Intel x86. On Intel, better let the - * compiler actually reload registers directly from original memory by using - * macros. - */ - -#ifdef __i386__ - -#define XPROD32(_a, _b, _t, _v, _x, _y) \ - { *(_x)=MULT32(_a,_t)+MULT32(_b,_v); \ - *(_y)=MULT32(_b,_t)-MULT32(_a,_v); } -#define XPROD31(_a, _b, _t, _v, _x, _y) \ - { *(_x)=MULT31(_a,_t)+MULT31(_b,_v); \ - *(_y)=MULT31(_b,_t)-MULT31(_a,_v); } -#define XNPROD31(_a, _b, _t, _v, _x, _y) \ - { *(_x)=MULT31(_a,_t)-MULT31(_b,_v); \ - *(_y)=MULT31(_b,_t)+MULT31(_a,_v); } - -#else - -STIN void XPROD32(ogg_int32_t a, ogg_int32_t b, - ogg_int32_t t, ogg_int32_t v, - ogg_int32_t *x, ogg_int32_t *y) -{ - *x = MULT32(a, t) + MULT32(b, v); - *y = MULT32(b, t) - MULT32(a, v); -} - -STIN void XPROD31(ogg_int32_t a, ogg_int32_t b, - ogg_int32_t t, ogg_int32_t v, - ogg_int32_t *x, ogg_int32_t *y) -{ - *x = MULT31(a, t) + MULT31(b, v); - *y = MULT31(b, t) - MULT31(a, v); -} - -STIN void XNPROD31(ogg_int32_t a, ogg_int32_t b, - ogg_int32_t t, ogg_int32_t v, - ogg_int32_t *x, ogg_int32_t *y) -{ - *x = MULT31(a, t) - MULT31(b, v); - *y = MULT31(b, t) + MULT31(a, v); -} - -#endif - -#endif - -#ifndef _V_CLIP_MATH -#define _V_CLIP_MATH - -STIN ogg_int32_t CLIP_TO_15(ogg_int32_t x) { - int ret=x; - ret-= ((x<=32767)-1)&(x-32767); - ret-= ((x>=-32768)-1)&(x+32768); - return(ret); -} - -#endif - -STIN ogg_int32_t VFLOAT_MULT(ogg_int32_t a,ogg_int32_t ap, - ogg_int32_t b,ogg_int32_t bp, - ogg_int32_t *p){ - if(a && b){ -#ifndef _LOW_ACCURACY_ - *p=ap+bp+32; - return MULT32(a,b); -#else - *p=ap+bp+31; - return (a>>15)*(b>>16); -#endif - }else - return 0; -} - -int _ilog(unsigned int); - -STIN ogg_int32_t VFLOAT_MULTI(ogg_int32_t a,ogg_int32_t ap, - ogg_int32_t i, - ogg_int32_t *p){ - - int ip=_ilog(abs(i))-31; - return VFLOAT_MULT(a,ap,i<<-ip,ip,p); -} - -STIN ogg_int32_t VFLOAT_ADD(ogg_int32_t a,ogg_int32_t ap, - ogg_int32_t b,ogg_int32_t bp, - ogg_int32_t *p){ - - if(!a){ - *p=bp; - return b; - }else if(!b){ - *p=ap; - return a; - } - - /* yes, this can leak a bit. */ - if(ap>bp){ - int shift=ap-bp+1; - *p=ap+1; - a>>=1; - if(shift<32){ - b=(b+(1<<(shift-1)))>>shift; - }else{ - b=0; - } - }else{ - int shift=bp-ap+1; - *p=bp+1; - b>>=1; - if(shift<32){ - a=(a+(1<<(shift-1)))>>shift; - }else{ - a=0; - } - } - - a+=b; - if((a&0xc0000000)==0xc0000000 || - (a&0xc0000000)==0){ - a<<=1; - (*p)--; - } - return(a); -} - -#endif - - - - diff --git a/wolf3d/newCode/Tremor/ogg.h b/wolf3d/newCode/Tremor/ogg.h deleted file mode 100644 index 85cb41b..0000000 --- a/wolf3d/newCode/Tremor/ogg.h +++ /dev/null @@ -1,206 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2003 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: subsumed libogg includes - - ********************************************************************/ -#ifndef _OGG_H -#define _OGG_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "os_types.h" - -typedef struct ogg_buffer_state{ - struct ogg_buffer *unused_buffers; - struct ogg_reference *unused_references; - int outstanding; - int shutdown; -} ogg_buffer_state; - -typedef struct ogg_buffer { - unsigned char *data; - long size; - int refcount; - - union { - ogg_buffer_state *owner; - struct ogg_buffer *next; - } ptr; -} ogg_buffer; - -typedef struct ogg_reference { - ogg_buffer *buffer; - long begin; - long length; - - struct ogg_reference *next; -} ogg_reference; - -typedef struct oggpack_buffer { - int headbit; - unsigned char *headptr; - long headend; - - /* memory management */ - ogg_reference *head; - ogg_reference *tail; - - /* render the byte/bit counter API constant time */ - long count; /* doesn't count the tail */ -} oggpack_buffer; - -typedef struct oggbyte_buffer { - ogg_reference *baseref; - - ogg_reference *ref; - unsigned char *ptr; - long pos; - long end; -} oggbyte_buffer; - -typedef struct ogg_sync_state { - /* decode memory management pool */ - ogg_buffer_state *bufferpool; - - /* stream buffers */ - ogg_reference *fifo_head; - ogg_reference *fifo_tail; - long fifo_fill; - - /* stream sync management */ - int unsynced; - int headerbytes; - int bodybytes; - -} ogg_sync_state; - -typedef struct ogg_stream_state { - ogg_reference *header_head; - ogg_reference *header_tail; - ogg_reference *body_head; - ogg_reference *body_tail; - - int e_o_s; /* set when we have buffered the last - packet in the logical bitstream */ - int b_o_s; /* set after we've written the initial page - of a logical bitstream */ - long serialno; - long pageno; - ogg_int64_t packetno; /* sequence number for decode; the framing - knows where there's a hole in the data, - but we need coupling so that the codec - (which is in a seperate abstraction - layer) also knows about the gap */ - ogg_int64_t granulepos; - - int lacing_fill; - ogg_uint32_t body_fill; - - /* decode-side state data */ - int holeflag; - int spanflag; - int clearflag; - int laceptr; - ogg_uint32_t body_fill_next; - -} ogg_stream_state; - -typedef struct { - ogg_reference *packet; - long bytes; - long b_o_s; - long e_o_s; - ogg_int64_t granulepos; - ogg_int64_t packetno; /* sequence number for decode; the framing - knows where there's a hole in the data, - but we need coupling so that the codec - (which is in a seperate abstraction - layer) also knows about the gap */ -} ogg_packet; - -typedef struct { - ogg_reference *header; - int header_len; - ogg_reference *body; - long body_len; -} ogg_page; - -/* Ogg BITSTREAM PRIMITIVES: bitstream ************************/ - -extern void oggpack_readinit(oggpack_buffer *b,ogg_reference *r); -extern long oggpack_look(oggpack_buffer *b,int bits); -extern void oggpack_adv(oggpack_buffer *b,int bits); -extern long oggpack_read(oggpack_buffer *b,int bits); -extern long oggpack_bytes(oggpack_buffer *b); -extern long oggpack_bits(oggpack_buffer *b); -extern int oggpack_eop(oggpack_buffer *b); - -/* Ogg BITSTREAM PRIMITIVES: decoding **************************/ - -extern ogg_sync_state *ogg_sync_create(void); -extern int ogg_sync_destroy(ogg_sync_state *oy); -extern int ogg_sync_reset(ogg_sync_state *oy); - -extern unsigned char *ogg_sync_bufferin(ogg_sync_state *oy, long size); -extern int ogg_sync_wrote(ogg_sync_state *oy, long bytes); -extern long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og); -extern int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og); -extern int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og); -extern int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op); -extern int ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op); - -/* Ogg BITSTREAM PRIMITIVES: general ***************************/ - -extern ogg_stream_state *ogg_stream_create(int serialno); -extern int ogg_stream_destroy(ogg_stream_state *os); -extern int ogg_stream_reset(ogg_stream_state *os); -extern int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno); -extern int ogg_stream_eos(ogg_stream_state *os); - -extern int ogg_page_checksum_set(ogg_page *og); - -extern int ogg_page_version(ogg_page *og); -extern int ogg_page_continued(ogg_page *og); -extern int ogg_page_bos(ogg_page *og); -extern int ogg_page_eos(ogg_page *og); -extern ogg_int64_t ogg_page_granulepos(ogg_page *og); -extern ogg_uint32_t ogg_page_serialno(ogg_page *og); -extern ogg_uint32_t ogg_page_pageno(ogg_page *og); -extern int ogg_page_packets(ogg_page *og); -extern int ogg_page_getbuffer(ogg_page *og, unsigned char **buffer); - -extern int ogg_packet_release(ogg_packet *op); -extern int ogg_page_release(ogg_page *og); - -extern void ogg_page_dup(ogg_page *d, ogg_page *s); - -/* Ogg BITSTREAM PRIMITIVES: return codes ***************************/ - -#define OGG_SUCCESS 0 - -#define OGG_HOLE -10 -#define OGG_SPAN -11 -#define OGG_EVERSION -12 -#define OGG_ESERIAL -13 -#define OGG_EINVAL -14 -#define OGG_EEOS -15 - - -#ifdef __cplusplus -} -#endif - -#endif /* _OGG_H */ diff --git a/wolf3d/newCode/Tremor/os.h b/wolf3d/newCode/Tremor/os.h deleted file mode 100644 index 95e6e27..0000000 --- a/wolf3d/newCode/Tremor/os.h +++ /dev/null @@ -1,64 +0,0 @@ -#ifndef _OS_H -#define _OS_H -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: #ifdef jail to whip a few platforms into the UNIX ideal. - - ********************************************************************/ - -#include -#include "os_types.h" - -#ifndef _V_IFDEFJAIL_H_ -# define _V_IFDEFJAIL_H_ - -# ifdef __GNUC__ -# define STIN static __inline__ -# elif _WIN32 -# define STIN static __inline -# endif -#else -# define STIN static -#endif - -#ifndef M_PI -# define M_PI (3.1415926536f) -#endif - -#ifdef _WIN32 -# include -# define rint(x) (floor((x)+0.5f)) -# define NO_FLOAT_MATH_LIB -# define FAST_HYPOT(a, b) sqrt((a)*(a) + (b)*(b)) -# define LITTLE_ENDIAN 1 -# define BYTE_ORDER LITTLE_ENDIAN -#endif - -#ifdef HAVE_ALLOCA_H -# include -#endif - -#ifdef USE_MEMORY_H -# include -#endif - -#ifndef min -# define min(x,y) ((x)>(y)?(y):(x)) -#endif - -#ifndef max -# define max(x,y) ((x)<(y)?(y):(x)) -#endif - -#endif /* _OS_H */ diff --git a/wolf3d/newCode/Tremor/os_types.h b/wolf3d/newCode/Tremor/os_types.h deleted file mode 100644 index b8ddb8e..0000000 --- a/wolf3d/newCode/Tremor/os_types.h +++ /dev/null @@ -1,88 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: #ifdef jail to whip a few platforms into the UNIX ideal. - - ********************************************************************/ -#ifndef _OS_TYPES_H -#define _OS_TYPES_H - -#ifdef _LOW_ACCURACY_ -# define X(n) (((((n)>>22)+1)>>1) - ((((n)>>22)+1)>>9)) -# define LOOKUP_T const unsigned char -#else -# define X(n) (n) -# define LOOKUP_T const ogg_int32_t -#endif - -/* make it easy on the folks that want to compile the libs with a - different malloc than stdlib */ -#define _ogg_malloc malloc -#define _ogg_calloc calloc -#define _ogg_realloc realloc -#define _ogg_free free - -#ifdef _WIN32 - -# ifndef __GNUC__ - /* MSVC/Borland */ - typedef __int64 ogg_int64_t; - typedef __int32 ogg_int32_t; - typedef unsigned __int32 ogg_uint32_t; - typedef __int16 ogg_int16_t; -# else - /* Cygwin */ - #include <_G_config.h> - typedef _G_int64_t ogg_int64_t; - typedef _G_int32_t ogg_int32_t; - typedef _G_uint32_t ogg_uint32_t; - typedef _G_int16_t ogg_int16_t; -# endif - -#elif defined(__MACOS__) - -# include - typedef SInt16 ogg_int16_t; - typedef SInt32 ogg_int32_t; - typedef UInt32 ogg_uint32_t; - typedef SInt64 ogg_int64_t; - -#elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */ - -# include - typedef int16_t ogg_int16_t; - typedef int32_t ogg_int32_t; - typedef u_int32_t ogg_uint32_t; - typedef int64_t ogg_int64_t; - -#elif defined(__BEOS__) - - /* Be */ -# include - -#elif defined (__EMX__) - - /* OS/2 GCC */ - typedef short ogg_int16_t; - typedef int ogg_int32_t; - typedef unsigned int ogg_uint32_t; - typedef long long ogg_int64_t; - -#else - -# include -# include "config_types.h" - -#endif - -#endif /* _OS_TYPES_H */ diff --git a/wolf3d/newCode/Tremor/registry.c b/wolf3d/newCode/Tremor/registry.c deleted file mode 100644 index c0b5fec..0000000 --- a/wolf3d/newCode/Tremor/registry.c +++ /dev/null @@ -1,50 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: registry for floor, res backends and channel mappings - - ********************************************************************/ - -#include "ivorbiscodec.h" -#include "codec_internal.h" -#include "registry.h" -#include "misc.h" - - -/* seems like major overkill now; the backend numbers will grow into - the infrastructure soon enough */ - -extern vorbis_func_floor floor0_exportbundle; -extern vorbis_func_floor floor1_exportbundle; -extern vorbis_func_residue residue0_exportbundle; -extern vorbis_func_residue residue1_exportbundle; -extern vorbis_func_residue residue2_exportbundle; -extern vorbis_func_mapping mapping0_exportbundle; - -vorbis_func_floor *_floor_P[]={ - &floor0_exportbundle, - &floor1_exportbundle, -}; - -vorbis_func_residue *_residue_P[]={ - &residue0_exportbundle, - &residue1_exportbundle, - &residue2_exportbundle, -}; - -vorbis_func_mapping *_mapping_P[]={ - &mapping0_exportbundle, -}; - - - diff --git a/wolf3d/newCode/Tremor/registry.h b/wolf3d/newCode/Tremor/registry.h deleted file mode 100644 index 2bc8068..0000000 --- a/wolf3d/newCode/Tremor/registry.h +++ /dev/null @@ -1,40 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: registry for time, floor, res backends and channel mappings - - ********************************************************************/ - -#ifndef _V_REG_H_ -#define _V_REG_H_ - -#define VI_TRANSFORMB 1 -#define VI_WINDOWB 1 -#define VI_TIMEB 1 -#define VI_FLOORB 2 -#define VI_RESB 3 -#define VI_MAPB 1 - -#include "backends.h" - -#if defined(_WIN32) && defined(VORBISDLL_IMPORT) -# define EXTERN __declspec(dllimport) extern -#else -# define EXTERN extern -#endif - -EXTERN vorbis_func_floor *_floor_P[]; -EXTERN vorbis_func_residue *_residue_P[]; -EXTERN vorbis_func_mapping *_mapping_P[]; - -#endif diff --git a/wolf3d/newCode/Tremor/res012.c b/wolf3d/newCode/Tremor/res012.c deleted file mode 100644 index 224b54e..0000000 --- a/wolf3d/newCode/Tremor/res012.c +++ /dev/null @@ -1,342 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: residue backend 0, 1 and 2 implementation - - ********************************************************************/ - -#include -#include -#include -#include "ogg.h" -#include "ivorbiscodec.h" -#include "codec_internal.h" -#include "registry.h" -#include "codebook.h" -#include "misc.h" -#include "os.h" -#include "block.h" - -typedef struct { - vorbis_info_residue0 *info; - int map; - - int parts; - int stages; - codebook *fullbooks; - codebook *phrasebook; - codebook ***partbooks; - - int partvals; - int **decodemap; - -} vorbis_look_residue0; - -void res0_free_info(vorbis_info_residue *i){ - vorbis_info_residue0 *info=(vorbis_info_residue0 *)i; - if(info){ - memset(info,0,sizeof(*info)); - _ogg_free(info); - } -} - -void res0_free_look(vorbis_look_residue *i){ - int j; - if(i){ - - vorbis_look_residue0 *look=(vorbis_look_residue0 *)i; - - for(j=0;jparts;j++) - if(look->partbooks[j])_ogg_free(look->partbooks[j]); - _ogg_free(look->partbooks); - for(j=0;jpartvals;j++) - _ogg_free(look->decodemap[j]); - _ogg_free(look->decodemap); - - memset(look,0,sizeof(*look)); - _ogg_free(look); - } -} - -static int ilog(unsigned int v){ - int ret=0; - while(v){ - ret++; - v>>=1; - } - return(ret); -} - -static int icount(unsigned int v){ - int ret=0; - while(v){ - ret+=v&1; - v>>=1; - } - return(ret); -} - -/* vorbis_info is for range checking */ -vorbis_info_residue *res0_unpack(vorbis_info *vi,oggpack_buffer *opb){ - int j,acc=0; - vorbis_info_residue0 *info=(vorbis_info_residue0 *)_ogg_calloc(1,sizeof(*info)); - codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; - - info->begin=oggpack_read(opb,24); - info->end=oggpack_read(opb,24); - info->grouping=oggpack_read(opb,24)+1; - info->partitions=oggpack_read(opb,6)+1; - info->groupbook=oggpack_read(opb,8); - - for(j=0;jpartitions;j++){ - int cascade=oggpack_read(opb,3); - if(oggpack_read(opb,1)) - cascade|=(oggpack_read(opb,5)<<3); - info->secondstages[j]=cascade; - - acc+=icount(cascade); - } - for(j=0;jbooklist[j]=oggpack_read(opb,8); - - if(info->groupbook>=ci->books)goto errout; - for(j=0;jbooklist[j]>=ci->books)goto errout; - - return(info); - errout: - res0_free_info(info); - return(NULL); -} - -vorbis_look_residue *res0_look(vorbis_dsp_state *vd,vorbis_info_mode *vm, - vorbis_info_residue *vr){ - vorbis_info_residue0 *info=(vorbis_info_residue0 *)vr; - vorbis_look_residue0 *look=(vorbis_look_residue0 *)_ogg_calloc(1,sizeof(*look)); - codec_setup_info *ci=(codec_setup_info *)vd->vi->codec_setup; - - int j,k,acc=0; - int dim; - int maxstage=0; - look->info=info; - look->map=vm->mapping; - - look->parts=info->partitions; - look->fullbooks=ci->fullbooks; - look->phrasebook=ci->fullbooks+info->groupbook; - dim=look->phrasebook->dim; - - look->partbooks=(codebook ***)_ogg_calloc(look->parts,sizeof(*look->partbooks)); - - for(j=0;jparts;j++){ - int stages=ilog(info->secondstages[j]); - if(stages){ - if(stages>maxstage)maxstage=stages; - look->partbooks[j]=(codebook **)_ogg_calloc(stages,sizeof(*look->partbooks[j])); - for(k=0;ksecondstages[j]&(1<partbooks[j][k]=ci->fullbooks+info->booklist[acc++]; -#ifdef TRAIN_RES - look->training_data[k][j]=calloc(look->partbooks[j][k]->entries, - sizeof(***look->training_data)); -#endif - } - } - } - - look->partvals=look->parts; - for(j=1;jpartvals*=look->parts; - look->stages=maxstage; - look->decodemap=(int **)_ogg_malloc(look->partvals*sizeof(*look->decodemap)); - for(j=0;jpartvals;j++){ - long val=j; - long mult=look->partvals/look->parts; - look->decodemap[j]=(int *)_ogg_malloc(dim*sizeof(*look->decodemap[j])); - for(k=0;kparts; - look->decodemap[j][k]=deco; - } - } - - return(look); -} - - -/* a truncated packet here just means 'stop working'; it's not an error */ -static int _01inverse(vorbis_block *vb,vorbis_look_residue *vl, - ogg_int32_t **in,int ch, - long (*decodepart)(codebook *, ogg_int32_t *, - oggpack_buffer *,int,int)){ - - long i,j,k,l,s; - vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl; - vorbis_info_residue0 *info=look->info; - - /* move all this setup out later */ - int samples_per_partition=info->grouping; - int partitions_per_word=look->phrasebook->dim; - int max=vb->pcmend>>1; - int end=(info->endend:max); - int n=end-info->begin; - - if(n>0){ - int partvals=n/samples_per_partition; - int partwords=(partvals+partitions_per_word-1)/partitions_per_word; - int ***partword=(int ***)alloca(ch*sizeof(*partword)); - - for(j=0;jstages;s++){ - - /* each loop decodes on partition codeword containing - partitions_pre_word partitions */ - for(i=0,l=0;iphrasebook,&vb->opb); - if(temp==-1)goto eopbreak; - partword[j][l]=look->decodemap[temp]; - if(partword[j][l]==NULL)goto errout; - } - } - - /* now we decode residual values for the partitions */ - for(k=0;kbegin+i*samples_per_partition; - if(info->secondstages[partword[j][l][k]]&(1<partbooks[partword[j][l][k]][s]; - if(stagebook){ - if(decodepart(stagebook,in[j]+offset,&vb->opb, - samples_per_partition,-8)==-1)goto eopbreak; - } - } - } - } - } - } - errout: - eopbreak: - return(0); -} - -int res0_inverse(vorbis_block *vb,vorbis_look_residue *vl, - ogg_int32_t **in,int *nonzero,int ch){ - int i,used=0; - for(i=0;iinfo; - - /* move all this setup out later */ - int samples_per_partition=info->grouping; - int partitions_per_word=look->phrasebook->dim; - int max=(vb->pcmend*ch)>>1; - int end=(info->endend:max); - int n=end-info->begin; - - if(n>0){ - - int partvals=n/samples_per_partition; - int partwords=(partvals+partitions_per_word-1)/partitions_per_word; - int **partword=(int **)_vorbis_block_alloc(vb,partwords*sizeof(*partword)); - int beginoff=info->begin/ch; - - for(i=0;istages;s++){ - for(i=0,l=0;iphrasebook,&vb->opb); - if(temp==-1)goto eopbreak; - partword[l]=look->decodemap[temp]; - if(partword[l]==NULL)goto errout; - } - - /* now we decode residual values for the partitions */ - for(k=0;ksecondstages[partword[l][k]]&(1<partbooks[partword[l][k]][s]; - - if(stagebook){ - if(vorbis_book_decodevv_add(stagebook,in, - i*samples_per_partition+beginoff,ch, - &vb->opb, - samples_per_partition,-8)==-1) - goto eopbreak; - } - } - } - } - } - errout: - eopbreak: - return(0); -} - - -vorbis_func_residue residue0_exportbundle={ - &res0_unpack, - &res0_look, - &res0_free_info, - &res0_free_look, - &res0_inverse -}; - -vorbis_func_residue residue1_exportbundle={ - &res0_unpack, - &res0_look, - &res0_free_info, - &res0_free_look, - &res1_inverse -}; - -vorbis_func_residue residue2_exportbundle={ - &res0_unpack, - &res0_look, - &res0_free_info, - &res0_free_look, - &res2_inverse -}; diff --git a/wolf3d/newCode/Tremor/sharedbook.c b/wolf3d/newCode/Tremor/sharedbook.c deleted file mode 100644 index 8e07492..0000000 --- a/wolf3d/newCode/Tremor/sharedbook.c +++ /dev/null @@ -1,439 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: basic shared codebook operations - - ********************************************************************/ - -#include -#include -#include -#include "ogg.h" -#include "misc.h" -#include "ivorbiscodec.h" -#include "codebook.h" - -/**** pack/unpack helpers ******************************************/ -int _ilog(unsigned int v){ - int ret=0; - while(v){ - ret++; - v>>=1; - } - return(ret); -} - -/* 32 bit float (not IEEE; nonnormalized mantissa + - biased exponent) : neeeeeee eeemmmmm mmmmmmmm mmmmmmmm - Why not IEEE? It's just not that important here. */ - -#define VQ_FEXP 10 -#define VQ_FMAN 21 -#define VQ_FEXP_BIAS 768 /* bias toward values smaller than 1. */ - -static ogg_int32_t _float32_unpack(long val,int *point){ - long mant=val&0x1fffff; - int sign=val&0x80000000; - long exp =(val&0x7fe00000L)>>VQ_FMAN; - - exp-=(VQ_FMAN-1)+VQ_FEXP_BIAS; - - if(mant){ - while(!(mant&0x40000000)){ - mant<<=1; - exp-=1; - } - - if(sign)mant= -mant; - }else{ - sign=0; - exp=-9999; - } - - *point=exp; - return mant; -} - -/* given a list of word lengths, generate a list of codewords. Works - for length ordered or unordered, always assigns the lowest valued - codewords first. Extended to handle unused entries (length 0) */ -ogg_uint32_t *_make_words(long *l,long n,long sparsecount){ - long i,j,count=0; - ogg_uint32_t marker[33]; - ogg_uint32_t *r=(ogg_uint32_t *)_ogg_malloc((sparsecount?sparsecount:n)*sizeof(*r)); - memset(marker,0,sizeof(marker)); - - for(i=0;i0){ - ogg_uint32_t entry=marker[length]; - - /* when we claim a node for an entry, we also claim the nodes - below it (pruning off the imagined tree that may have dangled - from it) as well as blocking the use of any nodes directly - above for leaves */ - - /* update ourself */ - if(length<32 && (entry>>length)){ - /* error condition; the lengths must specify an overpopulated tree */ - _ogg_free(r); - return(NULL); - } - r[count++]=entry; - - /* Look to see if the next shorter marker points to the node - above. if so, update it and repeat. */ - { - for(j=length;j>0;j--){ - - if(marker[j]&1){ - /* have to jump branches */ - if(j==1) - marker[1]++; - else - marker[j]=marker[j-1]<<1; - break; /* invariant says next upper marker would already - have been moved if it was on the same path */ - } - marker[j]++; - } - } - - /* prune the tree; the implicit invariant says all the longer - markers were dangling from our just-taken node. Dangle them - from our *new* node. */ - for(j=length+1;j<33;j++) - if((marker[j]>>1) == entry){ - entry=marker[j]; - marker[j]=marker[j-1]<<1; - }else - break; - }else - if(sparsecount==0)count++; - } - - /* bitreverse the words because our bitwise packer/unpacker is LSb - endian */ - for(i=0,count=0;i>j)&1; - } - - if(sparsecount){ - if(l[i]) - r[count++]=temp; - }else - r[count++]=temp; - } - - return(r); -} - -/* there might be a straightforward one-line way to do the below - that's portable and totally safe against roundoff, but I haven't - thought of it. Therefore, we opt on the side of caution */ -long _book_maptype1_quantvals(const static_codebook *b){ - /* get us a starting hint, we'll polish it below */ - int bits=_ilog(b->entries); - int vals=b->entries>>((bits-1)*(b->dim-1)/b->dim); - - while(1){ - long acc=1; - long acc1=1; - int i; - for(i=0;idim;i++){ - acc*=vals; - acc1*=vals+1; - } - if(acc<=b->entries && acc1>b->entries){ - return(vals); - }else{ - if(acc>b->entries){ - vals--; - }else{ - vals++; - } - } - } -} - -/* different than what _book_unquantize does for mainline: - we repack the book in a fixed point format that shares the same - binary point. Upon first use, we can shift point if needed */ - -/* we need to deal with two map types: in map type 1, the values are - generated algorithmically (each column of the vector counts through - the values in the quant vector). in map type 2, all the values came - in in an explicit list. Both value lists must be unpacked */ - -ogg_int32_t *_book_unquantize(const static_codebook *b,int n,int *sparsemap, - int *maxpoint){ - long j,k,count=0; - if(b->maptype==1 || b->maptype==2){ - int quantvals; - int minpoint,delpoint; - ogg_int32_t mindel=_float32_unpack(b->q_min,&minpoint); - ogg_int32_t delta=_float32_unpack(b->q_delta,&delpoint); - ogg_int32_t *r=(ogg_int32_t *)_ogg_calloc(n*b->dim,sizeof(*r)); - int *rp=(int *)_ogg_calloc(n*b->dim,sizeof(*rp)); - - *maxpoint=minpoint; - - /* maptype 1 and 2 both use a quantized value vector, but - different sizes */ - switch(b->maptype){ - case 1: - /* most of the time, entries%dimensions == 0, but we need to be - well defined. We define that the possible vales at each - scalar is values == entries/dim. If entries%dim != 0, we'll - have 'too few' values (values*dimentries;j++){ - if((sparsemap && b->lengthlist[j]) || !sparsemap){ - ogg_int32_t last=0; - int lastpoint=0; - int indexdiv=1; - for(k=0;kdim;k++){ - int index= (j/indexdiv)%quantvals; - int point=0; - int val=VFLOAT_MULTI(delta,delpoint, - abs(b->quantlist[index]),&point); - - val=VFLOAT_ADD(mindel,minpoint,val,point,&point); - val=VFLOAT_ADD(last,lastpoint,val,point,&point); - - if(b->q_sequencep){ - last=val; - lastpoint=point; - } - - if(sparsemap){ - r[sparsemap[count]*b->dim+k]=val; - rp[sparsemap[count]*b->dim+k]=point; - }else{ - r[count*b->dim+k]=val; - rp[count*b->dim+k]=point; - } - if(*maxpointentries;j++){ - if((sparsemap && b->lengthlist[j]) || !sparsemap){ - ogg_int32_t last=0; - int lastpoint=0; - - for(k=0;kdim;k++){ - int point=0; - int val=VFLOAT_MULTI(delta,delpoint, - abs(b->quantlist[j*b->dim+k]),&point); - - val=VFLOAT_ADD(mindel,minpoint,val,point,&point); - val=VFLOAT_ADD(last,lastpoint,val,point,&point); - - if(b->q_sequencep){ - last=val; - lastpoint=point; - } - - if(sparsemap){ - r[sparsemap[count]*b->dim+k]=val; - rp[sparsemap[count]*b->dim+k]=point; - }else{ - r[count*b->dim+k]=val; - rp[count*b->dim+k]=point; - } - if(*maxpointdim;j++) - if(rp[j]<*maxpoint) - r[j]>>=*maxpoint-rp[j]; - - _ogg_free(rp); - return(r); - } - return(NULL); -} - -void vorbis_staticbook_clear(static_codebook *b){ - if(b->quantlist)_ogg_free(b->quantlist); - if(b->lengthlist)_ogg_free(b->lengthlist); - memset(b,0,sizeof(*b)); - -} - -void vorbis_staticbook_destroy(static_codebook *b){ - vorbis_staticbook_clear(b); - _ogg_free(b); -} - -void vorbis_book_clear(codebook *b){ - /* static book is not cleared; we're likely called on the lookup and - the static codebook belongs to the info struct */ - if(b->valuelist)_ogg_free(b->valuelist); - if(b->codelist)_ogg_free(b->codelist); - - if(b->dec_index)_ogg_free(b->dec_index); - if(b->dec_codelengths)_ogg_free(b->dec_codelengths); - if(b->dec_firsttable)_ogg_free(b->dec_firsttable); - - memset(b,0,sizeof(*b)); -} - -static ogg_uint32_t bitreverse(ogg_uint32_t x){ - x= ((x>>16)&0x0000ffffUL) | ((x<<16)&0xffff0000UL); - x= ((x>> 8)&0x00ff00ffUL) | ((x<< 8)&0xff00ff00UL); - x= ((x>> 4)&0x0f0f0f0fUL) | ((x<< 4)&0xf0f0f0f0UL); - x= ((x>> 2)&0x33333333UL) | ((x<< 2)&0xccccccccUL); - return((x>> 1)&0x55555555UL) | ((x<< 1)&0xaaaaaaaaUL); -} - -static int sort32a(const void *a,const void *b){ - return (**(ogg_uint32_t **)a>**(ogg_uint32_t **)b)- - (**(ogg_uint32_t **)a<**(ogg_uint32_t **)b); -} - -/* decode codebook arrangement is more heavily optimized than encode */ -int vorbis_book_init_decode(codebook *c,const static_codebook *s){ - int i,j,n=0,tabn; - int *sortindex; - memset(c,0,sizeof(*c)); - - /* count actually used entries */ - for(i=0;ientries;i++) - if(s->lengthlist[i]>0) - n++; - - c->entries=s->entries; - c->used_entries=n; - c->dim=s->dim; - - if(n>0){ - /* two different remappings go on here. - - First, we collapse the likely sparse codebook down only to - actually represented values/words. This collapsing needs to be - indexed as map-valueless books are used to encode original entry - positions as integers. - - Second, we reorder all vectors, including the entry index above, - by sorted bitreversed codeword to allow treeless decode. */ - - /* perform sort */ - ogg_uint32_t *codes=_make_words(s->lengthlist,s->entries,c->used_entries); - ogg_uint32_t **codep=(ogg_uint32_t **)alloca(sizeof(*codep)*n); - - if(codes==NULL)goto err_out; - - for(i=0;icodelist=(ogg_uint32_t *)_ogg_malloc(n*sizeof(*c->codelist)); - /* the index is a reverse index */ - for(i=0;icodelist[sortindex[i]]=codes[i]; - _ogg_free(codes); - - - - c->valuelist=_book_unquantize(s,n,sortindex,&c->binarypoint); - c->dec_index=(int *)_ogg_malloc(n*sizeof(*c->dec_index)); - - for(n=0,i=0;ientries;i++) - if(s->lengthlist[i]>0) - c->dec_index[sortindex[n++]]=i; - - c->dec_codelengths=(char *)_ogg_malloc(n*sizeof(*c->dec_codelengths)); - for(n=0,i=0;ientries;i++) - if(s->lengthlist[i]>0) - c->dec_codelengths[sortindex[n++]]=s->lengthlist[i]; - - c->dec_firsttablen=_ilog(c->used_entries)-4; /* this is magic */ - if(c->dec_firsttablen<5)c->dec_firsttablen=5; - if(c->dec_firsttablen>8)c->dec_firsttablen=8; - - tabn=1<dec_firsttablen; - c->dec_firsttable=(ogg_uint32_t *)_ogg_calloc(tabn,sizeof(*c->dec_firsttable)); - c->dec_maxlength=0; - - for(i=0;idec_maxlengthdec_codelengths[i]) - c->dec_maxlength=c->dec_codelengths[i]; - if(c->dec_codelengths[i]<=c->dec_firsttablen){ - ogg_uint32_t orig=bitreverse(c->codelist[i]); - for(j=0;j<(1<<(c->dec_firsttablen-c->dec_codelengths[i]));j++) - c->dec_firsttable[orig|(j<dec_codelengths[i])]=i+1; - } - } - - /* now fill in 'unused' entries in the firsttable with hi/lo search - hints for the non-direct-hits */ - { - ogg_uint32_t mask=0xfffffffeUL<<(31-c->dec_firsttablen); - long lo=0,hi=0; - - for(i=0;idec_firsttablen); - if(c->dec_firsttable[bitreverse(word)]==0){ - while((lo+1)codelist[lo+1]<=word)lo++; - while( hi=(c->codelist[hi]&mask))hi++; - - /* we only actually have 15 bits per hint to play with here. - In order to overflow gracefully (nothing breaks, efficiency - just drops), encode as the difference from the extremes. */ - { - unsigned long loval=lo; - unsigned long hival=n-hi; - - if(loval>0x7fff)loval=0x7fff; - if(hival>0x7fff)hival=0x7fff; - c->dec_firsttable[bitreverse(word)]= - 0x80000000UL | (loval<<15) | hival; - } - } - } - } - } - - return(0); - err_out: - vorbis_book_clear(c); - return(-1); -} - diff --git a/wolf3d/newCode/Tremor/synthesis.c b/wolf3d/newCode/Tremor/synthesis.c deleted file mode 100644 index 962c730..0000000 --- a/wolf3d/newCode/Tremor/synthesis.c +++ /dev/null @@ -1,113 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2003 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: single-block PCM synthesis - last mod: $Id: synthesis.c,v 1.4 2003/03/29 03:07:21 xiphmont Exp $ - - ********************************************************************/ - -#include -#include "ogg.h" -#include "ivorbiscodec.h" -#include "codec_internal.h" -#include "registry.h" -#include "misc.h" -#include "block.h" - -int vorbis_synthesis(vorbis_block *vb,ogg_packet *op,int decodep){ - vorbis_dsp_state *vd=vb->vd; - private_state *b=(private_state *)vd->backend_state; - vorbis_info *vi=vd->vi; - codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; - oggpack_buffer *opb=&vb->opb; - int type,mode,i; - - /* first things first. Make sure decode is ready */ - _vorbis_block_ripcord(vb); - oggpack_readinit(opb,op->packet); - - /* Check the packet type */ - if(oggpack_read(opb,1)!=0){ - /* Oops. This is not an audio data packet */ - return(OV_ENOTAUDIO); - } - - /* read our mode and pre/post windowsize */ - mode=oggpack_read(opb,b->modebits); - if(mode==-1)return(OV_EBADPACKET); - - vb->mode=mode; - vb->W=ci->mode_param[mode]->blockflag; - if(vb->W){ - vb->lW=oggpack_read(opb,1); - vb->nW=oggpack_read(opb,1); - if(vb->nW==-1) return(OV_EBADPACKET); - }else{ - vb->lW=0; - vb->nW=0; - } - - /* more setup */ - vb->granulepos=op->granulepos; - vb->sequence=op->packetno-3; /* first block is third packet */ - vb->eofflag=op->e_o_s; - - if(decodep){ - /* alloc pcm passback storage */ - vb->pcmend=ci->blocksizes[vb->W]; - vb->pcm=(ogg_int32_t **)_vorbis_block_alloc(vb,sizeof(*vb->pcm)*vi->channels); - for(i=0;ichannels;i++) - vb->pcm[i]=(ogg_int32_t *)_vorbis_block_alloc(vb,vb->pcmend*sizeof(*vb->pcm[i])); - - /* unpack_header enforces range checking */ - type=ci->map_type[ci->mode_param[mode]->mapping]; - - return(_mapping_P[type]->inverse(vb,b->mode[mode])); - }else{ - /* no pcm */ - vb->pcmend=0; - vb->pcm=NULL; - - return(0); - } -} - -long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op){ - codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; - oggpack_buffer opb; - int mode; - - oggpack_readinit(&opb,op->packet); - - /* Check the packet type */ - if(oggpack_read(&opb,1)!=0){ - /* Oops. This is not an audio data packet */ - return(OV_ENOTAUDIO); - } - - { - int modebits=0; - int v=ci->modes; - while(v>1){ - modebits++; - v>>=1; - } - - /* read our mode and pre/post windowsize */ - mode=oggpack_read(&opb,modebits); - } - if(mode==-1)return(OV_EBADPACKET); - return(ci->blocksizes[ci->mode_param[mode]->blockflag]); -} - - diff --git a/wolf3d/newCode/Tremor/vorbisfile.c b/wolf3d/newCode/Tremor/vorbisfile.c deleted file mode 100644 index 0c48f1f..0000000 --- a/wolf3d/newCode/Tremor/vorbisfile.c +++ /dev/null @@ -1,1586 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2003 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: stdio-based convenience library for opening/seeking/decoding - last mod: $Id: vorbisfile.c,v 1.6 2003/03/30 23:40:56 xiphmont Exp $ - - ********************************************************************/ - -#include -#include -#include -#include -#include - -#include "ivorbiscodec.h" -#include "ivorbisfile.h" - -#include "misc.h" - -/* A 'chained bitstream' is a Vorbis bitstream that contains more than - one logical bitstream arranged end to end (the only form of Ogg - multiplexing allowed in a Vorbis bitstream; grouping [parallel - multiplexing] is not allowed in Vorbis) */ - -/* A Vorbis file can be played beginning to end (streamed) without - worrying ahead of time about chaining (see decoder_example.c). If - we have the whole file, however, and want random access - (seeking/scrubbing) or desire to know the total length/time of a - file, we need to account for the possibility of chaining. */ - -/* We can handle things a number of ways; we can determine the entire - bitstream structure right off the bat, or find pieces on demand. - This example determines and caches structure for the entire - bitstream, but builds a virtual decoder on the fly when moving - between links in the chain. */ - -/* There are also different ways to implement seeking. Enough - information exists in an Ogg bitstream to seek to - sample-granularity positions in the output. Or, one can seek by - picking some portion of the stream roughly in the desired area if - we only want coarse navigation through the stream. */ - -/************************************************************************* - * Many, many internal helpers. The intention is not to be confusing; - * rampant duplication and monolithic function implementation would be - * harder to understand anyway. The high level functions are last. Begin - * grokking near the end of the file */ - - -/* read a little more data from the file/pipe into the ogg_sync framer */ -static long _get_data(OggVorbis_File *vf){ - errno=0; - if(vf->datasource){ - unsigned char *buffer=ogg_sync_bufferin(vf->oy,CHUNKSIZE); - long bytes=(vf->callbacks.read_func)(buffer,1,CHUNKSIZE,vf->datasource); - if(bytes>0)ogg_sync_wrote(vf->oy,bytes); - if(bytes==0 && errno)return(-1); - return(bytes); - }else - return(0); -} - -/* save a tiny smidge of verbosity to make the code more readable */ -static void _seek_helper(OggVorbis_File *vf,ogg_int64_t offset){ - if(vf->datasource){ - (vf->callbacks.seek_func)(vf->datasource, offset, SEEK_SET); - vf->offset=offset; - ogg_sync_reset(vf->oy); - }else{ - /* shouldn't happen unless someone writes a broken callback */ - return; - } -} - -/* The read/seek functions track absolute position within the stream */ - -/* from the head of the stream, get the next page. boundary specifies - if the function is allowed to fetch more data from the stream (and - how much) or only use internally buffered data. - - boundary: -1) unbounded search - 0) read no additional data; use cached only - n) search for a new page beginning for n bytes - - return: <0) did not find a page (OV_FALSE, OV_EOF, OV_EREAD) - n) found a page at absolute offset n - - produces a refcounted page */ - -static ogg_int64_t _get_next_page(OggVorbis_File *vf,ogg_page *og, - ogg_int64_t boundary){ - if(boundary>0)boundary+=vf->offset; - while(1){ - long more; - - if(boundary>0 && vf->offset>=boundary)return(OV_FALSE); - more=ogg_sync_pageseek(vf->oy,og); - - if(more<0){ - /* skipped n bytes */ - vf->offset-=more; - }else{ - if(more==0){ - /* send more paramedics */ - if(!boundary)return(OV_FALSE); - { - long ret=_get_data(vf); - if(ret==0)return(OV_EOF); - if(ret<0)return(OV_EREAD); - } - }else{ - /* got a page. Return the offset at the page beginning, - advance the internal offset past the page end */ - ogg_int64_t ret=vf->offset; - vf->offset+=more; - return(ret); - - } - } - } -} - -/* find the latest page beginning before the current stream cursor - position. Much dirtier than the above as Ogg doesn't have any - backward search linkage. no 'readp' as it will certainly have to - read. */ -/* returns offset or OV_EREAD, OV_FAULT and produces a refcounted page */ - -static ogg_int64_t _get_prev_page(OggVorbis_File *vf,ogg_page *og){ - ogg_int64_t begin=vf->offset; - ogg_int64_t end=begin; - ogg_int64_t ret; - ogg_int64_t offset=-1; - - while(offset==-1){ - begin-=CHUNKSIZE; - if(begin<0) - begin=0; - _seek_helper(vf,begin); - while(vf->offsetoffset); - if(ret==OV_EREAD)return(OV_EREAD); - if(ret<0){ - break; - }else{ - offset=ret; - } - } - } - - /* we have the offset. Actually snork and hold the page now */ - _seek_helper(vf,offset); - ret=_get_next_page(vf,og,CHUNKSIZE); - if(ret<0) - /* this shouldn't be possible */ - return(OV_EFAULT); - - return(offset); -} - -/* finds each bitstream link one at a time using a bisection search - (has to begin by knowing the offset of the lb's initial page). - Recurses for each link so it can alloc the link storage after - finding them all, then unroll and fill the cache at the same time */ -static int _bisect_forward_serialno(OggVorbis_File *vf, - ogg_int64_t begin, - ogg_int64_t searched, - ogg_int64_t end, - ogg_uint32_t currentno, - long m){ - ogg_int64_t endsearched=end; - ogg_int64_t next=end; - ogg_page og={0,0,0,0}; - ogg_int64_t ret; - - /* the below guards against garbage seperating the last and - first pages of two links. */ - while(searched=0)next=ret; - }else{ - searched=ret+og.header_len+og.body_len; - } - ogg_page_release(&og); - } - - _seek_helper(vf,next); - ret=_get_next_page(vf,&og,-1); - if(ret==OV_EREAD)return(OV_EREAD); - - if(searched>=end || ret<0){ - ogg_page_release(&og); - vf->links=m+1; - vf->offsets=_ogg_malloc((vf->links+1)*sizeof(*vf->offsets)); - vf->serialnos=_ogg_malloc(vf->links*sizeof(*vf->serialnos)); - vf->offsets[m+1]=searched; - }else{ - ret=_bisect_forward_serialno(vf,next,vf->offset, - end,ogg_page_serialno(&og),m+1); - ogg_page_release(&og); - if(ret==OV_EREAD)return(OV_EREAD); - } - - vf->offsets[m]=begin; - vf->serialnos[m]=currentno; - return(0); -} - -/* uses the local ogg_stream storage in vf; this is important for - non-streaming input sources */ -/* consumes the page that's passed in (if any) */ - -static int _fetch_headers(OggVorbis_File *vf, - vorbis_info *vi, - vorbis_comment *vc, - ogg_uint32_t *serialno, - ogg_page *og_ptr){ - ogg_page og={0,0,0,0}; - ogg_packet op={0,0,0,0,0,0}; - int i,ret; - - if(!og_ptr){ - ogg_int64_t llret=_get_next_page(vf,&og,CHUNKSIZE); - if(llret==OV_EREAD)return(OV_EREAD); - if(llret<0)return OV_ENOTVORBIS; - og_ptr=&og; - } - - ogg_stream_reset_serialno(vf->os,ogg_page_serialno(og_ptr)); - if(serialno)*serialno=vf->os->serialno; - vf->ready_state=STREAMSET; - - /* extract the initial header from the first page and verify that the - Ogg bitstream is in fact Vorbis data */ - - vorbis_info_init(vi); - vorbis_comment_init(vc); - - i=0; - while(i<3){ - ogg_stream_pagein(vf->os,og_ptr); - while(i<3){ - int result=ogg_stream_packetout(vf->os,&op); - if(result==0)break; - if(result==-1){ - ret=OV_EBADHEADER; - goto bail_header; - } - if((ret=vorbis_synthesis_headerin(vi,vc,&op))){ - goto bail_header; - } - i++; - } - if(i<3) - if(_get_next_page(vf,og_ptr,CHUNKSIZE)<0){ - ret=OV_EBADHEADER; - goto bail_header; - } - } - - ogg_packet_release(&op); - ogg_page_release(&og); - return 0; - - bail_header: - ogg_packet_release(&op); - ogg_page_release(&og); - vorbis_info_clear(vi); - vorbis_comment_clear(vc); - vf->ready_state=OPENED; - - return ret; -} - -/* last step of the OggVorbis_File initialization; get all the - vorbis_info structs and PCM positions. Only called by the seekable - initialization (local stream storage is hacked slightly; pay - attention to how that's done) */ - -/* this is void and does not propogate errors up because we want to be - able to open and use damaged bitstreams as well as we can. Just - watch out for missing information for links in the OggVorbis_File - struct */ -static void _prefetch_all_headers(OggVorbis_File *vf, ogg_int64_t dataoffset){ - ogg_page og={0,0,0,0}; - int i; - ogg_int64_t ret; - - vf->vi=_ogg_realloc(vf->vi,vf->links*sizeof(*vf->vi)); - vf->vc=_ogg_realloc(vf->vc,vf->links*sizeof(*vf->vc)); - vf->dataoffsets=_ogg_malloc(vf->links*sizeof(*vf->dataoffsets)); - vf->pcmlengths=_ogg_malloc(vf->links*2*sizeof(*vf->pcmlengths)); - - for(i=0;ilinks;i++){ - if(i==0){ - /* we already grabbed the initial header earlier. Just set the offset */ - vf->dataoffsets[i]=dataoffset; - _seek_helper(vf,dataoffset); - - }else{ - - /* seek to the location of the initial header */ - - _seek_helper(vf,vf->offsets[i]); - if(_fetch_headers(vf,vf->vi+i,vf->vc+i,NULL,NULL)<0){ - vf->dataoffsets[i]=-1; - }else{ - vf->dataoffsets[i]=vf->offset; - } - } - - /* fetch beginning PCM offset */ - - if(vf->dataoffsets[i]!=-1){ - ogg_int64_t accumulated=0,pos; - long lastblock=-1; - int result; - - ogg_stream_reset_serialno(vf->os,vf->serialnos[i]); - - while(1){ - ogg_packet op={0,0,0,0,0,0}; - - ret=_get_next_page(vf,&og,-1); - if(ret<0) - /* this should not be possible unless the file is - truncated/mangled */ - break; - - if(ogg_page_serialno(&og)!=vf->serialnos[i]) - break; - - pos=ogg_page_granulepos(&og); - - /* count blocksizes of all frames in the page */ - ogg_stream_pagein(vf->os,&og); - while((result=ogg_stream_packetout(vf->os,&op))){ - if(result>0){ /* ignore holes */ - long thisblock=vorbis_packet_blocksize(vf->vi+i,&op); - if(lastblock!=-1) - accumulated+=(lastblock+thisblock)>>2; - lastblock=thisblock; - } - } - ogg_packet_release(&op); - - if(pos!=-1){ - /* pcm offset of last packet on the first audio page */ - accumulated= pos-accumulated; - break; - } - } - - /* less than zero? This is a stream with samples trimmed off - the beginning, a normal occurrence; set the offset to zero */ - if(accumulated<0)accumulated=0; - - vf->pcmlengths[i*2]=accumulated; - } - - /* get the PCM length of this link. To do this, - get the last page of the stream */ - { - ogg_int64_t end=vf->offsets[i+1]; - _seek_helper(vf,end); - - while(1){ - ret=_get_prev_page(vf,&og); - if(ret<0){ - /* this should not be possible */ - vorbis_info_clear(vf->vi+i); - vorbis_comment_clear(vf->vc+i); - break; - } - if(ogg_page_granulepos(&og)!=-1){ - vf->pcmlengths[i*2+1]=ogg_page_granulepos(&og)-vf->pcmlengths[i*2]; - break; - } - vf->offset=ret; - } - } - } - ogg_page_release(&og); -} - -static void _make_decode_ready(OggVorbis_File *vf){ - if(vf->ready_state!=STREAMSET)return; - if(vf->seekable){ - vorbis_synthesis_init(&vf->vd,vf->vi+vf->current_link); - }else{ - vorbis_synthesis_init(&vf->vd,vf->vi); - } - vorbis_block_init(&vf->vd,&vf->vb); - vf->ready_state=INITSET; - vf->bittrack=0; - vf->samptrack=0; - return; -} - -static int _open_seekable2(OggVorbis_File *vf){ - ogg_uint32_t serialno=vf->current_serialno; - ogg_uint32_t tempserialno; - ogg_int64_t dataoffset=vf->offset, end; - ogg_page og={0,0,0,0}; - - /* we're partially open and have a first link header state in - storage in vf */ - /* we can seek, so set out learning all about this file */ - (vf->callbacks.seek_func)(vf->datasource,0,SEEK_END); - vf->offset=vf->end=(vf->callbacks.tell_func)(vf->datasource); - - /* We get the offset for the last page of the physical bitstream. - Most OggVorbis files will contain a single logical bitstream */ - end=_get_prev_page(vf,&og); - if(end<0)return(end); - - /* more than one logical bitstream? */ - tempserialno=ogg_page_serialno(&og); - ogg_page_release(&og); - - if(tempserialno!=serialno){ - - /* Chained bitstream. Bisect-search each logical bitstream - section. Do so based on serial number only */ - if(_bisect_forward_serialno(vf,0,0,end+1,serialno,0)<0)return(OV_EREAD); - - }else{ - - /* Only one logical bitstream */ - if(_bisect_forward_serialno(vf,0,end,end+1,serialno,0))return(OV_EREAD); - - } - - /* the initial header memory is referenced by vf after; don't free it */ - _prefetch_all_headers(vf,dataoffset); - return(ov_raw_seek(vf,0)); -} - -/* clear out the current logical bitstream decoder */ -static void _decode_clear(OggVorbis_File *vf){ - vorbis_dsp_clear(&vf->vd); - vorbis_block_clear(&vf->vb); - vf->ready_state=OPENED; -} - -/* fetch and process a packet. Handles the case where we're at a - bitstream boundary and dumps the decoding machine. If the decoding - machine is unloaded, it loads it. It also keeps pcm_offset up to - date (seek and read both use this. seek uses a special hack with - readp). - - return: <0) error, OV_HOLE (lost packet) or OV_EOF - 0) need more data (only if readp==0) - 1) got a packet -*/ - -static int _fetch_and_process_packet(OggVorbis_File *vf, - int readp, - int spanp){ - ogg_page og={0,0,0,0}; - ogg_packet op={0,0,0,0,0,0}; - int ret=0; - - /* handle one packet. Try to fetch it from current stream state */ - /* extract packets from page */ - while(1){ - - /* process a packet if we can. If the machine isn't loaded, - neither is a page */ - if(vf->ready_state==INITSET){ - while(1) { - int result=ogg_stream_packetout(vf->os,&op); - ogg_int64_t granulepos; - - if(result<0){ - ret=OV_HOLE; /* hole in the data. */ - goto cleanup; - } - if(result>0){ - /* got a packet. process it */ - granulepos=op.granulepos; - if(!vorbis_synthesis(&vf->vb,&op,1)){ /* lazy check for lazy - header handling. The - header packets aren't - audio, so if/when we - submit them, - vorbis_synthesis will - reject them */ - - /* suck in the synthesis data and track bitrate */ - { - int oldsamples=vorbis_synthesis_pcmout(&vf->vd,NULL); - /* for proper use of libvorbis within libvorbisfile, - oldsamples will always be zero. */ - if(oldsamples){ - ret=OV_EFAULT; - goto cleanup; - } - - vorbis_synthesis_blockin(&vf->vd,&vf->vb); - vf->samptrack+=vorbis_synthesis_pcmout(&vf->vd,NULL)-oldsamples; - vf->bittrack+=op.bytes*8; - } - - /* update the pcm offset. */ - if(granulepos!=-1 && !op.e_o_s){ - int link=(vf->seekable?vf->current_link:0); - int i,samples; - - /* this packet has a pcm_offset on it (the last packet - completed on a page carries the offset) After processing - (above), we know the pcm position of the *last* sample - ready to be returned. Find the offset of the *first* - - As an aside, this trick is inaccurate if we begin - reading anew right at the last page; the end-of-stream - granulepos declares the last frame in the stream, and the - last packet of the last page may be a partial frame. - So, we need a previous granulepos from an in-sequence page - to have a reference point. Thus the !op.e_o_s clause - above */ - - if(vf->seekable && link>0) - granulepos-=vf->pcmlengths[link*2]; - if(granulepos<0)granulepos=0; /* actually, this - shouldn't be possible - here unless the stream - is very broken */ - - samples=vorbis_synthesis_pcmout(&vf->vd,NULL); - - granulepos-=samples; - for(i=0;ipcmlengths[i*2+1]; - vf->pcm_offset=granulepos; - } - ret=1; - goto cleanup; - } - } - else - break; - } - } - - if(vf->ready_state>=OPENED){ - int ret; - if(!readp){ - ret=0; - goto cleanup; - } - if((ret=_get_next_page(vf,&og,-1))<0){ - ret=OV_EOF; /* eof. leave unitialized */ - goto cleanup; - } - - /* bitrate tracking; add the header's bytes here, the body bytes - are done by packet above */ - vf->bittrack+=og.header_len*8; - - /* has our decoding just traversed a bitstream boundary? */ - if(vf->ready_state==INITSET){ - if(vf->current_serialno!=ogg_page_serialno(&og)){ - if(!spanp){ - ret=OV_EOF; - goto cleanup; - } - - _decode_clear(vf); - - if(!vf->seekable){ - vorbis_info_clear(vf->vi); - vorbis_comment_clear(vf->vc); - } - } - } - } - - /* Do we need to load a new machine before submitting the page? */ - /* This is different in the seekable and non-seekable cases. - - In the seekable case, we already have all the header - information loaded and cached; we just initialize the machine - with it and continue on our merry way. - - In the non-seekable (streaming) case, we'll only be at a - boundary if we just left the previous logical bitstream and - we're now nominally at the header of the next bitstream - */ - - if(vf->ready_state!=INITSET){ - int link; - - if(vf->ready_stateseekable){ - vf->current_serialno=ogg_page_serialno(&og); - - /* match the serialno to bitstream section. We use this rather than - offset positions to avoid problems near logical bitstream - boundaries */ - for(link=0;linklinks;link++) - if(vf->serialnos[link]==vf->current_serialno)break; - if(link==vf->links){ - ret=OV_EBADLINK; /* sign of a bogus stream. error out, - leave machine uninitialized */ - goto cleanup; - } - - vf->current_link=link; - - ogg_stream_reset_serialno(vf->os,vf->current_serialno); - vf->ready_state=STREAMSET; - - }else{ - /* we're streaming */ - /* fetch the three header packets, build the info struct */ - - int ret=_fetch_headers(vf,vf->vi,vf->vc,&vf->current_serialno,&og); - if(ret) goto cleanup; - vf->current_link++; - link=0; - } - } - - _make_decode_ready(vf); - } - ogg_stream_pagein(vf->os,&og); - } - cleanup: - ogg_packet_release(&op); - ogg_page_release(&og); - return ret; -} - -/* if, eg, 64 bit stdio is configured by default, this will build with - fseek64 */ -static int _fseek64_wrap(FILE *f,ogg_int64_t off,int whence){ - if(f==NULL)return(-1); - return fseek(f,off,whence); -} - -static int _ov_open1(void *f,OggVorbis_File *vf,char *initial, - long ibytes, ov_callbacks callbacks){ - int offsettest=(f?callbacks.seek_func(f,0,SEEK_CUR):-1); - int ret; - - memset(vf,0,sizeof(*vf)); - vf->datasource=f; - vf->callbacks = callbacks; - - /* init the framing state */ - vf->oy=ogg_sync_create(); - - /* perhaps some data was previously read into a buffer for testing - against other stream types. Allow initialization from this - previously read data (as we may be reading from a non-seekable - stream) */ - if(initial){ - unsigned char *buffer=ogg_sync_bufferin(vf->oy,ibytes); - memcpy(buffer,initial,ibytes); - ogg_sync_wrote(vf->oy,ibytes); - } - - /* can we seek? Stevens suggests the seek test was portable */ - if(offsettest!=-1)vf->seekable=1; - - /* No seeking yet; Set up a 'single' (current) logical bitstream - entry for partial open */ - vf->links=1; - vf->vi=_ogg_calloc(vf->links,sizeof(*vf->vi)); - vf->vc=_ogg_calloc(vf->links,sizeof(*vf->vc)); - vf->os=ogg_stream_create(-1); /* fill in the serialno later */ - - /* Try to fetch the headers, maintaining all the storage */ - if((ret=_fetch_headers(vf,vf->vi,vf->vc,&vf->current_serialno,NULL))<0){ - vf->datasource=NULL; - ov_clear(vf); - }else if(vf->ready_state < PARTOPEN) - vf->ready_state=PARTOPEN; - return(ret); -} - -static int _ov_open2(OggVorbis_File *vf){ - if(vf->ready_state < OPENED) - vf->ready_state=OPENED; - if(vf->seekable){ - int ret=_open_seekable2(vf); - if(ret){ - vf->datasource=NULL; - ov_clear(vf); - } - return(ret); - } - return 0; -} - - -/* clear out the OggVorbis_File struct */ -int ov_clear(OggVorbis_File *vf){ - if(vf){ - vorbis_block_clear(&vf->vb); - vorbis_dsp_clear(&vf->vd); - ogg_stream_destroy(vf->os); - - if(vf->vi && vf->links){ - int i; - for(i=0;ilinks;i++){ - vorbis_info_clear(vf->vi+i); - vorbis_comment_clear(vf->vc+i); - } - _ogg_free(vf->vi); - _ogg_free(vf->vc); - } - if(vf->dataoffsets)_ogg_free(vf->dataoffsets); - if(vf->pcmlengths)_ogg_free(vf->pcmlengths); - if(vf->serialnos)_ogg_free(vf->serialnos); - if(vf->offsets)_ogg_free(vf->offsets); - ogg_sync_destroy(vf->oy); - - if(vf->datasource)(vf->callbacks.close_func)(vf->datasource); - memset(vf,0,sizeof(*vf)); - } -#ifdef DEBUG_LEAKS - _VDBG_dump(); -#endif - return(0); -} - -/* inspects the OggVorbis file and finds/documents all the logical - bitstreams contained in it. Tries to be tolerant of logical - bitstream sections that are truncated/woogie. - - return: -1) error - 0) OK -*/ - -int ov_open_callbacks(void *f,OggVorbis_File *vf,char *initial,long ibytes, - ov_callbacks callbacks){ - int ret=_ov_open1(f,vf,initial,ibytes,callbacks); - if(ret)return ret; - return _ov_open2(vf); -} - -int ov_open(FILE *f,OggVorbis_File *vf,char *initial,long ibytes){ - ov_callbacks callbacks = { - (size_t (*)(void *, size_t, size_t, void *)) fread, - (int (*)(void *, ogg_int64_t, int)) _fseek64_wrap, - (int (*)(void *)) fclose, - (long (*)(void *)) ftell - }; - - return ov_open_callbacks((void *)f, vf, initial, ibytes, callbacks); -} - -/* Only partially open the vorbis file; test for Vorbisness, and load - the headers for the first chain. Do not seek (although test for - seekability). Use ov_test_open to finish opening the file, else - ov_clear to close/free it. Same return codes as open. */ - -int ov_test_callbacks(void *f,OggVorbis_File *vf,char *initial,long ibytes, - ov_callbacks callbacks) -{ - return _ov_open1(f,vf,initial,ibytes,callbacks); -} - -int ov_test(FILE *f,OggVorbis_File *vf,char *initial,long ibytes){ - ov_callbacks callbacks = { - (size_t (*)(void *, size_t, size_t, void *)) fread, - (int (*)(void *, ogg_int64_t, int)) _fseek64_wrap, - (int (*)(void *)) fclose, - (long (*)(void *)) ftell - }; - - return ov_test_callbacks((void *)f, vf, initial, ibytes, callbacks); -} - -int ov_test_open(OggVorbis_File *vf){ - if(vf->ready_state!=PARTOPEN)return(OV_EINVAL); - return _ov_open2(vf); -} - -/* How many logical bitstreams in this physical bitstream? */ -long ov_streams(OggVorbis_File *vf){ - return vf->links; -} - -/* Is the FILE * associated with vf seekable? */ -long ov_seekable(OggVorbis_File *vf){ - return vf->seekable; -} - -/* returns the bitrate for a given logical bitstream or the entire - physical bitstream. If the file is open for random access, it will - find the *actual* average bitrate. If the file is streaming, it - returns the nominal bitrate (if set) else the average of the - upper/lower bounds (if set) else -1 (unset). - - If you want the actual bitrate field settings, get them from the - vorbis_info structs */ - -long ov_bitrate(OggVorbis_File *vf,int i){ - if(vf->ready_state=vf->links)return(OV_EINVAL); - if(!vf->seekable && i!=0)return(ov_bitrate(vf,0)); - if(i<0){ - ogg_int64_t bits=0; - int i; - for(i=0;ilinks;i++) - bits+=(vf->offsets[i+1]-vf->dataoffsets[i])*8; - /* This once read: return(rint(bits/ov_time_total(vf,-1))); - * gcc 3.x on x86 miscompiled this at optimisation level 2 and above, - * so this is slightly transformed to make it work. - */ - return(bits*1000/ov_time_total(vf,-1)); - }else{ - if(vf->seekable){ - /* return the actual bitrate */ - return((vf->offsets[i+1]-vf->dataoffsets[i])*8000/ov_time_total(vf,i)); - }else{ - /* return nominal if set */ - if(vf->vi[i].bitrate_nominal>0){ - return vf->vi[i].bitrate_nominal; - }else{ - if(vf->vi[i].bitrate_upper>0){ - if(vf->vi[i].bitrate_lower>0){ - return (vf->vi[i].bitrate_upper+vf->vi[i].bitrate_lower)/2; - }else{ - return vf->vi[i].bitrate_upper; - } - } - return(OV_FALSE); - } - } - } -} - -/* returns the actual bitrate since last call. returns -1 if no - additional data to offer since last call (or at beginning of stream), - EINVAL if stream is only partially open -*/ -long ov_bitrate_instant(OggVorbis_File *vf){ - int link=(vf->seekable?vf->current_link:0); - long ret; - if(vf->ready_statesamptrack==0)return(OV_FALSE); - ret=vf->bittrack/vf->samptrack*vf->vi[link].rate; - vf->bittrack=0; - vf->samptrack=0; - return(ret); -} - -/* Guess */ -long ov_serialnumber(OggVorbis_File *vf,int i){ - if(i>=vf->links)return(ov_serialnumber(vf,vf->links-1)); - if(!vf->seekable && i>=0)return(ov_serialnumber(vf,-1)); - if(i<0){ - return(vf->current_serialno); - }else{ - return(vf->serialnos[i]); - } -} - -/* returns: total raw (compressed) length of content if i==-1 - raw (compressed) length of that logical bitstream for i==0 to n - OV_EINVAL if the stream is not seekable (we can't know the length) - or if stream is only partially open -*/ -ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i){ - if(vf->ready_stateseekable || i>=vf->links)return(OV_EINVAL); - if(i<0){ - ogg_int64_t acc=0; - int i; - for(i=0;ilinks;i++) - acc+=ov_raw_total(vf,i); - return(acc); - }else{ - return(vf->offsets[i+1]-vf->offsets[i]); - } -} - -/* returns: total PCM length (samples) of content if i==-1 PCM length - (samples) of that logical bitstream for i==0 to n - OV_EINVAL if the stream is not seekable (we can't know the - length) or only partially open -*/ -ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i){ - if(vf->ready_stateseekable || i>=vf->links)return(OV_EINVAL); - if(i<0){ - ogg_int64_t acc=0; - int i; - for(i=0;ilinks;i++) - acc+=ov_pcm_total(vf,i); - return(acc); - }else{ - return(vf->pcmlengths[i*2+1]); - } -} - -/* returns: total milliseconds of content if i==-1 - milliseconds in that logical bitstream for i==0 to n - OV_EINVAL if the stream is not seekable (we can't know the - length) or only partially open -*/ -ogg_int64_t ov_time_total(OggVorbis_File *vf,int i){ - if(vf->ready_stateseekable || i>=vf->links)return(OV_EINVAL); - if(i<0){ - ogg_int64_t acc=0; - int i; - for(i=0;ilinks;i++) - acc+=ov_time_total(vf,i); - return(acc); - }else{ - return(((ogg_int64_t)vf->pcmlengths[i*2+1])*1000/vf->vi[i].rate); - } -} - -/* seek to an offset relative to the *compressed* data. This also - scans packets to update the PCM cursor. It will cross a logical - bitstream boundary, but only if it can't get any packets out of the - tail of the bitstream we seek to (so no surprises). - - returns zero on success, nonzero on failure */ - -int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos){ - ogg_stream_state *work_os=NULL; - ogg_page og={0,0,0,0}; - ogg_packet op={0,0,0,0,0,0}; - - if(vf->ready_stateseekable) - return(OV_ENOSEEK); /* don't dump machine if we can't seek */ - - if(pos<0 || pos>vf->end)return(OV_EINVAL); - - /* don't yet clear out decoding machine (if it's initialized), in - the case we're in the same link. Restart the decode lapping, and - let _fetch_and_process_packet deal with a potential bitstream - boundary */ - vf->pcm_offset=-1; - ogg_stream_reset_serialno(vf->os, - vf->current_serialno); /* must set serialno */ - vorbis_synthesis_restart(&vf->vd); - - _seek_helper(vf,pos); - - /* we need to make sure the pcm_offset is set, but we don't want to - advance the raw cursor past good packets just to get to the first - with a granulepos. That's not equivalent behavior to beginning - decoding as immediately after the seek position as possible. - - So, a hack. We use two stream states; a local scratch state and - the shared vf->os stream state. We use the local state to - scan, and the shared state as a buffer for later decode. - - Unfortuantely, on the last page we still advance to last packet - because the granulepos on the last page is not necessarily on a - packet boundary, and we need to make sure the granpos is - correct. - */ - - { - int lastblock=0; - int accblock=0; - int thisblock; - int eosflag=0; - - work_os=ogg_stream_create(vf->current_serialno); /* get the memory ready */ - while(1){ - if(vf->ready_state>=STREAMSET){ - /* snarf/scan a packet if we can */ - int result=ogg_stream_packetout(work_os,&op); - - if(result>0){ - - if(vf->vi[vf->current_link].codec_setup){ - thisblock=vorbis_packet_blocksize(vf->vi+vf->current_link,&op); - if(thisblock<0){ - ogg_stream_packetout(vf->os,NULL); - thisblock=0; - }else{ - - if(eosflag) - ogg_stream_packetout(vf->os,NULL); - else - if(lastblock)accblock+=(lastblock+thisblock)>>2; - } - - if(op.granulepos!=-1){ - int i,link=vf->current_link; - ogg_int64_t granulepos=op.granulepos-vf->pcmlengths[link*2]; - if(granulepos<0)granulepos=0; - - for(i=0;ipcmlengths[i*2+1]; - vf->pcm_offset=granulepos-accblock; - break; - } - lastblock=thisblock; - continue; - }else - ogg_stream_packetout(vf->os,NULL); - } - } - - if(!lastblock){ - if(_get_next_page(vf,&og,-1)<0){ - vf->pcm_offset=ov_pcm_total(vf,-1); - break; - } - }else{ - /* huh? Bogus stream with packets but no granulepos */ - vf->pcm_offset=-1; - break; - } - - /* has our decoding just traversed a bitstream boundary? */ - if(vf->ready_state>=STREAMSET) - if(vf->current_serialno!=ogg_page_serialno(&og)){ - _decode_clear(vf); /* clear out stream state */ - ogg_stream_destroy(work_os); - } - - if(vf->ready_statecurrent_serialno=ogg_page_serialno(&og); - for(link=0;linklinks;link++) - if(vf->serialnos[link]==vf->current_serialno)break; - if(link==vf->links) - goto seek_error; /* sign of a bogus stream. error out, - leave machine uninitialized */ - - vf->current_link=link; - - ogg_stream_reset_serialno(vf->os,vf->current_serialno); - ogg_stream_reset_serialno(work_os,vf->current_serialno); - vf->ready_state=STREAMSET; - - } - - { - ogg_page dup; - ogg_page_dup(&dup,&og); - eosflag=ogg_page_eos(&og); - ogg_stream_pagein(vf->os,&og); - ogg_stream_pagein(work_os,&dup); - } - } - } - - ogg_packet_release(&op); - ogg_page_release(&og); - ogg_stream_destroy(work_os); - vf->bittrack=0; - vf->samptrack=0; - return(0); - - seek_error: - ogg_packet_release(&op); - ogg_page_release(&og); - - /* dump the machine so we're in a known state */ - vf->pcm_offset=-1; - ogg_stream_destroy(work_os); - _decode_clear(vf); - return OV_EBADLINK; -} - -/* Page granularity seek (faster than sample granularity because we - don't do the last bit of decode to find a specific sample). - - Seek to the last [granule marked] page preceeding the specified pos - location, such that decoding past the returned point will quickly - arrive at the requested position. */ -int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos){ - int link=-1; - ogg_int64_t result=0; - ogg_int64_t total=ov_pcm_total(vf,-1); - ogg_page og={0,0,0,0}; - ogg_packet op={0,0,0,0,0,0}; - - if(vf->ready_stateseekable)return(OV_ENOSEEK); - if(pos<0 || pos>total)return(OV_EINVAL); - - /* which bitstream section does this pcm offset occur in? */ - for(link=vf->links-1;link>=0;link--){ - total-=vf->pcmlengths[link*2+1]; - if(pos>=total)break; - } - - /* search within the logical bitstream for the page with the highest - pcm_pos preceeding (or equal to) pos. There is a danger here; - missing pages or incorrect frame number information in the - bitstream could make our task impossible. Account for that (it - would be an error condition) */ - - /* new search algorithm by HB (Nicholas Vinen) */ - { - ogg_int64_t end=vf->offsets[link+1]; - ogg_int64_t begin=vf->offsets[link]; - ogg_int64_t begintime = vf->pcmlengths[link*2]; - ogg_int64_t endtime = vf->pcmlengths[link*2+1]+begintime; - ogg_int64_t target=pos-total+begintime; - ogg_int64_t best=begin; - - while(beginoffset); - if(result==OV_EREAD) goto seek_error; - if(result<0){ - if(bisect<=begin+1) - end=begin; /* found it */ - else{ - if(bisect==0) goto seek_error; - bisect-=CHUNKSIZE; - if(bisect<=begin)bisect=begin+1; - _seek_helper(vf,bisect); - } - }else{ - ogg_int64_t granulepos=ogg_page_granulepos(&og); - if(granulepos==-1)continue; - if(granuleposoffset; /* raw offset of next page */ - begintime=granulepos; - - if(target-begintime>44100)break; - bisect=begin; /* *not* begin + 1 */ - }else{ - if(bisect<=begin+1) - end=begin; /* found it */ - else{ - if(end==vf->offset){ /* we're pretty close - we'd be stuck in */ - end=result; - bisect-=CHUNKSIZE; /* an endless loop otherwise. */ - if(bisect<=begin)bisect=begin+1; - _seek_helper(vf,bisect); - }else{ - end=result; - endtime=granulepos; - break; - } - } - } - } - } - } - - /* found our page. seek to it, update pcm offset. Easier case than - raw_seek, don't keep packets preceeding granulepos. */ - { - - /* seek */ - _seek_helper(vf,best); - vf->pcm_offset=-1; - - if(_get_next_page(vf,&og,-1)<0){ - ogg_page_release(&og); - return(OV_EOF); /* shouldn't happen */ - } - - if(link!=vf->current_link){ - /* Different link; dump entire decode machine */ - _decode_clear(vf); - - vf->current_link=link; - vf->current_serialno=ogg_page_serialno(&og); - vf->ready_state=STREAMSET; - - }else{ - vorbis_synthesis_restart(&vf->vd); - } - - ogg_stream_reset_serialno(vf->os,vf->current_serialno); - ogg_stream_pagein(vf->os,&og); - - /* pull out all but last packet; the one with granulepos */ - while(1){ - result=ogg_stream_packetpeek(vf->os,&op); - if(result==0){ - /* !!! the packet finishing this page originated on a - preceeding page. Keep fetching previous pages until we - get one with a granulepos or without the 'continued' flag - set. Then just use raw_seek for simplicity. */ - - _seek_helper(vf,best); - - while(1){ - result=_get_prev_page(vf,&og); - if(result<0) goto seek_error; - if(ogg_page_granulepos(&og)>-1 || - !ogg_page_continued(&og)){ - return ov_raw_seek(vf,result); - } - vf->offset=result; - } - } - if(result<0){ - result = OV_EBADPACKET; - goto seek_error; - } - if(op.granulepos!=-1){ - vf->pcm_offset=op.granulepos-vf->pcmlengths[vf->current_link*2]; - if(vf->pcm_offset<0)vf->pcm_offset=0; - vf->pcm_offset+=total; - break; - }else - result=ogg_stream_packetout(vf->os,NULL); - } - } - } - - /* verify result */ - if(vf->pcm_offset>pos || pos>ov_pcm_total(vf,-1)){ - result=OV_EFAULT; - goto seek_error; - } - vf->bittrack=0; - vf->samptrack=0; - - ogg_page_release(&og); - ogg_packet_release(&op); - return(0); - - seek_error: - - ogg_page_release(&og); - ogg_packet_release(&op); - - /* dump machine so we're in a known state */ - vf->pcm_offset=-1; - _decode_clear(vf); - return (int)result; -} - -/* seek to a sample offset relative to the decompressed pcm stream - returns zero on success, nonzero on failure */ - -int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos){ - ogg_packet op={0,0,0,0,0,0}; - ogg_page og={0,0,0,0}; - int thisblock,lastblock=0; - int ret=ov_pcm_seek_page(vf,pos); - if(ret<0)return(ret); - _make_decode_ready(vf); - - /* discard leading packets we don't need for the lapping of the - position we want; don't decode them */ - - while(1){ - - int ret=ogg_stream_packetpeek(vf->os,&op); - if(ret>0){ - thisblock=vorbis_packet_blocksize(vf->vi+vf->current_link,&op); - if(thisblock<0){ - ogg_stream_packetout(vf->os,NULL); - continue; /* non audio packet */ - } - if(lastblock)vf->pcm_offset+=(lastblock+thisblock)>>2; - - if(vf->pcm_offset+((thisblock+ - vorbis_info_blocksize(vf->vi,1))>>2)>=pos)break; - - /* remove the packet from packet queue and track its granulepos */ - ogg_stream_packetout(vf->os,NULL); - vorbis_synthesis(&vf->vb,&op,0); /* set up a vb with - only tracking, no - pcm_decode */ - vorbis_synthesis_blockin(&vf->vd,&vf->vb); - - /* end of logical stream case is hard, especially with exact - length positioning. */ - - if(op.granulepos>-1){ - int i; - /* always believe the stream markers */ - vf->pcm_offset=op.granulepos-vf->pcmlengths[vf->current_link*2]; - if(vf->pcm_offset<0)vf->pcm_offset=0; - for(i=0;icurrent_link;i++) - vf->pcm_offset+=vf->pcmlengths[i*2+1]; - } - - lastblock=thisblock; - - }else{ - if(ret<0 && ret!=OV_HOLE)break; - - /* suck in a new page */ - if(_get_next_page(vf,&og,-1)<0)break; - if(vf->current_serialno!=ogg_page_serialno(&og))_decode_clear(vf); - - if(vf->ready_statecurrent_serialno=ogg_page_serialno(&og); - for(link=0;linklinks;link++) - if(vf->serialnos[link]==vf->current_serialno)break; - if(link==vf->links){ - ogg_page_release(&og); - ogg_packet_release(&op); - return(OV_EBADLINK); - } - vf->current_link=link; - - ogg_stream_reset_serialno(vf->os,vf->current_serialno); - vf->ready_state=STREAMSET; - _make_decode_ready(vf); - lastblock=0; - } - - ogg_stream_pagein(vf->os,&og); - } - } - - vf->bittrack=0; - vf->samptrack=0; - /* discard samples until we reach the desired position. Crossing a - logical bitstream boundary with abandon is OK. */ - while(vf->pcm_offsetpcm_offset; - long samples=vorbis_synthesis_pcmout(&vf->vd,NULL); - - if(samples>target)samples=target; - vorbis_synthesis_read(&vf->vd,samples); - vf->pcm_offset+=samples; - - if(samplespcm_offset=ov_pcm_total(vf,-1); /* eof */ - } - - ogg_page_release(&og); - ogg_packet_release(&op); - return 0; -} - -/* seek to a playback time relative to the decompressed pcm stream - returns zero on success, nonzero on failure */ -int ov_time_seek(OggVorbis_File *vf,ogg_int64_t milliseconds){ - /* translate time to PCM position and call ov_pcm_seek */ - - int link=-1; - ogg_int64_t pcm_total=ov_pcm_total(vf,-1); - ogg_int64_t time_total=ov_time_total(vf,-1); - - if(vf->ready_stateseekable)return(OV_ENOSEEK); - if(milliseconds<0 || milliseconds>time_total)return(OV_EINVAL); - - /* which bitstream section does this time offset occur in? */ - for(link=vf->links-1;link>=0;link--){ - pcm_total-=vf->pcmlengths[link*2+1]; - time_total-=ov_time_total(vf,link); - if(milliseconds>=time_total)break; - } - - /* enough information to convert time offset to pcm offset */ - { - ogg_int64_t target=pcm_total+(milliseconds-time_total)*vf->vi[link].rate/1000; - return(ov_pcm_seek(vf,target)); - } -} - -/* page-granularity version of ov_time_seek - returns zero on success, nonzero on failure */ -int ov_time_seek_page(OggVorbis_File *vf,ogg_int64_t milliseconds){ - /* translate time to PCM position and call ov_pcm_seek */ - - int link=-1; - ogg_int64_t pcm_total=ov_pcm_total(vf,-1); - ogg_int64_t time_total=ov_time_total(vf,-1); - - if(vf->ready_stateseekable)return(OV_ENOSEEK); - if(milliseconds<0 || milliseconds>time_total)return(OV_EINVAL); - - /* which bitstream section does this time offset occur in? */ - for(link=vf->links-1;link>=0;link--){ - pcm_total-=vf->pcmlengths[link*2+1]; - time_total-=ov_time_total(vf,link); - if(milliseconds>=time_total)break; - } - - /* enough information to convert time offset to pcm offset */ - { - ogg_int64_t target=pcm_total+(milliseconds-time_total)*vf->vi[link].rate/1000; - return(ov_pcm_seek_page(vf,target)); - } -} - -/* tell the current stream offset cursor. Note that seek followed by - tell will likely not give the set offset due to caching */ -ogg_int64_t ov_raw_tell(OggVorbis_File *vf){ - if(vf->ready_stateoffset); -} - -/* return PCM offset (sample) of next PCM sample to be read */ -ogg_int64_t ov_pcm_tell(OggVorbis_File *vf){ - if(vf->ready_statepcm_offset); -} - -/* return time offset (milliseconds) of next PCM sample to be read */ -ogg_int64_t ov_time_tell(OggVorbis_File *vf){ - int link=0; - ogg_int64_t pcm_total=0; - ogg_int64_t time_total=0; - - if(vf->ready_stateseekable){ - pcm_total=ov_pcm_total(vf,-1); - time_total=ov_time_total(vf,-1); - - /* which bitstream section does this time offset occur in? */ - for(link=vf->links-1;link>=0;link--){ - pcm_total-=vf->pcmlengths[link*2+1]; - time_total-=ov_time_total(vf,link); - if(vf->pcm_offset>=pcm_total)break; - } - } - - return(time_total+(1000*vf->pcm_offset-pcm_total)/vf->vi[link].rate); -} - -/* link: -1) return the vorbis_info struct for the bitstream section - currently being decoded - 0-n) to request information for a specific bitstream section - - In the case of a non-seekable bitstream, any call returns the - current bitstream. NULL in the case that the machine is not - initialized */ - -vorbis_info *ov_info(OggVorbis_File *vf,int link){ - if(vf->seekable){ - if(link<0) - if(vf->ready_state>=STREAMSET) - return vf->vi+vf->current_link; - else - return vf->vi; - else - if(link>=vf->links) - return NULL; - else - return vf->vi+link; - }else{ - return vf->vi; - } -} - -/* grr, strong typing, grr, no templates/inheritence, grr */ -vorbis_comment *ov_comment(OggVorbis_File *vf,int link){ - if(vf->seekable){ - if(link<0) - if(vf->ready_state>=STREAMSET) - return vf->vc+vf->current_link; - else - return vf->vc; - else - if(link>=vf->links) - return NULL; - else - return vf->vc+link; - }else{ - return vf->vc; - } -} - -/* up to this point, everything could more or less hide the multiple - logical bitstream nature of chaining from the toplevel application - if the toplevel application didn't particularly care. However, at - the point that we actually read audio back, the multiple-section - nature must surface: Multiple bitstream sections do not necessarily - have to have the same number of channels or sampling rate. - - ov_read returns the sequential logical bitstream number currently - being decoded along with the PCM data in order that the toplevel - application can take action on channel/sample rate changes. This - number will be incremented even for streamed (non-seekable) streams - (for seekable streams, it represents the actual logical bitstream - index within the physical bitstream. Note that the accessor - functions above are aware of this dichotomy). - - input values: buffer) a buffer to hold packed PCM data for return - length) the byte length requested to be placed into buffer - - return values: <0) error/hole in data (OV_HOLE), partial open (OV_EINVAL) - 0) EOF - n) number of bytes of PCM actually returned. The - below works on a packet-by-packet basis, so the - return length is not related to the 'length' passed - in, just guaranteed to fit. - - *section) set to the logical bitstream number */ - -long ov_read(OggVorbis_File *vf,char *buffer,int bytes_req,int *bitstream){ - int i,j; - - ogg_int32_t **pcm; - long samples; - - if(vf->ready_stateready_state==INITSET){ - samples=vorbis_synthesis_pcmout(&vf->vd,&pcm); - if(samples)break; - } - - /* suck in another packet */ - { - int ret=_fetch_and_process_packet(vf,1,1); - if(ret==OV_EOF) - return(0); - if(ret<=0) - return(ret); - } - - } - - if(samples>0){ - - /* yay! proceed to pack data into the byte buffer */ - - long channels=ov_info(vf,-1)->channels; - - if(samples>(bytes_req/(2*channels))) - samples=bytes_req/(2*channels); - - for(i=0;i>9); - dest+=channels; - } - } - - vorbis_synthesis_read(&vf->vd,samples); - vf->pcm_offset+=samples; - if(bitstream)*bitstream=vf->current_link; - return(samples*2*channels); - }else{ - return(samples); - } -} diff --git a/wolf3d/newCode/Tremor/window.c b/wolf3d/newCode/Tremor/window.c deleted file mode 100644 index 006a1ee..0000000 --- a/wolf3d/newCode/Tremor/window.c +++ /dev/null @@ -1,83 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: window functions - - ********************************************************************/ - -#include -#include -#include "misc.h" -#include "window.h" -#include "window_lookup.h" - -const void *_vorbis_window(int type, int left){ - - switch(type){ - case 0: - - switch(left){ - case 32: - return vwin64; - case 64: - return vwin128; - case 128: - return vwin256; - case 256: - return vwin512; - case 512: - return vwin1024; - case 1024: - return vwin2048; - case 2048: - return vwin4096; - case 4096: - return vwin8192; - default: - return(0); - } - break; - default: - return(0); - } -} - -void _vorbis_apply_window(ogg_int32_t *d,const void *window_p[2], - long *blocksizes, - int lW,int W,int nW){ - - LOOKUP_T *window[2]={window_p[0],window_p[1]}; - long n=blocksizes[W]; - long ln=blocksizes[lW]; - long rn=blocksizes[nW]; - - long leftbegin=n/4-ln/4; - long leftend=leftbegin+ln/2; - - long rightbegin=n/2+n/4-rn/4; - long rightend=rightbegin+rn/2; - - int i,p; - - for(i=0;i - Copyright (C) 1997-2001 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. - -*/ - -/* - * angle.h: Angle math routines. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * Portion of this code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -#include "../wolfiphone.h" - -/* ------------------------------------------------------------------------------ - Function: angle_diff -Finds the difference between two angles. - - Parameters: angle1, angle2 -[in] Angles in Radians. - - Returns: - Returns the absolute difference between two angles, this will always - be between 0 and 180 degrees. - - Notes: ------------------------------------------------------------------------------ -*/ -INLINECALL float angle_diff( float angle1, float angle2 ) -{ - float d; - - if( angle1 > angle2 ) - { - d = angle1 - angle2; - } - else - { - d = angle2 - angle1; - } - - if( d > M_PI ) - { - return 2 * M_PI - d; - } - else - { - return d; - } -} - -/* ------------------------------------------------------------------------------ - Function: angle_wise -Clockwise distance between two angles. - - Parameters: angle1, angle2 -[in] Angles in Radians. - - Returns: - Returns the clockwise distance from angle2 to angle1, this may be - greater than 180 degrees. - - Notes: ------------------------------------------------------------------------------ -*/ -INLINECALL float angle_wise( float angle1, float angle2 ) -{ - if( angle1 > angle2 ) - { - return angle1 - angle2; - } - else - { - return angle1 + 2 * M_PI - angle2; - } -} - -/* ------------------------------------------------------------------------------ - Function: interpolate_angle -Linear interpolate between angle A and B by - fraction 'f'. - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -INLINECALL float interpolate_angle( float from, float to, float fraction ) -{ - float diff = angle_diff( from, to ) * fraction; - - if( angle_wise( to, from ) >= M_PI ) - { - return from - diff; - } - else - { - return from + diff; - } -} - -/* ------------------------------------------------------------------------------ - Function: normalize_angle - - - Parameters: - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -INLINECALL float normalize_angle( float angle ) -{ - while( angle < 0 ) - { - angle += (2 * M_PI); - } - - while( angle >= (2 * M_PI) ) - { - angle -= (2 * M_PI); - } - - return angle; -} - -/* ------------------------------------------------------------------------------ - Function: LerpAngle -Linear interpolate allowing for the Modulo 360 problem. - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -INLINECALL float LerpAngle( float from, float to, float frac ) -{ - if( to - from > 180 ) - { - to -= 360; - } - - if( to - from < -180 ) - { - to += 360; - } - - return from + frac * (to - from); -} diff --git a/wolf3d/newCode/env/angle.h b/wolf3d/newCode/env/angle.h deleted file mode 100644 index 500ac28..0000000 --- a/wolf3d/newCode/env/angle.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - - Copyright (C) 2005 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * angle.h: Angle math routines. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * Portion of this code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -#ifndef __ANGLE_H__ -#define __ANGLE_H__ - - -#define DEG2RAD( a ) ( (a) * 0.01745329251994329576f ) // a * M_PI / 180.0f -#define RAD2DEG( a ) ( (int)((a) / 0.01745329251994329576f) ) // a * 180.0f / M_PI - -#define ANGLE2SHORT( x ) ( (int)((x) * 65536 / 360) & 65535 ) -#define SHORT2ANGLE( x ) ( (x) * (360.0 / 65536) ) - - - -extern float angle_diff( float angle1, float angle2 ); -extern float angle_wise( float angle1, float angle2 ); -extern float interpolate_angle( float from, float to, float fraction ); -extern float normalize_angle( float angle ); -extern float LerpAngle( float from, float to, float frac ); - - - -#endif /* __ANGLE_H__ */ diff --git a/wolf3d/newCode/env/app_def.h b/wolf3d/newCode/env/app_def.h deleted file mode 100644 index d74edb8..0000000 --- a/wolf3d/newCode/env/app_def.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - - Copyright (C) 2004-2005 Michael Liebscher - - 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. - -*/ - -/* - * app_def.h: Engine interface to game layer. - * - */ - -#ifndef __APP_DEF__ -#define __APP_DEF__ - - - -#define WOLFENSTEIN3D 1 - - -#if WOLFENSTEIN3D - - #define APP_VERSION "0.01i" - - #define RELEASENAME "Nebka" - - #define BASEDIRNAME "base" - - - #define GAME_NAME "Wolfenstein 3-D Redux" - -#endif /* WOLFENSTEIN3D */ - - - -#endif /* __APP_DEF__ */ - diff --git a/wolf3d/newCode/env/arch.c b/wolf3d/newCode/env/arch.c deleted file mode 100644 index 9fb7aa0..0000000 --- a/wolf3d/newCode/env/arch.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - - Copyright (C) 1997-2001 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. - -*/ - -/* - * arch.c: Portable byte swapping. - * - * Author: Id Software, Inc. - * Date: 1997-2001 - * - */ - -#include "../wolfiphone.h" - - -/* ------------------------------------------------------------------------------ - Function: FloatSwap -Endian byte swapping on Float value. - - Parameters: f -[in] Float value to byte swap. - - Returns: Byte swapped float value. - - Notes: - ------------------------------------------------------------------------------ -*/ -INLINECALL float FloatSwap( float f ) -{ - union - { - float f; - W8 b[ 4 ]; - - } dat1, dat2; - - dat1.f = f; - dat2.b[ 0 ] = dat1.b[ 3 ]; - dat2.b[ 1 ] = dat1.b[ 2 ]; - dat2.b[ 2 ] = dat1.b[ 1 ]; - dat2.b[ 3 ] = dat1.b[ 0 ]; - - return dat2.f; -} diff --git a/wolf3d/newCode/env/arch.h b/wolf3d/newCode/env/arch.h deleted file mode 100644 index 73badb0..0000000 --- a/wolf3d/newCode/env/arch.h +++ /dev/null @@ -1,273 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * arch.h: System dependant #defines and macros. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * Portion of this code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -#ifndef __ARCH_H__ -#define __ARCH_H__ - - - -// Define BUILDSTRING and CPUSTRING based on platform -#ifdef _WIN32 - - #ifdef _DEBUG - - #define BUILDSTRING "Win32 DEBUG" - - #else - - #define BUILDSTRING "Win32 RELEASE" - - #endif - - - #ifdef _M_IX86 - - #define CPUSTRING "x86" - - #elif defined _M_ALPHA - - #define CPUSTRING "AXP" - - #else - - #define CPUSTRING "Unknown CPU" - - #endif - - -#elif defined __linux__ - - #define BUILDSTRING "Linux" - - #ifdef __i386__ - - #define CPUSTRING "i386" - - #elif defined __alpha__ - - #define CPUSTRING "AXP" - - #else - - #define CPUSTRING "Unknown CPU" - - #endif - - -#elif defined __FreeBSD__ - - #define BUILDSTRING "FreeBSD" - - #ifdef __i386__ - - #define CPUSTRING "i386" - - #else - - #define CPUSTRING "Unknown CPU" - - #endif - - -#elif defined __sun__ - - #define BUILDSTRING "Solaris" - - #ifdef __i386__ - - #define CPUSTRING "i386" - - #else - - #define CPUSTRING "sparc" - - #endif - - -#elif defined MACOS - - #define BUILDSTRING "MAC" - - #ifdef __powerpc__ - - #define CPUSTRING "PowerPC" - - #else - - #define CPUSTRING "Unknown CPU" - - #endif - - -#else - - #define BUILDSTRING "Unknown OS" - #define CPUSTRING "Unknown CPU" - -#endif /* if WIN32 else __linux__ else __FreeBSD__ else __sun__ else MACOS */ - - - - - -/* - correct numeric types: W8, SW8, W16, SW16, W32, SW32, W64, SW64 - correct misc types: void, float, _boolean - - s -signed - XX -Number of bits - -*/ -#if( __GNUC__ || __WATCOMC__ || _MSC_VER ) - - - typedef unsigned char W8, *PW8; - typedef signed char SW8, *PSW8; - typedef unsigned short W16, *PW16; - typedef signed short SW16, *PSW16; - typedef unsigned long W32, *PW32; - typedef signed long SW32, *PSW32; - - - - #if( __GNUC__ ) - - typedef unsigned long long W64, *PW64; - typedef long long SW64, *PSW64; - - #elif( _MSC_VER || __WATCOMC__ ) - - typedef unsigned __int64 W64, *PW64; - typedef __int64 SW64, *PSW64; - - #else - - #error "please define W64" - - #endif - -#else - - #error "Unknown compiler, please define basic types" - -#endif - - -/* Define NULL pointer value */ -#ifndef NULL - - #ifdef __cplusplus - #define NULL 0 - #else - #define NULL ((void *)0) - #endif - -#endif /* NULL */ - - - -/* Define INLINECALL keyword */ -#ifndef INLINECALL - - #if defined(__cplusplus) || defined(__GNUC__) - - #define INLINECALL inline - - #elif defined(_WIN32) && !defined(__WATCOMC__) - - #define INLINECALL __inline - - #else - - #define INLINECALL /* Not supported */ - - #endif - -#endif /* INLINECALL */ - - - - -typedef W8 colour3_t[ 3 ]; // RGB -typedef W8 colour4_t[ 4 ]; // RGBA -typedef W32 COLOURVAL, *PCOLOURVAL; // Represents a 32-bit colour value. - -#ifdef _WIN32 - - #define vsnprintf _vsnprintf - -#endif - - -typedef W8 _boolean; - -#define false 0 -#define true 1 - -//enum { false = 0, -// true = 1 }; - - - - -#define ShortSwap( x ) ( ( (((W16) (x)) & 0x00FF) << 8 ) | ( (((W16) (x))& 0xFF00) >> 8) ) -#define LongSwap( x ) ( ( ((W32) (x)) & 0xFF000000) >> 24 ) | ( ((( (W32) (x) ) & 0xFF0000) >> 8) ) | ( ((( (W32) (x) ) & 0xFF00) << 8 ) ) | ( (( (W32) (x) ) & 0xFF) << 24 ) - - - -#if defined( IPHONE) || defined(__i386__) || defined(_M_IX86) // Little endian - - #define BigShort( x ) ShortSwap( x ) - #define LittleShort( x ) ( x ) - - #define BigLong( x ) LongSwap( x ) - #define LittleLong( x ) ( x ) - - #define BigFloat( x ) FloatSwap( x ) - #define LittleFloat( x ) ( x ) - - -#else // Big endian - - #define BigShort( x ) ( x ) - #define LittleShort( x ) ShortSwap( x ) - - #define BigLong( x ) ( x ) - #define LittleLong( x ) LongSwap( x ) - - #define BigFloat( x ) ( x ) - #define LittleFloat( x ) FloatSwap( x ) - -#endif - - -#endif /* __ARCH_H__ */ diff --git a/wolf3d/newCode/env/cmd.c b/wolf3d/newCode/env/cmd.c deleted file mode 100644 index b8644bd..0000000 --- a/wolf3d/newCode/env/cmd.c +++ /dev/null @@ -1,1195 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 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: Script command processing module. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -#include "../wolfiphone.h" - - - -//void Cmd_ForwardToServer( void ); - -#define MAX_ALIAS_NAME 32 - -typedef struct cmdalias_s -{ - struct cmdalias_s *next; - char name[ MAX_ALIAS_NAME ]; - W32 id; - char *value; - -} cmdalias_t; - -cmdalias_t *cmd_alias; - -_boolean cmd_wait; - -#define ALIAS_LOOP_COUNT 16 -int alias_count; // for detecting runaway loops - - -//============================================================================= - -/* ------------------------------------------------------------------------------ - Function: Cmd_Wait_f -Wait command. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - 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" - ------------------------------------------------------------------------------ -*/ -PRIVATE void Cmd_Wait_f( void ) -{ - cmd_wait = true; -} - - -/* -============================================================================= - - COMMAND BUFFER - -============================================================================= -*/ - -PRIVATE sizebuf_t cmd_text; - -PRIVATE W8 cmd_text_buf[ 8192 ]; -PRIVATE W8 defer_text_buf[ 8192 ]; - - -/* ------------------------------------------------------------------------------ - Function: Cmd_Init -Allocates an initial text buffer that will grow as needed. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: This must be called before using command buffer. - ------------------------------------------------------------------------------ -*/ -PRIVATE void Cbuf_Init( void ) -{ - SZ_Init( &cmd_text, cmd_text_buf, sizeof( cmd_text_buf ) ); -} - - -/* ------------------------------------------------------------------------------ - Function: Cbuf_AddText -Adds command text at the end of the buffer. - - Parameters: text -[in] Ponter to NUL-terminated string. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void Cbuf_AddText( const char *text ) -{ - W32 length; - - length = strlen( text ); - - if( cmd_text.cursize + length >= cmd_text.maxsize ) - { - Com_Printf( "Cbuf_AddText: overflow\n" ); - return; - } - - SZ_Write( &cmd_text, (void *)text, length ); -} - -/* ------------------------------------------------------------------------------ - Function: Cbuf_InsertText -Adds command text immediately after the current - command. - - Parameters: text -[in] Command text to add to buffer. - - Returns: Nothing. - - Notes: - Adds a \n to the text - FIXME: actually change the command buffer to do less copying ------------------------------------------------------------------------------ -*/ -PUBLIC void Cbuf_InsertText( char *text ) -{ - char *temp; - size_t templen; - -// copy off any commands still remaining in the exec buffer - templen = cmd_text.cursize; - if( templen ) - { - temp = Z_Malloc( templen ); - 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 ); - } -} - - -/* ------------------------------------------------------------------------------ - Function: Cbuf_CopyToDefer -Copy command buffer to defer buffer. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Cbuf_CopyToDefer( void ) -{ - memcpy( defer_text_buf, cmd_text_buf, cmd_text.cursize ); - defer_text_buf[ cmd_text.cursize ] = 0; - cmd_text.cursize = 0; -} - -/* ------------------------------------------------------------------------------ - Function: Cbuf_InsertFromDefer -Insert commands from defer buffer to command - buffer. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Cbuf_InsertFromDefer( void ) -{ - Cbuf_InsertText( (char *)defer_text_buf ); - defer_text_buf[ 0 ] = 0; -} - - -/* ------------------------------------------------------------------------------ - Function: Cbuf_ExecuteText -Execute string. - - Parameters: exec_when -[in] see execwhen_t definition. - text -[in] string with command to execute. - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Cbuf_ExecuteText( execwhen_t exec_when, char *text ) -{ - switch( exec_when ) - { - case EXEC_NOW: - Cmd_ExecuteString( text ); - break; - - case EXEC_INSERT: - Cbuf_InsertText( text ); - break; - - case EXEC_APPEND: - Cbuf_AddText( text ); - break; - - default: - Com_DPrintf( "Cbuf_ExecuteText: bad exec_when" ); - } -} - -/* ------------------------------------------------------------------------------ - Function: Cbuf_Execute -execute string from command buffer. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Cbuf_Execute( void ) -{ - int i; - char *text; - char line[ 1024 ]; - int quotes; - - alias_count = 0; // don't allow infinite alias loops - - 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' || text[ i ] == '#' ) - { - break; // break on a newline or a hash mark - } - } - - - memcpy( line, text, i ); - line[ i ] = '\0'; // NUL-terminate string - -// 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; - memmove( text, text+i, cmd_text.cursize ); - } - -// execute the command line - Cmd_ExecuteString( line ); - - - if( cmd_wait ) - { - // skip out while text still remains in buffer, leaving it - // for next frame - cmd_wait = false; - break; - } - } -} - - - -/* ------------------------------------------------------------------------------ - Function: Cbuf_AddEarlyCommands -Adds command line parameters as script - statements. - - Parameters: clear -[in] Remove item from global array com_argv. - - Returns: Nothing. - - Notes: - Adds command line parameters as script statements - Commands lead with a +, and continue until another + - - Set commands are added early, so they are guaranteed to be set - before the client and server initialize for the first time. - - Other commands are added late, after all initialization is complete. ------------------------------------------------------------------------------ -*/ -PUBLIC void Cbuf_AddEarlyCommands( _boolean clear ) -{ - int i; - char *s; - - for( i = 0; i < COM_Argc(); ++i ) - { - s = COM_Argv( i ); - - if( strcmp( s, "+set" ) ) - continue; - - Cbuf_AddText( va("set %s %s\n", COM_Argv(i+1), COM_Argv(i+2))); - if( clear ) - { - COM_ClearArgv( i ); - COM_ClearArgv( i+1 ); - COM_ClearArgv( i+2 ); - } - i += 2; - } -} - -/* ------------------------------------------------------------------------------ - Function: Cbuf_AddLateCommands -Adds command line parameters as script - statements. - - Parameters: Nothing. - - Returns: true if any late commands were added, otherwise false. - - Notes: - Commands lead with a + and continue until another + or - - application.exe +map amlev1 - - Returns true if any late commands were added, which - will keep the demoloop from immediately starting ------------------------------------------------------------------------------ -*/ -PUBLIC _boolean Cbuf_AddLateCommands( void ) -{ - int i, j; - int s; - char *text, *build, c; - int argc; - _boolean ret; - -// build the combined string to parse from - s = 0; - argc = COM_Argc(); - for( i = 1; i < argc; ++i ) - { - s += strlen( COM_Argv( i ) ) + 1; - } - - if( ! s ) - { - return false; - } - - text = Z_Malloc( s + 1 ); - text[ 0 ] = '\0'; // Start with a NUL-terminated string. - - for( i = 1; i < argc; ++i ) - { - my_strlcat( text, COM_Argv( i ), s ); - if( i != argc-1 ) - { - my_strlcat( text, " ", s ); - } - } - -// pull out the commands - build = Z_Malloc( s + 1 ); - build[ 0 ] = '\0'; // Start with a NUL-terminated string. - - 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; - - my_strlcat( build, text+i, s+1 ); - my_strlcat( build, "\n", s+1 ); - text[ j ] = c; - i = j - 1; - } - } - - ret = (build[ 0 ] != 0); - if( ret ) - { - Cbuf_AddText (build); - } - - Z_Free( text ); - Z_Free( build ); - - return ret; -} - - -/* -============================================================================== - - SCRIPT COMMANDS - -============================================================================== -*/ - - - -/* ------------------------------------------------------------------------------ - Function: Cmd_Exec_f -Execute script file. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: Console function, exec - ------------------------------------------------------------------------------ -*/ -PRIVATE void Cmd_Exec_f( void ) -{ - filehandle_t *hfile; - char *f2; - int len; - - if( Cmd_Argc () != 2 ) - { - Com_Printf( "exec : execute a script file\n" ); - return; - } - - hfile = FS_OpenFile( Cmd_Argv( 1 ), FA_FILE_IPHONE_DOC_DIR ); - if( ! hfile ) - { - Com_Printf( "couldn't exec %s\n", Cmd_Argv( 1 ) ); - return; - } - - len = FS_GetFileSize( hfile ); - - Com_Printf( "execing %s\n", Cmd_Argv( 1 ) ); - - // the file doesn't have a trailing 0, so we need to copy it off - f2 = Z_Malloc( len + 1 ); - memcpy( f2, hfile->filedata, len ); - f2[ len ] = 0; - - printf( "%s", f2 ); // !@# - Cbuf_InsertText( f2 ); - - Z_Free( f2 ); - - FS_CloseFile( hfile ); -} - - -/* ------------------------------------------------------------------------------ - Function: Cmd_Echo_f -Prints the rest of the line to the console. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void Cmd_Echo_f( void ) -{ - int i; - - for( i = 1 ; i < Cmd_Argc() ; ++i ) - { - Com_Printf( "%s ",Cmd_Argv( i ) ); - } - - Com_Printf( "\n" ); -} - - -/* ------------------------------------------------------------------------------ - Function: Cmd_Alias_f -Creates a new command that executes a command - string (possibly ; seperated). - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void Cmd_Alias_f( void ) -{ - cmdalias_t *a; - char cmd[ 1024 ]; - int i, c; - char *s; - W32 hashid; - - if( Cmd_Argc() == 1 ) - { - Com_Printf( "Current alias commands:\n" ); - for( a = cmd_alias ; a ; a = a->next ) - { - Com_Printf( "%s : %s\n", a->name, a->value ); - } - return; - } - - s = Cmd_Argv( 1 ); - if( strlen( s ) >= MAX_ALIAS_NAME ) - { - Com_Printf( "Alias name is too long\n" ); - return; - } - - hashid = my_strhash( s ); - - // if the alias already exists, reuse it - for( a = cmd_alias ; a ; a = a->next ) - { - if( hashid == a->id ) - { - Z_Free( a->value ); - break; - } - } - - if( ! a ) - { - a = Z_Malloc( sizeof( cmdalias_t ) ); - a->next = cmd_alias; - cmd_alias = a; - } - my_strlcpy( a->name, s, sizeof( a->name ) ); - a->id = hashid; - -// copy the rest of the command line - cmd[ 0 ] = '\0'; // start out with a NUL-terminated string - c = Cmd_Argc(); - for( i = 2; i < c; ++i ) - { - my_strlcat( cmd, Cmd_Argv( i ), sizeof( cmd ) ); - if( i != (c - 1) ) - { - my_strlcat( cmd, " ", sizeof( cmd ) ); - } - } - my_strlcat( cmd, "\n", sizeof( cmd ) ); - - a->value = my_CopyString( cmd ); -} - -/* -============================================================================= - - COMMAND EXECUTION - -============================================================================= -*/ - -typedef struct cmd_function_s -{ - struct cmd_function_s *next; - char *name; - W32 id; - xcommand_t function; - -} cmd_function_t; - - -PRIVATE int cmd_argc; -PRIVATE char *cmd_argv[ MAX_STRING_TOKENS ]; -PRIVATE char *cmd_null_string = ""; -PRIVATE char cmd_args[ MAX_STRING_CHARS ]; - -PRIVATE cmd_function_t *cmd_functions; // possible commands to execute - -/* ------------------------------------------------------------------------------ - Function: Cmd_Argc -How many arguments are passed in. - - Parameters: Nothing. - - Returns: How many arguments are passed in. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC int Cmd_Argc( void ) -{ - return cmd_argc; -} - -/* ------------------------------------------------------------------------------ - Function: Cmd_Argv -Retrieve one argument. - - Parameters: arg -[in] Which argument to retrieve. - - Returns: NULL if outside argument index, otherwise returns the argument - string. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC char *Cmd_Argv( int arg ) -{ - if( arg >= cmd_argc ) - { - return cmd_null_string; - } - - return cmd_argv[ arg ]; -} - -/* ------------------------------------------------------------------------------ - Function: Cmd_Args -Retrieve all arguments. - - Parameters: Nothing. - - Returns: A single string containing argv(1) to argv(argc()-1) - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC char *Cmd_Args( void ) -{ - return cmd_args; -} - -/* ------------------------------------------------------------------------------ - Function: Cmd_MacroExpandString - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE char *Cmd_MacroExpandString( char *text ) -{ - int i, j, count, len; - _boolean inquote; - char *scan; - static char expanded[ MAX_STRING_CHARS ]; - char temporary[MAX_STRING_CHARS]; - char *token, *start; - - inquote = false; - scan = text; - - len = strlen( scan ); - if( len >= MAX_STRING_CHARS ) - { - Com_Printf( "Line exceeded %i chars, discarded.\n", MAX_STRING_CHARS ); - return NULL; - } - - count = 0; - - for( i = 0 ; i < len ; ++i ) - { - if (scan[i] == '"') - inquote ^= 1; - - if (inquote) - continue; // don't expand inside quotes - - if (scan[i] != '$') - continue; - - // scan out the complete macro - start = scan+i+1; - token = COM_Parse( &start ); - if (!start) - continue; - - token = Cvar_VariableString (token); - - j = strlen(token); - len += j; - if (len >= MAX_STRING_CHARS) - { - Com_Printf ("Expanded line exceeded %i chars, discarded.\n", MAX_STRING_CHARS); - return NULL; - } - - strncpy( temporary, scan, i ); - my_strlcpy( temporary+i, token, sizeof( temporary ) - i ); - my_strlcpy( temporary+i+j, start, sizeof( temporary ) - i - j ); - - my_strlcpy( expanded, temporary, sizeof( expanded ) ); - scan = expanded; - i--; - - if( ++count == 100 ) - { - Com_Printf( "Macro expansion loop, discarded.\n" ); - return NULL; - } - } - - if( inquote ) - { - Com_Printf( "Line has unmatched quote, discarded.\n" ); - return NULL; - } - - return scan; -} - - -/* ------------------------------------------------------------------------------ - Function: Cmd_TokenizeString -Parses the given string into command line tokens. - - Parameters: text -[in] string to tokenize. - macroExpand -[in] Expand macro, true for yes, otherwise false. - - Returns: Nothing - - Notes: - $Cvars will be expanded unless they are in a quoted token ------------------------------------------------------------------------------ -*/ -PUBLIC void Cmd_TokenizeString( char *text, _boolean macroExpand ) -{ - int i; - char *com_token; - -// clear the args from the last string - for( i = 0 ; i < cmd_argc ; ++i ) - { - Z_Free( cmd_argv[ i ] ); - } - - cmd_argc = 0; - cmd_args[ 0 ] = 0; - - // macro expand the text - if( macroExpand ) - { - text = Cmd_MacroExpandString( text ); - } - - if( ! text ) - { - return; - } - - 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; - } - - // set cmd_args to everything after the first arg - if( cmd_argc == 1 ) - { - int l; - - my_strlcpy( cmd_args, text, sizeof( cmd_args ) - 1 ); - - // strip off any trailing whitespace - l = strlen( cmd_args ) - 1; - for( ; l >= 0 ; --l ) - { - if (cmd_args[l] <= ' ') - { - cmd_args[l] = 0; - } - else - { - break; - } - } - } - - com_token = COM_Parse( &text ); - if( ! text ) - { - return; - } - - if( cmd_argc < MAX_STRING_TOKENS ) - { - cmd_argv[ cmd_argc ] = Z_Malloc( strlen( com_token ) + 1 ); - my_strlcpy( cmd_argv[ cmd_argc ], com_token, strlen( com_token ) + 1 ); - cmd_argc++; - } - } - -} - - -/* ------------------------------------------------------------------------------ - Function: Cmd_AddCommand -Add a command name and function to the cmd repository. - - Parameters: - cmd_name -[in] Pointer to a NUL-terminated string that constains a - command name. - function -[in] Function to associate with cmd_name. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void Cmd_AddCommand( char *cmd_name, xcommand_t function ) -{ - cmd_function_t *cmd; - W32 hashid; - -// fail if the command is a variable name - if( Cvar_VariableString( cmd_name )[ 0 ] ) - { - Com_Printf( "Cmd_AddCommand: \"%s\" already defined as a var\n", cmd_name ); - return; - } - - hashid = my_strhash( cmd_name ); - -// fail if the command already exists - for( cmd = cmd_functions ; cmd ; cmd = cmd->next ) - { - if( hashid == cmd->id ) - { - Com_Printf( "Cmd_AddCommand: \"%s\" already defined\n", cmd_name ); - return; - } - } - - cmd = Z_Malloc( sizeof( cmd_function_t ) ); - cmd->name = cmd_name; - cmd->id = hashid; - cmd->function = function; - cmd->next = cmd_functions; - cmd_functions = cmd; - -} - -/* ------------------------------------------------------------------------------ - Function: Cmd_RemoveCommand -Remove command. - - Parameters: cmd_name -[in] name of command to remove. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Cmd_RemoveCommand( char *cmd_name ) -{ - cmd_function_t *cmd, **back; - W32 hashid; - - hashid = my_strhash( cmd_name ); - - back = &cmd_functions; - while( 1 ) - { - cmd = *back; - if( ! cmd ) - { - Com_DPrintf( "Cmd_RemoveCommand: %s was not added\n", cmd_name ); - return; - } - - if( hashid == cmd->id ) - { - *back = cmd->next; - Z_Free( cmd ); - return; - } - - back = &cmd->next; - } -} - -/* ------------------------------------------------------------------------------ - Function: Cmd_Exists -Check to see if command already exists. - - Parameters: cmd_name -[in] name of command to check. - - Returns: true if the command already exists, otherwise false. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC _boolean Cmd_Exists( char *cmd_name ) -{ - cmd_function_t *cmd; - W32 hashid = my_strhash( cmd_name ); - - for( cmd = cmd_functions ; cmd ; cmd = cmd->next ) - { - if( hashid == cmd->id ) - { - return true; - } - } - - return false; -} - - -/* ------------------------------------------------------------------------------ - Function: Cmd_CompleteCommand -Complete partial command on console - command-line. - - Parameters: partial -[in] Partial name of command. - - Returns: NULL if no command exists, otherwise returns the complete name of - command. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC char *Cmd_CompleteCommand( char *partial ) -{ - cmd_function_t *cmd; - int len; - cmdalias_t *a; - W32 hashid; - - len = strlen( partial ); - - if( ! len ) - { - return NULL; - } - - - -// -// Check for exact match. -// - hashid = my_strhash( partial ); - - for( cmd = cmd_functions ; cmd ; cmd = cmd->next ) - { - if( hashid == cmd->id ) - { - return cmd->name; - } - } - - for( a = cmd_alias ; a ; a = a->next ) - { - if( hashid == a->id ) - { - return a->name; - } - } - -// -// Check for partial match. -// - for( cmd = cmd_functions ; cmd ; cmd = cmd->next ) - { - if( ! strncmp( partial, cmd->name, len ) ) - { - return cmd->name; - } - } - - for( a = cmd_alias ; a ; a = a->next ) - { - if( ! strncmp( partial, a->name, len ) ) - { - return a->name; - } - } - - return NULL; -} - - -/* ------------------------------------------------------------------------------ - Function: Cmd_ExecuteString -Execute command string. - - Parameters: text -[in] text string to execute. - - Returns: Nothing. - - Notes: - A complete command line has been parsed, so try to execute it - FIXME: lookupnoadd the token to speed search? ------------------------------------------------------------------------------ -*/ -PUBLIC void Cmd_ExecuteString( char *text ) -{ - cmd_function_t *cmd; - cmdalias_t *a; - W32 hashid; - - Cmd_TokenizeString( text, true ); - - // execute the command line - if( ! Cmd_Argc() ) - { - return; // no tokens - } - - hashid = my_strhash( cmd_argv[ 0 ] ); - - // check functions - for( cmd = cmd_functions ; cmd ; cmd = cmd->next ) - { - if( hashid == cmd->id ) - { - if( ! cmd->function ) - { // forward to server command - Cmd_ExecuteString( va( "cmd %s", text ) ); - } - else - { - cmd->function(); - } - - return; - } - } - - // check alias - for( a = cmd_alias ; a ; a = a->next ) - { - if( ! my_stricmp( cmd_argv[ 0 ], a->name ) ) - { - if( ++alias_count == ALIAS_LOOP_COUNT ) - { - Com_Printf( "ALIAS_LOOP_COUNT\n" ); - return; - } - Cbuf_InsertText( a->value ); - return; - } - } - - // check cvars - if( Cvar_Command() ) - { - return; - } - - // send it as a server command if we are connected -// Cmd_ForwardToServer(); -} - -/* ------------------------------------------------------------------------------ - Function: Cmd_List_f -Callback function that list commands. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: List commands and total number of commands. ------------------------------------------------------------------------------ -*/ -PRIVATE void Cmd_List_f( void ) -{ - cmd_function_t *cmd; - int i = 0; - - for( cmd = cmd_functions; cmd; cmd = cmd->next, ++i ) - { - Com_Printf( "%s\n", cmd->name ); - } - - Com_Printf( "%i commands\n", i ); -} - -/* ------------------------------------------------------------------------------ - Function: Cmd_Init -Initialize the command buffer. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void Cmd_Init( void ) -{ - Cbuf_Init(); - -// -// register our commands -// - Cmd_AddCommand( "listCmds", Cmd_List_f ); - Cmd_AddCommand( "exec", Cmd_Exec_f ); - Cmd_AddCommand( "echo", Cmd_Echo_f ); - Cmd_AddCommand( "alias", Cmd_Alias_f); - Cmd_AddCommand( "wait", Cmd_Wait_f ); -} - diff --git a/wolf3d/newCode/env/cmd.h b/wolf3d/newCode/env/cmd.h deleted file mode 100644 index 0bf5192..0000000 --- a/wolf3d/newCode/env/cmd.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 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 text buffering and command execution. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -/* - - Notes: - - 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 DEFAULT.CFG\n" ); Cbuf_Execute(); - -*/ - -#ifndef __CMD_H__ -#define __CMD_H__ - -#include "arch.h" - - -typedef enum { - - EXEC_NOW, // don't return until completed - EXEC_INSERT, // insert at current position, but don't run yet - EXEC_APPEND // add to end of the command buffer - -} execwhen_t; - - -extern void Cbuf_AddText( const char *text ); -// as new commands are generated from the console or keybindings, -// the text is added to the end of the command buffer. - -extern 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. - -extern void Cbuf_ExecuteText( execwhen_t exec_when, char *text ); -// this can be used in place of either Cbuf_AddText or Cbuf_InsertText - -extern void Cbuf_AddEarlyCommands( _boolean clear ); -// adds all the +set commands from the command line - -extern _boolean Cbuf_AddLateCommands( void ); -// adds all the remaining + commands from the command line -// Returns true if any late commands were added, which -// will keep the demoloop from immediately starting - -extern 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! - -extern void Cbuf_CopyToDefer( void ); -extern void Cbuf_InsertFromDefer( void ); -// These two functions are used to defer any pending commands while a map -// is being loaded - -//=========================================================================== - -#define MAX_STRING_CHARS 1024 // max length of a string passed to Cmd_TokenizeString -#define MAX_STRING_TOKENS 80 // max tokens resulting from Cmd_TokenizeString -#define MAX_TOKEN_CHARS 128 // max length of an individual token - -/* - -Command execution takes a NUL-terminated string, breaks it into tokens, -then searches for a command or variable that matches the first token. - -*/ - -typedef void (*xcommand_t) (void); - -extern void Cmd_Init( void ); - -extern 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 -// if function is NULL, the command will be forwarded to the server -// as a clc_stringcmd instead of executed locally -extern void Cmd_RemoveCommand( char *cmd_name ); - -extern _boolean Cmd_Exists( char *cmd_name ); -// used by the cvar code to check for cvar / command name overlap - -extern char *Cmd_CompleteCommand( char *partial ); -// attempts to match a partial command for automatic command line completion -// returns NULL if nothing fits - -extern int Cmd_Argc( void ); -extern char *Cmd_Argv( int arg ); -extern 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 always safe. - -extern void Cmd_TokenizeString( char *text, _boolean macroExpand ); -// Takes a NUL-terminated string. Does not need to be /n terminated. -// breaks the string up into arg tokens. - -extern void Cmd_ExecuteString( char *text ); -// Parses a single line of text into arguments and tries to execute it -// as if it was typed at the console - -//extern 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. - - - - - - -#endif /* __CMD_H__ */ diff --git a/wolf3d/newCode/env/com_string.c b/wolf3d/newCode/env/com_string.c deleted file mode 100644 index 400007e..0000000 --- a/wolf3d/newCode/env/com_string.c +++ /dev/null @@ -1,518 +0,0 @@ -/* - - Copyright (C) 2004-2005 Michael Liebscher - Copyright (C) 1998 Todd C. Miller - Copyright (C) 1997-2001 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. - -*/ - -/* - * com_string.c: Common string functions done in a portable manner. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * Portion of this code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - * Portion of this code was derived from code that was originally - * written by Todd C. Miller. - * - */ - -#include "../wolfiphone.h" - - - - - -/* ------------------------------------------------------------------------------ - Function: my_strlcpy -Copies a specified number of characters from a - source string into a buffer. - - Parameters: dest -[in/out] Pointer to a buffer into which the function - copies characters - source -[in] Pointer to a NUL-terminated string from which - the function copies characters. - nMaxLength -[in] Specifies the number of bytes to be copied - from the string pointed to by source into the - buffer pointed to by dest. - - Returns: Returns strlen( source ); if retval >= nMaxLength, truncation - occurred. - - Notes: - At most nMaxLength-1 characters will be copied. Always NUL- - terminates (unless nMaxLength == 0). ------------------------------------------------------------------------------ -*/ -PUBLIC size_t my_strlcpy( char *dest, const char *source, size_t nMaxLength ) -{ - char *d = dest; - const char *s = source; - size_t n = nMaxLength; - - /* Copy as many bytes as will fit */ - if( n != 0 && --n != 0 ) - { - do - { - if( (*d++ = *s++) == 0 ) - { - break; - } - - } while( --n != 0 ); - } - - /* Not enough room in dest, add NUL and traverse rest of source */ - if( n == 0 ) - { - if( nMaxLength != 0 ) - { - *d = '\0'; /* NUL-terminate dest */ - } - - while( *s++ ) - { - ; - } - } - - return( s - source - 1 ); /* count does not include NUL */ -} - -/* ------------------------------------------------------------------------------ - Function: my_strlcat -Appends one string to another. - - Parameters: dest -[in/out] Pointer to a NUL-terminated string. The buffer - must be large enough to contain both strings or else - truncation will occur. - source -[in] Pointer to a NUL-terminated string from which - the function copies characters. - nMaxLength -[in] full size of dest, not space left. - - Returns: Returns strlen( source ) + MIN( nMaxLength, strlen( initial dest ) ). - If retval >= nMaxLength, truncation occurred. - - Notes: - At most nMaxLength-1 characters will be copied. Always NUL- - terminates (unless nMaxLength <= strlen( dest ) ). ------------------------------------------------------------------------------ -*/ -PUBLIC size_t my_strlcat( char *dest, const char *source, size_t nMaxLength ) -{ - char *d = dest; - const char *s = source; - size_t n = nMaxLength; - size_t dlen; - - /* Find the end of dest and adjust bytes left but don't go past end */ - while( n-- != 0 && *d != '\0' ) - { - d++; - } - - dlen = d - dest; - n = nMaxLength - dlen; - - /* No room left to append string */ - if( n == 0 ) - { - return( dlen + strlen( s ) ); - } - - while( *s != '\0' ) - { - if( n != 1 ) - { - *d++ = *s; - n--; - } - s++; - } - *d = '\0'; /* NUL-terminate string */ - - return( dlen + (s - source) ); /* count does not include NUL */ - -} - - -/* ------------------------------------------------------------------------------ - Function: my_strnicmp -Compare characters of two strings without regard to case. - - Parameters: string1, string2 -[in] NUL-terminated strings to compare. - count -[in] Number of characters to compare. - - Returns: 0 string1 identical to string2, -1 otherwise. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC int my_strnicmp( const char *string1, const char *string2, size_t count ) -{ - char c1, c2; - - if( ! string1 || ! *string1 || - ! string2 || ! *string2 ) - { - return -1; - } - - do - { - c1 = *string1++; - c2 = *string2++; - - if( ! count-- ) - { - return 0; /* strings are equal until end point */ - } - - if( c1 != c2 ) - { - if( TOUPPER( c1 ) != TOUPPER( c2 ) ) /* Uppercase compare */ - { - return -1; /* strings are not equal */ - } - } - - } while( c1 ); - - return 0; /* strings are equal */ -} - -/* ------------------------------------------------------------------------------ - Function: my_stricmp -Perform an uppercase comparison of strings. - - Parameters: string1, string2 -[in] NUL-terminated strings to compare. - - Returns: 0 string1 identical to string2, -1 otherwise. - - Notes: - Calls my_strnicmp, where count is 99999 ------------------------------------------------------------------------------ -*/ -PUBLIC int my_stricmp( const char *string1, const char *string2 ) -{ - return my_strnicmp( string1, string2, 99999 ); -} - -/* ------------------------------------------------------------------------------ - Function: my_snprintf -Write formatted data to a string. - - Parameters: dest -[out] Storage location for output. - size -[in] Maximum number of characters to store. - format -[in] Format-control string. - ... -[in] Optional arguments. - - Returns: Nothing. - - Notes: If the format string is longer than 32768 truncation will occur. - Also, if format is longer than dest truncation will occur. ------------------------------------------------------------------------------ -*/ -PUBLIC void my_snprintf( char *dest, size_t size, const char *format, ... ) -{ - va_list argptr; - char bigbuffer[ 0x8000 ]; - - va_start( argptr, format ); - (void)vsnprintf( bigbuffer, sizeof( bigbuffer ), format, argptr ); - va_end( argptr ); - - bigbuffer[ sizeof( bigbuffer ) - 1 ] = '\0'; - - my_strlcpy( dest, bigbuffer, size ); -} - - -/* ------------------------------------------------------------------------------ - Function: my_CopyString -Allocate a duplicate copy of a string, and return - duplicate. - - Parameters: in -[in] String to duplicate. - - - Returns: - Pointer to duplicate string. Caller is responsible for freeing - memory with Z_Free. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC char *my_CopyString( const char *in ) -{ - char *out; - - out = Z_Malloc( strlen( in ) + 1 ); - my_strlcpy( out, in, strlen( in ) + 1 ); - - return out; -} - -/* ------------------------------------------------------------------------------ - Function: my_strhash -Create a hash id from string. - - Parameters: string -[in] NUL-terminated string. - - - Returns: Hash id. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC W32 my_strhash( const char *string ) -{ - W32 hash = *string; - - if( hash ) - { - for( string += 1; *string != '\0'; ++string ) - { - hash = (hash << 5) - hash + *string; - } - } - - return hash; -} - - -/* ------------------------------------------------------------------------------ - Function: my_strupr -Convert a string to uppercase. - - Parameters: string -[in/out] NUL-terminated string to capitalize. - - Returns: - This functions returns a pointer to the converted string. Because - the modification is done in place, the pointer returned is the same - as the pointer passed as the input argument. No return value is - reserved to indicate an error. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC char *my_strupr( char *string ) -{ - char *ptr; - - if( ! string || ! *string ) - { - return string; - } - - ptr = string; - - do - { - *ptr = TOUPPER( *ptr ); - - } while( *ptr++ ); - - - return string; -} - -/* ------------------------------------------------------------------------------ - Function: my_strlwr -Convert a string to lowercase. - - Parameters: string -[in/out] NUL-terminated string to convert to lowercase. - - Returns: - This functions returns a pointer to the converted string. Because - the modification is done in place, the pointer returned is the same - as the pointer passed as the input argument. No return value is - reserved to indicate an error. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC char *my_strlwr( char *string ) -{ - char *ptr; - - if( ! string || ! *string ) - { - return string; - } - - ptr = string; - - do - { - *ptr = TOLOWER( *ptr ); - - } while( *ptr++ ); - - - return string; -} - -/* ------------------------------------------------------------------------------ - Function: StringToInteger -Convert string to integer. - - Parameters: string -[in] NUL-terminated string to be converted. - error -[out] Error code. See header. - - Returns: An integer value. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC SW32 StringToInteger( const char *string, W32 *error ) -{ - const char *ptr = string; - SW32 temp; - SW32 number = 0; - W32 errortag = 0; - _boolean bNegative = false; - - if( ! string || ! *string ) - { - *error = SCE_NULL_VALUE; - - return 0; - } - - if( *ptr == '-' ) - { - bNegative = true; - - ptr++; - } - - while( *ptr && ISNUMERIC( *ptr ) ) - { - temp = number; - number = (number * 10) + *ptr - '0'; - - if( number < temp ) - { - errortag &= SCE_BUFFER_OVERFLOW; - } - - ptr++; - } - - if( *ptr ) - { - errortag &= SCE_NON_NUMERIC; - } - - - if( bNegative ) - { - number = -number; - } - - - *error = errortag; - - return number; -} - -/* ------------------------------------------------------------------------------ - Function: StringToFloat -Convert string to float. - - Parameters: string -[in] NUL-terminated string to be converted. - error -[out] Error code. See header. - - Returns: A float value. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC double StringToFloat( const char *string, W32 *error ) -{ - const char *ptr = string; - double number = 0; - SW32 exponent = 0; - W32 expError; - _boolean bNegative = false; - - *error = 0; - - if( ! string || ! *string ) - { - *error &= SCE_NULL_VALUE; - - return 0; - } - - if( *ptr == '-' ) - { - bNegative = true; - - ptr++; - } - else if( *ptr == '+' ) - { - ptr++; - } - - while( *ptr && ISNUMERIC( *ptr ) ) - { - number = (number * 10) + (double)(*ptr - '0'); - - ptr++; - } - - if( *ptr == '.' ) - { - ptr++; - - while( *ptr && ISNUMERIC( *ptr ) ) - { - number = (number * 10) + (double)(*ptr - '0'); - exponent--; - - ptr++; - } - } - - if( TOLOWER( *ptr ) == 'e' ) - { - ptr++; - - exponent += StringToInteger( ptr, &expError ); - } - - if( bNegative ) - { - number = -number; - } - - if( expError ) - { - *error |= expError; - } - - return (number * pow( 10, exponent )); -} diff --git a/wolf3d/newCode/env/com_string.h b/wolf3d/newCode/env/com_string.h deleted file mode 100644 index ae510f8..0000000 --- a/wolf3d/newCode/env/com_string.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (c) 1998 Todd C. Miller - Copyright (C) 1997-2001 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. - -*/ - -/* - * com_string.h: Common string functions done in a portable manner. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * Portion of this code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - * Portion of this code was derived from code that was originally - * written by Todd C. Miller. - * - */ - -/* - Notes: - This module is implemented by com_string.c. - -*/ - -#ifndef __COM_STRING_H__ -#define __COM_STRING_H__ - -#define ISSPACE( c ) ( ( c ) == ' ' || ( c ) == '\f' || ( c ) == '\n' || ( c ) == '\r' || ( c ) == '\t' || ( c ) == '\v' ) -#define ISUPPER( c ) ( ( c ) >= 'A' && ( c ) <= 'Z' ) -#define ISLOWER( c ) ( ( c ) >= 'a' && ( c ) <= 'z' ) -#define ISALPHA( c ) ( ISUPPER( c ) || ISLOWER( c ) ) -#define TOUPPER( c ) ( ISLOWER( c ) ? (c) - 'a' + 'A' : ( c ) ) -#define TOLOWER( c ) ( ISUPPER( c ) ? (c) - 'A' + 'a' : ( c ) ) - -#define ISNUMERIC( c ) ( ( c ) >= '0' && ( c ) <= '9' ) -#define ISALPHANUMERIC( c ) ( ISALPHA( c ) || ISNUMERIC( c ) ) - - - - -extern size_t my_strlcpy( char *dest, const char *source, size_t nMaxLength ); -extern size_t my_strlcat( char *dest, const char *source, size_t nMaxLength ); - - -extern int my_stricmp( const char *string1, const char *string2 ); -extern int my_strnicmp( const char *string1, const char *string2, size_t count ); - - -extern void my_snprintf( char *dest, size_t size, const char *format, ... ); - -extern char *my_CopyString( const char *in ); - -extern W32 my_strhash( const char *string ); - -extern char *my_strupr( char *string ); -extern char *my_strlwr( char *string ); - - -/* String conversion error */ -#define SCE_NON_NUMERIC (1 << 0) /* Non-numeric value was encountered */ -#define SCE_BUFFER_OVERFLOW (1 << 1) /* Numberic overflowed */ -#define SCE_NULL_VALUE (1 << 2) /* NULL string was passed into function */ - - -extern SW32 StringToInteger( const char *string, W32 *error ); -extern double StringToFloat( const char *string, W32 *error ); - - -#endif /* __COM_STRING_H__ */ diff --git a/wolf3d/newCode/env/common.c b/wolf3d/newCode/env/common.c deleted file mode 100644 index 1572967..0000000 --- a/wolf3d/newCode/env/common.c +++ /dev/null @@ -1,593 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * common.c: Misc functions used in client and server. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -#include "../wolfiphone.h" - - -#define MAXPRINTMSG 4096 - -#define MAX_NUM_ARGVS 50 - - -colour3_t colourBlack = { 0, 0, 0 }; -colour3_t colourRed = { 255, 0, 0 }; -colour3_t colourGreen = { 0, 255, 0 }; -colour3_t colourBlue = { 0, 0, 255 }; -colour3_t colourWhite = { 255, 255, 255 }; - - -int com_argc; -char *com_argv[ MAX_NUM_ARGVS + 1 ]; - - -jmp_buf abortframe; // an ERR_DROP occured, exit the entire frame - - -FILE *log_stats_file; - -cvar_t *log_stats; -cvar_t *developer; -cvar_t *logfile_active; // 1 = buffer log, 2 = flush after each print - -FILE *logfile; - - -/* -============================================================================ - -CLIENT / SERVER interactions - -============================================================================ -*/ -static int rd_target; -static char *rd_buffer; -static int rd_buffersize; -static void (*rd_flush)( int target, char *buffer ); - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Com_BeginRedirect( int target, char *buffer, int buffersize, void (*flush) ) -{ - if( ! target || ! buffer || ! buffersize || ! flush ) - { - return; - } - - rd_target = target; - rd_buffer = buffer; - rd_buffersize = buffersize; - rd_flush = flush; - - *rd_buffer = 0; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Com_EndRedirect( void ) -{ - rd_flush( rd_target, rd_buffer ); - - rd_target = 0; - rd_buffer = NULL; - rd_buffersize = 0; - rd_flush = NULL; -} - -/* ------------------------------------------------------------------------------ - Function: Com_Printf -print out message. - - Parameters: - - Returns: Nothing. - - Notes: - Both client and server can use this, and it will output - to the apropriate place. ------------------------------------------------------------------------------ -*/ -PUBLIC void Com_Printf( const char *fmt, ... ) -{ - va_list argptr; - static char msg[ MAXPRINTMSG ]; - - va_start( argptr, fmt ); - (void)vsnprintf( msg, sizeof( msg ), fmt, argptr ); - va_end( argptr ); - - msg[ sizeof( msg ) - 1 ] = '\0'; - - if( rd_target ) - { - if( (strlen( msg ) + strlen( rd_buffer ) ) > (rd_buffersize - 1) ) - { - rd_flush( rd_target, rd_buffer ); - *rd_buffer = '\0'; - } - my_strlcat( rd_buffer, msg, rd_buffersize ); - return; - } - - Con_Print( msg ); -#ifdef _WIN32 - OutputDebugString( msg ); -#endif - - // also echo to debugging console -// Sys_ConsoleOutput( msg ); - - // logfile - if( logfile_active && logfile_active->value ) - { - char name[ MAX_GAMEPATH ]; - - if( ! logfile ) - { - my_snprintf( name, sizeof( name ), "%s/console.log", FS_Gamedir() ); - if( logfile_active->value > 2 ) - { - logfile = fopen( name, "a" ); - } - else - { - logfile = fopen( name, "w" ); - } - } - if( logfile ) - { - fprintf( logfile, "%s", msg ); - } - - if( logfile_active->value > 1 ) - { - fflush( logfile ); // force it to save every time - } - } -} - -/* ------------------------------------------------------------------------------ - Function: Com_DPrintf -A Com_Printf that only shows up if the "developer" - cvar is set - - Parameters: - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Com_DPrintf( const char *fmt, ... ) -{ - va_list argptr; - static char msg[ MAXPRINTMSG ]; - - if( ! developer || ! developer->value ) - { - return; // don't confuse non-developers with techie stuff... - } - - va_start( argptr, fmt ); - (void)vsnprintf( msg, sizeof( msg ), fmt, argptr ); - va_end( argptr ); - - msg[ sizeof( msg ) - 1 ] = '\0'; - - Com_Printf( "%s", msg ); -} - - -/* ------------------------------------------------------------------------------ - Function: Com_Error - - Parameters: - - Returns: - - Notes: - Both client and server can use this, and it will - do the apropriate things. ------------------------------------------------------------------------------ -*/ -PUBLIC void Com_Error( int code, const char *fmt, ... ) -{ - va_list argptr; - static char msg[ MAXPRINTMSG ]; - static _boolean recursive; - - if( recursive ) - { - Sys_Error( "recursive error after: %s", msg ); - } - - recursive = true; - - va_start (argptr,fmt); - (void)vsnprintf( msg, sizeof( msg ), fmt, argptr ); - va_end (argptr); - - msg[ sizeof( msg ) - 1 ] = '\0'; - - if( code == ERR_DISCONNECT ) - { - recursive = false; - longjmp (abortframe, -1); - } - else if( code == ERR_DROP ) - { - Com_Printf( "********************\nERROR: %s\n********************\n", msg ); - recursive = false; - longjmp( abortframe, -1 ); - } - else - { - } - - if( logfile ) - { - fclose( logfile ); - logfile = NULL; - } - - Sys_Error( "%s", msg ); -} - - - -//=========================================================================== - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void SZ_Init( sizebuf_t *buf, PW8 data, int length ) -{ - memset( buf, 0, sizeof( *buf ) ); - buf->data = data; - buf->maxsize = length; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void SZ_Clear( sizebuf_t *buf ) -{ - buf->cursize = 0; - buf->overflowed = false; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void *SZ_GetSpace( sizebuf_t *buf, int length ) -{ - void *data; - - if( buf->cursize + length > buf->maxsize ) - { - if( ! buf->allowoverflow ) - { - Com_Error( ERR_FATAL, "SZ_GetSpace: overflow without allowoverflow set" ); - } - - if( length > buf->maxsize ) - { - Com_Error( ERR_FATAL, "SZ_GetSpace: %i is > full buffer size", length ); - } - - Com_Printf( "SZ_GetSpace: overflow\n" ); - SZ_Clear( buf ); - buf->overflowed = true; - } - - data = buf->data + buf->cursize; - buf->cursize += length; - - return data; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void SZ_Write( sizebuf_t *buf, void *data, int length ) -{ - memcpy( SZ_GetSpace( buf, length ), data, length ); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void SZ_Print( sizebuf_t *buf, W8 *data ) -{ - int len; - - len = strlen( (char *)data ) + 1; - - if (buf->cursize) - { - if( buf->data[ buf->cursize - 1 ] ) - { - memcpy( (PW8)SZ_GetSpace( buf, len ), data, len ); // no trailing 0 - } - else - { - memcpy( (PW8)SZ_GetSpace( buf, len - 1 ) - 1, data, len ); // write over trailing 0 - } - } - else - { - memcpy( (PW8)SZ_GetSpace( buf, len ),data,len ); - } -} - - -//============================================================================ - - -/* ------------------------------------------------------------------------------ - Function: COM_CheckParm - - Parameters: - - Returns: - The position (1 to argc-1) in the program's argument list - where the given parameter apears, or 0 if not present - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC int COM_CheckParm( char *parm ) -{ - int i; - - for( i = 1 ; i < com_argc ; ++i ) - { - if( ! strcmp( parm, com_argv[ i ] ) ) - { - return i; - } - } - - return 0; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC int COM_Argc (void) -{ - return com_argc; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC char *COM_Argv (int arg) -{ - if (arg < 0 || arg >= com_argc || !com_argv[arg]) - return ""; - return com_argv[arg]; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void COM_ClearArgv( int arg ) -{ - if (arg < 0 || arg >= com_argc || !com_argv[arg]) - { - return; - } - - com_argv[ arg ] = ""; -} - - -/* ------------------------------------------------------------------------------ - Function: COM_InitArgv -Set global argv values with commadline argv values. - - Parameters: - argc -[in] An integer specifying how many arguments are in argv[]. - argv -[in] An array of null-terminated strings. The last pointer - (argv[argc]) is NULL. - - Returns: Nothing. - - Notes: Sets global variables com_argc and com_argv. ------------------------------------------------------------------------------ -*/ -PUBLIC void COM_InitArgv( int argc, char *argv[] ) -{ - int i; - - if( argc > MAX_NUM_ARGVS ) - { - argc = MAX_NUM_ARGVS; - Com_DPrintf( "argc > MAX_NUM_ARGVS\n" ); - } - - com_argc = argc; - for( i = 0; i < argc; ++i ) - { - if( ! argv[ i ] || strlen( argv[ i ] ) >= MAX_TOKEN_CHARS ) - { - com_argv[ i ] = ""; - } - else - { - com_argv[ i ] = argv[ i ]; - } - } -} - - -/* ------------------------------------------------------------------------------ - Function: COM_AddParm -Adds the given string at the end of the current - argument list - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void COM_AddParm( char *parm ) -{ - if( com_argc == MAX_NUM_ARGVS ) - { - Com_Error( ERR_FATAL, "COM_AddParm: MAX_NUM_ARGS" ); - } - - com_argv[ com_argc++ ] = parm; -} - -/* ------------------------------------------------------------------------------ - Function: Com_Error_f -Just throw a fatal error to test error shutdown - procedures. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void Com_Error_f (void) -{ - Com_Error( ERR_FATAL, "%s", Cmd_Argv( 1 ) ); -} - - diff --git a/wolf3d/newCode/env/common.h b/wolf3d/newCode/env/common.h deleted file mode 100644 index a487392..0000000 --- a/wolf3d/newCode/env/common.h +++ /dev/null @@ -1,206 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * common.h: Common definitions between client and server. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -/* - Notes: - This module is implemented by common.c. - -*/ - - -#ifndef __COMMON_H__ -#define __COMMON_H__ - - -//============================================================================ - -typedef struct sizebuf_s -{ - _boolean allowoverflow; // if false, do a Com_Error - _boolean overflowed; // set to true if the buffer size failed - W8 *data; - int maxsize; - int cursize; - int readcount; - -} sizebuf_t; - -extern void SZ_Init( sizebuf_t *buf, PW8 data, int length ); -extern void SZ_Clear( sizebuf_t *buf ); -extern void *SZ_GetSpace( sizebuf_t *buf, int length ); -extern void SZ_Write( sizebuf_t *buf, void *data, int length ); -extern void SZ_Print( sizebuf_t *buf, W8 *data ); // memcpy onto the sizebuf - -//============================================================================ - - -extern int COM_Argc( void ); -extern char *COM_Argv( int arg ); // range and null checked -extern void COM_ClearArgv( int arg ); -extern int COM_CheckParm( char *parm ); -extern void COM_AddParm( char *parm ); - -extern void COM_Init( void ); -extern void COM_InitArgv( int argc, char *argv[] ); - - -extern char *COM_Parse( char **data_p ); -// data is an in/out parm, returns a parsed out token - - - -//============================================================================ - - - - -///////////////////////////////////////////////////////////////////// -// -// Colour -// -///////////////////////////////////////////////////////////////////// - -extern colour3_t colourBlack; -extern colour3_t colourRed; -extern colour3_t colourBlue; -extern colour3_t colourGreen; -extern colour3_t colourWhite; - - -///////////////////////////////////////////////////////////////////// -// End Colour -///////////////////////////////////////////////////////////////////// - - - - -/* -============================================================== - - MISC - -============================================================== -*/ - - -#define ERR_FATAL 0 // exit the entire game with a popup window -#define ERR_DROP 1 // print to console and disconnect from game -#define ERR_QUIT 2 // not an error, just a normal exit -#define ERR_DISCONNECT 4 // don't kill server - -#define EXEC_NOW 0 // don't return until completed -#define EXEC_INSERT 1 // insert at current position, but don't run yet -#define EXEC_APPEND 2 // add to end of the command buffer - -#define PRINT_ALL 0 -#define PRINT_DEVELOPER 1 // only print when "developer 1" - -extern void Com_BeginRedirect( int target, char *buffer, int buffersize, void (*flush) ); -extern void Com_EndRedirect( void ); -extern void Com_Printf( const char *fmt, ... ); -extern void Com_DPrintf( const char *fmt, ... ); -extern void Com_Error( int code, const char *fmt, ... ); - - -extern char *va( char *format, ... ); - - - -extern cvar_t *developer; -extern cvar_t *log_stats; -extern cvar_t *logfile_active; -extern FILE *log_stats_file; - - -extern void common_Init( int argc, char *argv[] ); -extern void common_Frame( int msec ); - - - - -/* -============================================================== - - NON-PORTABLE SYSTEM SERVICES - -============================================================== -*/ -extern char *Sys_ConsoleInput( void ); -extern void Sys_ConsoleOutput( const char *string ); -extern void Sys_SendKeyEvents( void ); -extern void Sys_Error( const char *format, ... ); -extern void Sys_Quit( void ); -extern char *Sys_GetClipboardData( void ); -extern void Sys_CopyProtect( void ); - - -/* -============================================================== - - CLIENT / SERVER SYSTEMS - -============================================================== -*/ -extern void Client_Init( void ); - - - - -// -// button bits -// -#define BUTTON_ATTACK 1 -#define BUTTON_USE 2 -#define BUTTON_ANY 128 // any key whatsoever - - - - -// usercmd_t is sent to the server each client frame -typedef struct usercmd_s -{ - W8 msec; - W8 buttons; - short angles[ 3 ]; - short forwardmove, sidemove, upmove; - W8 impulse; // remove? - W8 lightlevel; // light level the player is standing on - -} usercmd_t; - - - - - - -#endif /* __COMMON_H__ */ - diff --git a/wolf3d/newCode/env/common_utils.h b/wolf3d/newCode/env/common_utils.h deleted file mode 100644 index e53f68e..0000000 --- a/wolf3d/newCode/env/common_utils.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - - 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. - -*/ - -/* - * common_utils.h: General Purpose Macros. - * - * Author: Michael Liebscher - * - */ - -#ifndef __COMMON_UTILS_H__ -#define __COMMON_UTILS_H__ - - - -/* - Make sure the following macros are defined. -*/ - -#ifndef __FILE__ - - #define __FILE__ "" - -#endif - -#ifndef __LINE__ - - #define __LINE__ 0L - -#endif - - - -/* - These function prefixes are used for figuring out which - functions are exported and which are not. -*/ - -#define PUBLIC /* Accessible outside this module */ -#define PRIVATE static /* Accessible only within this module */ - - - -#endif /* __COMMON_UTILS_H__ */ - diff --git a/wolf3d/newCode/env/console.c b/wolf3d/newCode/env/console.c deleted file mode 100644 index 52b7fd4..0000000 --- a/wolf3d/newCode/env/console.c +++ /dev/null @@ -1,822 +0,0 @@ -/* - - Copyright (C) 2004-2005 Michael Liebscher - Copyright (C) 1997-2001 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: Console drawing and management. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -#include "../wolfiphone.h" - -extern viddef_t viddef; -extern int consoleActive; - - -console_t con; - -float scr_conlines; -float scr_con_current; - -cvar_t *con_notifytime; -cvar_t *scr_conspeed; - - -#define MAXCMDLINE 256 - -char key_lines[ 32 ][ MAXCMDLINE ]; -int edit_line; -int key_linepos; - - -colour3_t colourconLGray = { 220, 220, 220 }; -colour3_t colourconLLGray = { 192, 192, 192 }; - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void DrawString( int x, int y, char *s ) -{ - Font_put_line( FONT0, x, y, s ); -} - -/* ------------------------------------------------------------------------------ - Function: Key_ClearTyping -Clear any keys that where typed. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -void Key_ClearTyping( void ) -{ - key_lines[ edit_line ][ 1 ] = 0; // clear any typing - key_linepos = 1; -} - -/* ------------------------------------------------------------------------------ - Function: Con_ToggleConsole_f -Get ready to enter console. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Con_ToggleConsole_f( void ) -{ - Key_ClearTyping(); - Con_ClearNotify(); -} - -/* ------------------------------------------------------------------------------ - Function: Con_Clear_f -Clear console text buffer. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - Zero sets con.text memory block. ------------------------------------------------------------------------------ -*/ -PRIVATE void Con_Clear_f( void ) -{ - memset( con.text, ' ', CON_TEXTSIZE ); -} - - -/* ------------------------------------------------------------------------------ - Function: Con_Dump_f -Save the console contents out to a file. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void Con_Dump_f( void ) -{ - int length, x; - char *line; - FILE *f; - char buffer[1024]; - char name[MAX_OSPATH]; - - if( Cmd_Argc() != 2 ) - { - Com_Printf( "usage: conDump \n" ); - return; - } - - my_snprintf( name, sizeof( name ), "%s/%s.txt", FS_Gamedir(), Cmd_Argv( 1 ) ); - - Com_Printf( "Dumped console text to %s.\n", name ); - FS_CreatePath( name ); - f = fopen( name, "w" ); - if( ! f ) - { - Com_Printf( "ERROR: couldn't open.\n" ); - return; - } - - // skip empty lines - for( length = con.current - con.totallines + 1; length <= con.current; ++length ) - { - line = con.text + (length % con.totallines) * con.linewidth; - for( x = 0; x < con.linewidth; ++x ) - { - if( line[ x ] != ' ' ) - { - break; - } - } - - if( x != con.linewidth ) - { - break; - } - } - - // write the remaining lines - buffer[ con.linewidth ] = '\0'; - for( ; length <= con.current ; ++length ) - { - line = con.text + (length % con.totallines) * con.linewidth; - my_strlcpy( buffer, line, con.linewidth ); - for( x = con.linewidth - 1; x >= 0; --x ) - { - if( buffer[ x ] == ' ' ) - { - buffer[ x ] = '\0'; // NUL-terminate string - } - else - { - break; - } - } - for( x = 0; buffer[ x ]; ++x ) - { - buffer[ x ] &= 0x7f; - } - - fprintf( f, "%s\n", buffer ); - } - - fclose( f ); -} - -/* ------------------------------------------------------------------------------ - Function: Con_ClearNotify -Clear console con.times. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Con_ClearNotify( void ) -{ - int i; - - for( i = 0; i < NUM_CON_TIMES; ++i ) - { - con.times[ i ] = 0; - } -} - - -/* ------------------------------------------------------------------------------ - Function: Con_CheckResize -If the line width has changed, reformat the buffer. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Con_CheckResize( void ) -{ - int i, j, width, oldwidth, oldtotallines, numlines, numchars; - char tbuf[ CON_TEXTSIZE ]; - - width = (viddef.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; - 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; - } - - memcpy( tbuf, con.text, CON_TEXTSIZE ); - 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.current = con.totallines - 1; - con.display = con.current; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Con_Init( void ) -{ - con.linewidth = -1; - - Con_CheckResize(); - - Com_Printf( "Console Initialized\n" ); - -// -// register our commands -// - con_notifytime = Cvar_Get( "con_notifytime", "90", CVAR_INIT ); - scr_conspeed = Cvar_Get( "scr_conspeed", "90", CVAR_INIT ); - - Cmd_AddCommand( "toggleconsole", Con_ToggleConsole_f ); - Cmd_AddCommand( "clear", Con_Clear_f ); - Cmd_AddCommand( "conDump", Con_Dump_f ); - - con.initialized = true; -} - -/* ------------------------------------------------------------------------------ - Function: Con_Linefeed -Fill rest of line with spaces. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void Con_Linefeed( void ) -{ - con.x = 0; - if( con.display == con.current ) - { - con.display++; - } - con.current++; - memset( &con.text[ (con.current % con.totallines) * con.linewidth ] - , ' ', con.linewidth ); -} - -/* ------------------------------------------------------------------------------ - Function: Con_Print -Print formatted message to the console. - - Parameters: txt -[in] Text message to print - - Returns: Nothing. - - Notes: - 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 text will appear at the top of the game window ------------------------------------------------------------------------------ -*/ -PUBLIC void Con_Print( char *txt ) -{ - int y; - int c, wordlength; - static int cr; - int mask; - -#ifdef IPHONE - printf( "%s", txt ); -#endif - - if( ! con.initialized ) - { - return; - } - - if( txt[ 0 ] == 1 || txt[ 0 ] == 2 ) - { - mask = 128; // go to colored text - txt++; - } - else - { - mask = 0; - } - - - while( (c = *txt) ) - { - // count word length - for( wordlength = 0 ; wordlength < con.linewidth ; ++wordlength ) - { - if( txt[ wordlength ] <= ' ') - { - break; - } - } - - // word wrap - if( wordlength != con.linewidth && (con.x + wordlength > 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 ] = iphoneFrameNum; - } - } - - 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.ormask; - con.x++; - if( con.x >= con.linewidth ) - { - con.x = 0; - } - break; - } - - } -} - - -/* ------------------------------------------------------------------------------ - Function: Con_CenteredPrint -Print message that is centered on screen. - - Parameters: text -[in] Message string. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void Con_CenteredPrint( const char *text ) -{ - int length; - char buffer[ 1024 ]; - - length = strlen( text ); - length = ( con.linewidth - length ) >> 1; - if( length < 0 ) - { - length = 0; - } - - memset( buffer, ' ', length ); - my_strlcpy( buffer + length, text, sizeof( buffer ) - length ); - my_strlcat( buffer, "\n", sizeof( buffer ) ); - Con_Print( buffer ); -} - - -/* -============================================================================== - - DRAWING - -============================================================================== -*/ - - -/* ------------------------------------------------------------------------------ - Function: Con_DrawInput -The input line scrolls horizontally if typing - goes beyond the right edge. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PRIVATE void Con_DrawInput( void ) -{ - int y; - int i; - char *text; - char buf[256]; - W16 heightfont, charwidth; - static char ccursor[ 2 ] = { ' ', '_' }; - - - heightfont = Font_GetSize( FONT0 ) + 4; - -#ifdef IPHONE - { - const char * GetCurrentCommandLine(); - extern int consoleActive; - - if ( consoleActive == 0 ) { - return; - } - strcpy( buf, GetCurrentCommandLine() ); - key_linepos = strlen( buf ); - buf[key_linepos+1] = 0; - text = buf; - } -#else - if( ClientStatic.key_dest != key_console ) - { - return; // don't draw anything (always draw if not active) - } - - text = key_lines[ edit_line ]; -#endif - -// add the cursor frame - text[ key_linepos ] = ccursor[ 0 + ((int)( iphoneFrameNum >> 3 ) & 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 - heightfont; - - charwidth = 8; - for( i = 0 ; i < con.linewidth ; ++i ) - { - charwidth += Font_put_character( FONT0, charwidth, con.vislines - 22, text[ i ] ); - } - -// remove cursor - key_lines[ edit_line ][ key_linepos ] = 0; -} - -/* ------------------------------------------------------------------------------ - Function: Con_DrawNotify -Draws the last few lines of output transparently - over the game top. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void Con_DrawNotify( void ) -{ - int x, v; - int charwidth; - char *text; - int i; - int time; -// char *s; -// int skip; - W16 size; - - - Font_SetSize( FONT1, 1 ); - size = Font_GetSize( FONT1 ); - - Font_SetColour( FONT1, colourWhite ); - - v = 0; - for( i = con.current - NUM_CON_TIMES+1 ; i <= con.current ; ++i ) - { - if( i < 0 ) - { - continue; - } - - time = FloatToInt( con.times[ i % NUM_CON_TIMES ] ); - if( time == 0 ) - { - continue; - } - - time = iphoneFrameNum- time; - if( time > con_notifytime->value ) - { - continue; - } - - text = con.text + (i % con.totallines) * con.linewidth; - - charwidth = 0; - for( x = 0 ; x < con.linewidth ; ++x ) - { - charwidth += Font_put_character( FONT1, charwidth, v, text[ x ] ); - } - - v += size; - } - - Font_SetSize( FONT1, 2 ); - -} - - -/* ------------------------------------------------------------------------------ - Function: Con_DrawConsole -Draws the console. - - Parameters: frac -[in] Fraction of the screen the console will take up. - Range is 0.0 to 1.0 - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void Con_DrawConsole( float frac ) -{ - int i, x, y; - int rows; - char *text; - int row; - W32 lines; - char version[ 64 ]; -// int w, h; - int heightfont, charwidth; - - lines = FloatToInt( viddef.height * frac ); - if( lines < 1 ) - { - return; - } - - - Font_SetSize( FONT0, 1 ); - Font_SetColour( FONT0, colourconLLGray ); - heightfont = Font_GetSize( FONT0 ); - - - - if( lines > viddef.height ) - { - lines = viddef.height; - } - -// -// Draw the background -// - R_Draw_Fill( 0, -viddef.height + lines, viddef.width, viddef.height, colourBlack ); - R_Draw_Fill( 0, lines-2, viddef.width, 2, colourconLGray ); - - -// SCR_AddDirtyPoint( 0, 0 ); -// SCR_AddDirtyPoint( viddef.width-1, lines-1 ); - - my_snprintf( version, sizeof( version ), "v%s", APP_VERSION ); - Font_SetColour( FONT0, colourGreen ); - Font_put_lineR2L( FONT0, viddef.width-20, lines - 2 - heightfont, version ); - Font_SetColour( FONT0, colourconLLGray ); - -// -// Draw the text -// - con.vislines = lines; - -#if 0 - - rows = (lines - 8) >> 3; // rows of text to draw - - y = lines - 24; - -#else - - rows = (lines - 22) >> 3; // rows of text to draw - - y = lines - 30; - -#endif - -// draw from the bottom up - if( con.display != con.current ) - { - // draw arrows to show the buffer is backscrolled - for( x = 0; x < con.linewidth; x += 4 ) - { - Font_put_character( FONT0, (x+1) << 3, y, '^' ); - } - - y -= heightfont; - rows--; - } - - row = con.display; - for( i = 0 ; i < rows ; ++i, y -= heightfont, --row ) - { - if( row < 0 ) - { - break; - } - - if( con.current - row >= con.totallines ) - { - break; // past scrollback wrap point - } - - text = con.text + (row % con.totallines) * con.linewidth; - - charwidth = 0; - for( x = 0; x < con.linewidth; ++x ) - { - charwidth += Font_put_character( FONT0, charwidth, y, text[ x ] ); - } - } - -// draw the input prompt, user text, and cursor if desired - Con_DrawInput(); - - Font_SetSize( FONT0, 2 ); -} - -/* - ----------------------------------------------------------------------------- - Function: Client_Screen_RunConsole -Figure out how the console should be - drawn. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - - ----------------------------------------------------------------------------- - */ -PUBLIC void Client_Screen_RunConsole( void ) -{ - if( scr_conlines < scr_con_current ) - { - scr_con_current -= scr_conspeed->value * iphoneFrameNum; - if( scr_conlines > scr_con_current ) - { - scr_con_current = scr_conlines; - } - - } - else if( scr_conlines > scr_con_current ) - { - scr_con_current += scr_conspeed->value * iphoneFrameNum; - if( scr_conlines < scr_con_current ) - { - scr_con_current = scr_conlines; - } - } - -} - -/* - ----------------------------------------------------------------------------- - Function: Client_Screen_DrawConsole -Draw the console on the screen. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - - ----------------------------------------------------------------------------- - */ -PUBLIC void Client_Screen_DrawConsole( void ) -{ - Con_CheckResize(); - - if( scr_con_current ) - { - Con_DrawConsole( scr_con_current ); - } - else - { - Con_DrawNotify(); - } -} - - - diff --git a/wolf3d/newCode/env/console.h b/wolf3d/newCode/env/console.h deleted file mode 100644 index 6134aaa..0000000 --- a/wolf3d/newCode/env/console.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 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.h: Console drawing and management.. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -/* - Notes: - This module is implemented by console.c. - -*/ - -#ifndef __CONSOLE_H__ -#define __CONSOLE_H__ - - -#define NUM_CON_TIMES 4 - -#define CON_TEXTSIZE 32768 - -typedef struct -{ - _boolean initialized; - - char text[CON_TEXTSIZE]; - int current; // line where next message will be printed - int x; // offset in current line for next print - int display; // bottom of console displays this line - - int ormask; // high bit mask for colored characters - - int linewidth; // characters across screen - int totallines; // total lines in console scrollback - - float cursorspeed; - - int vislines; - - float times[NUM_CON_TIMES]; // cls.realtime time the line was generated - // for transparent notify lines -} console_t; - -extern console_t con; - -extern void Con_DrawCharacter( int cx, int line, int num ); - -extern void Con_CheckResize( void ); -extern void Con_Init( void ); -extern void Con_DrawConsole( float frac ); -extern void Con_Print( char *txt ); -extern void Con_CenteredPrint( const char *text ); -extern void Con_DrawNotify( void ); -extern void Con_ClearNotify( void ); -extern void Con_ToggleConsole_f( void ); - -extern void Client_Screen_RunConsole( void ); -extern void Client_Screen_DrawConsole( void ); - -#endif /* __CONSOLE_H__ */ - diff --git a/wolf3d/newCode/env/cvar.c b/wolf3d/newCode/env/cvar.c deleted file mode 100644 index da3125c..0000000 --- a/wolf3d/newCode/env/cvar.c +++ /dev/null @@ -1,765 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 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. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -#include "../wolfiphone.h" - - -cvar_t *cvar_vars; - - -/* ------------------------------------------------------------------------------ - Function: Cvar_InfoValidate -String can not have / " ; - - Parameters: string -[in] String to validate. - - Returns: 1 if string is valid, otherwise 0; - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE _boolean Cvar_InfoValidate( const char *string ) -{ - if( strstr( string, "\\" ) ) - { - return false; - } - - if( strstr( string, "\"" ) ) - { - return false; - } - - if( strstr( string, ";" ) ) - { - return false; - } - - return true; -} - -/* ------------------------------------------------------------------------------ - Function: Cvar_FindVar -Return cvar; - - Parameters: var_name -[in] Name of cvar to lookup. - - Returns: NULL if cvar not found, otherwise returns the cvar. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE cvar_t *Cvar_FindVar( const char *var_name ) -{ - cvar_t *var; - W32 hashid; - - hashid = my_strhash( var_name ); - - for( var = cvar_vars ; var ; var = var->next ) - { - if( hashid == var->id ) - { - return var; - } - } - - return NULL; -} - -/* ------------------------------------------------------------------------------ - Function: Cvar_VariableValue -Get value of cvar. - - Parameters: var_name -[in] Name of cvar to get value. - - Returns: 0 if not found, other the value of the cvar. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC float Cvar_VariableValue( const char *var_name ) -{ - cvar_t *var; - - var = Cvar_FindVar( var_name ); - if( ! var ) - { - return 0; - } - - return (float)atof( var->string ); -} - - -/* ------------------------------------------------------------------------------ - Function: Cvar_VariableString -Get cvar variable as string. - - Parameters: var_name -[in] Name of cvar to get value. - - Returns: Blank string on error, otherwise value string. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC char *Cvar_VariableString( const char *var_name ) -{ - cvar_t *var; - - var = Cvar_FindVar( var_name ); - if( ! var ) - { - return ""; - } - - return var->string; -} - -/* ------------------------------------------------------------------------------ - Function: Cvar_CompleteVariable -Complete cvar string name. - - Parameters: partial -[in] Partial name of string to look up. - - Returns: NULL if partial string not found, otherwise the complete - string name. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC char *Cvar_CompleteVariable( const char *partial ) -{ - cvar_t *cvar; - size_t len; - W32 hashid; - - len = strlen( partial ); - - if( ! len ) - { - return NULL; - } - -// -// Check exact match. -// - hashid = my_strhash( partial ); - - for( cvar = cvar_vars ; cvar ; cvar = cvar->next ) - { - if( hashid == cvar->id ) - { - return cvar->name; - } - } - -// -// Check partial match. -// - for( cvar = cvar_vars ; cvar ; cvar = cvar->next ) - { - if( ! strncmp( partial, cvar->name, len ) ) - { - return cvar->name; - } - } - - return NULL; -} - -/* ------------------------------------------------------------------------------ - Function: Cvar_Get -Get cvar structure. - - Parameters: - var_name -[in] the name of the cvar variable. - var_value -[in] string value of the cvar variable. - flags -[in] see CVARFlags for more information. - - Returns: NULL on error, otherwise valid pointer to cvar_t structure. - - Notes: - If the variable already exists, the value will not be set and - the flags will be or'ed. ------------------------------------------------------------------------------ -*/ -PUBLIC cvar_t *Cvar_Get( const char *var_name, const char *var_value, CVARFlags flags ) -{ - cvar_t *var; - - if( flags & (CVAR_USERINFO | CVAR_SERVERINFO) ) - { - if( ! Cvar_InfoValidate( var_name ) ) - { - Com_Printf( "invalid info cvar name\n" ); - return NULL; - } - } - - var = Cvar_FindVar( var_name ); - if( var ) - { - var->flags |= flags; - return var; - } - - if( ! var_value ) - { - return NULL; - } - - if( flags & (CVAR_USERINFO | CVAR_SERVERINFO) ) - { - if( ! Cvar_InfoValidate( var_value ) ) - { - Com_Printf( "invalid info cvar value\n" ); - return NULL; - } - } - - var = Z_Malloc( sizeof( *var ) ); - var->name = my_CopyString( var_name ); - var->string = my_CopyString( var_value ); - var->id = my_strhash( var_name ); - var->modified = true; - var->value = (float)atof( var->string ); - - // link the variable in - var->next = cvar_vars; - cvar_vars = var; - - var->flags = flags; - - return var; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE cvar_t *Cvar_Set2( const char *var_name, const char *value, _boolean force ) -{ - cvar_t *var; - - var = Cvar_FindVar( var_name ); - if( ! var ) - { // create it - return Cvar_Get( var_name, value, CVAR_INIT ); - } - - if( var->flags & (CVAR_USERINFO | CVAR_SERVERINFO) ) - { - if( ! Cvar_InfoValidate( value ) ) - { - Com_Printf( "invalid info cvar value\n" ); - return var; - } - } - - if( ! force ) - { - if( var->flags & CVAR_NOSET ) - { - Com_Printf( "%s is write protected.\n", var_name ); - return var; - } - - if( var->flags & CVAR_LATCH ) - { - if( var->latched_string ) - { - if( strcmp( value, var->latched_string ) == 0 ) - { - return var; - } - - Z_Free( var->latched_string ); - } - else - { - if( strcmp( value, var->string ) == 0 ) - { - return var; - } - } - return var; - } - } - else - { - if( var->latched_string ) - { - Z_Free( var->latched_string ); - var->latched_string = NULL; - } - } - - if( ! strcmp( value, var->string ) ) - { - return var; // not changed - } - - var->modified = true; - - if( var->flags & CVAR_USERINFO ) - { - userinfo_modified = true; // transmit at next oportunity - } - - Z_Free( var->string ); // free the old value string - - var->string = my_CopyString( value ); - var->value = (float)atof( var->string ); - - return var; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC cvar_t *Cvar_ForceSet( const char *var_name, const char *value ) -{ - return Cvar_Set2( var_name, value, true ); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC cvar_t *Cvar_Set( const char *var_name, const char *value ) -{ - return Cvar_Set2( var_name, value, false ); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC cvar_t *Cvar_FullSet( const char *var_name, const char *value, CVARFlags flags ) -{ - cvar_t *var; - - var = Cvar_FindVar( var_name ); - if( ! var ) - { // create it - return Cvar_Get( var_name, value, flags ); - } - - var->modified = true; - - if( var->flags & CVAR_USERINFO ) - { - userinfo_modified = true; // transmit at next oportunity - } - - Z_Free( var->string ); // free the old value string - - var->string = my_CopyString( value ); - var->value = (float)atof( var->string ); - var->flags = flags; - - return var; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Cvar_SetValue( const char *var_name, float value ) -{ - char val[ 32 ]; - - if( value == (int)value ) - { - my_snprintf( val, sizeof( val ), "%i", (int)value ); - } - else - { - my_snprintf( val, sizeof( val ), "%f", value ); - } - - Cvar_Set( var_name, val ); -} - -/* ------------------------------------------------------------------------------ - Function: Cvar_GetLatchedVars -Any variables with latched values will now - be updated - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Cvar_GetLatchedVars( void ) -{ - cvar_t *var; - - for( var = cvar_vars ; var ; var = var->next ) - { - if( ! var->latched_string ) - { - continue; - } - - Z_Free( var->string ); - var->string = var->latched_string; - var->latched_string = NULL; - var->value = (float)atof(var->string); - } -} - - -/* ------------------------------------------------------------------------------ - Function: Cvar_Command -Handles variable inspection and changing from - the console. - - Parameters: Nothing. - - Returns: false if variable not found, otherwise true. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC _boolean 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 ) - { - Com_Printf( "\"%s\" is \"%s\"\n", v->name, v->string ); - return true; - } - - Cvar_Set( v->name, Cmd_Argv( 1 ) ); - return true; -} - -/* ------------------------------------------------------------------------------ - Function: Cvar_Set_f -Allows setting and defining of arbitrary cvars from console. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void Cvar_Set_f( void ) -{ - int c; - int flags; - - c = Cmd_Argc(); - if( c != 3 && c != 4 ) - { - Com_Printf( "usage: set [u / s]\n" ); - return; - } - - if( c == 4 ) - { - if( ! strcmp( Cmd_Argv( 3 ), "u" ) ) - { - flags = CVAR_USERINFO; - } - else if( ! strcmp( Cmd_Argv( 3 ), "s" ) ) - { - flags = CVAR_SERVERINFO; - } - else - { - Com_Printf( "flags can only be 'u' or 's'\n" ); - return; - } - Cvar_FullSet( Cmd_Argv( 1 ), Cmd_Argv( 2 ), flags ); - } - else - { - Cvar_Set( Cmd_Argv( 1 ), Cmd_Argv( 2 ) ); - } -} - - -/* ------------------------------------------------------------------------------ - Function: Cvar_WriteVariables -Appends lines containing "set variable value" - for all variables with the archive flag set - to true. - - Parameters: - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Cvar_WriteVariables( const char *path ) -{ - cvar_t *var; - char buffer[1024]; - FILE *f; - - f = fopen( path, "a" ); - for( var = cvar_vars ; var ; var = var->next ) - { - if( var->flags & CVAR_ARCHIVE ) - { - my_snprintf( buffer, sizeof( buffer ), "set %s \"%s\"\n", var->name, var->string ); - fprintf( f, "%s", buffer ); - } - } - fclose( f ); -} - -/* ------------------------------------------------------------------------------ - Function: Cvar_List_f -Print all cvars to the console. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void Cvar_List_f( void ) -{ - cvar_t *var; - int i; - - i = 0; - for( var = cvar_vars ; var ; var = var->next, ++i ) - { - if( var->flags & CVAR_ARCHIVE ) - { - Com_Printf ("*"); - } - else - { - Com_Printf (" "); - } - - - if( var->flags & CVAR_USERINFO ) - { - Com_Printf ("U"); - } - else - { - Com_Printf (" "); - } - - - if (var->flags & CVAR_SERVERINFO) - { - Com_Printf ("S"); - } - else - { - Com_Printf (" "); - } - - - if( var->flags & CVAR_NOSET ) - { - Com_Printf ("-"); - } - else if (var->flags & CVAR_LATCH) - { - Com_Printf ("L"); - } - else - { - Com_Printf (" "); - } - - Com_Printf (" %s \"%s\"\n", var->name, var->string); - } - - Com_Printf ("%i cvars\n", i); -} - - -PUBLIC _boolean userinfo_modified; - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE char *Cvar_BitInfo( int bit ) -{ - return NULL; -/* static char info[ MAX_INFO_STRING ]; - cvar_t *var; - - info[0] = 0; - - for (var = cvar_vars ; var ; var = var->next) - { - if (var->flags & bit) - Info_SetValueForKey (info, var->name, var->string); - } - return info; -*/ -} - - -/* ------------------------------------------------------------------------------ - Function: Cvar_Userinfo -Get CVAR_USERINFO cvars in a string. - - Parameters: Nothing. - - Returns: An info string containing all the CVAR_USERINFO cvars. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC char *Cvar_Userinfo( void ) -{ - return Cvar_BitInfo( CVAR_USERINFO ); -} - - -/* ------------------------------------------------------------------------------ - Function: Cvar_Serverinfo -Get CVAR_SERVERINFO cvars in a string. - - Parameters: Nothing. - - Returns: An info string containing all the CVAR_SERVERINFO cvars. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC char *Cvar_Serverinfo( void ) -{ - return Cvar_BitInfo( CVAR_SERVERINFO ); -} - - -/* ------------------------------------------------------------------------------ - Function: Cvar_Init -Initialize cvar console functions. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - - This is done so that we can read in archived cvars from cfg files. - Also to list all the cvar variables. ------------------------------------------------------------------------------ -*/ -PUBLIC void Cvar_Init( void ) -{ - Cmd_AddCommand( "set", Cvar_Set_f ); - Cmd_AddCommand( "listCvars", Cvar_List_f ); -} - diff --git a/wolf3d/newCode/env/cvar.h b/wolf3d/newCode/env/cvar.h deleted file mode 100644 index aa41f2f..0000000 --- a/wolf3d/newCode/env/cvar.h +++ /dev/null @@ -1,162 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 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: Dynamic variable tracking. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -/* - -Notes: - - Dynamic variable tracking. - - 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. - - The user can access cvars from the console in three ways: - r_draworder -prints the current value - r_draworder 0 -sets the current value to 0 - set r_draworder 0 -as above, but creates the cvar if not present - - Cvars are restricted from having the same names as commands to keep this - module from being ambiguous. - - This module is implemented by cvar.c - -*/ - -#ifndef __CVAR_H__ -#define __CVAR_H__ - - -#include "arch.h" - -#if 0 -typedef enum _CVARType -{ - CVAR_DEFAULT = BIT( 0 ), // Just create it with no flag value. - CVAR_BOOL = BIT( 0 ), // Set to cause it to be saved to vars.rc - CVAR_INT = BIT( 0 ), // Added to userinfo when changed. - CVAR_FLOAT = BIT( 0 ), // Added to serverinfo when changed. - CVAR_STRING = BIT( 0 ), // Don't allow change from console at all, - // but can be set from the command line. - - CVAR_LATCH = BIT( 0 ), // Save changes until server restart. - -} CVARType; -#endif - -typedef enum _CVARFlags -{ - CVAR_INIT = 0x0, // Just create it with no flag value. - CVAR_ARCHIVE = 0x1, // Set to cause it to be saved to vars.rc - CVAR_USERINFO = 0x2, // Added to userinfo when changed. - CVAR_SERVERINFO = 0x4, // Added to serverinfo when changed. - CVAR_NOSET = 0x8, // Don't allow change from console at all, - // but can be set from the command line. - - CVAR_LATCH = 0x10, // Save changes until server restart. - -} CVARFlags; - - -// nothing outside the Cvar_*() functions should modify these fields! -typedef struct cvar_s -{ - char *name; - char *string; - W32 id; - char *latched_string; // for CVAR_LATCH vars - int flags; - _boolean modified; // set each time the cvar is changed - float value; - - struct cvar_s *next; - -} cvar_t; - -extern cvar_t *cvar_vars; - - - -extern cvar_t *Cvar_Get( const char *var_name, const char *value, CVARFlags flags ); -// creates the variable if it doesn't exist, or returns the existing one -// if it exists, the value will not be changed, but flags will be ORed in -// that allows variables to be unarchived without needing bitflags - -extern cvar_t *Cvar_Set( const char *var_name, const char *value ); -// will create the variable if it doesn't exist - -extern cvar_t *Cvar_ForceSet( const char *var_name, const char *value ); -// will set the variable even if NOSET or LATCH - -extern cvar_t *Cvar_FullSet( const char *var_name, const char *value, CVARFlags flags ); - -extern void Cvar_SetValue( const char *var_name, float value ); -// expands value to a string and calls Cvar_Set - -extern float Cvar_VariableValue( const char *var_name ); -// returns 0 if not defined or non numeric - -extern char *Cvar_VariableString( const char *var_name ); -// returns an empty string if not defined - -extern char *Cvar_CompleteVariable( const char *partial ); -// attempts to match a partial variable name for command line completion -// returns NULL if nothing fits - -extern void Cvar_GetLatchedVars( void ); -// any CVAR_LATCHED variables that have been set will now take effect - -extern _boolean 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) - -extern void Cvar_WriteVariables( const char *path ); -// appends lines containing "set variable value" for all variables -// with the archive flag set to true. - -extern void Cvar_Init( void ); - -extern char *Cvar_Userinfo( void ); -// returns an info string containing all the CVAR_USERINFO cvars - -extern char *Cvar_Serverinfo( void ); -// returns an info string containing all the CVAR_SERVERINFO cvars - -extern _boolean userinfo_modified; -// this is set each time a CVAR_USERINFO variable is changed -// so that the client knows to send it to the server - - -#endif /* __CVAR_H__ */ - diff --git a/wolf3d/newCode/env/fileio.c b/wolf3d/newCode/env/fileio.c deleted file mode 100644 index 1848e55..0000000 --- a/wolf3d/newCode/env/fileio.c +++ /dev/null @@ -1,302 +0,0 @@ -/* - - Copyright (C) 2005 Michael Liebscher - - 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 "../wolfiphone.h" - -// if true, use mmap instead of alloc and read -//#define USE_MMAP - -/* ------------------------------------------------------------------------------ - Function: FS_GetLoadedFilePointer() -Get file pointer. - - Parameters: - filestream -[in] Target file handle. - origin -[in] Pointer position - SEEK_SET -Beginning of file. - SEEK_CUR -Current position of file pointer. - SEEK_END -End of file. - - Returns: File pointer on success, otherwise NULL. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void *FS_GetLoadedFilePointer( filehandle_t *fhandle, W32 origin ) -{ - switch( origin ) - { - case SEEK_SET: - return( (void *)fhandle->ptrStart ); - - case SEEK_END: - return( (void *)fhandle->ptrEnd ); - - case SEEK_CUR: - return( (void *)fhandle->ptrCurrent ); - } - - return NULL; -} - -/* ------------------------------------------------------------------------------ - Function: FS_GetFileSize() -Get the length of a file. - - Parameters: filestream -[in] Target file handle. - - Returns: The file length in bytes. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC SW32 FS_GetFileSize( filehandle_t *fhandle ) -{ - return fhandle->filesize; -} - -/* ------------------------------------------------------------------------------ - Function: FS_FileSeek() -Moves the file pointer to a specified location. - - Parameters: - fhandle -[in] Pointer to filehandle_t structure. - offset -[in] Number of bytes from origin - origin -[in] Initial position - SEEK_SET -Beginning of file. - SEEK_CUR -Current position of file pointer. - SEEK_END -End of file. - - Returns: If successful zero, otherwise a nonzero value. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC W32 FS_FileSeek( filehandle_t *fhandle, SW32 offset, W32 origin ) -{ - switch( origin ) - { - case SEEK_SET: - if( offset < 0 || - offset > fhandle->filesize ) - { - return 1; - } - - fhandle->ptrCurrent = fhandle->ptrStart + offset; - break; - - case SEEK_END: - if( offset > 0 ) - { - return 1; - } - - // offset is negative - if( (fhandle->filesize + offset) < 0 ) - { - return 1; - } - - // offset is negative - fhandle->ptrCurrent = fhandle->ptrEnd + offset; - break; - - case SEEK_CUR: - if( offset < 0 ) - { - // offset is negative - if( ((fhandle->ptrCurrent - fhandle->ptrStart) + offset) < 0 ) - { - return 1; - } - } - - if( offset > 0 ) - { - if( offset > (fhandle->ptrEnd - fhandle->ptrCurrent) ) - { - return 1; - } - } - - fhandle->ptrCurrent += offset; - break; - - default: - return 1; - } - - return 0; -} - -/* ------------------------------------------------------------------------------ - Function: FS_FileTell() -Gets the current position of a file pointer. - - Parameters: fhandle -[in] Pointer to filehandle_t structure. - - Returns: If successful current file position, otherwise -1. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC SW32 FS_FileTell( filehandle_t *fhandle ) -{ - return( fhandle->ptrCurrent - fhandle->ptrStart ); -} - -/* ------------------------------------------------------------------------------ - Function: FS_CloseFile -Close file handle. - - Parameters: filestream -[in] Pointer to valid FILE structure. - - Returns: Nothing. - - Notes: Closes a file stream that was returned by FS_FOpenFile. - ------------------------------------------------------------------------------ -*/ -PUBLIC void FS_CloseFile( filehandle_t *fhandle ) -{ - if( fhandle->filedata ) - { -#ifdef USE_MMAP - if ( munmap( fhandle->filedata, fhandle->filesize ) != 0 ) { - assert( 0 ); - } -#else - free( fhandle->filedata ); -#endif - fhandle->filedata = NULL; - } - - Z_Free( fhandle ); -} - - -/* ------------------------------------------------------------------------------ - Function: FS_OpenFile -Open file from the file system. - ------------------------------------------------------------------------------ -*/ -PUBLIC filehandle_t *FS_OpenFile( const char *filename, W32 FlagsAndAttributes ) -{ - char netpath[ MAX_OSPATH ]; - filehandle_t *hFile; - const char *pathBase; - struct stat s; - int fd; - - -// -// Check for the file in the directory tree -// - if ( FlagsAndAttributes & FA_FILE_IPHONE_DOC_DIR ) { - extern char iphoneDocDirectory[1024]; - pathBase = iphoneDocDirectory; - my_snprintf( netpath, sizeof( netpath ), "%s/%s", pathBase, filename ); - } else { -// extern char iphoneAppDirectory[1024]; -// pathBase = iphoneAppDirectory; - pathBase = FS_Gamedir(); - my_snprintf( netpath, sizeof( netpath ), "%s/%s", pathBase, filename ); - } - - // high performance file mapping path, avoiding stdio - fd = open( netpath, O_RDONLY ); - if ( fd == -1 ) { - return NULL; - } - fstat( fd, &s ); - - hFile = Z_Malloc( sizeof( filehandle_t ) ); - memset( hFile, 0, sizeof( filehandle_t ) ); - - hFile->filesize = s.st_size; -#ifdef USE_MMAP - hFile->filedata = mmap( NULL, hFile->filesize, PROT_READ, MAP_FILE|MAP_PRIVATE, fd, 0 ); - if ( (int)hFile->filedata == -1 ) { - Com_Printf( "mmap failed: %s\n", strerror( errno ) ); - assert( 0 ); - } -#else - hFile->filedata = malloc( hFile->filesize ); - read( fd, hFile->filedata, hFile->filesize ); -#endif - hFile->ptrStart = hFile->ptrCurrent = (PW8)hFile->filedata; - hFile->ptrEnd = (PW8)hFile->filedata + hFile->filesize; - hFile->bLoaded = true; - // mmap doesn't require the file to stay open - close( fd ); - return hFile; -} - - -/* ------------------------------------------------------------------------------ - Function: FS_ReadFile -Reads data from a stream. - - Parameters: buffer -[in/out] Storage location for data. - size -[in] Item size in bytes. - count -[in] Maximum number of items to be read. - fhandle -[in] Pointer to valid filehandle_t structure. - - Returns: On success number of full items actually read, otherwise -1. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC SW32 FS_ReadFile( void *buffer, W32 size, W32 count, filehandle_t *fhandle ) -{ - W8 *buf = (PW8)buffer; - W32 i; - - if( (size * count) > (fhandle->ptrEnd - fhandle->ptrCurrent) ) - { - SW32 read; - - read = (fhandle->ptrEnd - fhandle->ptrCurrent); - - for( i = 0 ; i < (fhandle->ptrEnd - fhandle->ptrCurrent) ; ++i ) - { - buf[ i ] = fhandle->ptrCurrent[ i ]; - } - - fhandle->ptrCurrent = fhandle->ptrEnd; - - return( read ); - } - else - { - for( i = 0 ; i < (size * count) ; ++i, fhandle->ptrCurrent++ ) - { - buf[ i ] = *fhandle->ptrCurrent; - } - - return( (size * count) / size ); - } - - /* should never get here */ - return -1; -} diff --git a/wolf3d/newCode/env/files.c b/wolf3d/newCode/env/files.c deleted file mode 100644 index acd92e2..0000000 --- a/wolf3d/newCode/env/files.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * files.c: Interface to file i/o layer. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -/* - - Notes: - - This module accesses data through a hierarchal file system, but the - contents of the file system can be transparently merged from several - sources. - - The "base directory" is the path to the directory holding the - executable and all game directories. The sys_* files pass this to - host_init in quakeparms_t->basedir. This can be overridden with the - "-basedir" command line parm to allow code debugging in a different - directory. The base directory is only used during file system - initialization. - - The "game directory" is the first tree on the search path and directory - that all generated files (save games, screen shots, demos, config - files) will be saved to. This can be overridden with the "-game" - command line parameter. The game directory can never be changed while - the application is executing. This is a precaution against having a - malicious server instruct clients to write files over areas they - shouldn't. - -*/ - -#include "../wolfiphone.h" - - - -PRIVATE char fs_gamedir[ MAX_OSPATH ]; - - - -/* ------------------------------------------------------------------------------ - Function: FS_Gamedir -Get root directory. - - Parameters: Nothing. - - Returns: String with the name of the root directory. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC char *FS_Gamedir( void ) -{ - return fs_gamedir; -} - - -/* ------------------------------------------------------------------------------ - Function: FS_ListFiles -List files. - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE char **FS_ListFiles( char *findname, int *numfiles, unsigned musthave, unsigned canthave ) -{ - char *s; - int nfiles = 0; - char **list = 0; - - s = FS_FindFirst( findname, musthave, canthave ); - while ( s ) - { - if ( s[strlen(s)-1] != '.' ) - nfiles++; - s = FS_FindNext( musthave, canthave ); - } - FS_FindClose (); - - if ( !nfiles ) - return NULL; - - nfiles++; // add space for a guard - *numfiles = nfiles; - - list = MM_MALLOC( sizeof( char * ) * nfiles ); - if( list == NULL ) - { - MM_OUTOFMEM( "list" ); - } - - memset( list, 0, sizeof( char * ) * nfiles ); - - s = FS_FindFirst( findname, musthave, canthave ); - nfiles = 0; - while( s ) - { - if( s[ strlen( s ) - 1 ] != '.' ) - { - list[ nfiles ] = strdup( s ); - - (void)my_strlwr( list[ nfiles ] ); - - nfiles++; - } - s = FS_FindNext( musthave, canthave ); - } - FS_FindClose(); - - return list; -} - - -/* ------------------------------------------------------------------------------ - Function: FS_InitFilesystem -Initialize file system. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void FS_InitFilesystem( void ) -{ - char *p; - p = getenv("CWD"); - sprintf( fs_gamedir, "%s/base", p ); -} diff --git a/wolf3d/newCode/env/filestring.c b/wolf3d/newCode/env/filestring.c deleted file mode 100644 index d36603d..0000000 --- a/wolf3d/newCode/env/filestring.c +++ /dev/null @@ -1,161 +0,0 @@ -/* - - Copyright (C) 2004-2005 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * filestring.c: Portable file path/name manipulation methods. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -#include "../wolfiphone.h" - - -/* ------------------------------------------------------------------------------ - Function: FS_CreatePath -Creates given path. - - Parameters: path -[in] Pointer to NULL terminated string that contains directory - path. - - Returns: Nothing. - - Notes: Creates any directories needed to store the given filename. - ------------------------------------------------------------------------------ -*/ -PUBLIC void FS_CreatePath( char *path ) -{ - char *ofs; - - for( ofs = path + 1; *ofs; ofs++ ) - { - if( *ofs == '/' ) - { // create the directory - *ofs = '\0'; - FS_CreateDirectory( path ); - *ofs = '/'; - } - } - -} - -PUBLIC void FS_FilePath( char *in, char *out ) -{ - char *s; - - s = in + strlen( in ) - 1; - - while( s != in && *s != '/' ) - { - s--; - } - - strncpy( out, in, s-in ); - out[ s - in ] = '\0'; // NUL-terminate string. -} - -PUBLIC char *FS_SkipPath( char *pathname ) -{ - char *last; - - last = pathname; - while( *pathname ) - { - if( *pathname == '/' ) - { - last = pathname + 1; - } - pathname++; - } - - return last; -} - -PUBLIC void FS_StripExtension( char *in, char *out ) -{ - while( *in && *in != '.' ) - { - *out++ = *in++; - } - - *out = '\0'; // NUL-terminate string. -} - -PUBLIC char *FS_FileExtension( char *in ) -{ - static char exten[ 8 ]; - int i; - - while( *in && *in != '.' ) - { - in++; - } - - if( ! *in ) - { - return ""; - } - - in++; - for( i = 0 ; i < 7 && *in ; i++, in++ ) - { - exten[ i ] = *in; - } - - exten[ i ] = '\0'; // NUL-terminate string. - - return exten; -} - -PUBLIC void FS_FileBase( char *in, char *out ) -{ - char *s, *s2; - - s = in + strlen( in ) - 1; - - while( s != in && *s != '.' ) - { - s--; - } - - for( s2 = s ; s2 != in && *s2 != '/' ; s2-- ) - { - ; - } - - if( s - s2 < 2 ) - { - out[ 0 ] = '\0'; // NUL-terminate string. - } - else - { - s--; - strncpy( out, s2 + 1, s - s2 ); - out[ s - s2 ] = '\0'; // NUL-terminate string. - } -} - - diff --git a/wolf3d/newCode/env/filestring.h b/wolf3d/newCode/env/filestring.h deleted file mode 100644 index 696fa1a..0000000 --- a/wolf3d/newCode/env/filestring.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - - Copyright (C) 2004-2005 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * filesystem.h: Interface to filesystem layer. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -/* - Notes: - This module is implemented by filestring.c. - -*/ - -#ifndef __FILESTRING_H__ -#define __FILESTRING_H__ - - -extern void FS_CreatePath( char *path ); - -extern void FS_FilePath( char *in, char *out ); - -extern char *FS_SkipPath( char *pathname ); - -extern void FS_StripExtension( char *in, char *out ); - -extern char *FS_FileExtension( char *in ); - -extern void FS_FileBase( char *in, char *out ); - -#endif /* __FILESTRING_H__ */ diff --git a/wolf3d/newCode/env/filesystem.h b/wolf3d/newCode/env/filesystem.h deleted file mode 100644 index 59bde77..0000000 --- a/wolf3d/newCode/env/filesystem.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - - Copyright (C) 2004-2005 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * filesystem.h: Interface to filesystem layer. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -/* - Notes: - This module is implemented by files.c. - -*/ - -#ifndef __FILESYSTEM_H__ -#define __FILESYSTEM_H__ - -#define MAX_GAMEPATH 256 // max length of a game pathname -#define MAX_OSPATH 256 // max length of a filesystem pathname - - -extern void FS_InitFilesystem(void); -extern char *FS_Gamedir(void); - - - -///////////////////////////////////////////////////////////////////// -// -// PORTABLE FILE SYSTEM SERVICES -// -///////////////////////////////////////////////////////////////////// - -typedef struct -{ - FILE *hFile; - - /* Following is used when the file is loaded into memory */ - _boolean bLoaded; /* Was file loaded into memory? */ - W32 filesize; /* Size of file data in bytes */ - - W8 *ptrStart; /* pointer to start of file data block */ - W8 *ptrCurrent; /* pointer to current position in file data block */ - W8 *ptrEnd; /* pointer to end of file data block */ - - void *filedata; /* file data loaded into memory */ - -} filehandle_t; - - -/* Desired Access Flags */ -#define DA_GENERIC_READ 0x01 -#define DA_GENERIC_WRITE 0x02 - -/* Flags and Attributes */ -#define FA_FILE_FLAG_LOAD 0x01 -#define FA_FILE_FLAG_CACHE 0x02 -#define FA_FILE_IPHONE_DOC_DIR 0x04 - -extern filehandle_t *FS_OpenFile( const char *filename, W32 FlagsAndAttributes ); -extern void FS_CloseFile( filehandle_t *fhandle ); -// note: this can't be called from another DLL, due to MS libc issues - -extern SW32 FS_ReadFile( void *buffer, W32 size, W32 count, filehandle_t *fhandle ); - -extern SW32 FS_FileTell( filehandle_t *fhandle ); - -extern W32 FS_FileSeek( filehandle_t *fhandle, SW32 offset, W32 origin ); - -extern SW32 FS_GetFileSize( filehandle_t *fhandle ); - -extern void *FS_GetLoadedFilePointer( filehandle_t *fhandle, W32 origin ); - - - -extern void FS_CreatePath( char *path ); - -extern void FS_FilePath( char *in, char *out ); - -extern char *FS_SkipPath( char *pathname ); - -///////////////////////////////////////////////////////////////////// -// -// NON-PORTABLE FILE SYSTEM SERVICES -// -///////////////////////////////////////////////////////////////////// - -extern W8 FS_CreateDirectory( const char *dirname ); -extern W8 FS_ChangeCurrentDirectory( const char *path ); - -extern _boolean FS_DeleteFile( const char *filename ); -extern _boolean FS_RemoveDirectory( const char *pathname ); - -// directory/file attributes -#define FA_ARCH 0x01 -#define FA_HIDDEN 0x02 -#define FA_RDONLY 0x04 -#define FA_DIR 0x08 -#define FA_SYSTEM 0x10 - -// pass in an attribute mask of things you wish to REJECT -extern char *FS_FindFirst( const char *path, W32 musthave, W32 canthave ); -extern char *FS_FindNext( W32 musthave, W32 canthave ); -extern void FS_FindClose( void ); - - - - - -#endif /* __FILESYSTEM_H__ */ - diff --git a/wolf3d/newCode/env/font_manager.c b/wolf3d/newCode/env/font_manager.c deleted file mode 100644 index b4bf57e..0000000 --- a/wolf3d/newCode/env/font_manager.c +++ /dev/null @@ -1,492 +0,0 @@ -/* - - Copyright (C) 2004-2005 Michael Liebscher - - 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. - -*/ - -/* - * font_manager.c: Font management. - * - */ - - -#include "../wolfiphone.h" - -/* - - ! " # $ % & ' ( ) * + , - . / -0 1 2 3 4 5 6 7 8 9 : ; ( = ) ? -@ A B C D E F G H I J K L M N O -P Q R S T U V W X Y Z [ / ] ^ - -` a b c d e f g h i j k l m n o -p q r s t u v w x y z { | } ~ - -*/ - - -#define MAX_FONTS 4 -font_t *myfonts[ MAX_FONTS ]; -PRIVATE W32 num_fonts = 0; - - -typedef struct -{ - char *start, *end; - -} string_seg_t; - - -font_t *createFont( const char *filename ) -{ - font_t *temp_font; - char *datname; - filehandle_t *fp; - W32 size; - W32 i; - - if( num_fonts == (MAX_FONTS - 1) ) - { - Com_Printf( "[createFont]: No more font slots open\n" ); - - return NULL; - } - - - temp_font = Z_Malloc( sizeof( font_t ) ); - - temp_font->texfont = TM_FindTexture( filename, TT_Pic ); - if( NULL == temp_font->texfont ) - { - Com_Printf( "[createFont]: unable to open file (%s)\n", filename ); - - Z_Free( temp_font ); - - return NULL; - } - - memset( temp_font->nCharWidth, 0, sizeof( temp_font->nCharWidth ) ); - - datname = MM_MALLOC( strlen( filename ) + 1 ); - - FS_StripExtension( (char *)filename, datname ); - - my_strlcat( datname, ".dat", strlen( filename ) + 1 ); - - fp = FS_OpenFile( datname, 0 ); - if( NULL == fp ) - { - Com_Printf( "[createFont]: unable to open file (%s)\n", datname ); - - MM_FREE( datname ); - Z_Free( temp_font ); - - return NULL; - } - - size = FS_GetFileSize( fp ); - - // check header size - if( size < 10 ) - { - Com_Printf( "[createFont]: File (%s) has incorrect file length\n", datname ); - - MM_FREE( datname ); - Z_Free( temp_font ); - - FS_CloseFile( fp ); - - return NULL; - } - - - // Check sig of font dat file - - FS_ReadFile( &size, 1, 4, fp ); - - - FS_ReadFile( &temp_font->nMaxWidth, 1, 1, fp ); - FS_ReadFile( &temp_font->nMaxHeight, 1, 1, fp ); - - - FS_ReadFile( &size, 1, 4, fp ); - size = LittleLong( size ); - - if( size > 127 ) - { - Com_Printf( "[createFont]: File (%s) has incorrect Character Width array\n", datname ); - - MM_FREE( datname ); - Z_Free( temp_font ); - - FS_CloseFile( fp ); - - return NULL; - } - - FS_ReadFile( &temp_font->nCharWidth, 1, size, fp ); - - FS_CloseFile( fp ); - - - - - temp_font->nSize = 2; - temp_font->colour[ 3 ] = 255; - - temp_font->hFrac = (float)(temp_font->nMaxHeight / (float)temp_font->texfont->height); - temp_font->wFrac = (float)(temp_font->nMaxWidth / (float)temp_font->texfont->width); - - - - for( i = 0 ; i < MAX_FONTS ; ++i ) - { - if( ! myfonts[ i ] ) - { - break; - } - } - - if( i == (MAX_FONTS - 1) ) - { - Com_Printf( "[createFont]: No more font slots open\n" ); - - MM_FREE( datname ); - Z_Free( temp_font ); - - return NULL; - } - - myfonts[ i ] = temp_font; - - MM_FREE( datname ); - - - return temp_font; -} - -void Font_Init( void ) -{ - W32 i; - - for( i = 0 ; i < MAX_FONTS ; ++i ) - { - myfonts[ i ] = NULL; - } - - (void)createFont( "iphone/font1.tga" ); -// (void)createFont( "iphone/font2.tga" ); -} - -void Font_Shutdown( void ) -{ - -} - -void Font_GetMsgDimensions( FONTSELECT fs, const char *string, int *w, int *h ) -{ - int width = 0; - int mx = 0; - W16 scale; - int height; - - if( ! myfonts[ fs ] ) - { - *w = *h = 0; - - return; - } - - scale = myfonts[ fs ]->nMaxHeight * myfonts[ fs ]->nSize; - height = scale; - - while( *string ) - { - if( *string == '\n' ) - { - if( mx > width ) - { - width = mx; - } - - mx = 0; - height += scale; - ++string; - - continue; - } - - mx += myfonts[ fs ]->nCharWidth[ (*string)-32 ] * myfonts[ fs ]->nSize; - - ++string; - } - - if( mx > width ) - { - width = mx; - } - - *w = width; - *h = height; -} - -void Font_SetSize( FONTSELECT fs, W16 size ) -{ - if( myfonts[ fs ] ) - { - myfonts[ fs ]->nSize = size; - } -} - -W16 Font_GetSize( FONTSELECT fs ) -{ - if( myfonts[ fs ] ) - { - return( myfonts[ fs ]->nMaxHeight * myfonts[ fs ]->nSize ); - } - - return 0; -} - -void Font_SetColour( FONTSELECT fs, colour3_t c ) -{ - if( myfonts[ fs ] ) - { - myfonts[ fs ]->colour[ 0 ] = c[ 0 ]; - myfonts[ fs ]->colour[ 1 ] = c[ 1 ]; - myfonts[ fs ]->colour[ 2 ] = c[ 2 ]; - } -} - -extern void R_Draw_Character( int x, int y, int num, font_t *myfont ); - -void Font_put_line( FONTSELECT fs, int x, int y, const char *string ) -{ - int mx = x; - W16 scale; - - if( ! myfonts[ fs ] ) - { - return; - } - - scale = myfonts[ fs ]->nSize; - - while( *string ) - { - if( *string == '\n' ) - { - mx = x; - y += myfonts[ fs ]->nMaxHeight * scale; - ++string; - continue; - } - - R_Draw_Character( mx, y, *string, myfonts[ fs ] ); - mx += myfonts[ fs ]->nCharWidth[ (*string)-32 ] * scale; - ++string; - } -} - - -void Font_put_lineR2L( FONTSELECT fs, int x, int y, const char *string ) -{ - int mx = x; - unsigned int charindex; - unsigned int i; - - if( ! myfonts[ fs ] ) - { - return; - } - - for ( i = 0; i < strlen( string ); ++i ) - { - charindex = strlen( string ) - i - 1; - mx -= myfonts[ fs ]->nCharWidth[ string[ charindex ]-32 ] * myfonts[ fs ]->nSize; - - R_Draw_Character( mx, y, string[ charindex ], myfonts[ fs ] ); - } -} - -W16 Font_put_character( FONTSELECT fs, int x, int y, W16 num ) -{ - if( ! myfonts[ fs ] || num > 126 ) - { - return 0; - } - - R_Draw_Character( x, y, num, myfonts[ fs ] ); - - return( myfonts[ fs ]->nCharWidth[ num - 32 ] * myfonts[ fs ]->nSize ); -} - - -void Font_put_line_size( FONTSELECT fs, int x, int y, const char *start, const char *end ) -{ - int mx = x; - W16 scale; - - if( ! myfonts[ fs ] ) - { - return; - } - - scale = myfonts[ fs ]->nSize; - - while( start != end ) - { - R_Draw_Character( mx, y, *start, myfonts[ fs ] ); - mx += myfonts[ fs ]->nCharWidth[ (*start)-32 ] * scale; - ++start; - } - -} - - - -W8 Font_get_line( FONTSELECT fs, int line_width, string_seg_t *sst ) -{ - int x = 0, last_word_width = 0, last_word_spaces = 0; - int in_a_word = 0; - int t_words = 0; - int t_spaces = 0; - int chars_width = 0; - W16 scale; - const char *word_start = sst->start; - - - if( ! myfonts[ fs ] ) - { - return false; - } - - - scale = myfonts[ fs ]->nSize; - - - if( line_width < 0 ) - { - line_width = 1000000; - } - - - while( *sst->end != '\0' && *sst->end != '\n' ) - { - char c = *sst->end; - - int c_width = myfonts[ fs ]->nCharWidth[ c - 32 ] * scale; // FIX ME - - // we exceeded the space available for this line - if( x + c_width > line_width ) - { - if( in_a_word ) - { - chars_width = last_word_width; - sst->end = (char *)word_start; - t_spaces = last_word_spaces; - } - - return t_words ? true : false; - } - - - x += c_width; - - if( c != ' ' ) - { - if( ! in_a_word ) - { - last_word_width = chars_width; - word_start = sst->end; - } - - in_a_word = 1; - chars_width += c_width; - } - else - { - if( in_a_word ) - { - in_a_word = 0; - t_words++; - last_word_spaces = t_spaces; - } - - t_spaces++; - } - - ++sst->end; - } - - if( in_a_word ) - { - t_words++; - } - - if( *sst->end != '\0' && *sst->end == '\n' ) - { - ++sst->end; - } - - return t_words ? true : false; - -} - - -void Font_put_paragraph( FONTSELECT fs, short x, short y, - const char *string, - int space_between_lines, - int line_width_in_pixel ) -{ - string_seg_t sst; - sst.start = sst.end = (char *)string; - - if( ! myfonts[ fs ] ) - { - return; - } - - while( Font_get_line( fs, line_width_in_pixel, &sst ) ) - { - Font_put_line_size( fs, x, y, sst.start, sst.end ); - - if( *sst.end != '\0' && *sst.end == ' ' ) - { - sst.start = sst.end; - ++sst.start; - sst.end = sst.start; - } - else if( *sst.end != '\0' && *sst.end == '\n' ) - { - while( *sst.end == '\n' ) - { - ++sst.end; - y += Font_GetSize( fs ) + space_between_lines; - } - - sst.start = sst.end; - } - else - { - sst.start = sst.end; - } - - y += Font_GetSize( fs ) + space_between_lines; - } - -} - diff --git a/wolf3d/newCode/env/font_manager.h b/wolf3d/newCode/env/font_manager.h deleted file mode 100644 index ac54886..0000000 --- a/wolf3d/newCode/env/font_manager.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - - 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. - -*/ - -/* - * font_manager.h: Font management. - * - * Author: Michael Liebscher - * Date: 2004 - * - */ - -/* - Notes: - This module is implemented by font_manager.c. - -*/ - -#ifndef __FONT_MANAGER_H__ -#define __FONT_MANAGER_H__ - - -typedef enum { FONT0 = 0, FONT1, FONT2, FONT3 } FONTSELECT; - - - -typedef struct -{ - W8 nCharWidth[ 128 ]; /* width of each character */ - W8 nMaxWidth; /* box width */ - W8 nMaxHeight; /* box height */ - SW32 spacing; /* space between characters */ - W32 nSize; - float wFrac; - float hFrac; - colour4_t colour; /* Font colour */ - texture_t *texfont; - -} font_t; - - -extern void Font_Init( void ); -extern void Font_Shutdown( void ); - - -extern void Font_SetSize( FONTSELECT fs, W16 size ); -extern W16 Font_GetSize( FONTSELECT fs ); - -extern void Font_SetColour( FONTSELECT fs, colour3_t c ); - -extern void Font_put_line( FONTSELECT fs, int x, int y, const char *string ); -extern void Font_put_lineR2L( FONTSELECT fs, int x, int y, const char *string ); -extern W16 Font_put_character( FONTSELECT fs, int x, int y, W16 num ); - -extern void Font_put_paragraph( FONTSELECT fs, short x, short y, - const char *string, - int space_between_lines, - int line_width_in_pixel ); - -extern void Font_GetMsgDimensions( FONTSELECT fs, const char *string, int *w, int *h ); - -#endif /* __FONT_MANAGER_H__ */ diff --git a/wolf3d/newCode/env/glob.c b/wolf3d/newCode/env/glob.c deleted file mode 100644 index 02a68e1..0000000 --- a/wolf3d/newCode/env/glob.c +++ /dev/null @@ -1,207 +0,0 @@ -/* - - Copyright (C) 1997-2001 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 "../wolfiphone.h" - -/* Like glob_match, but match PATTERN against any final segment of TEXT. */ -static int glob_match_after_star( char *pattern, char *text ) -{ - register char *p = pattern, *t = text; - register char c, c1; - - while( (c = *p++) == '?' || c == '*' ) - { - if( c == '?' && *t++ == '\0' ) - { - return 0; - } - } - - if( c == '\0' ) - { - return 1; - } - - if( c == '\\' ) - { - c1 = *p; - } - else - { - c1 = c; - } - - while( 1 ) - { - if( (c == '[' || *t == c1) && glob_match( p - 1, t ) ) - { - return 1; - } - - if( *t++ == '\0' ) - { - return 0; - } - } -} - -/* Return nonzero if PATTERN has any special globbing chars in it. */ -static int glob_pattern_p( char *pattern ) -{ - register char *p = pattern; - register char c; - int open = 0; - - while( (c = *p++) != '\0' ) - { - switch( c ) - { - case '?': - case '*': - return 1; - - case '[': /* Only accept an open brace if there is a close */ - open++; /* brace to match it. Bracket expressions must be */ - continue; /* complete, according to Posix.2 */ - case ']': - if( open ) - { - return 1; - } - continue; - - case '\\': - if( *p++ == '\0' ) - { - return 0; - } - } - - } - - return 0; -} - -/* Match the pattern PATTERN against the string TEXT; - return 1 if it matches, 0 otherwise. - - A match means the entire string TEXT is used up in matching. - - In the pattern string, `*' matches any sequence of characters, - `?' matches any character, [SET] matches any character in the specified set, - [!SET] matches any character not in the specified set. - - A set is composed of characters or ranges; a range looks like - character hyphen character (as in 0-9 or A-Z). - [0-9a-zA-Z_] is the set of characters allowed in C identifiers. - Any other character in the pattern must be matched exactly. - - To suppress the special syntactic significance of any of `[]*?!-\', - and match the character exactly, precede it with a `\'. -*/ - -int glob_match(char *pattern, char *text) -{ - register char *p = pattern, *t = text; - register char c; - - while ((c = *p++) != '\0') - switch (c) { - case '?': - if (*t == '\0') - return 0; - else - ++t; - break; - - case '\\': - if (*p++ != *t++) - return 0; - break; - - case '*': - return glob_match_after_star(p, t); - - case '[': - { - register char c1 = *t++; - int invert; - - if (!c1) - return (0); - - invert = ((*p == '!') || (*p == '^')); - if (invert) - p++; - - c = *p++; - while (1) { - register char cstart = c, cend = c; - - if (c == '\\') { - cstart = *p++; - cend = cstart; - } - if (c == '\0') - return 0; - - c = *p++; - if (c == '-' && *p != ']') { - cend = *p++; - if (cend == '\\') - cend = *p++; - if (cend == '\0') - return 0; - c = *p++; - } - if (c1 >= cstart && c1 <= cend) - goto match; - if (c == ']') - break; - } - if (!invert) - return 0; - break; - - match: - /* Skip the rest of the [...] construct that already matched. */ - while (c != ']') { - if (c == '\0') - return 0; - c = *p++; - if (c == '\0') - return 0; - else if (c == '\\') - ++p; - } - if (invert) - return 0; - break; - } - - default: - if (c != *t++) - return 0; - } - - return *t == '\0'; -} - diff --git a/wolf3d/newCode/env/glob.h b/wolf3d/newCode/env/glob.h deleted file mode 100644 index 81f2c44..0000000 --- a/wolf3d/newCode/env/glob.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - - Copyright (C) 1997-2001 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. - -*/ - -extern int glob_match( char *pattern, char *text ); diff --git a/wolf3d/newCode/env/math.c b/wolf3d/newCode/env/math.c deleted file mode 100644 index af0a7fb..0000000 --- a/wolf3d/newCode/env/math.c +++ /dev/null @@ -1,224 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * math.c: Math routines. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -#include "../wolfiphone.h" - - - - - - -//////////////////////////// -// -// Square Root -// -//////////////////////////// - -/* ------------------------------------------------------------------------------ - Function: _sqrtf -Calculates the square root. - - Parameters: x -[in] Nonnegative floating-point value - - Returns: The square-root of x. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC float _sqrtf( float x ) -{ - return (float)sqrt( x ); -} - - -/* ------------------------------------------------------------------------------ - Function: _3DNow_Sqrt -Calculates the square root. - - Parameters: x -[in] Nonnegative floating-point value - - Returns: The square-root of x. - - Notes: 15-Bit Precision ------------------------------------------------------------------------------ -*/ -#if __i386__ - -PUBLIC float _3DNow_Sqrt( float x ) -{ - float root = 0.f; - -#if( _MSC_VER || __WATCOMC__ ) - - __asm - { - femms - movd mm0, x - pfrsqrt mm1, mm0 - punpckldq mm0, mm0 - pfmul mm0, mm1 - movd root, mm0 - femms - } - -#endif - - return root; -} - -/* ------------------------------------------------------------------------------ - Function: _SSE_Sqrt -Calculates the square root. - - Parameters: x -[in] Nonnegative floating-point value - - Returns: The square-root of x. - - Notes: ------------------------------------------------------------------------------ -*/ -float _SSE_Sqrt( float x ) -{ - float root = 0.f; - -#if( _MSC_VER || __WATCOMC__ ) - - __asm - { - sqrtss xmm0, x - movss root, xmm0 - } - - -#endif - - return root; -} - -#endif /* __i386__ */ - -//////////////////////////// -// -// End Square Root -// -//////////////////////////// - - -float (*pfSqrt)( float x ) = _sqrtf; - - - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC int my_log2( int val ) -{ - int answer = 0; - while( ( val >>= 1 ) != 0 ) - { - answer++; - } - return answer; -} - -/* ------------------------------------------------------------------------------ - Function: CalcFov -Calculate the field of view. - - Parameters:fov_x -[in] Must be within 1 and 179 degrees. - width -[in] Width of viewing area. - height -[in] Height of viewing area. - - Returns: The field of view in degrees. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC float CalcFov( float fov_x, float width, float height ) -{ - if( fov_x < 1 || fov_x > 179 ) - { - Com_Error( ERR_DROP, "Bad fov: %f", fov_x ); - } - - return (float)RAD2DEG( atan( height / ( width / tan( fov_x / 360 * M_PI ) ) ) ) * 2; -} - -/* ------------------------------------------------------------------------------ - Function: MathLib_Init -Initialize optimized math routines. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void MathLib_Init( void ) -{ - Com_Printf( "Initializing Math Module\n" ); - -#if 0//__i386__ - - if( main_cpu_s.b3DNow ) - { -// pfSqrt = _3DNow_Sqrt; - - Com_Printf( "...using 3DNow!\n" ); - } - - if( main_cpu_s.bSSE ) - { -// pfSqrt = _SSE_Sqrt; - - Com_Printf( "...using SSE\n" ); - } - -#endif -} - - - - diff --git a/wolf3d/newCode/env/matrix.c b/wolf3d/newCode/env/matrix.c deleted file mode 100644 index 8f8e47c..0000000 --- a/wolf3d/newCode/env/matrix.c +++ /dev/null @@ -1,158 +0,0 @@ -/* - - Copyright (C) 2005 Michael Liebscher - - 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. - -*/ - -/* - * matrix.c: Matrix math routines. - * - * Author: Michael Liebscher - * - */ - - -#include "../wolfiphone.h" - -/* ------------------------------------------------------------------------------ - Function: Matrix3x3Multiply -Computes the product of two 3x3 matrices. - - Parameters: in1, in2 -[in] 3x3 matrices. - out -[out] result. - - Returns: Nothing - - Notes: - Product of two 3x3 matrices - ( a b c ) ( r u x ) ( ar + bs + ct au + bv + cw ax + by + cz ) - ( d e f ) ( s v y ) = ( dr + es + ft du + ev + fw dx + ey + fz ) - ( h i j ) ( t w z ) ( hr + hs + ht iu + iv + iw jx + jy + jz ) ------------------------------------------------------------------------------ -*/ -PUBLIC void Matrix3x3Multiply( mat3_t in1, mat3_t in2, mat3_t out ) -{ - out[0] = in1[0] * in2[0] + in1[1] * in2[3] + in1[2] * in2[6]; - out[1] = in1[0] * in2[1] + in1[1] * in2[4] + in1[2] * in2[7]; - out[2] = in1[0] * in2[2] + in1[1] * in2[5] + in1[2] * in2[8]; - - out[3] = in1[3] * in2[0] + in1[4] * in2[3] + in1[5] * in2[6]; - out[4] = in1[3] * in2[1] + in1[4] * in2[4] + in1[5] * in2[7]; - out[5] = in1[3] * in2[2] + in1[4] * in2[5] + in1[5] * in2[8]; - - out[6] = in1[6] * in2[0] + in1[7] * in2[3] + in1[8] * in2[6]; - out[7] = in1[6] * in2[1] + in1[7] * in2[4] + in1[8] * in2[7]; - out[8] = in1[6] * in2[2] + in1[7] * in2[5] + in1[8] * in2[8]; -} - -/* ------------------------------------------------------------------------------ - Function: MatrixIdentity -Set matrix to the identity matrix (unit matrix). - - Parameters: matrix -[in/out] 4x4 matrix. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void MatrixIdentity( mat4_t matrix ) -{ - matrix[ 0] = 1.0; matrix[ 1] = 0.0; matrix[ 2] = 0.0; matrix[ 3] = 0.0; - matrix[ 4] = 0.0; matrix[ 5] = 1.0; matrix[ 6] = 0.0; matrix[ 7] = 0.0; - matrix[ 8] = 0.0; matrix[ 9] = 0.0; matrix[10] = 1.0; matrix[11] = 0.0; - matrix[12] = 0.0; matrix[13] = 0.0; matrix[14] = 0.0; matrix[15] = 1.0; -} - -/* ------------------------------------------------------------------------------ - Function: MatrixInvert -Invert a matrix. - - Parameters: - in -[in] Input matrix - out -[out] Output matrix. - - - Returns: Nothing. - - Notes: Matrix MUST be orthonormal - ------------------------------------------------------------------------------ -*/ -PUBLIC void MatrixInvert( mat4_t in, mat4_t out ) -{ - // Transpose rotation - out[ 0] = in[ 0]; out[ 1] = in[ 4]; out[ 2] = in[ 8]; - out[ 4] = in[ 1]; out[ 5] = in[ 5]; out[ 6] = in[ 9]; - out[ 8] = in[ 2]; out[ 9] = in[ 6]; out[10] = in[10]; - - // Clear shearing terms - out[3] = 0.0f; out[7] = 0.0f; out[11] = 0.0f; out[15] = 1.0f; - - // Translation is minus the dot of translation and rotations - out[12] = -(in[12] * in[ 0]) - (in[13] * in[ 1]) - (in[14] * in[ 2]); - out[13] = -(in[12] * in[ 4]) - (in[13] * in[ 5]) - (in[14] * in[ 6]); - out[14] = -(in[12] * in[ 8]) - (in[13] * in[ 9]) - (in[14] * in[10]); -} - -/* ------------------------------------------------------------------------------ - Function: VectorMatrixMultiply -Multiply a vector by a matrix. - - Parameters: - vecIn -[in] Input vector. - m -[in] Input matrix. - vecOut -[out] Output vector. - - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void VectorMatrixMultiply( vec3_t vecIn, mat4_t m, vec3_t vecOut ) -{ - vecOut[0] = (vecIn[0] * m[ 0]) + (vecIn[1] * m[ 4]) + (vecIn[2] * m[ 8]) + m[12]; - vecOut[1] = (vecIn[0] * m[ 1]) + (vecIn[1] * m[ 5]) + (vecIn[2] * m[ 9]) + m[13]; - vecOut[2] = (vecIn[0] * m[ 2]) + (vecIn[1] * m[ 6]) + (vecIn[2] * m[10]) + m[14]; -} - -/* ------------------------------------------------------------------------------ - Function: VectorMatrix3x3Multiply -Multiply a vector by just the 3x3 portion - of a matrix. - - Parameters: - in -[in] Input vector. - m -[in] Input matrix. - out -[out] Output vector. - - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void VectorMatrix3x3Multiply( vec3_t in, mat4_t m, vec3_t out ) -{ - out[0] = (in[0] * m[ 0]) + (in[1] * m[ 4]) + (in[2] * m[ 8]); - out[1] = (in[0] * m[ 1]) + (in[1] * m[ 5]) + (in[2] * m[ 9]); - out[2] = (in[0] * m[ 2]) + (in[1] * m[ 6]) + (in[2] * m[10]); -} - diff --git a/wolf3d/newCode/env/matrix.h b/wolf3d/newCode/env/matrix.h deleted file mode 100644 index 8245b25..0000000 --- a/wolf3d/newCode/env/matrix.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - - Copyright (C) 2005 Michael Liebscher - - 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. - -*/ - -/* - * matrix.h: Matrix math routines. - * - * Author: Michael Liebscher - * - */ - -#ifndef __MATRIX_H__ -#define __MATRIX_H__ - -#include "vector.h" - -typedef float mat3_t[ 9 ]; // 3x3 matrix -typedef float mat4_t[ 16 ]; // 4x4 matrix - -extern void Matrix3x3Multiply( mat3_t in1, mat3_t in2, mat3_t out ) ; -extern void MatrixIdentity( mat4_t matrix ); -extern void MatrixInvert( mat4_t in, mat4_t out ); -extern void VectorMatrixMultiply( vec3_t vecIn, mat4_t m, vec3_t vecOut ); -extern void VectorMatrix3x3Multiply( vec3_t vecIn, mat4_t m, vec3_t vecOut ); - - -#endif /* __MATRIX_H__ */ diff --git a/wolf3d/newCode/env/memory.c b/wolf3d/newCode/env/memory.c deleted file mode 100644 index b8af11a..0000000 --- a/wolf3d/newCode/env/memory.c +++ /dev/null @@ -1,193 +0,0 @@ -/* - - Copyright (C) 2004-2005 Michael Liebscher - - 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. - -*/ - -/* - * memory.c: Memory allocation module. - * - * Author: Michael Liebscher - * - */ - -#include "../wolfiphone.h" - - - -#ifndef DEBUG_MEMORY - - #define DEBUG_MEMORY 0 - -#endif - - -/* ------------------------------------------------------------------------------ - Function: Memory_malloc -Allocates memory blocks. - - Parameters: size -[in] Bytes to allocate. - - Returns: - Void pointer to the allocated space on success, or NULL if - there is insufficient memory available. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void *Memory_malloc( size_t size ) -{ - void *ptr; - ptr = malloc( size ); - - if( ptr != NULL ) - { - -#if DEBUG_MEMORY - - Com_DPrintf( "[Memory_malloc]: %p size:%ld\n", ptr, size ); - -#endif - - return ptr; - } - - - Com_DPrintf( "[Memory_malloc]: Could not allocate %d bytes\n", size ); - - return NULL; -} - - -/* ------------------------------------------------------------------------------ - Function: Memory_calloc -Allocates an array in memory with elements - initialized to 0. - - Parameters: - num -[in] Number of elements. - size -[in] Bytes to allocate. - - Returns: - Void pointer to the allocated space on success, or NULL if - there is insufficient memory available. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void *Memory_calloc( size_t num, size_t size ) -{ - void *ptr; - ptr = calloc( num, size ); - - if( ptr != NULL ) - { - -#if DEBUG_MEMORY - - Com_DPrintf( "[Memory_calloc]: %p size:%ld num:%ld\n", ptr, size, num ); - -#endif - - return ptr; - } - - Com_DPrintf( "[Memory_calloc]: Could not allocate %d objects of size %d\n", num, size ); - - return NULL; -} - -/* ------------------------------------------------------------------------------ - Function: Memory_realloc -Reallocate memory blocks. - - Parameters: - memblock -[in] Pointer to previously allocated memory block. - size -[in] Bytes to allocate. - - Returns: - A void pointer to the reallocated (and possibly moved) memory - block. The return value is NULL if the size is zero and the - buffer argument is not NULL, or if there is not enough - available memory to expand the block to the given size. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void *Memory_realloc( void *memblock, size_t size ) -{ - void *ptr; - - ptr = realloc( memblock, size ); - - if( ptr != NULL ) - { - -#if DEBUG_MEMORY - - Com_DPrintf( "[Memory_realloc]: %p size:%ld\n", ptr, size ); - -#endif - - return ptr; - } - - Com_DPrintf( "[Memory_realloc]: Could not reallocate %d bytes\n", size ); - - return NULL; -} - - -/* ------------------------------------------------------------------------------ - Function: Memory_free -Deallocates or frees a memory block. - - Parameters: - memblock -[in] Previously allocated memory block to be freed. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Memory_free( void *memblock ) -{ - if( memblock ) - { - -#if DEBUG_MEMORY - - Com_DPrintf( "[Memory_free]: %p\n", memblock ); - -#endif - - free( memblock ); - } -} - - -PUBLIC void Memory_outofmem( const char *name, const char *file, W32 line ) -{ - - Com_Error( ERR_FATAL, "%s:%ld failed allocation for \"%s\"\n", - file, line, name ); - -} diff --git a/wolf3d/newCode/env/memory.h b/wolf3d/newCode/env/memory.h deleted file mode 100644 index 861c8e1..0000000 --- a/wolf3d/newCode/env/memory.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - - Copyright (C) 2004-2005 Michael Liebscher - - 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. - -*/ - -/* - * memory.h: Memory allocation manager. - * - * Author: Michael Liebscher - * - */ - -/* - Notes: - This module is implemented by memory.c. - -*/ - -#ifndef __MEMORY_H__ -#define __MEMORY_H__ - - -// Use the macros -extern void *Memory_malloc( size_t size ); -extern void *Memory_calloc( size_t num, size_t size ); -extern void *Memory_realloc( void *memblock, size_t size ); -extern void Memory_free( void *memblock ); - -extern void Memory_outofmem( const char *name, const char *file, W32 line ); - -#define MM_MALLOC( size ) Memory_malloc( (size) ) -#define MM_CALLOC( num, size ) Memory_calloc( (num), (size) ) -#define MM_REALLOC( memblock, size ) Memory_realloc( (memblock), (size) ) - -#define MM_FREE( memblock ) { Memory_free( (memblock) ); ((memblock)) = NULL; } - -#define MM_OUTOFMEM( name ) Memory_outofmem( (name), __FILE__, __LINE__ ) - - - - -#endif /* __MEMORY_H__ */ diff --git a/wolf3d/newCode/env/mymath.h b/wolf3d/newCode/env/mymath.h deleted file mode 100644 index 42507b4..0000000 --- a/wolf3d/newCode/env/mymath.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - - Copyright (C) 2004-2005 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * mymath.h: Math routines. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * Portion of this code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -#ifndef __MYMATH_H__ -#define __MYMATH_H__ - - - -typedef int fixed4_t; -typedef int fixed8_t; -typedef int fixed16_t; - - -#define PITCH 0 /* up / down */ -#define YAW 1 /* left / right */ -#define ROLL 2 /* fall over */ - - -#ifndef M_PI - - #define M_PI 3.14159265358979323846f // matches value in gcc v2 math.h - -#endif - - - -#ifndef ABS - - #define ABS( x ) ( (x) < 0 ? -(x) : (x) ) - -#endif - - - -#define nanmask ( 255 << 23 ) - -#define IS_NAN( x ) ( ( (*(int *) &x ) & nanmask ) == nanmask ) - - - -/* Use RINT() instead of rint() */ -#ifdef __GNUC__ - - #define RINT( x ) rint( x ) - -#else - - #define RINT( x ) floor( (x) + 0.5 ) - -#endif - - - - -extern void MathLib_Init( void ); - -extern int my_log2( int val ); - -extern float (*pfSqrt)( float x ); - -extern float CalcFov( float fov_x, float width, float height ); - - - -#endif /* __MYMATH_H__ */ - diff --git a/wolf3d/newCode/env/myopengl.h b/wolf3d/newCode/env/myopengl.h deleted file mode 100644 index 83a9304..0000000 --- a/wolf3d/newCode/env/myopengl.h +++ /dev/null @@ -1,872 +0,0 @@ -/* - - Copyright (C) 2005 Michael Liebscher - - 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. - -*/ - -/* - * MyOpenGL.h: OpenGL Interface - * - * Author: Michael Liebscher - * - */ - -/* - Notes: - - This module is implemented by opengl_win.c. - -*/ - -#ifndef __MYOPENGL_H__ -#define __MYOPENGL_H__ - -#ifdef _WIN32 - - #define WIN32_LEAN_AND_MEAN 1 - #include - -#endif - -#ifdef IPHONE -#include -#include -#else -#include -#endif - - -#ifdef __unix__ - - #include - -#endif - - -extern int OpenGL_Init( const char *dllname ); -extern void OpenGL_Shutdown( void ); - - - -#ifndef APIENTRY - - #define APIENTRY - -#endif - -#ifndef APIENTRYP - - #define APIENTRYP APIENTRY * - -#endif - - -typedef GLvoid ( APIENTRYP GLACCUM )(GLenum op, GLfloat value); -typedef GLvoid ( APIENTRYP GLALPHAFUNC )(GLenum func, GLclampf ref); -typedef GLboolean ( APIENTRYP GLARETEXTURESRESIDENT )(GLsizei n, const GLuint *textures, GLboolean *residences); -typedef GLvoid ( APIENTRYP GLARRAYELEMENT )(GLint i); -typedef GLvoid ( APIENTRYP GLBEGIN )(GLenum mode); -typedef GLvoid ( APIENTRYP GLBINDTEXTURE )(GLenum target, GLuint texture); -typedef GLvoid ( APIENTRYP GLBITMAP )(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); -typedef GLvoid ( APIENTRYP GLBLENDFUNC )(GLenum sfactor, GLenum dfactor); -typedef GLvoid ( APIENTRYP GLCALLLIST )(GLuint list); -typedef GLvoid ( APIENTRYP GLCALLLISTS )(GLsizei n, GLenum type, const GLvoid *lists); -typedef GLvoid ( APIENTRYP GLCLEAR )(GLbitfield mask); -typedef GLvoid ( APIENTRYP GLCLEARACCUM )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -typedef GLvoid ( APIENTRYP GLCLEARCOLOR )(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -typedef GLvoid ( APIENTRYP GLCLEARDEPTH )(GLclampd depth); -typedef GLvoid ( APIENTRYP GLCLEARINDEX )(GLfloat c); -typedef GLvoid ( APIENTRYP GLCLEARSTENCIL )(GLint s); -typedef GLvoid ( APIENTRYP GLCLIPPLANE )(GLenum plane, const GLdouble *equation); -typedef GLvoid ( APIENTRYP GLCOLOR3B )(GLbyte red, GLbyte green, GLbyte blue); -typedef GLvoid ( APIENTRYP GLCOLOR3BV )(const GLbyte *v); -typedef GLvoid ( APIENTRYP GLCOLOR3D )(GLdouble red, GLdouble green, GLdouble blue); -typedef GLvoid ( APIENTRYP GLCOLOR3DV )(const GLdouble *v); -typedef GLvoid ( APIENTRYP GLCOLOR3F )(GLfloat red, GLfloat green, GLfloat blue); -typedef GLvoid ( APIENTRYP GLCOLOR3FV )(const GLfloat *v); -typedef GLvoid ( APIENTRYP GLCOLOR3I )(GLint red, GLint green, GLint blue); -typedef GLvoid ( APIENTRYP GLCOLOR3IV )(const GLint *v); -typedef GLvoid ( APIENTRYP GLCOLOR3S )(GLshort red, GLshort green, GLshort blue); -typedef GLvoid ( APIENTRYP GLCOLOR3SV )(const GLshort *v); -typedef GLvoid ( APIENTRYP GLCOLOR3UB )(GLubyte red, GLubyte green, GLubyte blue); -typedef GLvoid ( APIENTRYP GLCOLOR3UBV )(const GLubyte *v); -typedef GLvoid ( APIENTRYP GLCOLOR3UI )(GLuint red, GLuint green, GLuint blue); -typedef GLvoid ( APIENTRYP GLCOLOR3UIV )(const GLuint *v); -typedef GLvoid ( APIENTRYP GLCOLOR3US )(GLushort red, GLushort green, GLushort blue); -typedef GLvoid ( APIENTRYP GLCOLOR3USV )(const GLushort *v); -typedef GLvoid ( APIENTRYP GLCOLOR4B )(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); -typedef GLvoid ( APIENTRYP GLCOLOR4BV )(const GLbyte *v); -typedef GLvoid ( APIENTRYP GLCOLOR4D )(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); -typedef GLvoid ( APIENTRYP GLCOLOR4DV )(const GLdouble *v); -typedef GLvoid ( APIENTRYP GLCOLOR4F )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -typedef GLvoid ( APIENTRYP GLCOLOR4FV )(const GLfloat *v); -typedef GLvoid ( APIENTRYP GLCOLOR4I )(GLint red, GLint green, GLint blue, GLint alpha); -typedef GLvoid ( APIENTRYP GLCOLOR4IV )(const GLint *v); -typedef GLvoid ( APIENTRYP GLCOLOR4S )(GLshort red, GLshort green, GLshort blue, GLshort alpha); -typedef GLvoid ( APIENTRYP GLCOLOR4SV )(const GLshort *v); -typedef GLvoid ( APIENTRYP GLCOLOR4UB )(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); -typedef GLvoid ( APIENTRYP GLCOLOR4UBV )(const GLubyte *v); -typedef GLvoid ( APIENTRYP GLCOLOR4UI )(GLuint red, GLuint green, GLuint blue, GLuint alpha); -typedef GLvoid ( APIENTRYP GLCOLOR4UIV )(const GLuint *v); -typedef GLvoid ( APIENTRYP GLCOLOR4US )(GLushort red, GLushort green, GLushort blue, GLushort alpha); -typedef GLvoid ( APIENTRYP GLCOLOR4USV )(const GLushort *v); -typedef GLvoid ( APIENTRYP GLCOLORMASK )(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -typedef GLvoid ( APIENTRYP GLCOLORMATERIAL )(GLenum face, GLenum mode); -typedef GLvoid ( APIENTRYP GLCOLORPOINTER )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef GLvoid ( APIENTRYP GLCOPYPIXELS )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); -typedef GLvoid ( APIENTRYP GLCOPYTEXIMAGE1D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); -typedef GLvoid ( APIENTRYP GLCOPYTEXIMAGE2D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef GLvoid ( APIENTRYP GLCOPYTEXSUBIMAGE1D )(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef GLvoid ( APIENTRYP GLCOPYTEXSUBIMAGE2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef GLvoid ( APIENTRYP GLCULLFACE )(GLenum mode); -typedef GLvoid ( APIENTRYP GLDELETELISTS )(GLuint list, GLsizei range); -typedef GLvoid ( APIENTRYP GLDELETETEXTURES )(GLsizei n, const GLuint *textures); -typedef GLvoid ( APIENTRYP GLDEPTHFUNC )(GLenum func); -typedef GLvoid ( APIENTRYP GLDEPTHMASK )(GLboolean flag); -typedef GLvoid ( APIENTRYP GLDEPTHRANGE )(GLclampd zNear, GLclampd zFar); -typedef GLvoid ( APIENTRYP GLDISABLE )(GLenum cap); -typedef GLvoid ( APIENTRYP GLDISABLECLIENTSTATE )(GLenum array); -typedef GLvoid ( APIENTRYP GLDRAWARRAYS )(GLenum mode, GLint first, GLsizei count); -typedef GLvoid ( APIENTRYP GLDRAWBUFFER )(GLenum mode); -typedef GLvoid ( APIENTRYP GLDRAWELEMENTS )(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); -typedef GLvoid ( APIENTRYP GLDRAWPIXELS )(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -typedef GLvoid ( APIENTRYP GLEDGEFLAG )(GLboolean flag); -typedef GLvoid ( APIENTRYP GLEDGEFLAGPOINTER )(GLsizei stride, const GLvoid *pointer); -typedef GLvoid ( APIENTRYP GLEDGEFLAGV )(const GLboolean *flag); -typedef GLvoid ( APIENTRYP GLENABLE )(GLenum cap); -typedef GLvoid ( APIENTRYP GLENABLECLIENTSTATE )(GLenum array); -typedef GLvoid ( APIENTRYP GLEND )(void); -typedef GLvoid ( APIENTRYP GLENDLIST )(void); -typedef GLvoid ( APIENTRYP GLEVALCOORD1D )(GLdouble u); -typedef GLvoid ( APIENTRYP GLEVALCOORD1DV )(const GLdouble *u); -typedef GLvoid ( APIENTRYP GLEVALCOORD1F )(GLfloat u); -typedef GLvoid ( APIENTRYP GLEVALCOORD1FV )(const GLfloat *u); -typedef GLvoid ( APIENTRYP GLEVALCOORD2D )(GLdouble u, GLdouble v); -typedef GLvoid ( APIENTRYP GLEVALCOORD2DV )(const GLdouble *u); -typedef GLvoid ( APIENTRYP GLEVALCOORD2F )(GLfloat u, GLfloat v); -typedef GLvoid ( APIENTRYP GLEVALCOORD2FV )(const GLfloat *u); -typedef GLvoid ( APIENTRYP GLEVALMESH1 )(GLenum mode, GLint i1, GLint i2); -typedef GLvoid ( APIENTRYP GLEVALMESH2 )(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); -typedef GLvoid ( APIENTRYP GLEVALPOINT1 )(GLint i); -typedef GLvoid ( APIENTRYP GLEVALPOINT2 )(GLint i, GLint j); -typedef GLvoid ( APIENTRYP GLFEEDBACKBUFFER )(GLsizei size, GLenum type, GLfloat *buffer); -typedef GLvoid ( APIENTRYP GLFINISH )(void); -typedef GLvoid ( APIENTRYP GLFLUSH )(void); -typedef GLvoid ( APIENTRYP GLFOGF )(GLenum pname, GLfloat param); -typedef GLvoid ( APIENTRYP GLFOGFV )(GLenum pname, const GLfloat *params); -typedef GLvoid ( APIENTRYP GLFOGI )(GLenum pname, GLint param); -typedef GLvoid ( APIENTRYP GLFOGIV )(GLenum pname, const GLint *params); -typedef GLvoid ( APIENTRYP GLFRONTFACE )(GLenum mode); -typedef GLvoid ( APIENTRYP GLFRUSTUM )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -typedef GLuint ( APIENTRYP GLGENLISTS )(GLsizei range); -typedef GLvoid ( APIENTRYP GLGENTEXTURES )(GLsizei n, GLuint *textures); -typedef GLvoid ( APIENTRYP GLGETBOOLEANV )(GLenum pname, GLboolean *params); -typedef GLvoid ( APIENTRYP GLGETCLIPPLANE )(GLenum plane, GLdouble *equation); -typedef GLvoid ( APIENTRYP GLGETDOUBLEV )(GLenum pname, GLdouble *params); -typedef GLenum ( APIENTRYP GLGETERROR )(void); -typedef GLvoid ( APIENTRYP GLGETFLOATV )(GLenum pname, GLfloat *params); -typedef GLvoid ( APIENTRYP GLGETINTEGERV )(GLenum pname, GLint *params); -typedef GLvoid ( APIENTRYP GLGETLIGHTFV )(GLenum light, GLenum pname, GLfloat *params); -typedef GLvoid ( APIENTRYP GLGETLIGHTIV )(GLenum light, GLenum pname, GLint *params); -typedef GLvoid ( APIENTRYP GLGETMAPDV )(GLenum target, GLenum query, GLdouble *v); -typedef GLvoid ( APIENTRYP GLGETMAPFV )(GLenum target, GLenum query, GLfloat *v); -typedef GLvoid ( APIENTRYP GLGETMAPIV )(GLenum target, GLenum query, GLint *v); -typedef GLvoid ( APIENTRYP GLGETMATERIALFV )(GLenum face, GLenum pname, GLfloat *params); -typedef GLvoid ( APIENTRYP GLGETMATERIALIV )(GLenum face, GLenum pname, GLint *params); -typedef GLvoid ( APIENTRYP GLGETPIXELMAPFV )(GLenum map, GLfloat *values); -typedef GLvoid ( APIENTRYP GLGETPIXELMAPUIV )(GLenum map, GLuint *values); -typedef GLvoid ( APIENTRYP GLGETPIXELMAPUSV )(GLenum map, GLushort *values); -typedef GLvoid ( APIENTRYP GLGETPOINTERV )(GLenum pname, GLvoid* *params); -typedef GLvoid ( APIENTRYP GLGETPOLYGONSTIPPLE )(GLubyte *mask); -typedef const GLubyte * ( APIENTRYP GLGETSTRING )(GLenum name); -typedef GLvoid ( APIENTRYP GLGETTEXENVFV )(GLenum target, GLenum pname, GLfloat *params); -typedef GLvoid ( APIENTRYP GLGETTEXENVIV )(GLenum target, GLenum pname, GLint *params); -typedef GLvoid ( APIENTRYP GLGETTEXGENDV )(GLenum coord, GLenum pname, GLdouble *params); -typedef GLvoid ( APIENTRYP GLGETTEXGENFV )(GLenum coord, GLenum pname, GLfloat *params); -typedef GLvoid ( APIENTRYP GLGETTEXGENIV )(GLenum coord, GLenum pname, GLint *params); -typedef GLvoid ( APIENTRYP GLGETTEXIMAGE )(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -typedef GLvoid ( APIENTRYP GLGETTEXPARAMETERFV )(GLenum target, GLenum pname, GLfloat *params); -typedef GLvoid ( APIENTRYP GLGETTEXPARAMETERIV )(GLenum target, GLenum pname, GLint *params); -typedef GLvoid ( APIENTRYP GLHINT )(GLenum target, GLenum mode); -typedef GLvoid ( APIENTRYP GLINDEXMASK )(GLuint mask); -typedef GLvoid ( APIENTRYP GLINDEXPOINTER )(GLenum type, GLsizei stride, const GLvoid *pointer); -typedef GLvoid ( APIENTRYP GLINDEXD )(GLdouble c); -typedef GLvoid ( APIENTRYP GLINDEXDV )(const GLdouble *c); -typedef GLvoid ( APIENTRYP GLINDEXF )(GLfloat c); -typedef GLvoid ( APIENTRYP GLINDEXFV )(const GLfloat *c); -typedef GLvoid ( APIENTRYP GLINDEXI )(GLint c); -typedef GLvoid ( APIENTRYP GLINDEXIV )(const GLint *c); -typedef GLvoid ( APIENTRYP GLINDEXS )(GLshort c); -typedef GLvoid ( APIENTRYP GLINDEXSV )(const GLshort *c); -typedef GLvoid ( APIENTRYP GLINDEXUB )(GLubyte c); -typedef GLvoid ( APIENTRYP GLINDEXUBV )(const GLubyte *c); -typedef GLvoid ( APIENTRYP GLINITNAMES )(void); -typedef GLvoid ( APIENTRYP GLINTERLEAVEDARRAYS )(GLenum format, GLsizei stride, const GLvoid *pointer); -typedef GLboolean ( APIENTRYP GLISENABLED )(GLenum cap); -typedef GLboolean ( APIENTRYP GLISLIST )(GLuint list); -typedef GLboolean ( APIENTRYP GLISTEXTURE )(GLuint texture); -typedef GLvoid ( APIENTRYP GLLIGHTMODELF )(GLenum pname, GLfloat param); -typedef GLvoid ( APIENTRYP GLLIGHTMODELFV )(GLenum pname, const GLfloat *params); -typedef GLvoid ( APIENTRYP GLLIGHTMODELI )(GLenum pname, GLint param); -typedef GLvoid ( APIENTRYP GLLIGHTMODELIV )(GLenum pname, const GLint *params); -typedef GLvoid ( APIENTRYP GLLIGHTF )(GLenum light, GLenum pname, GLfloat param); -typedef GLvoid ( APIENTRYP GLLIGHTFV )(GLenum light, GLenum pname, const GLfloat *params); -typedef GLvoid ( APIENTRYP GLLIGHTI )(GLenum light, GLenum pname, GLint param); -typedef GLvoid ( APIENTRYP GLLIGHTIV )(GLenum light, GLenum pname, const GLint *params); -typedef GLvoid ( APIENTRYP GLLINESTIPPLE )(GLint factor, GLushort pattern); -typedef GLvoid ( APIENTRYP GLLINEWIDTH )(GLfloat width); -typedef GLvoid ( APIENTRYP GLLISTBASE )(GLuint base); -typedef GLvoid ( APIENTRYP GLLOADIDENTITY )(void); -typedef GLvoid ( APIENTRYP GLLOADMATRIXD )(const GLdouble *m); -typedef GLvoid ( APIENTRYP GLLOADMATRIXF )(const GLfloat *m); -typedef GLvoid ( APIENTRYP GLLOADNAME )(GLuint name); -typedef GLvoid ( APIENTRYP GLLOGICOP )(GLenum opcode); -typedef GLvoid ( APIENTRYP GLMAP1D )(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -typedef GLvoid ( APIENTRYP GLMAP1F )(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -typedef GLvoid ( APIENTRYP GLMAP2D )(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -typedef GLvoid ( APIENTRYP GLMAP2F )(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -typedef GLvoid ( APIENTRYP GLMAPGRID1D )(GLint un, GLdouble u1, GLdouble u2); -typedef GLvoid ( APIENTRYP GLMAPGRID1F )(GLint un, GLfloat u1, GLfloat u2); -typedef GLvoid ( APIENTRYP GLMAPGRID2D )(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); -typedef GLvoid ( APIENTRYP GLMAPGRID2F )(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); -typedef GLvoid ( APIENTRYP GLMATERIALF )(GLenum face, GLenum pname, GLfloat param); -typedef GLvoid ( APIENTRYP GLMATERIALFV )(GLenum face, GLenum pname, const GLfloat *params); -typedef GLvoid ( APIENTRYP GLMATERIALI )(GLenum face, GLenum pname, GLint param); -typedef GLvoid ( APIENTRYP GLMATERIALIV )(GLenum face, GLenum pname, const GLint *params); -typedef GLvoid ( APIENTRYP GLMATRIXMODE )(GLenum mode); -typedef GLvoid ( APIENTRYP GLMULTMATRIXD )(const GLdouble *m); -typedef GLvoid ( APIENTRYP GLMULTMATRIXF )(const GLfloat *m); -typedef GLvoid ( APIENTRYP GLNEWLIST )(GLuint list, GLenum mode); -typedef GLvoid ( APIENTRYP GLNORMAL3B )(GLbyte nx, GLbyte ny, GLbyte nz); -typedef GLvoid ( APIENTRYP GLNORMAL3BV )(const GLbyte *v); -typedef GLvoid ( APIENTRYP GLNORMAL3D )(GLdouble nx, GLdouble ny, GLdouble nz); -typedef GLvoid ( APIENTRYP GLNORMAL3DV )(const GLdouble *v); -typedef GLvoid ( APIENTRYP GLNORMAL3F )(GLfloat nx, GLfloat ny, GLfloat nz); -typedef GLvoid ( APIENTRYP GLNORMAL3FV )(const GLfloat *v); -typedef GLvoid ( APIENTRYP GLNORMAL3I )(GLint nx, GLint ny, GLint nz); -typedef GLvoid ( APIENTRYP GLNORMAL3IV )(const GLint *v); -typedef GLvoid ( APIENTRYP GLNORMAL3S )(GLshort nx, GLshort ny, GLshort nz); -typedef GLvoid ( APIENTRYP GLNORMAL3SV )(const GLshort *v); -typedef GLvoid ( APIENTRYP GLNORMALPOINTER )(GLenum type, GLsizei stride, const GLvoid *pointer); -typedef GLvoid ( APIENTRYP GLORTHO )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -typedef GLvoid ( APIENTRYP GLPASSTHROUGH )(GLfloat token); -typedef GLvoid ( APIENTRYP GLPIXELMAPFV )(GLenum map, GLsizei mapsize, const GLfloat *values); -typedef GLvoid ( APIENTRYP GLPIXELMAPUIV )(GLenum map, GLsizei mapsize, const GLuint *values); -typedef GLvoid ( APIENTRYP GLPIXELMAPUSV )(GLenum map, GLsizei mapsize, const GLushort *values); -typedef GLvoid ( APIENTRYP GLPIXELSTOREF )(GLenum pname, GLfloat param); -typedef GLvoid ( APIENTRYP GLPIXELSTOREI )(GLenum pname, GLint param); -typedef GLvoid ( APIENTRYP GLPIXELTRANSFERF )(GLenum pname, GLfloat param); -typedef GLvoid ( APIENTRYP GLPIXELTRANSFERI )(GLenum pname, GLint param); -typedef GLvoid ( APIENTRYP GLPIXELZOOM )(GLfloat xfactor, GLfloat yfactor); -typedef GLvoid ( APIENTRYP GLPOINTSIZE )(GLfloat size); -typedef GLvoid ( APIENTRYP GLPOLYGONMODE )(GLenum face, GLenum mode); -typedef GLvoid ( APIENTRYP GLPOLYGONOFFSET )(GLfloat factor, GLfloat units); -typedef GLvoid ( APIENTRYP GLPOLYGONSTIPPLE )(const GLubyte *mask); -typedef GLvoid ( APIENTRYP GLPOPATTRIB )(void); -typedef GLvoid ( APIENTRYP GLPOPCLIENTATTRIB )(void); -typedef GLvoid ( APIENTRYP GLPOPMATRIX )(void); -typedef GLvoid ( APIENTRYP GLPOPNAME )(void); -typedef GLvoid ( APIENTRYP GLPRIORITIZETEXTURES )(GLsizei n, const GLuint *textures, const GLclampf *priorities); -typedef GLvoid ( APIENTRYP GLPUSHATTRIB )(GLbitfield mask); -typedef GLvoid ( APIENTRYP GLPUSHCLIENTATTRIB )(GLbitfield mask); -typedef GLvoid ( APIENTRYP GLPUSHMATRIX )(void); -typedef GLvoid ( APIENTRYP GLPUSHNAME )(GLuint name); -typedef GLvoid ( APIENTRYP GLRASTERPOS2D )(GLdouble x, GLdouble y); -typedef GLvoid ( APIENTRYP GLRASTERPOS2DV )(const GLdouble *v); -typedef GLvoid ( APIENTRYP GLRASTERPOS2F )(GLfloat x, GLfloat y); -typedef GLvoid ( APIENTRYP GLRASTERPOS2FV )(const GLfloat *v); -typedef GLvoid ( APIENTRYP GLRASTERPOS2I )(GLint x, GLint y); -typedef GLvoid ( APIENTRYP GLRASTERPOS2IV )(const GLint *v); -typedef GLvoid ( APIENTRYP GLRASTERPOS2S )(GLshort x, GLshort y); -typedef GLvoid ( APIENTRYP GLRASTERPOS2SV )(const GLshort *v); -typedef GLvoid ( APIENTRYP GLRASTERPOS3D )(GLdouble x, GLdouble y, GLdouble z); -typedef GLvoid ( APIENTRYP GLRASTERPOS3DV )(const GLdouble *v); -typedef GLvoid ( APIENTRYP GLRASTERPOS3F )(GLfloat x, GLfloat y, GLfloat z); -typedef GLvoid ( APIENTRYP GLRASTERPOS3FV )(const GLfloat *v); -typedef GLvoid ( APIENTRYP GLRASTERPOS3I )(GLint x, GLint y, GLint z); -typedef GLvoid ( APIENTRYP GLRASTERPOS3IV )(const GLint *v); -typedef GLvoid ( APIENTRYP GLRASTERPOS3S )(GLshort x, GLshort y, GLshort z); -typedef GLvoid ( APIENTRYP GLRASTERPOS3SV )(const GLshort *v); -typedef GLvoid ( APIENTRYP GLRASTERPOS4D )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef GLvoid ( APIENTRYP GLRASTERPOS4DV )(const GLdouble *v); -typedef GLvoid ( APIENTRYP GLRASTERPOS4F )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef GLvoid ( APIENTRYP GLRASTERPOS4FV )(const GLfloat *v); -typedef GLvoid ( APIENTRYP GLRASTERPOS4I )(GLint x, GLint y, GLint z, GLint w); -typedef GLvoid ( APIENTRYP GLRASTERPOS4IV )(const GLint *v); -typedef GLvoid ( APIENTRYP GLRASTERPOS4S )(GLshort x, GLshort y, GLshort z, GLshort w); -typedef GLvoid ( APIENTRYP GLRASTERPOS4SV )(const GLshort *v); -typedef GLvoid ( APIENTRYP GLREADBUFFER )(GLenum mode); -typedef GLvoid ( APIENTRYP GLREADPIXELS )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); -typedef GLvoid ( APIENTRYP GLRECTD )(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); -typedef GLvoid ( APIENTRYP GLRECTDV )(const GLdouble *v1, const GLdouble *v2); -typedef GLvoid ( APIENTRYP GLRECTF )(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); -typedef GLvoid ( APIENTRYP GLRECTFV )(const GLfloat *v1, const GLfloat *v2); -typedef GLvoid ( APIENTRYP GLRECTI )(GLint x1, GLint y1, GLint x2, GLint y2); -typedef GLvoid ( APIENTRYP GLRECTIV )(const GLint *v1, const GLint *v2); -typedef GLvoid ( APIENTRYP GLRECTS )(GLshort x1, GLshort y1, GLshort x2, GLshort y2); -typedef GLvoid ( APIENTRYP GLRECTSV )(const GLshort *v1, const GLshort *v2); -typedef GLint ( APIENTRYP GLRENDERMODE )(GLenum mode); -typedef GLvoid ( APIENTRYP GLROTATED )(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -typedef GLvoid ( APIENTRYP GLROTATEF )(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -typedef GLvoid ( APIENTRYP GLSCALED )(GLdouble x, GLdouble y, GLdouble z); -typedef GLvoid ( APIENTRYP GLSCALEF )(GLfloat x, GLfloat y, GLfloat z); -typedef GLvoid ( APIENTRYP GLSCISSOR )(GLint x, GLint y, GLsizei width, GLsizei height); -typedef GLvoid ( APIENTRYP GLSELECTBUFFER )(GLsizei size, GLuint *buffer); -typedef GLvoid ( APIENTRYP GLSHADEMODEL )(GLenum mode); -typedef GLvoid ( APIENTRYP GLSTENCILFUNC )(GLenum func, GLint ref, GLuint mask); -typedef GLvoid ( APIENTRYP GLSTENCILMASK )(GLuint mask); -typedef GLvoid ( APIENTRYP GLSTENCILOP )(GLenum fail, GLenum zfail, GLenum zpass); -typedef GLvoid ( APIENTRYP GLTEXCOORD1D )(GLdouble s); -typedef GLvoid ( APIENTRYP GLTEXCOORD1DV )(const GLdouble *v); -typedef GLvoid ( APIENTRYP GLTEXCOORD1F )(GLfloat s); -typedef GLvoid ( APIENTRYP GLTEXCOORD1FV )(const GLfloat *v); -typedef GLvoid ( APIENTRYP GLTEXCOORD1I )(GLint s); -typedef GLvoid ( APIENTRYP GLTEXCOORD1IV )(const GLint *v); -typedef GLvoid ( APIENTRYP GLTEXCOORD1S )(GLshort s); -typedef GLvoid ( APIENTRYP GLTEXCOORD1SV )(const GLshort *v); -typedef GLvoid ( APIENTRYP GLTEXCOORD2D )(GLdouble s, GLdouble t); -typedef GLvoid ( APIENTRYP GLTEXCOORD2DV )(const GLdouble *v); -typedef GLvoid ( APIENTRYP GLTEXCOORD2F )(GLfloat s, GLfloat t); -typedef GLvoid ( APIENTRYP GLTEXCOORD2FV )(const GLfloat *v); -typedef GLvoid ( APIENTRYP GLTEXCOORD2I )(GLint s, GLint t); -typedef GLvoid ( APIENTRYP GLTEXCOORD2IV )(const GLint *v); -typedef GLvoid ( APIENTRYP GLTEXCOORD2S )(GLshort s, GLshort t); -typedef GLvoid ( APIENTRYP GLTEXCOORD2SV )(const GLshort *v); -typedef GLvoid ( APIENTRYP GLTEXCOORD3D )(GLdouble s, GLdouble t, GLdouble r); -typedef GLvoid ( APIENTRYP GLTEXCOORD3DV )(const GLdouble *v); -typedef GLvoid ( APIENTRYP GLTEXCOORD3F )(GLfloat s, GLfloat t, GLfloat r); -typedef GLvoid ( APIENTRYP GLTEXCOORD3FV )(const GLfloat *v); -typedef GLvoid ( APIENTRYP GLTEXCOORD3I )(GLint s, GLint t, GLint r); -typedef GLvoid ( APIENTRYP GLTEXCOORD3IV )(const GLint *v); -typedef GLvoid ( APIENTRYP GLTEXCOORD3S )(GLshort s, GLshort t, GLshort r); -typedef GLvoid ( APIENTRYP GLTEXCOORD3SV )(const GLshort *v); -typedef GLvoid ( APIENTRYP GLTEXCOORD4D )(GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef GLvoid ( APIENTRYP GLTEXCOORD4DV )(const GLdouble *v); -typedef GLvoid ( APIENTRYP GLTEXCOORD4F )(GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef GLvoid ( APIENTRYP GLTEXCOORD4FV )(const GLfloat *v); -typedef GLvoid ( APIENTRYP GLTEXCOORD4I )(GLint s, GLint t, GLint r, GLint q); -typedef GLvoid ( APIENTRYP GLTEXCOORD4IV )(const GLint *v); -typedef GLvoid ( APIENTRYP GLTEXCOORD4S )(GLshort s, GLshort t, GLshort r, GLshort q); -typedef GLvoid ( APIENTRYP GLTEXCOORD4SV )(const GLshort *v); -typedef GLvoid ( APIENTRYP GLTEXCOORDPOINTER )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef GLvoid ( APIENTRYP GLTEXENVF )(GLenum target, GLenum pname, GLfloat param); -typedef GLvoid ( APIENTRYP GLTEXENVFV )(GLenum target, GLenum pname, const GLfloat *params); -typedef GLvoid ( APIENTRYP GLTEXENVI )(GLenum target, GLenum pname, GLint param); -typedef GLvoid ( APIENTRYP GLTEXENVIV )(GLenum target, GLenum pname, const GLint *params); -typedef GLvoid ( APIENTRYP GLTEXGEND )(GLenum coord, GLenum pname, GLdouble param); -typedef GLvoid ( APIENTRYP GLTEXGENDV )(GLenum coord, GLenum pname, const GLdouble *params); -typedef GLvoid ( APIENTRYP GLTEXGENF )(GLenum coord, GLenum pname, GLfloat param); -typedef GLvoid ( APIENTRYP GLTEXGENFV )(GLenum coord, GLenum pname, const GLfloat *params); -typedef GLvoid ( APIENTRYP GLTEXGENI )(GLenum coord, GLenum pname, GLint param); -typedef GLvoid ( APIENTRYP GLTEXGENIV )(GLenum coord, GLenum pname, const GLint *params); -typedef GLvoid ( APIENTRYP GLTEXIMAGE1D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef GLvoid ( APIENTRYP GLTEXIMAGE2D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef GLvoid ( APIENTRYP GLTEXPARAMETERF )(GLenum target, GLenum pname, GLfloat param); -typedef GLvoid ( APIENTRYP GLTEXPARAMETERFV )(GLenum target, GLenum pname, const GLfloat *params); -typedef GLvoid ( APIENTRYP GLTEXPARAMETERI )(GLenum target, GLenum pname, GLint param); -typedef GLvoid ( APIENTRYP GLTEXPARAMETERIV )(GLenum target, GLenum pname, const GLint *params); -typedef GLvoid ( APIENTRYP GLTEXSUBIMAGE1D )(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -typedef GLvoid ( APIENTRYP GLTEXSUBIMAGE2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -typedef GLvoid ( APIENTRYP GLTRANSLATED )(GLdouble x, GLdouble y, GLdouble z); -typedef GLvoid ( APIENTRYP GLTRANSLATEF )(GLfloat x, GLfloat y, GLfloat z); -typedef GLvoid ( APIENTRYP GLVERTEX2D )(GLdouble x, GLdouble y); -typedef GLvoid ( APIENTRYP GLVERTEX2DV )(const GLdouble *v); -typedef GLvoid ( APIENTRYP GLVERTEX2F )(GLfloat x, GLfloat y); -typedef GLvoid ( APIENTRYP GLVERTEX2FV )(const GLfloat *v); -typedef GLvoid ( APIENTRYP GLVERTEX2I )(GLint x, GLint y); -typedef GLvoid ( APIENTRYP GLVERTEX2IV )(const GLint *v); -typedef GLvoid ( APIENTRYP GLVERTEX2S )(GLshort x, GLshort y); -typedef GLvoid ( APIENTRYP GLVERTEX2SV )(const GLshort *v); -typedef GLvoid ( APIENTRYP GLVERTEX3D )(GLdouble x, GLdouble y, GLdouble z); -typedef GLvoid ( APIENTRYP GLVERTEX3DV )(const GLdouble *v); -typedef GLvoid ( APIENTRYP GLVERTEX3F )(GLfloat x, GLfloat y, GLfloat z); -typedef GLvoid ( APIENTRYP GLVERTEX3FV )(const GLfloat *v); -typedef GLvoid ( APIENTRYP GLVERTEX3I )(GLint x, GLint y, GLint z); -typedef GLvoid ( APIENTRYP GLVERTEX3IV )(const GLint *v); -typedef GLvoid ( APIENTRYP GLVERTEX3S )(GLshort x, GLshort y, GLshort z); -typedef GLvoid ( APIENTRYP GLVERTEX3SV )(const GLshort *v); -typedef GLvoid ( APIENTRYP GLVERTEX4D )(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef GLvoid ( APIENTRYP GLVERTEX4DV )(const GLdouble *v); -typedef GLvoid ( APIENTRYP GLVERTEX4F )(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef GLvoid ( APIENTRYP GLVERTEX4FV )(const GLfloat *v); -typedef GLvoid ( APIENTRYP GLVERTEX4I )(GLint x, GLint y, GLint z, GLint w); -typedef GLvoid ( APIENTRYP GLVERTEX4IV )(const GLint *v); -typedef GLvoid ( APIENTRYP GLVERTEX4S )(GLshort x, GLshort y, GLshort z, GLshort w); -typedef GLvoid ( APIENTRYP GLVERTEX4SV )(const GLshort *v); -typedef GLvoid ( APIENTRYP GLVERTEXPOINTER )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef GLvoid ( APIENTRYP GLVIEWPORT )(GLint x, GLint y, GLsizei width, GLsizei height); - - -//GLACCUM pfglAccum; -GLALPHAFUNC pfglAlphaFunc; -GLARETEXTURESRESIDENT pfglAreTexturesResident; -//GLARRAYELEMENT pfglArrayElement; -GLBEGIN pfglBegin; -GLBINDTEXTURE pfglBindTexture; -//GLBITMAP pfglBitmap; -GLBLENDFUNC pfglBlendFunc; -GLCALLLIST pfglCallList; -GLCALLLISTS pfglCallLists; -GLCLEAR pfglClear; -//GLCLEARACCUM pfglClearAccum; -GLCLEARCOLOR pfglClearColor; -GLCLEARDEPTH pfglClearDepth; -//GLCLEARINDEX pfglClearIndex; -//GLCLEARSTENCIL pfglClearStencil; -//GLCLIPPLANE pfglClipPlane; -GLCOLOR3B pfglColor3b; -GLCOLOR3BV pfglColor3bv; -GLCOLOR3D pfglColor3d; -GLCOLOR3DV pfglColor3dv; -GLCOLOR3F pfglColor3f; -GLCOLOR3FV pfglColor3fv; -GLCOLOR3I pfglColor3i; -GLCOLOR3IV pfglColor3iv; -GLCOLOR3S pfglColor3s; -GLCOLOR3SV pfglColor3sv; -GLCOLOR3UB pfglColor3ub; -GLCOLOR3UBV pfglColor3ubv; -GLCOLOR3UI pfglColor3ui; -GLCOLOR3UIV pfglColor3uiv; -GLCOLOR3US pfglColor3us; -GLCOLOR3USV pfglColor3usv; -GLCOLOR4B pfglColor4b; -GLCOLOR4BV pfglColor4bv; -GLCOLOR4D pfglColor4d; -GLCOLOR4DV pfglColor4dv; -GLCOLOR4F pfglColor4f; -GLCOLOR4FV pfglColor4fv; -GLCOLOR4I pfglColor4i; -GLCOLOR4IV pfglColor4iv; -GLCOLOR4S pfglColor4s; -GLCOLOR4SV pfglColor4sv; -GLCOLOR4UB pfglColor4ub; -GLCOLOR4UBV pfglColor4ubv; -GLCOLOR4UI pfglColor4ui; -GLCOLOR4UIV pfglColor4uiv; -GLCOLOR4US pfglColor4us; -GLCOLOR4USV pfglColor4usv; -GLCOLORMASK pfglColorMask; -GLCOLORMATERIAL pfglColorMaterial; -GLCOLORPOINTER pfglColorPointer; -GLCOPYPIXELS pfglCopyPixels; -GLCOPYTEXIMAGE1D pfglCopyTexImage1D; -GLCOPYTEXIMAGE2D pfglCopyTexImage2D; -GLCOPYTEXSUBIMAGE1D pfglCopyTexSubImage1D; -GLCOPYTEXSUBIMAGE2D pfglCopyTexSubImage2D; -GLCULLFACE pfglCullFace; -GLDELETELISTS pfglDeleteLists; -GLDELETETEXTURES pfglDeleteTextures; -GLDEPTHFUNC pfglDepthFunc; -GLDEPTHMASK pfglDepthMask; -GLDEPTHRANGE pfglDepthRange; -GLDISABLE pfglDisable; -GLDISABLECLIENTSTATE pfglDisableClientState; -GLDRAWARRAYS pfglDrawArrays; -GLDRAWBUFFER pfglDrawBuffer; -GLDRAWELEMENTS pfglDrawElements; -GLDRAWPIXELS pfglDrawPixels; -GLEDGEFLAG pfglEdgeFlag; -GLEDGEFLAGPOINTER pfglEdgeFlagPointer; -GLEDGEFLAGV pfglEdgeFlagv; -GLENABLE pfglEnable; -GLENABLECLIENTSTATE pfglEnableClientState; -GLEND pfglEnd; -GLENDLIST pfglEndList; -GLEVALCOORD1D pfglEvalCoord1d; -GLEVALCOORD1DV pfglEvalCoord1dv; -GLEVALCOORD1F pfglEvalCoord1f; -GLEVALCOORD1FV pfglEvalCoord1fv; -GLEVALCOORD2D pfglEvalCoord2d; -GLEVALCOORD2DV pfglEvalCoord2dv; -GLEVALCOORD2F pfglEvalCoord2f; -GLEVALCOORD2FV pfglEvalCoord2fv; -GLEVALMESH1 pfglEvalMesh1; -GLEVALMESH2 pfglEvalMesh2; -GLEVALPOINT1 pfglEvalPoint1; -GLEVALPOINT2 pfglEvalPoint2; -GLFEEDBACKBUFFER pfglFeedbackBuffer; -GLFINISH pfglFinish; -GLFLUSH pfglFlush; -GLFOGF pfglFogf; -GLFOGFV pfglFogfv; -GLFOGI pfglFogi; -GLFOGIV pfglFogiv; -GLFRONTFACE pfglFrontFace; -GLFRUSTUM pfglFrustum; -GLGENLISTS pfglGenLists; -GLGENTEXTURES pfglGenTextures; -GLGETBOOLEANV pfglGetBooleanv; -GLGETCLIPPLANE pfglGetClipPlane; -GLGETDOUBLEV pfglGetDoublev; -GLGETERROR pfglGetError; -GLGETFLOATV pfglGetFloatv; -GLGETINTEGERV pfglGetIntegerv; -GLGETLIGHTFV pfglGetLightfv; -GLGETLIGHTIV pfglGetLightiv; -GLGETMAPDV pfglGetMapdv; -GLGETMAPFV pfglGetMapfv; -GLGETMAPIV pfglGetMapiv; -GLGETMATERIALFV pfglGetMaterialfv; -GLGETMATERIALIV pfglGetMaterialiv; -GLGETPIXELMAPFV pfglGetPixelMapfv; -GLGETPIXELMAPUIV pfglGetPixelMapuiv; -GLGETPIXELMAPUSV pfglGetPixelMapusv; -GLGETPOINTERV pfglGetPointerv; -GLGETPOLYGONSTIPPLE pfglGetPolygonStipple; -GLGETSTRING pfglGetString; -GLGETTEXENVFV pfglGetTexEnvfv; -GLGETTEXENVIV pfglGetTexEnviv; -GLGETTEXGENDV pfglGetTexGendv; -GLGETTEXGENFV pfglGetTexGenfv; -GLGETTEXGENIV pfglGetTexGeniv; -GLGETTEXIMAGE pfglGetTexImage; -GLGETTEXPARAMETERFV pfglGetTexParameterfv; -GLGETTEXPARAMETERIV pfglGetTexParameteriv; -GLHINT pfglHint; -GLINDEXMASK pfglIndexMask; -GLINDEXPOINTER pfglIndexPointer; -GLINDEXD pfglIndexd; -GLINDEXDV pfglIndexdv; -GLINDEXF pfglIndexf; -GLINDEXFV pfglIndexfv; -GLINDEXI pfglIndexi; -GLINDEXIV pfglIndexiv; -GLINDEXS pfglIndexs; -GLINDEXSV pfglIndexsv; -GLINDEXUB pfglIndexub; -GLINDEXUBV pfglIndexubv; -GLINITNAMES pfglInitNames; -GLINTERLEAVEDARRAYS pfglInterleavedArrays; -GLISENABLED pfglIsEnabled; -GLISLIST pfglIsList; -GLISTEXTURE pfglIsTexture; -GLLIGHTMODELF pfglLightModelf; -GLLIGHTMODELFV pfglLightModelfv; -GLLIGHTMODELI pfglLightModeli; -GLLIGHTMODELIV pfglLightModeliv; -GLLIGHTF pfglLightf; -GLLIGHTFV pfglLightfv; -GLLIGHTI pfglLighti; -GLLIGHTIV pfglLightiv; -GLLINESTIPPLE pfglLineStipple; -GLLINEWIDTH pfglLineWidth; -GLLISTBASE pfglListBase; -GLLOADIDENTITY pfglLoadIdentity; -GLLOADMATRIXD pfglLoadMatrixd; -GLLOADMATRIXF pfglLoadMatrixf; -GLLOADNAME pfglLoadName; -GLLOGICOP pfglLogicOp; -GLMAP1D pfglMap1d; -GLMAP1F pfglMap1f; -GLMAP2D pfglMap2d; -GLMAP2F pfglMap2f; -GLMAPGRID1D pfglMapGrid1d; -GLMAPGRID1F pfglMapGrid1f; -GLMAPGRID2D pfglMapGrid2d; -GLMAPGRID2F pfglMapGrid2f; -GLMATERIALF pfglMaterialf; -GLMATERIALFV pfglMaterialfv; -GLMATERIALI pfglMateriali; -GLMATERIALIV pfglMaterialiv; -GLMATRIXMODE pfglMatrixMode; -GLMULTMATRIXD pfglMultMatrixd; -GLMULTMATRIXF pfglMultMatrixf; -GLNEWLIST pfglNewList; -GLNORMAL3B pfglNormal3b; -GLNORMAL3BV pfglNormal3bv; -GLNORMAL3D pfglNormal3d; -GLNORMAL3DV pfglNormal3dv; -GLNORMAL3F pfglNormal3f; -GLNORMAL3FV pfglNormal3fv; -GLNORMAL3I pfglNormal3i; -GLNORMAL3IV pfglNormal3iv; -GLNORMAL3S pfglNormal3s; -GLNORMAL3SV pfglNormal3sv; -GLNORMALPOINTER pfglNormalPointer; -GLORTHO pfglOrtho; -GLPASSTHROUGH pfglPassThrough; -GLPIXELMAPFV pfglPixelMapfv; -GLPIXELMAPUIV pfglPixelMapuiv; -GLPIXELMAPUSV pfglPixelMapusv; -GLPIXELSTOREF pfglPixelStoref; -GLPIXELSTOREI pfglPixelStorei; -GLPIXELTRANSFERF pfglPixelTransferf; -GLPIXELTRANSFERI pfglPixelTransferi; -GLPIXELZOOM pfglPixelZoom; -GLPOINTSIZE pfglPointSize; -GLPOLYGONMODE pfglPolygonMode; -GLPOLYGONOFFSET pfglPolygonOffset; -GLPOLYGONSTIPPLE pfglPolygonStipple; -GLPOPATTRIB pfglPopAttrib; -GLPOPCLIENTATTRIB pfglPopClientAttrib; -GLPOPMATRIX pfglPopMatrix; -GLPOPNAME pfglPopName; -GLPRIORITIZETEXTURES pfglPrioritizeTextures; -GLPUSHATTRIB pfglPushAttrib; -GLPUSHCLIENTATTRIB pfglPushClientAttrib; -GLPUSHMATRIX pfglPushMatrix; -GLPUSHNAME pfglPushName; -GLRASTERPOS2D pfglRasterPos2d; -GLRASTERPOS2DV pfglRasterPos2dv; -GLRASTERPOS2F pfglRasterPos2f; -GLRASTERPOS2FV pfglRasterPos2fv; -GLRASTERPOS2I pfglRasterPos2i; -GLRASTERPOS2IV pfglRasterPos2iv; -GLRASTERPOS2S pfglRasterPos2s; -GLRASTERPOS2SV pfglRasterPos2sv; -GLRASTERPOS3D pfglRasterPos3d; -GLRASTERPOS3DV pfglRasterPos3dv; -GLRASTERPOS3F pfglRasterPos3f; -GLRASTERPOS3FV pfglRasterPos3fv; -GLRASTERPOS3I pfglRasterPos3i; -GLRASTERPOS3IV pfglRasterPos3iv; -GLRASTERPOS3S pfglRasterPos3s; -GLRASTERPOS3SV pfglRasterPos3sv; -GLRASTERPOS4D pfglRasterPos4d; -GLRASTERPOS4DV pfglRasterPos4dv; -GLRASTERPOS4F pfglRasterPos4f; -GLRASTERPOS4FV pfglRasterPos4fv; -GLRASTERPOS4I pfglRasterPos4i; -GLRASTERPOS4IV pfglRasterPos4iv; -GLRASTERPOS4S pfglRasterPos4s; -GLRASTERPOS4SV pfglRasterPos4sv; -GLREADBUFFER pfglReadBuffer; -GLREADPIXELS pfglReadPixels; -GLRECTD pfglRectd; -GLRECTDV pfglRectdv; -GLRECTF pfglRectf; -GLRECTFV pfglRectfv; -GLRECTI pfglRecti; -GLRECTIV pfglRectiv; -GLRECTS pfglRects; -GLRECTSV pfglRectsv; -GLRENDERMODE pfglRenderMode; -GLROTATED pfglRotated; -GLROTATEF pfglRotatef; -GLSCALED pfglScaled; -GLSCALEF pfglScalef; -GLSCISSOR pfglScissor; -GLSELECTBUFFER pfglSelectBuffer; -GLSHADEMODEL pfglShadeModel; -GLSTENCILFUNC pfglStencilFunc; -GLSTENCILMASK pfglStencilMask; -GLSTENCILOP pfglStencilOp; -GLTEXCOORD1D pfglTexCoord1d; -GLTEXCOORD1DV pfglTexCoord1dv; -GLTEXCOORD1F pfglTexCoord1f; -GLTEXCOORD1FV pfglTexCoord1fv; -GLTEXCOORD1I pfglTexCoord1i; -GLTEXCOORD1IV pfglTexCoord1iv; -GLTEXCOORD1S pfglTexCoord1s; -GLTEXCOORD1SV pfglTexCoord1sv; -GLTEXCOORD2D pfglTexCoord2d; -GLTEXCOORD2DV pfglTexCoord2dv; -GLTEXCOORD2F pfglTexCoord2f; -GLTEXCOORD2FV pfglTexCoord2fv; -GLTEXCOORD2I pfglTexCoord2i; -GLTEXCOORD2IV pfglTexCoord2iv; -GLTEXCOORD2S pfglTexCoord2s; -GLTEXCOORD2SV pfglTexCoord2sv; -GLTEXCOORD3D pfglTexCoord3d; -GLTEXCOORD3DV pfglTexCoord3dv; -GLTEXCOORD3F pfglTexCoord3f; -GLTEXCOORD3FV pfglTexCoord3fv; -GLTEXCOORD3I pfglTexCoord3i; -GLTEXCOORD3IV pfglTexCoord3iv; -GLTEXCOORD3S pfglTexCoord3s; -GLTEXCOORD3SV pfglTexCoord3sv; -GLTEXCOORD4D pfglTexCoord4d; -GLTEXCOORD4DV pfglTexCoord4dv; -GLTEXCOORD4F pfglTexCoord4f; -GLTEXCOORD4FV pfglTexCoord4fv; -GLTEXCOORD4I pfglTexCoord4i; -GLTEXCOORD4IV pfglTexCoord4iv; -GLTEXCOORD4S pfglTexCoord4s; -GLTEXCOORD4SV pfglTexCoord4sv; -GLTEXCOORDPOINTER pfglTexCoordPointer; -GLTEXENVF pfglTexEnvf; -GLTEXENVFV pfglTexEnvfv; -GLTEXENVI pfglTexEnvi; -GLTEXENVIV pfglTexEnviv; -GLTEXGEND pfglTexGend; -GLTEXGENDV pfglTexGendv; -GLTEXGENF pfglTexGenf; -GLTEXGENFV pfglTexGenfv; -GLTEXGENI pfglTexGeni; -GLTEXGENIV pfglTexGeniv; -GLTEXIMAGE1D pfglTexImage1D; -GLTEXIMAGE2D pfglTexImage2D; -GLTEXPARAMETERF pfglTexParameterf; -GLTEXPARAMETERFV pfglTexParameterfv; -GLTEXPARAMETERI pfglTexParameteri; -GLTEXPARAMETERIV pfglTexParameteriv; -GLTEXSUBIMAGE1D pfglTexSubImage1D; -GLTEXSUBIMAGE2D pfglTexSubImage2D; -GLTRANSLATED pfglTranslated; -GLTRANSLATEF pfglTranslatef; -GLVERTEX2D pfglVertex2d; -GLVERTEX2DV pfglVertex2dv; -GLVERTEX2F pfglVertex2f; -GLVERTEX2FV pfglVertex2fv; -GLVERTEX2I pfglVertex2i; -GLVERTEX2IV pfglVertex2iv; -GLVERTEX2S pfglVertex2s; -GLVERTEX2SV pfglVertex2sv; -GLVERTEX3D pfglVertex3d; -GLVERTEX3DV pfglVertex3dv; -GLVERTEX3F pfglVertex3f; -GLVERTEX3FV pfglVertex3fv; -GLVERTEX3I pfglVertex3i; -GLVERTEX3IV pfglVertex3iv; -GLVERTEX3S pfglVertex3s; -GLVERTEX3SV pfglVertex3sv; -GLVERTEX4D pfglVertex4d; -GLVERTEX4DV pfglVertex4dv; -GLVERTEX4F pfglVertex4f; -GLVERTEX4FV pfglVertex4fv; -GLVERTEX4I pfglVertex4i; -GLVERTEX4IV pfglVertex4iv; -GLVERTEX4S pfglVertex4s; -GLVERTEX4SV pfglVertex4sv; -GLVERTEXPOINTER pfglVertexPointer; -GLVIEWPORT pfglViewport; - - - -#ifdef _WIN32 - - -typedef BOOL (WINAPI *WGLCOPYCONTEXT)(HGLRC, HGLRC, UINT); -typedef HGLRC (WINAPI *WGLCREATECONTEXT)(HDC); -typedef HGLRC (WINAPI *WGLCREATELAYERCONTEXT)(HDC, int); -typedef BOOL (WINAPI *WGLDELETECONTEXT)(HGLRC); -typedef BOOL (WINAPI *WGLDESCRIBELAYERPLANE)(HDC, int, int, UINT, LPLAYERPLANEDESCRIPTOR); -typedef HGLRC (WINAPI *WGLGETCURRENTCONTEXT)(VOID); -typedef HDC (WINAPI *WGLGETCURRENTDC)(VOID); -typedef int (WINAPI *WGLGETLAYERPALETTEENTRIES)(HDC, int, int, int, COLORREF *); -typedef PROC (WINAPI *WGLGETPROCADDRESS)(LPCSTR); -typedef BOOL (WINAPI *WGLMAKECURRENT)(HDC, HGLRC); -typedef BOOL (WINAPI *WGLREALIZELAYERPALETTE)(HDC, int, BOOL); -typedef int (WINAPI *WGLSETLAYERPALETTEENTRIES)(HDC, int, int, int, CONST COLORREF *); -typedef BOOL (WINAPI *WGLSHARELISTS)(HGLRC, HGLRC); -typedef BOOL (WINAPI *WGLSWAPLAYERBUFFERS)(HDC, UINT); -typedef BOOL (WINAPI *WGLUSEFONTBITMAPS)(HDC, DWORD, DWORD, DWORD); -typedef BOOL (WINAPI *WGLUSEFONTOUTLINES)(HDC, DWORD, DWORD, DWORD, FLOAT, FLOAT, int, LPGLYPHMETRICSFLOAT); - - -WGLCOPYCONTEXT pfwglCopyContext; -WGLCREATECONTEXT pfwglCreateContext; -WGLCREATELAYERCONTEXT pfwglCreateLayerContext; -WGLDELETECONTEXT pfwglDeleteContext; -WGLDESCRIBELAYERPLANE pfwglDescribeLayerPlane; -WGLGETCURRENTCONTEXT pfwglGetCurrentContext; -WGLGETCURRENTDC pfwglGetCurrentDC; -WGLGETLAYERPALETTEENTRIES pfwglGetLayerPaletteEntries; -WGLGETPROCADDRESS pfwglGetProcAddress; -WGLMAKECURRENT pfwglMakeCurrent; -WGLREALIZELAYERPALETTE pfwglRealizeLayerPalette; -WGLSETLAYERPALETTEENTRIES pfwglSetLayerPaletteEntries; -WGLSHARELISTS pfwglShareLists; -WGLSWAPLAYERBUFFERS pfwglSwapLayerBuffers; -WGLUSEFONTBITMAPS pfwglUseFontBitmaps; -WGLUSEFONTOUTLINES pfwglUseFontOutlines; - - -typedef int ( WINAPI *WGLCHOOSEPIXELFORMAT )(HDC, CONST PIXELFORMATDESCRIPTOR *); -typedef int ( WINAPI *WGLDESCRIBEPIXELFORMAT) (HDC, int, UINT, LPPIXELFORMATDESCRIPTOR); -typedef int ( WINAPI *WGLGETPIXELFORMAT)(HDC); -typedef BOOL ( WINAPI *WGLSETPIXELFORMAT)(HDC, int, CONST PIXELFORMATDESCRIPTOR *); -typedef BOOL ( WINAPI *WGLSWAPBUFFERS)(HDC); - - -WGLCHOOSEPIXELFORMAT pfwglChoosePixelFormat; -WGLDESCRIBEPIXELFORMAT pfwglDescribePixelFormat; -WGLGETPIXELFORMAT pfwglGetPixelFormat; -WGLSETPIXELFORMAT pfwglSetPixelFormat; -WGLSWAPBUFFERS pfwglSwapBuffers; - - - -typedef BOOL (WINAPI *WGLSWAPINTERVALEXT)( int ); -typedef int (WINAPI *WGLGETSWAPINTERVALEXT)( void ); - -WGLSWAPINTERVALEXT pfwglSwapIntervalEXT; -WGLGETSWAPINTERVALEXT pfwglGetSwapIntervalEXT; - - -void *(WINAPI *pfwglAllocateMemoryNV)( GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority ); -void *(WINAPI *pfwglFreeMemoryNV)( void *pointer ); - - - -#ifndef HPBUFFERARB - - DECLARE_HANDLE( HPBUFFERARB ); - -#endif - -HPBUFFERARB (WINAPI *pfwglCreatePbufferARB)( HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList ); -HDC (WINAPI *pfwglGetPbufferDCARB)( HPBUFFERARB hPbuffer ); -int (WINAPI *pfwglReleasePbufferDCARB)( HPBUFFERARB hPbuffer, HDC hDC ); -BOOL (WINAPI *pfwglDestroyPbufferARB)(HPBUFFERARB hPbuffer); -BOOL (WINAPI *pfwglQueryPbufferARB)( HPBUFFERARB hPbuffer, int iAttribute, int *piValue ); - - -BOOL (WINAPI *pfwglGetPixelFormatAttribivARB)( HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues); -BOOL (WINAPI *pfwglGetPixelFormatAttribfvARB)( HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues); -BOOL (WINAPI *pfwglChoosePixelFormatARB)( HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); - - -#endif /* _WIN32 */ - -#ifdef __unix__ - -// Local function in dll -extern void *pfwglGetProcAddress( const char *symbol ); - - -void *(*pfwglAllocateMemoryNV)( GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority ); -void *(*pfwglFreeMemoryNV)( void *pointer ); - - -// GLX Functions -XVisualInfo * (*pfglXChooseVisual)( Display *dpy, int screen, int *attribList ); -void (*pfglXCopyContext)( Display *dpy, GLXContext src, GLXContext dst, GLuint mask ); -GLXContext (*pfglXCreateContext)( Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct ); -GLXPixmap (*pfglXCreateGLXPixmap)( Display *dpy, XVisualInfo *vis, Pixmap pixmap ); -void (*pfglXDestroyContext)( Display *dpy, GLXContext ctx ); -void (*pfglXDestroyGLXPixmap)( Display *dpy, GLXPixmap pix ); -int (*pfglXGetConfig)( Display *dpy, XVisualInfo *vis, int attrib, int *value ); -GLXContext (*pfglXGetCurrentContext)( void ); -GLXDrawable (*pfglXGetCurrentDrawable)( void ); -Bool (*pfglXIsDirect)( Display *dpy, GLXContext ctx ); -Bool (*pfglXMakeCurrent)( Display *dpy, GLXDrawable drawable, GLXContext ctx); -Bool (*pfglXQueryExtension)( Display *dpy, int *errorBase, int *eventBase ); -Bool (*pfglXQueryVersion)( Display *dpy, int *major, int *minor ); -void (*pfglXSwapBuffers)( Display *dpy, GLXDrawable drawable ); -void (*pfglXUseXFont)( Font font, int first, int count, int listBase ); -void (*pfglXWaitGL)( void ); -void (*pfglXWaitX)( void ); - -#endif /* __unix__ */ - - - - - -#endif /* __MYOPENGL_H__ */ diff --git a/wolf3d/newCode/env/myopengl_extension.h b/wolf3d/newCode/env/myopengl_extension.h deleted file mode 100644 index 79c26f3..0000000 --- a/wolf3d/newCode/env/myopengl_extension.h +++ /dev/null @@ -1,716 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - - 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. - -*/ - -/* - * myopengl_extension.h: Interface to OpenGL extensions. - * - * Author: Michael Liebscher - * Date: 2004 - * - */ - -/* - - Notes: - - This module is implemented by opengl_extenstion.c - -*/ - - -#ifndef __MYOPENGL_EXTENSION_H__ -#define __MYOPENGL_EXTENSION_H__ - - -#ifdef IPHONE -#include -#include -#else -#include -#include "GL/glext.h" -#endif - - -#ifndef APIENTRY - - #define APIENTRY - -#endif - -#ifndef APIENTRYP - - #define APIENTRYP APIENTRY * - -#endif - - - -/////////////////////////////////////////////////////////////////////////////// -// -// OpenGL Extensions -// -/////////////////////////////////////////////////////////////////////////////// - - -#define GL_POINT_SIZE_MIN_EXT 0x8126 -#define GL_POINT_SIZE_MAX_EXT 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 -#define GL_DISTANCE_ATTENUATION_EXT 0x8129 - -#ifdef __sgi -#define GL_SHARED_TEXTURE_PALETTE_EXT GL_TEXTURE_COLOR_TABLE_SGI -#else -#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB -#endif - - -#define GL_TEXTURE0_ARB 0x84C0 -#define GL_TEXTURE1_ARB 0x84C1 -#define GL_TEXTURE2_ARB 0x84C2 -#define GL_TEXTURE3_ARB 0x84C3 - -#ifndef WGL_ARB_pixel_format - #define WGL_ARB_pixel_format 1 - #define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 - #define WGL_DRAW_TO_WINDOW_ARB 0x2001 - #define WGL_DRAW_TO_BITMAP_ARB 0x2002 - #define WGL_ACCELERATION_ARB 0x2003 - #define WGL_NEED_PALETTE_ARB 0x2004 - #define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 - #define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 - #define WGL_SWAP_METHOD_ARB 0x2007 - #define WGL_NUMBER_OVERLAYS_ARB 0x2008 - #define WGL_NUMBER_UNDERLAYS_ARB 0x2009 - #define WGL_TRANSPARENT_ARB 0x200A - #define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 - #define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 - #define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 - #define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A - #define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B - #define WGL_SHARE_DEPTH_ARB 0x200C - #define WGL_SHARE_STENCIL_ARB 0x200D - #define WGL_SHARE_ACCUM_ARB 0x200E - #define WGL_SUPPORT_GDI_ARB 0x200F - #define WGL_SUPPORT_OPENGL_ARB 0x2010 - #define WGL_DOUBLE_BUFFER_ARB 0x2011 - #define WGL_STEREO_ARB 0x2012 - #define WGL_PIXEL_TYPE_ARB 0x2013 - #define WGL_COLOR_BITS_ARB 0x2014 - #define WGL_RED_BITS_ARB 0x2015 - #define WGL_RED_SHIFT_ARB 0x2016 - #define WGL_GREEN_BITS_ARB 0x2017 - #define WGL_GREEN_SHIFT_ARB 0x2018 - #define WGL_BLUE_BITS_ARB 0x2019 - #define WGL_BLUE_SHIFT_ARB 0x201A - #define WGL_ALPHA_BITS_ARB 0x201B - #define WGL_ALPHA_SHIFT_ARB 0x201C - #define WGL_ACCUM_BITS_ARB 0x201D - #define WGL_ACCUM_RED_BITS_ARB 0x201E - #define WGL_ACCUM_GREEN_BITS_ARB 0x201F - #define WGL_ACCUM_BLUE_BITS_ARB 0x2020 - #define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 - #define WGL_DEPTH_BITS_ARB 0x2022 - #define WGL_STENCIL_BITS_ARB 0x2023 - #define WGL_AUX_BUFFERS_ARB 0x2024 - - #define WGL_NO_ACCELERATION_ARB 0x2025 - #define WGL_GENERIC_ACCELERATION_ARB 0x2026 - #define WGL_FULL_ACCELERATION_ARB 0x2027 - - #define WGL_SWAP_EXCHANGE_ARB 0x2028 - #define WGL_SWAP_COPY_ARB 0x2029 - #define WGL_SWAP_UNDEFINED_ARB 0x202A - - #define WGL_TYPE_RGBA_ARB 0x202B - #define WGL_TYPE_COLORINDEX_ARB 0x202C -#endif /* WGL_ARB_pixel_format */ - -#ifndef WGL_ARB_pbuffer - #define WGL_ARB_pbuffer 1 - #define WGL_DRAW_TO_PBUFFER_ARB 0x202D - #define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E - #define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F - #define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 - #define WGL_PBUFFER_LARGEST_ARB 0x2033 - #define WGL_PBUFFER_WIDTH_ARB 0x2034 - #define WGL_PBUFFER_HEIGHT_ARB 0x2035 - #define WGL_PBUFFER_LOST_ARB 0x2036 -#endif - - - - - - - - - - -/* - ----------------------- - ARB_MultiTexture - ----------------------- -*/ -void (APIENTRYP pfglActiveTextureARB) (GLenum); -void (APIENTRYP pfglClientActiveTextureARB) (GLenum); -void (APIENTRYP pfglMultiTexCoord1dARB) (GLenum, GLdouble); -void (APIENTRYP pfglMultiTexCoord1dvARB) (GLenum, const GLdouble *); -void (APIENTRYP pfglMultiTexCoord1fARB) (GLenum, GLfloat); -void (APIENTRYP pfglMultiTexCoord1fvARB) (GLenum, const GLfloat *); -void (APIENTRYP pfglMultiTexCoord1iARB) (GLenum, GLint); -void (APIENTRYP pfglMultiTexCoord1ivARB) (GLenum, const GLint *); -void (APIENTRYP pfglMultiTexCoord1sARB) (GLenum, GLshort); -void (APIENTRYP pfglMultiTexCoord1svARB) (GLenum, const GLshort *); -void (APIENTRYP pfglMultiTexCoord2dARB) (GLenum, GLdouble, GLdouble); -void (APIENTRYP pfglMultiTexCoord2dvARB) (GLenum, const GLdouble *); -void (APIENTRYP pfglMultiTexCoord2fARB) (GLenum, GLfloat, GLfloat); -void (APIENTRYP pfglMultiTexCoord2fvARB) (GLenum, const GLfloat *); -void (APIENTRYP pfglMultiTexCoord2iARB) (GLenum, GLint, GLint); -void (APIENTRYP pfglMultiTexCoord2ivARB) (GLenum, const GLint *); -void (APIENTRYP pfglMultiTexCoord2sARB) (GLenum, GLshort, GLshort); -void (APIENTRYP pfglMultiTexCoord2svARB) (GLenum, const GLshort *); -void (APIENTRYP pfglMultiTexCoord3dARB) (GLenum, GLdouble, GLdouble, GLdouble); -void (APIENTRYP pfglMultiTexCoord3dvARB) (GLenum, const GLdouble *); -void (APIENTRYP pfglMultiTexCoord3fARB) (GLenum, GLfloat, GLfloat, GLfloat); -void (APIENTRYP pfglMultiTexCoord3fvARB) (GLenum, const GLfloat *); -void (APIENTRYP pfglMultiTexCoord3iARB) (GLenum, GLint, GLint, GLint); -void (APIENTRYP pfglMultiTexCoord3ivARB) (GLenum, const GLint *); -void (APIENTRYP pfglMultiTexCoord3sARB) (GLenum, GLshort, GLshort, GLshort); -void (APIENTRYP pfglMultiTexCoord3svARB) (GLenum, const GLshort *); -void (APIENTRYP pfglMultiTexCoord4dARB) (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); -void (APIENTRYP pfglMultiTexCoord4dvARB) (GLenum, const GLdouble *); -void (APIENTRYP pfglMultiTexCoord4fARB) (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); -void (APIENTRYP pfglMultiTexCoord4fvARB) (GLenum, const GLfloat *); -void (APIENTRYP pfglMultiTexCoord4iARB) (GLenum, GLint, GLint, GLint, GLint); -void (APIENTRYP pfglMultiTexCoord4ivARB) (GLenum, const GLint *); -void (APIENTRYP pfglMultiTexCoord4sARB) (GLenum, GLshort, GLshort, GLshort, GLshort); -void (APIENTRYP pfglMultiTexCoord4svARB) (GLenum, const GLshort *); - - -/* - ----------------------- - ARB_TransposeMatrix - ----------------------- -*/ -void (APIENTRYP pfglLoadTransposeMatrixfARB) (const GLfloat *); -void (APIENTRYP pfglLoadTransposeMatrixdARB) (const GLdouble *); -void (APIENTRYP pfglMultTransposeMatrixfARB) (const GLfloat *); -void (APIENTRYP pfglMultTransposeMatrixdARB) (const GLdouble *); - - -/* - ----------------------- - ARB_MultiSample - ----------------------- -*/ -void (APIENTRYP pfglSampleCoverageARB) (GLclampf, GLboolean); - - -/* - ----------------------- - ARB_TextureCompression - ----------------------- -*/ -void (APIENTRYP pfglCompressedTexImage3DARB) (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -void (APIENTRYP pfglCompressedTexImage2DARB) (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -void (APIENTRYP pfglCompressedTexImage1DARB) (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); -void (APIENTRYP pfglCompressedTexSubImage3DARB) (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -void (APIENTRYP pfglCompressedTexSubImage2DARB) (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -void (APIENTRYP pfglCompressedTexSubImage1DARB) (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); -void (APIENTRYP pfglGetCompressedTexImageARB) (GLenum, GLint, GLvoid *); - - -/* - ----------------------- - ARB_PointParameters - ----------------------- -*/ -void (APIENTRYP pfglPointParameterfARB) (GLenum, GLfloat); -void (APIENTRYP pfglPointParameterfvARB) (GLenum, const GLfloat *); - - -/* - ----------------------- - ARB_VertexBlend - ----------------------- -*/ -void (APIENTRYP pfglWeightbvARB) (GLint, const GLbyte *); -void (APIENTRYP pfglWeightsvARB) (GLint, const GLshort *); -void (APIENTRYP pfglWeightivARB) (GLint, const GLint *); -void (APIENTRYP pfglWeightfvARB) (GLint, const GLfloat *); -void (APIENTRYP pfglWeightdvARB) (GLint, const GLdouble *); -void (APIENTRYP pfglWeightubvARB) (GLint, const GLubyte *); -void (APIENTRYP pfglWeightusvARB) (GLint, const GLushort *); -void (APIENTRYP pfglWeightuivARB) (GLint, const GLuint *); -void (APIENTRYP pfglWeightPointerARB) (GLint, GLenum, GLsizei, const GLvoid *); -void (APIENTRYP pfglVertexBlendARB) (GLint); - - -/* - ----------------------- - ARB_MatrixPalette - ----------------------- -*/ -void (APIENTRYP pfglCurrentPaletteMatrixARB) (GLint); -void (APIENTRYP pfglMatrixIndexubvARB) (GLint, const GLubyte *); -void (APIENTRYP pfglMatrixIndexusvARB) (GLint, const GLushort *); -void (APIENTRYP pfglMatrixIndexuivARB) (GLint, const GLuint *); -void (APIENTRYP pfglMatrixIndexPointerARB) (GLint, GLenum, GLsizei, const GLvoid *); - - -/* - ------------------------------ - ARB_VertexProgram - ------------------------------ -*/ -void (APIENTRYP pfglVertexAttrib1dARB) (GLuint, GLdouble); -void (APIENTRYP pfglVertexAttrib1dvARB) (GLuint, const GLdouble *); -void (APIENTRYP pfglVertexAttrib1fARB) (GLuint, GLfloat); -void (APIENTRYP pfglVertexAttrib1fvARB) (GLuint, const GLfloat *); -void (APIENTRYP pfglVertexAttrib1sARB) (GLuint, GLshort); -void (APIENTRYP pfglVertexAttrib1svARB) (GLuint, const GLshort *); -void (APIENTRYP pfglVertexAttrib2dARB) (GLuint, GLdouble, GLdouble); -void (APIENTRYP pfglVertexAttrib2dvARB) (GLuint, const GLdouble *); -void (APIENTRYP pfglVertexAttrib2fARB) (GLuint, GLfloat, GLfloat); -void (APIENTRYP pfglVertexAttrib2fvARB) (GLuint, const GLfloat *); -void (APIENTRYP pfglVertexAttrib2sARB) (GLuint, GLshort, GLshort); -void (APIENTRYP pfglVertexAttrib2svARB) (GLuint, const GLshort *); -void (APIENTRYP pfglVertexAttrib3dARB) (GLuint, GLdouble, GLdouble, GLdouble); -void (APIENTRYP pfglVertexAttrib3dvARB) (GLuint, const GLdouble *); -void (APIENTRYP pfglVertexAttrib3fARB) (GLuint, GLfloat, GLfloat, GLfloat); -void (APIENTRYP pfglVertexAttrib3fvARB) (GLuint, const GLfloat *); -void (APIENTRYP pfglVertexAttrib3sARB) (GLuint, GLshort, GLshort, GLshort); -void (APIENTRYP pfglVertexAttrib3svARB) (GLuint, const GLshort *); -void (APIENTRYP pfglVertexAttrib4NbvARB) (GLuint, const GLbyte *); -void (APIENTRYP pfglVertexAttrib4NivARB) (GLuint, const GLint *); -void (APIENTRYP pfglVertexAttrib4NsvARB) (GLuint, const GLshort *); -void (APIENTRYP pfglVertexAttrib4NubARB) (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); -void (APIENTRYP pfglVertexAttrib4NubvARB) (GLuint, const GLubyte *); -void (APIENTRYP pfglVertexAttrib4NuivARB) (GLuint, const GLuint *); -void (APIENTRYP pfglVertexAttrib4NusvARB) (GLuint, const GLushort *); -void (APIENTRYP pfglVertexAttrib4bvARB) (GLuint, const GLbyte *); -void (APIENTRYP pfglVertexAttrib4dARB) (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -void (APIENTRYP pfglVertexAttrib4dvARB) (GLuint, const GLdouble *); -void (APIENTRYP pfglVertexAttrib4fARB) (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -void (APIENTRYP pfglVertexAttrib4fvARB) (GLuint, const GLfloat *); -void (APIENTRYP pfglVertexAttrib4ivARB) (GLuint, const GLint *); -void (APIENTRYP pfglVertexAttrib4sARB) (GLuint, GLshort, GLshort, GLshort, GLshort); -void (APIENTRYP pfglVertexAttrib4svARB) (GLuint, const GLshort *); -void (APIENTRYP pfglVertexAttrib4ubvARB) (GLuint, const GLubyte *); -void (APIENTRYP pfglVertexAttrib4uivARB) (GLuint, const GLuint *); -void (APIENTRYP pfglVertexAttrib4usvARB) (GLuint, const GLushort *); -void (APIENTRYP pfglVertexAttribPointerARB) (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); -void (APIENTRYP pfglEnableVertexAttribArrayARB) (GLuint); -void (APIENTRYP pfglDisableVertexAttribArrayARB) (GLuint); -void (APIENTRYP pfglProgramStringARB) (GLenum, GLenum, GLsizei, const GLvoid *); -void (APIENTRYP pfglBindProgramARB) (GLenum, GLuint); -void (APIENTRYP pfglDeleteProgramsARB) (GLsizei, const GLuint *); -void (APIENTRYP pfglGenProgramsARB) (GLsizei, GLuint *); -void (APIENTRYP pfglProgramEnvParameter4dARB) (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -void (APIENTRYP pfglProgramEnvParameter4dvARB) (GLenum, GLuint, const GLdouble *); -void (APIENTRYP pfglProgramEnvParameter4fARB) (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -void (APIENTRYP pfglProgramEnvParameter4fvARB) (GLenum, GLuint, const GLfloat *); -void (APIENTRYP pfglProgramLocalParameter4dARB) (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -void (APIENTRYP pfglProgramLocalParameter4dvARB) (GLenum, GLuint, const GLdouble *); -void (APIENTRYP pfglProgramLocalParameter4fARB) (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -void (APIENTRYP pfglProgramLocalParameter4fvARB) (GLenum, GLuint, const GLfloat *); -void (APIENTRYP pfglGetProgramEnvParameterdvARB) (GLenum, GLuint, GLdouble *); -void (APIENTRYP pfglGetProgramEnvParameterfvARB) (GLenum, GLuint, GLfloat *); -void (APIENTRYP pfglGetProgramLocalParameterdvARB) (GLenum, GLuint, GLdouble *); -void (APIENTRYP pfglGetProgramLocalParameterfvARB) (GLenum, GLuint, GLfloat *); -void (APIENTRYP pfglGetProgramivARB) (GLenum, GLenum, GLint *); -void (APIENTRYP pfglGetProgramStringARB) (GLenum, GLenum, GLvoid *); -void (APIENTRYP pfglGetVertexAttribdvARB) (GLuint, GLenum, GLdouble *); -void (APIENTRYP pfglGetVertexAttribfvARB) (GLuint, GLenum, GLfloat *); -void (APIENTRYP pfglGetVertexAttribivARB) (GLuint, GLenum, GLint *); -void (APIENTRYP pfglGetVertexAttribPointervARB) (GLuint, GLenum, GLvoid* *); -GLboolean (APIENTRYP pfglIsProgramARB) (GLuint); - - -/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */ - - -/* - ------------------------------ - ARB_VertexBufferObject - ------------------------------ -*/ -void (APIENTRYP pfglBindBufferARB) (GLenum, GLuint); -void (APIENTRYP pfglDeleteBuffersARB) (GLsizei, const GLuint *); -void (APIENTRYP pfglGenBuffersARB) (GLsizei, GLuint *); -GLboolean (APIENTRYP pfglIsBufferARB) (GLuint); -void (APIENTRYP pfglBufferDataARB) (GLenum, GLsizeiptrARB, const GLvoid *, GLenum); -void (APIENTRYP pfglBufferSubDataARB) (GLenum, GLintptrARB, GLsizeiptrARB, const GLvoid *); -void (APIENTRYP pfglGetBufferSubDataARB) (GLenum, GLintptrARB, GLsizeiptrARB, GLvoid *); -GLvoid* (APIENTRYP pfglMapBufferARB) (GLenum, GLenum); -GLboolean (APIENTRYP pfglUnmapBufferARB) (GLenum); -void (APIENTRYP pfglGetBufferParameterivARB) (GLenum, GLenum, GLint *); -void (APIENTRYP pfglGetBufferPointervARB) (GLenum, GLenum, GLvoid* *); - - -/* - ------------------------------ - ARB_OcclusionQuery - ------------------------------ -*/ -void (APIENTRYP pfglGenQueriesARB) (GLsizei, GLuint *); -void (APIENTRYP pfglDeleteQueriesARB) (GLsizei, const GLuint *); -GLboolean (APIENTRYP pfglIsQueryARB) (GLuint); -void (APIENTRYP pfglBeginQueryARB) (GLenum, GLuint); -void (APIENTRYP pfglEndQueryARB) (GLenum); -void (APIENTRYP pfglGetQueryivARB) (GLenum, GLenum, GLint *); -void (APIENTRYP pfglGetQueryObjectivARB) (GLuint, GLenum, GLint *); -void (APIENTRYP pfglGetQueryObjectuivARB) (GLuint, GLenum, GLuint *); - - -/* - ------------------------------ - ARB_ShaderObjects - ------------------------------ -*/ -void (APIENTRYP pfglDeleteObjectARB) (GLhandleARB); -GLhandleARB (APIENTRYP pfglGetHandleARB) (GLenum); -void (APIENTRYP pfglDetachObjectARB) (GLhandleARB, GLhandleARB); -GLhandleARB (APIENTRYP pfglCreateShaderObjectARB) (GLenum); -void (APIENTRYP pfglShaderSourceARB) (GLhandleARB, GLsizei, const GLcharARB* *, const GLint *); -void (APIENTRYP pfglCompileShaderARB) (GLhandleARB); -GLhandleARB (APIENTRYP pfglCreateProgramObjectARB) (void); -void (APIENTRYP pfglAttachObjectARB) (GLhandleARB, GLhandleARB); -void (APIENTRYP pfglLinkProgramARB) (GLhandleARB); -void (APIENTRYP pfglUseProgramObjectARB) (GLhandleARB); -void (APIENTRYP pfglValidateProgramARB) (GLhandleARB); -void (APIENTRYP pfglUniform1fARB) (GLint, GLfloat); -void (APIENTRYP pfglUniform2fARB) (GLint, GLfloat, GLfloat); -void (APIENTRYP pfglUniform3fARB) (GLint, GLfloat, GLfloat, GLfloat); -void (APIENTRYP pfglUniform4fARB) (GLint, GLfloat, GLfloat, GLfloat, GLfloat); -void (APIENTRYP pfglUniform1iARB) (GLint, GLint); -void (APIENTRYP pfglUniform2iARB) (GLint, GLint, GLint); -void (APIENTRYP pfglUniform3iARB) (GLint, GLint, GLint, GLint); -void (APIENTRYP pfglUniform4iARB) (GLint, GLint, GLint, GLint, GLint); -void (APIENTRYP pfglUniform1fvARB) (GLint, GLsizei, const GLfloat *); -void (APIENTRYP pfglUniform2fvARB) (GLint, GLsizei, const GLfloat *); -void (APIENTRYP pfglUniform3fvARB) (GLint, GLsizei, const GLfloat *); -void (APIENTRYP pfglUniform4fvARB) (GLint, GLsizei, const GLfloat *); -void (APIENTRYP pfglUniform1ivARB) (GLint, GLsizei, const GLint *); -void (APIENTRYP pfglUniform2ivARB) (GLint, GLsizei, const GLint *); -void (APIENTRYP pfglUniform3ivARB) (GLint, GLsizei, const GLint *); -void (APIENTRYP pfglUniform4ivARB) (GLint, GLsizei, const GLint *); -void (APIENTRYP pfglUniformMatrix2fvARB) (GLint, GLsizei, GLboolean, const GLfloat *); -void (APIENTRYP pfglUniformMatrix3fvARB) (GLint, GLsizei, GLboolean, const GLfloat *); -void (APIENTRYP pfglUniformMatrix4fvARB) (GLint, GLsizei, GLboolean, const GLfloat *); -void (APIENTRYP pfglGetObjectParameterfvARB) (GLhandleARB, GLenum, GLfloat *); -void (APIENTRYP pfglGetObjectParameterivARB) (GLhandleARB, GLenum, GLint *); -void (APIENTRYP pfglGetInfoLogARB) (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); -void (APIENTRYP pfglGetAttachedObjectsARB) (GLhandleARB, GLsizei, GLsizei *, GLhandleARB *); -GLint (APIENTRYP pfglGetUniformLocationARB) (GLhandleARB, const GLcharARB *); -void (APIENTRYP pfglGetActiveUniformARB) (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); -void (APIENTRYP pfglGetUniformfvARB) (GLhandleARB, GLint, GLfloat *); -void (APIENTRYP pfglGetUniformivARB) (GLhandleARB, GLint, GLint *); -void (APIENTRYP pfglGetShaderSourceARB) (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); - - -/* - ------------------------------ - ARB_VertexShader - ------------------------------ -*/ -void (APIENTRYP pfglBindAttribLocationARB) (GLhandleARB, GLuint, const GLcharARB *); -void (APIENTRYP pfglGetActiveAttribARB) (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); -GLint (APIENTRYP pfglGetAttribLocationARB) (GLhandleARB, const GLcharARB *); - - -/* - ----------------------- - EXT_BlendColor - ----------------------- -*/ -void (APIENTRYP pfglBlendColorEXT) (GLclampf, GLclampf, GLclampf, GLclampf); - - -/* - ------------------------- - EXT_CompiledVertexArray - ------------------------- -*/ -void ( APIENTRYP pfglLockArraysEXT) ( GLint, GLsizei ); -void ( APIENTRYP pfglUnlockArraysEXT) ( void ); - - -/* - ----------------------- - EXT_SecondaryColor - ----------------------- -*/ -void (APIENTRYP pfglSecondaryColor3bEXT) (GLbyte, GLbyte, GLbyte); -void (APIENTRYP pfglSecondaryColor3bvEXT) (const GLbyte *); -void (APIENTRYP pfglSecondaryColor3dEXT) (GLdouble, GLdouble, GLdouble); -void (APIENTRYP pfglSecondaryColor3dvEXT) (const GLdouble *); -void (APIENTRYP pfglSecondaryColor3fEXT) (GLfloat, GLfloat, GLfloat); -void (APIENTRYP pfglSecondaryColor3fvEXT) (const GLfloat *); -void (APIENTRYP pfglSecondaryColor3iEXT) (GLint, GLint, GLint); -void (APIENTRYP pfglSecondaryColor3ivEXT) (const GLint *); -void (APIENTRYP pfglSecondaryColor3sEXT) (GLshort, GLshort, GLshort); -void (APIENTRYP pfglSecondaryColor3svEXT) (const GLshort *); -void (APIENTRYP pfglSecondaryColor3ubEXT) (GLubyte, GLubyte, GLubyte); -void (APIENTRYP pfglSecondaryColor3ubvEXT) (const GLubyte *); -void (APIENTRYP pfglSecondaryColor3uiEXT) (GLuint, GLuint, GLuint); -void (APIENTRYP pfglSecondaryColor3uivEXT) (const GLuint *); -void (APIENTRYP pfglSecondaryColor3usEXT) (GLushort, GLushort, GLushort); -void (APIENTRYP pfglSecondaryColor3usvEXT) (const GLushort *); -void (APIENTRYP pfglSecondaryColorPointerEXT) (GLint, GLenum, GLsizei, const GLvoid *); - - -/* - ----------------------- - EXT_VertexShader - ----------------------- -*/ -void (APIENTRYP pfglBeginVertexShaderEXT) (void); -void (APIENTRYP pfglEndVertexShaderEXT) (void); -void (APIENTRYP pfglBindVertexShaderEXT) (GLuint); -GLuint (APIENTRYP pfglGenVertexShadersEXT) (GLuint); -void (APIENTRYP pfglDeleteVertexShaderEXT) (GLuint); -void (APIENTRYP pfglShaderOp1EXT) (GLenum, GLuint, GLuint); -void (APIENTRYP pfglShaderOp2EXT) (GLenum, GLuint, GLuint, GLuint); -void (APIENTRYP pfglShaderOp3EXT) (GLenum, GLuint, GLuint, GLuint, GLuint); -void (APIENTRYP pfglSwizzleEXT) (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); -void (APIENTRYP pfglWriteMaskEXT) (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); -void (APIENTRYP pfglInsertComponentEXT) (GLuint, GLuint, GLuint); -void (APIENTRYP pfglExtractComponentEXT) (GLuint, GLuint, GLuint); -GLuint (APIENTRYP pfglGenSymbolsEXT) (GLenum, GLenum, GLenum, GLuint); -void (APIENTRYP pfglSetInvariantEXT) (GLuint, GLenum, const GLvoid *); -void (APIENTRYP pfglSetLocalConstantEXT) (GLuint, GLenum, const GLvoid *); -void (APIENTRYP pfglVariantbvEXT) (GLuint, const GLbyte *); -void (APIENTRYP pfglVariantsvEXT) (GLuint, const GLshort *); -void (APIENTRYP pfglVariantivEXT) (GLuint, const GLint *); -void (APIENTRYP pfglVariantfvEXT) (GLuint, const GLfloat *); -void (APIENTRYP pfglVariantdvEXT) (GLuint, const GLdouble *); -void (APIENTRYP pfglVariantubvEXT) (GLuint, const GLubyte *); -void (APIENTRYP pfglVariantusvEXT) (GLuint, const GLushort *); -void (APIENTRYP pfglVariantuivEXT) (GLuint, const GLuint *); -void (APIENTRYP pfglVariantPointerEXT) (GLuint, GLenum, GLuint, const GLvoid *); -void (APIENTRYP pfglEnableVariantClientStateEXT) (GLuint); -void (APIENTRYP pfglDisableVariantClientStateEXT) (GLuint); -GLuint (APIENTRYP pfglBindLightParameterEXT) (GLenum, GLenum); -GLuint (APIENTRYP pfglBindMaterialParameterEXT) (GLenum, GLenum); -GLuint (APIENTRYP pfglBindTexGenParameterEXT) (GLenum, GLenum, GLenum); -GLuint (APIENTRYP pfglBindTextureUnitParameterEXT) (GLenum, GLenum); -GLuint (APIENTRYP pfglBindParameterEXT) (GLenum); -GLboolean (APIENTRYP pfglIsVariantEnabledEXT) (GLuint, GLenum); -void (APIENTRYP pfglGetVariantBooleanvEXT) (GLuint, GLenum, GLboolean *); -void (APIENTRYP pfglGetVariantIntegervEXT) (GLuint, GLenum, GLint *); -void (APIENTRYP pfglGetVariantFloatvEXT) (GLuint, GLenum, GLfloat *); -void (APIENTRYP pfglGetVariantPointervEXT) (GLuint, GLenum, GLvoid* *); -void (APIENTRYP pfglGetInvariantBooleanvEXT) (GLuint, GLenum, GLboolean *); -void (APIENTRYP pfglGetInvariantIntegervEXT) (GLuint, GLenum, GLint *); -void (APIENTRYP pfglGetInvariantFloatvEXT) (GLuint, GLenum, GLfloat *); -void (APIENTRYP pfglGetLocalConstantBooleanvEXT) (GLuint, GLenum, GLboolean *); -void (APIENTRYP pfglGetLocalConstantIntegervEXT) (GLuint, GLenum, GLint *); -void (APIENTRYP pfglGetLocalConstantFloatvEXT) (GLuint, GLenum, GLfloat *); - - -/* - ----------------------- - EXT_VertexWeighting - ----------------------- -*/ -void (APIENTRYP pfglVertexWeightfEXT) (GLfloat); -void (APIENTRYP pfglVertexWeightfvEXT) (const GLfloat *); -void (APIENTRYP pfglVertexWeightPointerEXT) (GLsizei, GLenum, GLsizei, const GLvoid *); - - - -////////////////////////////////// -// -// nVidia Extensions -// -////////////////////////////////// - - - -/* - ----------------------- - NV_Fence - ----------------------- -*/ -void (APIENTRYP pfglDeleteFencesNV) (GLsizei, const GLuint *); -void (APIENTRYP pfglGenFencesNV) (GLsizei, GLuint *); -GLboolean (APIENTRYP pfglIsFenceNV) (GLuint); -GLboolean (APIENTRYP pfglTestFenceNV) (GLuint); -void (APIENTRYP pfglGetFenceivNV) (GLuint, GLenum, GLint *); -void (APIENTRYP pfglFinishFenceNV) (GLuint); -void (APIENTRYP pfglSetFenceNV) (GLuint, GLenum); - - -/* - ----------------------- - NV_VertexArrayRange - ----------------------- -*/ -void (APIENTRYP pfglFlushVertexArrayRangeNV) (void); -void (APIENTRYP pfglVertexArrayRangeNV) (GLsizei, const GLvoid *); - - -/* - ----------------------- - NV_VertexProgram - ----------------------- -*/ -GLboolean (APIENTRYP pfglAreProgramsResidentNV) (GLsizei, const GLuint *, GLboolean *); -void (APIENTRYP pfglBindProgramNV) (GLenum, GLuint); -void (APIENTRYP pfglDeleteProgramsNV) (GLsizei, const GLuint *); -void (APIENTRYP pfglExecuteProgramNV) (GLenum, GLuint, const GLfloat *); -void (APIENTRYP pfglGenProgramsNV) (GLsizei, GLuint *); -void (APIENTRYP pfglGetProgramParameterdvNV) (GLenum, GLuint, GLenum, GLdouble *); -void (APIENTRYP pfglGetProgramParameterfvNV) (GLenum, GLuint, GLenum, GLfloat *); -void (APIENTRYP pfglGetProgramivNV) (GLuint, GLenum, GLint *); -void (APIENTRYP pfglGetProgramStringNV) (GLuint, GLenum, GLubyte *); -void (APIENTRYP pfglGetTrackMatrixivNV) (GLenum, GLuint, GLenum, GLint *); -void (APIENTRYP pfglGetVertexAttribdvNV) (GLuint, GLenum, GLdouble *); -void (APIENTRYP pfglGetVertexAttribfvNV) (GLuint, GLenum, GLfloat *); -void (APIENTRYP pfglGetVertexAttribivNV) (GLuint, GLenum, GLint *); -void (APIENTRYP pfglGetVertexAttribPointervNV) (GLuint, GLenum, GLvoid* *); -GLboolean (APIENTRYP pfglIsProgramNV) (GLuint); -void (APIENTRYP pfglLoadProgramNV) (GLenum, GLuint, GLsizei, const GLubyte *); -void (APIENTRYP pfglProgramParameter4dNV) (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -void (APIENTRYP pfglProgramParameter4dvNV) (GLenum, GLuint, const GLdouble *); -void (APIENTRYP pfglProgramParameter4fNV) (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -void (APIENTRYP pfglProgramParameter4fvNV) (GLenum, GLuint, const GLfloat *); -void (APIENTRYP pfglProgramParameters4dvNV) (GLenum, GLuint, GLuint, const GLdouble *); -void (APIENTRYP pfglProgramParameters4fvNV) (GLenum, GLuint, GLuint, const GLfloat *); -void (APIENTRYP pfglRequestResidentProgramsNV) (GLsizei, const GLuint *); -void (APIENTRYP pfglTrackMatrixNV) (GLenum, GLuint, GLenum, GLenum); -void (APIENTRYP pfglVertexAttribPointerNV) (GLuint, GLint, GLenum, GLsizei, const GLvoid *); -void (APIENTRYP pfglVertexAttrib1dNV) (GLuint, GLdouble); -void (APIENTRYP pfglVertexAttrib1dvNV) (GLuint, const GLdouble *); -void (APIENTRYP pfglVertexAttrib1fNV) (GLuint, GLfloat); -void (APIENTRYP pfglVertexAttrib1fvNV) (GLuint, const GLfloat *); -void (APIENTRYP pfglVertexAttrib1sNV) (GLuint, GLshort); -void (APIENTRYP pfglVertexAttrib1svNV) (GLuint, const GLshort *); -void (APIENTRYP pfglVertexAttrib2dNV) (GLuint, GLdouble, GLdouble); -void (APIENTRYP pfglVertexAttrib2dvNV) (GLuint, const GLdouble *); -void (APIENTRYP pfglVertexAttrib2fNV) (GLuint, GLfloat, GLfloat); -void (APIENTRYP pfglVertexAttrib2fvNV) (GLuint, const GLfloat *); -void (APIENTRYP pfglVertexAttrib2sNV) (GLuint, GLshort, GLshort); -void (APIENTRYP pfglVertexAttrib2svNV) (GLuint, const GLshort *); -void (APIENTRYP pfglVertexAttrib3dNV) (GLuint, GLdouble, GLdouble, GLdouble); -void (APIENTRYP pfglVertexAttrib3dvNV) (GLuint, const GLdouble *); -void (APIENTRYP pfglVertexAttrib3fNV) (GLuint, GLfloat, GLfloat, GLfloat); -void (APIENTRYP pfglVertexAttrib3fvNV) (GLuint, const GLfloat *); -void (APIENTRYP pfglVertexAttrib3sNV) (GLuint, GLshort, GLshort, GLshort); -void (APIENTRYP pfglVertexAttrib3svNV) (GLuint, const GLshort *); -void (APIENTRYP pfglVertexAttrib4dNV) (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -void (APIENTRYP pfglVertexAttrib4dvNV) (GLuint, const GLdouble *); -void (APIENTRYP pfglVertexAttrib4fNV) (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -void (APIENTRYP pfglVertexAttrib4fvNV) (GLuint, const GLfloat *); -void (APIENTRYP pfglVertexAttrib4sNV) (GLuint, GLshort, GLshort, GLshort, GLshort); -void (APIENTRYP pfglVertexAttrib4svNV) (GLuint, const GLshort *); -void (APIENTRYP pfglVertexAttrib4ubNV) (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); -void (APIENTRYP pfglVertexAttrib4ubvNV) (GLuint, const GLubyte *); -void (APIENTRYP pfglVertexAttribs1dvNV) (GLuint, GLsizei, const GLdouble *); -void (APIENTRYP pfglVertexAttribs1fvNV) (GLuint, GLsizei, const GLfloat *); -void (APIENTRYP pfglVertexAttribs1svNV) (GLuint, GLsizei, const GLshort *); -void (APIENTRYP pfglVertexAttribs2dvNV) (GLuint, GLsizei, const GLdouble *); -void (APIENTRYP pfglVertexAttribs2fvNV) (GLuint, GLsizei, const GLfloat *); -void (APIENTRYP pfglVertexAttribs2svNV) (GLuint, GLsizei, const GLshort *); -void (APIENTRYP pfglVertexAttribs3dvNV) (GLuint, GLsizei, const GLdouble *); -void (APIENTRYP pfglVertexAttribs3fvNV) (GLuint, GLsizei, const GLfloat *); -void (APIENTRYP pfglVertexAttribs3svNV) (GLuint, GLsizei, const GLshort *); -void (APIENTRYP pfglVertexAttribs4dvNV) (GLuint, GLsizei, const GLdouble *); -void (APIENTRYP pfglVertexAttribs4fvNV) (GLuint, GLsizei, const GLfloat *); -void (APIENTRYP pfglVertexAttribs4svNV) (GLuint, GLsizei, const GLshort *); -void (APIENTRYP pfglVertexAttribs4ubvNV) (GLuint, GLsizei, const GLubyte *); - - -////////////////////////////////// -// -// ATI Extensions -// -////////////////////////////////// - -/* - ------------------------------ - ATI_EnvmapBumpmap - ------------------------------ -*/ -void (APIENTRYP pfglTexBumpParameterivATI) (GLenum, const GLint *); -void (APIENTRYP pfglTexBumpParameterfvATI) (GLenum, const GLfloat *); -void (APIENTRYP pfglGetTexBumpParameterivATI) (GLenum, GLint *); -void (APIENTRYP pfglGetTexBumpParameterfvATI) (GLenum, GLfloat *); - - -/* - ------------------------------ - ATI_FragmentShader - ------------------------------ -*/ -GLuint (APIENTRYP pfglGenFragmentShadersATI) (GLuint); -void (APIENTRYP pfglBindFragmentShaderATI) (GLuint); -void (APIENTRYP pfglDeleteFragmentShaderATI) (GLuint); -void (APIENTRYP pfglBeginFragmentShaderATI) (void); -void (APIENTRYP pfglEndFragmentShaderATI) (void); -void (APIENTRYP pfglPassTexCoordATI) (GLuint, GLuint, GLenum); -void (APIENTRYP pfglSampleMapATI) (GLuint, GLuint, GLenum); -void (APIENTRYP pfglColorFragmentOp1ATI) (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -void (APIENTRYP pfglColorFragmentOp2ATI) (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -void (APIENTRYP pfglColorFragmentOp3ATI) (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -void (APIENTRYP pfglAlphaFragmentOp1ATI) (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint); -void (APIENTRYP pfglAlphaFragmentOp2ATI) (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -void (APIENTRYP pfglAlphaFragmentOp3ATI) (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -void (APIENTRYP pfglSetFragmentShaderConstantATI) (GLuint, const GLfloat *); - -/* - ------------------------------ - ATI_VertexArrayObject - ------------------------------ -*/ -GLuint (APIENTRYP pfglNewObjectBufferATI) (GLsizei, const GLvoid *, GLenum); -GLboolean (APIENTRYP pfglIsObjectBufferATI) (GLuint); -void (APIENTRYP pfglUpdateObjectBufferATI) (GLuint, GLuint, GLsizei, const GLvoid *, GLenum); -void (APIENTRYP pfglGetObjectBufferfvATI) (GLuint, GLenum, GLfloat *); -void (APIENTRYP pfglGetObjectBufferivATI) (GLuint, GLenum, GLint *); -void (APIENTRYP pfglFreeObjectBufferATI) (GLuint); -void (APIENTRYP pfglArrayObjectATI) (GLenum, GLint, GLenum, GLsizei, GLuint, GLuint); -void (APIENTRYP pfglGetArrayObjectfvATI) (GLenum, GLenum, GLfloat *); -void (APIENTRYP pfglGetArrayObjectivATI) (GLenum, GLenum, GLint *); -void (APIENTRYP pfglVariantArrayObjectATI) (GLuint, GLenum, GLsizei, GLuint, GLuint); -void (APIENTRYP pfglGetVariantArrayObjectfvATI) (GLuint, GLenum, GLfloat *); -void (APIENTRYP pfglGetVariantArrayObjectivATI) (GLuint, GLenum, GLint *); - - - - -/* - ------------------------------ - ATI_MapObjectBuffer - ------------------------------ -*/ -GLvoid* (APIENTRYP pfglMapObjectBufferATI) (GLuint); -void (APIENTRYP pfglUnmapObjectBufferATI) (GLuint); - - - - - - - - - -#endif /* __MYOPENGL_EXTENSION_H__ */ diff --git a/wolf3d/newCode/env/num_type.h b/wolf3d/newCode/env/num_type.h deleted file mode 100644 index 169716c..0000000 --- a/wolf3d/newCode/env/num_type.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - - Copyright (C) 2005 Michael Liebscher - - 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. - -*/ - -/* - - num_type.h: System dependant float/double to integer conversions. - - - */ - - -#ifndef __NUM_TYPE_H__ -#define __NUM_TYPE_H__ - -#include "arch.h" - - - -#define BIT( x ) ( 1 << (x) ) - - - - -#define FloatToInt( a ) (SW32)(a) -#define DoubleToInt( a ) (SW32)(a) - - - - - -#endif /* __NUM_TYPE_H__ */ diff --git a/wolf3d/newCode/env/oggfile.c b/wolf3d/newCode/env/oggfile.c deleted file mode 100644 index 98dec77..0000000 --- a/wolf3d/newCode/env/oggfile.c +++ /dev/null @@ -1,154 +0,0 @@ -/* - - Copyright (C) 2009 Id Software, Inc. - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 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 "../wolfiphone.h" - -filehandle_t *fh; - -PRIVATE size_t ovc_read( void *ptr, size_t size, size_t nmemb, void *dataSource ) -{ - if( ! size || ! nmemb ) - { - return 0; - } - - return FS_ReadFile( ptr, size, nmemb, fh ); -} - -PRIVATE int ovc_seek( void *dataSource, ogg_int64_t offset, int whence ) -{ - return FS_FileSeek( fh, offset, whence ); -} - -PRIVATE int ovc_close( void *dataSource ) -{ - return 0; -} - -PRIVATE long ovc_tell( void *dataSource ) -{ - return FS_FileTell( fh ); -} - - - -/* ------------------------------------------------------------------------------ - Function: LoadOggInfo -Load ogg file. - - Parameters: filename -[in] Name of wav file to load. - wav -[out] wav data. - info -[out] wav sound info. - - Returns: True if file loaded, otherwise false. - - Notes: Caller is responsible for freeing wav data by calling Z_Free. - ------------------------------------------------------------------------------ -*/ -PUBLIC _boolean LoadOggInfo( const char *filename, W8 **wav, soundInfo_t *info ) -{ - W8 *data; - int size; - int dummy; - char *newFilename; - int len; - OggVorbis_File vorbisFile; - vorbis_info vorbisInfo; - ov_callbacks vorbisCallbacks = {ovc_read, ovc_seek, ovc_close, ovc_tell}; - int ret; - - newFilename = strdup( filename ); - - len = strlen( newFilename ); - if ( len < 5 || strcmp( newFilename + len - 4, ".wav" ) ) { - free( newFilename ); - return false; - } - - newFilename[ len - 3 ] = 'o'; - newFilename[ len - 2 ] = 'g'; - newFilename[ len - 1 ] = 'g'; - - fh = FS_OpenFile( newFilename, 0 ); - if( ! fh ) - { - free( newFilename ); - return false; - } - - if( (ret = ov_open_callbacks( fh, &vorbisFile, NULL, 0, vorbisCallbacks )) < 0 ) { - free( newFilename ); - return false; - } - - vorbisInfo = *ov_info( &vorbisFile, -1 ); - if( vorbisInfo.channels != 1 && vorbisInfo.channels != 2 ) - { - Com_Printf( "Only mono and stereo OGG files supported (%s)\n", newFilename ); - free( newFilename ); - return false; - } - - info->channels = vorbisInfo.channels; - info->sample_rate = vorbisInfo.rate; - info->sample_size = 2; - -#define BUFFER_SIZE ( 128 * 1024 ) - - data = (W8 *)malloc( BUFFER_SIZE ); - size = 0; - - while( size < BUFFER_SIZE ) - { - int read = 0; - read = ov_read( &vorbisFile, (char *)data + size, BUFFER_SIZE - size, &dummy ); - if( read == 0 ) - { - break; - } - - if( read <= 0 ) - { - Com_Printf( "Only mono and stereo OGG files supported (%s)\n", newFilename ); - free( newFilename ); - return false; - } - - size += read; - } - - info->samples = size / ( info->channels * info->sample_size ); - - Com_Printf("Loaded %s: channels=%d, sample_rate=%d, sample_size=%d, samples=%d. \n", newFilename, info->channels, info->sample_rate, info->sample_size, info->samples ); - free( newFilename ); - - *wav = (W8 *)Z_Malloc( size ); - memcpy(*wav, data, size ); - free( data ); - - - FS_CloseFile( fh ); - - return true; -} - diff --git a/wolf3d/newCode/env/oggfile.h b/wolf3d/newCode/env/oggfile.h deleted file mode 100644 index ff0e648..0000000 --- a/wolf3d/newCode/env/oggfile.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - - Copyright (C) 2009 Id Software, Inc. - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 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 __LOADERS_OGGFILE_H__ -#define __LOADERS_OGGFILE_H__ - -extern _boolean LoadOggInfo( const char *filename, W8 **wav, soundInfo_t *info ); - -#endif /* __LOADERS_OGGFILE_H__ */ diff --git a/wolf3d/newCode/env/openal_binding.c b/wolf3d/newCode/env/openal_binding.c deleted file mode 100644 index 968db79..0000000 --- a/wolf3d/newCode/env/openal_binding.c +++ /dev/null @@ -1,335 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - - 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. - -*/ - -/* - * openal_binding.c: Interface to OpenAL library. - * - * Author: Michael Liebscher - * Date: 2004 - * - */ - - -#include "../wolfiphone.h" - - -#ifdef _WIN32 - - HINSTANCE hinstOpenAL; - -#elif __unix__ - - void *OpenALLib; - -#elif IPHONE - - void *OpenALLib; - // from here on in this file, behave like unix - #define __unix__ 1 - -#else - - #error "Please define interface to OpenAL library!" - -#endif - - -/* ------------------------------------------------------------------------------ - Function: OpenAL_Shutdown -Shutdown interface to OpenAL. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - Unloads the specified Dynamic Link Library then NULLs out all the - proc pointers. - ------------------------------------------------------------------------------ -*/ -PUBLIC void OpenAL_Shutdown( void ) -{ - -#ifdef _WIN32 - - if( hinstOpenAL ) - { - FreeLibrary( hinstOpenAL ); - hinstOpenAL = NULL; - } - - hinstOpenAL = NULL; - -#elif __unix__ - - if( OpenALLib ) - { - dlclose( OpenALLib ); - OpenALLib = NULL; - } - - OpenALLib = NULL; - -#else - - #error "Please define interface to OpenAL library!" - -#endif - - - pfalcCloseDevice = NULL; - pfalcCreateContext = NULL; - pfalcDestroyContext = NULL; - pfalcGetContextsDevice = NULL; - pfalcGetCurrentContext = NULL; - pfalcGetEnumValue = NULL; - pfalcGetError = NULL; - pfalcGetIntegerv = NULL; - pfalcGetProcAddress = NULL; - pfalcGetString = NULL; - pfalcIsExtensionPresent = NULL; - pfalcMakeContextCurrent = NULL; - pfalcOpenDevice = NULL; - pfalcProcessContext = NULL; - pfalcSuspendContext = NULL; - - - pfalGenBuffers = NULL; - pfalDeleteBuffers = NULL; - pfalIsBuffer = NULL; - pfalBufferData = NULL; - pfalGetBufferf = NULL; - pfalGetBufferi = NULL; - pfalEnable = NULL; - pfalDisable = NULL; - pfalDopplerFactor = NULL; - pfalDopplerVelocity = NULL; - pfalDistanceModel = NULL; - pfalGetBoolean = NULL; - pfalGetBooleanv = NULL; - pfalGetDouble = NULL; - pfalGetDoublev = NULL; - pfalGetFloat = NULL; - pfalGetFloatv = NULL; - pfalGetInteger = NULL; - pfalGetIntegerv = NULL; - pfalGetEnumValue = NULL; - pfalGetError = NULL; - pfalGetProcAddress = NULL; - pfalGetString = NULL; - pfalIsExtensionPresent = NULL; - pfalIsEnabled = NULL; - pfalListenerf = NULL; - pfalListener3f = NULL; - pfalListenerfv = NULL; - pfalListeneri = NULL; - pfalGetListenerf = NULL; - pfalGetListener3f = NULL; - pfalGetListenerfv = NULL; - pfalGetListeneri = NULL; - pfalGenSources = NULL; - pfalDeleteSources = NULL; - pfalIsSource = NULL; - pfalSourcef = NULL; - pfalSourcefv = NULL; - pfalSource3f = NULL; - pfalSourcei = NULL; - pfalGetSourcef = NULL; - pfalGetSource3f = NULL; - pfalGetSourcefv = NULL; - pfalGetSourcei = NULL; - pfalSourcePlay = NULL; - pfalSourcePlayv = NULL; - pfalSourcePause = NULL; - pfalSourcePausev = NULL; - pfalSourceStop = NULL; - pfalSourceStopv = NULL; - pfalSourceRewind = NULL; - pfalSourceRewindv = NULL; - pfalSourceQueueBuffers = NULL; - pfalSourceUnqueueBuffers = NULL; - -} - - - -#ifdef _WIN32 - - #define GPA( a ) GetProcAddress( hinstOpenAL, a ) - -#elif __unix__ - - #define GPA( a ) dlsym( OpenALLib, a ) - -#else - - #error "Please define interface to OpenAL library!" - -#endif - - - - - -/* ------------------------------------------------------------------------------ - Function: OpenAL_Init -Setup interface to OpenAL. - - Parameters: dllname -[in] Name of the OpenAL dynamic link library. - - Returns: true on success, otherwise false. - - Notes: - This is responsible for binding our al function pointers to - the appropriate OpenAL stuff. In Windows this means doing a - LoadLibrary and a bunch of calls to GetProcAddress. On other - operating systems we need to do the right thing, whatever that - might be. - ------------------------------------------------------------------------------ -*/ -PUBLIC _boolean OpenAL_Init( const char *dllname ) -{ - -#ifdef _WIN32 - - char buffer[ 1024 ], *ptr; - - SearchPath( NULL, dllname, NULL, sizeof( buffer ) - 1, buffer, &ptr ); - - Com_Printf( "...calling LoadLibrary( %s ): ", buffer ); - - if( ( hinstOpenAL = LoadLibrary( dllname ) ) == 0 ) - { - char *buf = NULL; - - Com_Printf( "failed\n" ); - - FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, GetLastError(), - MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), - (LPTSTR) &buf, 0, NULL ); - - Com_Printf( "%s\n", buf ); - - return false; - } - -#elif __unix__ - - Com_Printf( "...calling dlopen( %s ): ", dllname ); - - if( ( OpenALLib = dlopen( dllname, RTLD_LAZY | RTLD_GLOBAL ) ) == 0 ) - { - Com_Printf( "failed\n" ); - - Com_Printf( "%s\n", dlerror() ); - - return false; - } - -#else - - #error "Please define interface to OpenAL library!" - -#endif - - - Com_Printf( "succeeded\n" ); - - - if( ! (pfalcCloseDevice = (ALCCLOSEDEVICE)GPA( "alcCloseDevice" )) ) return false; - if( ! (pfalcCreateContext = (ALCCREATECONTEXT)GPA( "alcCreateContext" )) ) return false; - if( ! (pfalcDestroyContext = (ALCDESTROYCONTEXT)GPA( "alcDestroyContext" )) ) return false; - if( ! (pfalcGetContextsDevice = (ALCGETCONTEXTSDEVICE)GPA( "alcGetContextsDevice" )) ) return false; - if( ! (pfalcGetCurrentContext = (ALCGETCURRENTCONTEXT)GPA( "alcGetCurrentContext" )) ) return false; - if( ! (pfalcGetEnumValue = (ALCGETENUMVALUE)GPA( "alcGetEnumValue" )) ) return false; - if( ! (pfalcGetError = (ALCGETERROR)GPA( "alcGetError" )) ) return false; - if( ! (pfalcGetIntegerv = (ALCGETINTEGERV)GPA( "alcGetIntegerv" )) ) return false; - if( ! (pfalcGetProcAddress = (ALCGETPROCADDRESS)GPA( "alcGetProcAddress" )) ) return false; - if( ! (pfalcGetString = (ALCGETSTRING)GPA( "alcGetString" )) ) return false; - if( ! (pfalcIsExtensionPresent = (ALCISEXTENSIONPRESENT)GPA( "alcIsExtensionPresent" )) ) return false; - if( ! (pfalcMakeContextCurrent = (ALCMAKECONTEXTCURRENT)GPA( "alcMakeContextCurrent" )) ) return false; - if( ! (pfalcOpenDevice = (ALCOPENDEVICE)GPA( "alcOpenDevice" )) ) return false; - if( ! (pfalcProcessContext = (ALCPROCESSCONTEXT)GPA( "alcProcessContext" )) ) return false; - if( ! (pfalcSuspendContext = (ALCSUSPENDCONTEXT)GPA( "alcSuspendContext" )) ) return false; - - - if( ! (pfalGenBuffers = (ALGENBUFFERS)GPA("alGenBuffers")) ) return false; - if( ! (pfalDeleteBuffers = (ALDELETEBUFFERS)GPA("alDeleteBuffers")) ) return false; - if( ! (pfalIsBuffer = (ALISBUFFER)GPA("alIsBuffer")) ) return false; - if( ! (pfalBufferData = (ALBUFFERDATA)GPA("alBufferData")) ) return false; - if( ! (pfalGetBufferf = (ALGETBUFFERF)GPA("alGetBufferf")) ) return false; - if( ! (pfalGetBufferi = (ALGETBUFFERI)GPA("alGetBufferi")) ) return false; - if( ! (pfalEnable = (ALENABLE)GPA("alEnable")) ) return false; - if( ! (pfalDisable = (ALDISABLE)GPA("alDisable")) ) return false; - if( ! (pfalDopplerFactor = (ALDOPPLERFACTOR)GPA("alDopplerFactor")) ) return false; - if( ! (pfalDopplerVelocity = (ALDOPPLERVELOCITY)GPA("alDopplerVelocity")) ) return false; - if( ! (pfalDistanceModel = (ALDISTANCEMODEL)GPA("alDistanceModel")) ) return false; - if( ! (pfalGetBoolean = (ALGETBOOLEAN)GPA("alGetBoolean")) ) return false; - if( ! (pfalGetBooleanv = (ALGETBOOLEANV)GPA("alGetBooleanv")) ) return false; - if( ! (pfalGetDouble = (ALGETDOUBLE)GPA("alGetDouble")) ) return false; - if( ! (pfalGetDoublev = (ALGETDOUBLEV)GPA("alGetDoublev")) ) return false; - if( ! (pfalGetFloat = (ALGETFLOAT)GPA("alGetFloat")) ) return false; - if( ! (pfalGetFloatv = (ALGETFLOATV)GPA("alGetFloatv")) ) return false; - if( ! (pfalGetInteger = (ALGETINTEGER)GPA("alGetInteger")) ) return false; - if( ! (pfalGetIntegerv = (ALGETINTEGERV)GPA("alGetIntegerv")) ) return false; - if( ! (pfalGetEnumValue = (ALGETENUMVALUE)GPA("alGetEnumValue")) ) return false; - if( ! (pfalGetError = (ALGETERROR)GPA("alGetError")) ) return false; - if( ! (pfalGetProcAddress = (ALGETPROCADDRESS)GPA("alGetProcAddress")) ) return false; - if( ! (pfalGetString = (ALGETSTRING)GPA("alGetString")) ) return false; - if( ! (pfalIsExtensionPresent = (ALISEXTENSIONPRESENT)GPA("alIsExtensionPresent")) ) return false; - if( ! (pfalIsEnabled = (ALISENABLED)GPA("alIsEnabled")) ) return false; - if( ! (pfalListenerf = (ALLISTENERF)GPA("alListenerf")) ) return false; - if( ! (pfalListener3f = (ALLISTENER3F)GPA("alListener3f")) ) return false; - if( ! (pfalListenerfv = (ALLISTENERFV)GPA("alListenerfv")) ) return false; - if( ! (pfalListeneri = (ALLISTENERI)GPA("alListeneri")) ) return false; - if( ! (pfalGetListenerf = (ALGETLISTENERF)GPA("alGetListenerf")) ) return false; - if( ! (pfalGetListener3f = (ALGETLISTENER3F)GPA("alGetListener3f")) ) return false; - if( ! (pfalGetListenerfv = (ALGETLISTENERFV)GPA("alGetListenerfv")) ) return false; - if( ! (pfalGetListeneri = (ALGETLISTENERI)GPA("alGetListeneri")) ) return false; - if( ! (pfalGenSources = (ALGENSOURCES)GPA("alGenSources")) ) return false; - if( ! (pfalDeleteSources = (ALDELETESOURCES)GPA("alDeleteSources")) ) return false; - if( ! (pfalIsSource = (ALISSOURCE)GPA("alIsSource")) ) return false; - if( ! (pfalSourcef = (ALSOURCEF)GPA("alSourcef")) ) return false; - if( ! (pfalSourcefv = (ALSOURCEFV)GPA("alSourcefv")) ) return false; - if( ! (pfalSource3f = (ALSOURCE3F)GPA("alSource3f")) ) return false; - if( ! (pfalSourcei = (ALSOURCEI)GPA("alSourcei")) ) return false; - if( ! (pfalGetSourcef = (ALGETSOURCEF)GPA("alGetSourcef")) ) return false; - if( ! (pfalGetSource3f = (ALGETSOURCE3F)GPA("alGetSource3f")) ) return false; - if( ! (pfalGetSourcefv = (ALGETSOURCEFV)GPA("alGetSourcefv")) ) return false; - if( ! (pfalGetSourcei = (ALGETSOURCEI)GPA("alGetSourcei")) ) return false; - if( ! (pfalSourcePlay = (ALSOURCEPLAY)GPA("alSourcePlay")) ) return false; - if( ! (pfalSourcePlayv = (ALSOURCEPLAYV)GPA("alSourcePlayv")) ) return false; - if( ! (pfalSourcePause = (ALSOURCEPAUSE)GPA("alSourcePause")) ) return false; - if( ! (pfalSourcePausev = (ALSOURCEPAUSEV)GPA("alSourcePausev")) ) return false; - if( ! (pfalSourceStop = (ALSOURCESTOP)GPA("alSourceStop")) ) return false; - if( ! (pfalSourceStopv = (ALSOURCESTOPV)GPA("alSourceStopv")) ) return false; - if( ! (pfalSourceRewind = (ALSOURCEREWIND)GPA("alSourceRewind")) ) return false; - if( ! (pfalSourceRewindv = (ALSOURCEREWINDV)GPA("alSourceRewindv")) ) return false; - if( ! (pfalSourceQueueBuffers = (ALSOURCEQUEUEBUFFERS)GPA("alSourceQueueBuffers")) ) return false; - if( ! (pfalSourceUnqueueBuffers = (ALSOURCEUNQUEUEBUFFERS)GPA("alSourceUnqueueBuffers")) ) return false; - - - return true; - -} - diff --git a/wolf3d/newCode/env/openal_binding.h b/wolf3d/newCode/env/openal_binding.h deleted file mode 100644 index ba88024..0000000 --- a/wolf3d/newCode/env/openal_binding.h +++ /dev/null @@ -1,186 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - - 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. - -*/ - -/* - * openal_binding.h: Interface to OpenAL library. - * - * Author: Michael Liebscher - * Date: 2004 - * - */ - - -#ifndef __OPENAL_BINDING_H__ -#define __OPENAL_BINDING_H__ - -extern _boolean OpenAL_Init( const char *dllname ); -extern void OpenAL_Shutdown( void ); - - - -typedef ALCAPI ALCvoid ( * ALCCLOSEDEVICE)(ALCdevice *pDevice); -typedef ALCAPI ALCcontext*( * ALCCREATECONTEXT)(ALCdevice *device, const ALCint *attrList); -typedef ALCAPI ALCvoid ( * ALCDESTROYCONTEXT)(ALCcontext *context); -typedef ALCAPI ALCdevice* ( * ALCGETCONTEXTSDEVICE)(ALCcontext *pContext); -typedef ALCAPI ALCcontext * ( * ALCGETCURRENTCONTEXT)(ALCvoid); -typedef ALCAPI ALCenum ( * ALCGETENUMVALUE)(ALCdevice *device, const ALCubyte *enumName); -typedef ALCAPI ALCenum ( * ALCGETERROR)(ALCdevice *device); -typedef ALCAPI ALCvoid ( * ALCGETINTEGERV)(ALCdevice *device,ALCenum param,ALsizei size,ALCint *data); -typedef ALCAPI ALCvoid * ( * ALCGETPROCADDRESS)(ALCdevice *device, const ALCubyte *funcName); -typedef ALCAPI const ALCubyte* ( * ALCGETSTRING)(ALCdevice *device,ALCenum param); -typedef ALCAPI ALCboolean ( * ALCISEXTENSIONPRESENT)(ALCdevice *device, const ALCubyte *extName); -typedef ALCAPI ALCboolean ( * ALCMAKECONTEXTCURRENT)(ALCcontext *context); -typedef ALCAPI ALCdevice* ( * ALCOPENDEVICE)(const ALCubyte *deviceName); -typedef ALCAPI ALCvoid ( * ALCPROCESSCONTEXT)(ALCcontext *pContext); -typedef ALCAPI ALCvoid ( * ALCSUSPENDCONTEXT)(ALCcontext *pContext); - - - -typedef ALCAPI ALvoid ( * ALGENBUFFERS)(ALsizei n, ALuint* bufferNames); -typedef ALCAPI ALvoid ( * ALDELETEBUFFERS)(ALsizei n, const ALuint* bufferNames); -typedef ALCAPI ALboolean ( * ALISBUFFER)(ALuint bufferName); -typedef ALCAPI ALvoid ( * ALBUFFERDATA)(ALuint bufferName, ALenum format, const ALvoid* data, ALsizei size, ALsizei freq); -typedef ALCAPI ALvoid ( * ALGETBUFFERF)(ALuint bufferName, ALenum param, ALfloat* value); -typedef ALCAPI ALvoid ( * ALGETBUFFERI)(ALuint bufferName, ALenum param, ALint* value); -typedef ALCAPI ALvoid ( * ALENABLE)(ALenum capability); -typedef ALCAPI ALvoid ( * ALDISABLE)(ALenum capability); -typedef ALCAPI ALvoid ( * ALDOPPLERFACTOR)(ALfloat value); -typedef ALCAPI ALvoid ( * ALDOPPLERVELOCITY)(ALfloat value); -typedef ALCAPI ALvoid ( * ALDISTANCEMODEL)(ALenum value); -typedef ALCAPI ALboolean ( * ALGETBOOLEAN)(ALenum param); -typedef ALCAPI ALvoid ( * ALGETBOOLEANV)(ALenum param, ALboolean* data); -typedef ALCAPI ALdouble ( * ALGETDOUBLE)(ALenum param); -typedef ALCAPI ALvoid ( * ALGETDOUBLEV)(ALenum param, ALdouble* data); -typedef ALCAPI ALfloat ( * ALGETFLOAT)(ALenum param); -typedef ALCAPI ALvoid ( * ALGETFLOATV)(ALenum param, ALfloat* data); -typedef ALCAPI ALint ( * ALGETINTEGER)(ALenum param); -typedef ALCAPI ALvoid ( * ALGETINTEGERV)(ALenum param, ALint* data); -typedef ALCAPI ALenum ( * ALGETENUMVALUE)(const ALubyte* ename); -typedef ALCAPI ALenum ( * ALGETERROR)(ALvoid); -typedef ALCAPI ALvoid* ( * ALGETPROCADDRESS)(const ALubyte* fname); -typedef ALCAPI const ALubyte* ( * ALGETSTRING)(ALenum param); -typedef ALCAPI ALboolean ( * ALISEXTENSIONPRESENT)(const ALubyte* ename); -typedef ALCAPI ALboolean ( * ALISENABLED)(ALenum capability); -typedef ALCAPI ALvoid ( * ALLISTENERF)(ALenum param, ALfloat value); -typedef ALCAPI ALvoid ( * ALLISTENER3F)(ALenum param, ALfloat v1, ALfloat v2, ALfloat v3); -typedef ALCAPI ALvoid ( * ALLISTENERFV)(ALenum param, const ALfloat* values); -typedef ALCAPI ALvoid ( * ALLISTENERI)(ALenum param, ALint value); -typedef ALCAPI ALvoid ( * ALGETLISTENERF)(ALenum param, ALfloat* value); -typedef ALCAPI ALvoid ( * ALGETLISTENER3F)(ALenum param, ALfloat* v1, ALfloat* v2, ALfloat* v3); -typedef ALCAPI ALvoid ( * ALGETLISTENERFV)(ALenum param, ALfloat* values); -typedef ALCAPI ALvoid ( * ALGETLISTENERI)(ALenum param, ALint* value); -typedef ALCAPI ALvoid ( * ALGENSOURCES)(ALsizei n, ALuint* sourceNames); -typedef ALCAPI ALvoid ( * ALDELETESOURCES)(ALsizei n, const ALuint* sourceNames); -typedef ALCAPI ALboolean ( * ALISSOURCE)(ALuint sourceName); -typedef ALCAPI ALvoid ( * ALSOURCEF)(ALuint sourceName, ALenum param, ALfloat value); -typedef ALCAPI ALvoid ( * ALSOURCEFV)(ALuint sourceName, ALenum param, const ALfloat* values); -typedef ALCAPI ALvoid ( * ALSOURCE3F)(ALuint sourceName, ALenum param, ALfloat v1, ALfloat v2, ALfloat v3); -typedef ALCAPI ALvoid ( * ALSOURCEI)(ALuint sourceName, ALenum param, ALint value); -typedef ALCAPI ALvoid ( * ALGETSOURCEF)(ALuint sourceName, ALenum param, ALfloat* value); -typedef ALCAPI ALvoid ( * ALGETSOURCE3F)(ALuint sourceName, ALenum param, ALfloat* v1, ALfloat* v2, ALfloat* v3); -typedef ALCAPI ALvoid ( * ALGETSOURCEFV)(ALuint sourceName, ALenum param, ALfloat* values); -typedef ALCAPI ALvoid ( * ALGETSOURCEI)(ALuint sourceName, ALenum param, ALint* value); -typedef ALCAPI ALvoid ( * ALSOURCEPLAY)(ALuint sourceName); -typedef ALCAPI ALvoid ( * ALSOURCEPLAYV)(ALsizei n, const ALuint* sourceNames); -typedef ALCAPI ALvoid ( * ALSOURCEPAUSE)(ALuint sourceName); -typedef ALCAPI ALvoid ( * ALSOURCEPAUSEV)(ALsizei n, const ALuint* sourceNames); -typedef ALCAPI ALvoid ( * ALSOURCESTOP)(ALuint sourceName); -typedef ALCAPI ALvoid ( * ALSOURCESTOPV)(ALsizei n, const ALuint* sourceNames); -typedef ALCAPI ALvoid ( * ALSOURCEREWIND)(ALuint sourceName); -typedef ALCAPI ALvoid ( * ALSOURCEREWINDV)(ALsizei n, const ALuint* sourceNames); -typedef ALCAPI ALvoid ( * ALSOURCEQUEUEBUFFERS)(ALuint sourceName, ALsizei n, const ALuint* buffers); -typedef ALCAPI ALvoid ( * ALSOURCEUNQUEUEBUFFERS)(ALuint sourceName, ALsizei n, ALuint* buffers); - - - -ALCCLOSEDEVICE pfalcCloseDevice; -ALCCREATECONTEXT pfalcCreateContext; -ALCDESTROYCONTEXT pfalcDestroyContext; -ALCGETCONTEXTSDEVICE pfalcGetContextsDevice; -ALCGETCURRENTCONTEXT pfalcGetCurrentContext; -ALCGETENUMVALUE pfalcGetEnumValue; -ALCGETERROR pfalcGetError; -ALCGETINTEGERV pfalcGetIntegerv; -ALCGETPROCADDRESS pfalcGetProcAddress; -ALCGETSTRING pfalcGetString; -ALCISEXTENSIONPRESENT pfalcIsExtensionPresent; -ALCMAKECONTEXTCURRENT pfalcMakeContextCurrent; -ALCOPENDEVICE pfalcOpenDevice; -ALCPROCESSCONTEXT pfalcProcessContext; -ALCSUSPENDCONTEXT pfalcSuspendContext; - -ALGENBUFFERS pfalGenBuffers; -ALDELETEBUFFERS pfalDeleteBuffers; -ALISBUFFER pfalIsBuffer; -ALBUFFERDATA pfalBufferData; -ALGETBUFFERF pfalGetBufferf; -ALGETBUFFERI pfalGetBufferi; -ALENABLE pfalEnable; -ALDISABLE pfalDisable; -ALDOPPLERFACTOR pfalDopplerFactor; -ALDOPPLERVELOCITY pfalDopplerVelocity; -ALDISTANCEMODEL pfalDistanceModel; -ALGETBOOLEAN pfalGetBoolean; -ALGETBOOLEANV pfalGetBooleanv; -ALGETDOUBLE pfalGetDouble; -ALGETDOUBLEV pfalGetDoublev; -ALGETFLOAT pfalGetFloat; -ALGETFLOATV pfalGetFloatv; -ALGETINTEGER pfalGetInteger; -ALGETINTEGERV pfalGetIntegerv; -ALGETENUMVALUE pfalGetEnumValue; -ALGETERROR pfalGetError; -ALGETPROCADDRESS pfalGetProcAddress; -ALGETSTRING pfalGetString; -ALISEXTENSIONPRESENT pfalIsExtensionPresent; -ALISENABLED pfalIsEnabled; -ALLISTENERF pfalListenerf; -ALLISTENER3F pfalListener3f; -ALLISTENERFV pfalListenerfv; -ALLISTENERI pfalListeneri; -ALGETLISTENERF pfalGetListenerf; -ALGETLISTENER3F pfalGetListener3f; -ALGETLISTENERFV pfalGetListenerfv; -ALGETLISTENERI pfalGetListeneri; -ALGENSOURCES pfalGenSources; -ALDELETESOURCES pfalDeleteSources; -ALISSOURCE pfalIsSource; -ALSOURCEF pfalSourcef; -ALSOURCEFV pfalSourcefv; -ALSOURCE3F pfalSource3f; -ALSOURCEI pfalSourcei; -ALGETSOURCEF pfalGetSourcef; -ALGETSOURCE3F pfalGetSource3f; -ALGETSOURCEFV pfalGetSourcefv; -ALGETSOURCEI pfalGetSourcei; -ALSOURCEPLAY pfalSourcePlay; -ALSOURCEPLAYV pfalSourcePlayv; -ALSOURCEPAUSE pfalSourcePause; -ALSOURCEPAUSEV pfalSourcePausev; -ALSOURCESTOP pfalSourceStop; -ALSOURCESTOPV pfalSourceStopv; -ALSOURCEREWIND pfalSourceRewind; -ALSOURCEREWINDV pfalSourceRewindv; -ALSOURCEQUEUEBUFFERS pfalSourceQueueBuffers; -ALSOURCEUNQUEUEBUFFERS pfalSourceUnqueueBuffers; - - - -#endif /* __OPENAL_BINDING_H__ */ diff --git a/wolf3d/newCode/env/openal_main.c b/wolf3d/newCode/env/openal_main.c deleted file mode 100644 index dd26477..0000000 --- a/wolf3d/newCode/env/openal_main.c +++ /dev/null @@ -1,244 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - - 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. - -*/ - -/* - * openal_main.c: Interface to Sound Device. - * - * Author: Michael Liebscher - * Date: 2004 - * - */ - -#include "../wolfiphone.h" - - -#ifdef _WIN32 - - #define OPENAL_DLL_NAME "openal32.dll" - -#elif __unix__ - - #define OPENAL_DLL_NAME "libopenal.so" - -#elif IPHONE - -#define OPENAL_DLL_NAME "/System/Library/Frameworks/OpenAL.framework/OpenAL" - -#else - - #error "Please define OPENAL_DLL_NAME" - -#endif - -PRIVATE ALCcontext *Context; -PRIVATE ALCdevice *Device; - - -cvar_t *s_driver; -cvar_t *s_device; - - -char *deviceList; -char *sound_devices[ 12 ]; - -W16 numSoundDevices, numDefaultSoundDevice; - - - -/* ------------------------------------------------------------------------------ - Function: Sound_Device_getDeviceList -Get OpenAL device list. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PRIVATE void Sound_Device_getDeviceList( void ) -{ - char deviceName[ 256 ]; - - my_strlcpy( deviceName, s_device->string, sizeof( deviceName ) ); - if( pfalcIsExtensionPresent( NULL, (ALubyte*)"ALC_ENUMERATION_EXT") == AL_TRUE ) - { - // try out enumeration extension - deviceList = (char *)pfalcGetString( NULL, ALC_DEVICE_SPECIFIER ); - for( numSoundDevices = 0 ; numSoundDevices < 12 ; ++numSoundDevices ) - { - sound_devices[ numSoundDevices ] = NULL; - } - - for( numSoundDevices = 0 ; numSoundDevices < 12 ; ++numSoundDevices ) - { - sound_devices[ numSoundDevices ] = deviceList; - if( strcmp( sound_devices[ numSoundDevices ], deviceName ) == 0 ) - { - numDefaultSoundDevice = numSoundDevices; - } - deviceList += strlen( deviceList ); - if( deviceList[ 0 ] == 0 ) - { - if( deviceList[ 1 ] == 0 ) - { - break; - } - else - { - deviceList += 1; - } - } - - } // End for numSoundDevices = 0 ; numSoundDevices < 12 ; ++numSoundDevices - } - -} - - -/* ------------------------------------------------------------------------------ - Function: Sound_Device_Register -Register OpenAL cvars. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PRIVATE void Sound_Device_Register( void ) -{ - s_driver = Cvar_Get( "s_driver", OPENAL_DLL_NAME, CVAR_ARCHIVE ); - s_device = Cvar_Get( "s_device", "", CVAR_LATCH | CVAR_ARCHIVE ); -} - -/* ------------------------------------------------------------------------------ - Function: Sound_Device_Setup -Setup OpenAL sound device. - - Parameters: Nothing. - - Returns: true on success, otherwise false. - - Notes: Call Sound_Device_Shutdown() when you are done. ------------------------------------------------------------------------------ -*/ -PUBLIC _boolean Sound_Device_Setup( void ) -{ - Com_Printf( "...Initializing OpenAL subsystem\n" ); - - Sound_Device_Register(); - - // Initialize our OpenAL dynamic bindings - if( ! OpenAL_Init( s_driver->string ) ) - { - Com_Printf( "[%s]: Dynamic binding of (%s) failed\n", "openal_main.c", s_driver->string ); - - goto failed; - } - - - Sound_Device_getDeviceList(); - - - Device = pfalcOpenDevice( (ALCubyte *)( (s_device->string[ 0 ]) ? s_device->string : NULL ) ); - if( Device == NULL ) - { - Com_Printf( "Failed to Initialize OpenAL\n" ); - - goto failed; - } - - // Create context(s) - Context = pfalcCreateContext( Device, NULL ); - if( Context == NULL ) - { - Com_Printf( "Failed to initialize OpenAL\n" ); - - goto failed; - } - - - - // Set active context - pfalcGetError( Device ); - pfalcMakeContextCurrent( Context ); - if( pfalcGetError( Device ) != ALC_NO_ERROR ) - { - Com_Printf( "Failed to Make Context Current\n" ); - - goto failed; - } - - return true; - - - -failed: - - OpenAL_Shutdown(); - - if( Context ) - { - pfalcDestroyContext( Context ); - Context = NULL; - } - - if( Device ) - { - pfalcCloseDevice( Device ); - Device = NULL; - } - - return false; -} - -/* ------------------------------------------------------------------------------ - Function: Sound_Device_Shutdown -Shutdown OpenAL sound device. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void Sound_Device_Shutdown( void ) -{ - if( Context ) - { - pfalcMakeContextCurrent( NULL ); - pfalcDestroyContext( Context ); - - Context = NULL; - } - - if( Device ) - { - pfalcCloseDevice( Device ); - - Device = NULL; - } - - OpenAL_Shutdown(); -} - diff --git a/wolf3d/newCode/env/opengl_draw.c b/wolf3d/newCode/env/opengl_draw.c deleted file mode 100644 index ccec2b8..0000000 --- a/wolf3d/newCode/env/opengl_draw.c +++ /dev/null @@ -1,339 +0,0 @@ -/* - - Copyright (C) 2004-2005 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * opengl_draw.c: OpenGL drawing routines. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - - -#include "../wolfiphone.h" - -texture_t *draw_chars; - -//extern _boolean scrap_dirty; -//void Scrap_Upload (void); - - - -/* ------------------------------------------------------------------------------ - Function: R_Draw_Char -Draw ASCII character to the screen. - - Parameters: x -[in] x-coordinate. - y -[in] y-coordinate. - num -[in] ASCII character value. - myfont -[in] Valid pointer to font_t structure. - - Returns: Nothing. - - Notes: - It can be clipped to the top of the screen to allow the console to be - smoothly scrolled off. - ------------------------------------------------------------------------------ -*/ -PUBLIC void R_Draw_Character( int x, int y, int num, font_t *myfont ) -{ - int row, col; - int scale, sh; // scaled width, height - float frow, fcol; - - num &= 255; - - if( (num & 127) == 32 ) - { - return; // space - } - - if( y <= -myfont->nMaxHeight ) - { - return; // totally off screen - } - - scale = myfont->nSize; - sh = myfont->nMaxHeight; - - row = (num >> 4) - 2; - col = num & 15; - - frow = row * myfont->hFrac; - fcol = col * myfont->wFrac; - - - pfglColor4ubv( myfont->colour ); - - pfglEnable( GL_BLEND ); - - - R_Bind( myfont->texfont->texnum ); - - - pfglBegin( GL_QUADS ); - - - pfglTexCoord2f( fcol, frow ); - pfglVertex2i( x, y ); - - pfglTexCoord2f( fcol+myfont->wFrac, frow ); - pfglVertex2i( x+myfont->nMaxWidth*scale, y ); - - pfglTexCoord2f( fcol+myfont->wFrac, frow+myfont->hFrac ); - pfglVertex2i( x+myfont->nMaxWidth*scale, (y+sh*scale) ); - - pfglTexCoord2f( fcol, frow+myfont->hFrac ); - pfglVertex2i( x, (y+sh*scale) ); - - - - pfglEnd(); - - pfglDisable( GL_BLEND ); - pfglColor3f( 1, 1, 1 ); -} - - -/* ------------------------------------------------------------------------------ - Function: R_Draw_StretchPic -Draw stretched image to the screen. - - Parameters: x -[in] x-coordinate. - y -[in] y-coordinate. - w -[in] width of region. - h -[in] height of region. - pic -[in] Image filename to stretch. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void R_Draw_StretchPic( int x, int y, int w, int h, const char *pic ) -{ - texture_t *gl; - - gl = TM_FindTexture( pic, TT_Pic ); - if( ! gl ) - { - Com_Printf( "Can't find pic: %s\n", pic ); - return; - } - -// if( scrap_dirty ) -// Scrap_Upload(); - - - R_Bind( gl->texnum ); - - pfglBegin( GL_QUADS ); - - pfglTexCoord2f( 0.0f, 0.0f ); pfglVertex2i( x, y ); - pfglTexCoord2f( 1.0f, 0.0f ); pfglVertex2i( x+w, y ); - pfglTexCoord2f( 1.0f, 1.0f ); pfglVertex2i( x+w, y+h ); - pfglTexCoord2f( 0.0f, 1.0f ); pfglVertex2i( x, y+h ); - - pfglEnd(); -} - - -/* ------------------------------------------------------------------------------ - Function: R_Draw_Pic -Draw image to the screen. - - Parameters: x -[in] x-coordinate. - y -[in] y-coordinate. - pic -[in] Image filename to draw. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void R_Draw_Pic( int x, int y, const char *pic ) -{ - texture_t *tex; - - tex = TM_FindTexture( pic, TT_Pic ); - if( ! tex ) - { - Com_Printf( "Can't find pic: %s\n", pic ); - return; - } -// if( scrap_dirty ) -// Scrap_Upload(); - - - - R_Bind( tex->texnum ); - - pfglBegin( GL_QUADS ); - - pfglTexCoord2f( 0.0, 0.0 ); pfglVertex2i( x, y ); - pfglTexCoord2f( 1.0, 0.0 ); pfglVertex2i( x + tex->width, y ); - pfglTexCoord2f( 1.0, 1.0 ); pfglVertex2i( x + tex->width, y + tex->height ); - pfglTexCoord2f( 0.0, 1.0 ); pfglVertex2i( x, y + tex->height ); - - pfglEnd(); - -} - - - -/* ------------------------------------------------------------------------------ - Function: R_Draw_Tile -Tile image on the screen. - - Parameters: x -[in] x-coordinate. - y -[in] y-coordinate. - w -[in] width of region. - h -[in] height of region. - pic -[in] Image filename to draw. - - Returns: Nothing. - - Notes: - This repeats a tile graphic to fill a region on the screen. ------------------------------------------------------------------------------ -*/ -PUBLIC void R_Draw_Tile( int x, int y, int w, int h, const char *pic ) -{ - texture_t *image; - - image = TM_FindTexture( pic, TT_Wall ); - if( ! image ) - { - Com_Printf( "Can't find pic: %s\n", pic ); - return; - } - - - R_Bind( image->texnum ); - - pfglBegin( GL_QUADS ); - - - pfglTexCoord2i( x/image->upload_width, y/image->upload_height); - pfglVertex2i( x, y ); - - pfglTexCoord2i( (x + w)/image->upload_width, y/image->upload_height); - pfglVertex2i( x + w, y ); - - pfglTexCoord2i( (x+w)/image->upload_width, (y+h)/image->upload_height); - pfglVertex2i( x + w, y + h ); - - pfglTexCoord2i( x/image->upload_width, (y+h)/image->upload_height ); - pfglVertex2i( x, y + h ); - - - pfglEnd (); - -} - - -/* ------------------------------------------------------------------------------ - Function: R_Draw_Fill -Fills a box of pixels with a single color. - - Parameters: x -[in] x-coordinate. - y -[in] y-coordinate. - w -[in] width of region. - h -[in] height of region. - c -[in] Colour to fill region. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void R_Draw_Fill( int x, int y, int w, int h, colour3_t c ) -{ - qglScissor( x, 320-(y+h), w, h ); - qglEnable( GL_SCISSOR_TEST ); - qglClearColor( c[0] / 255.0f, c[1] / 255.0f, c[2] / 255.0f, 1.0f ); - qglClear( GL_COLOR_BUFFER_BIT ); - qglDisable( GL_SCISSOR_TEST ); -} - -PUBLIC void R_Draw_Blend( int x, int y, int w, int h, colour4_t c ) -{ - pfglDisable( GL_TEXTURE_2D ); - pfglColor4ubv( c ); - - pfglBegin( GL_QUADS ); - - pfglVertex2i( x, y ); - pfglVertex2i( x+w, y ); - pfglVertex2i( x+w, y+h ); - pfglVertex2i( x, y+h ); - - pfglEnd(); - - pfglColor3f( 1, 1, 1 ); - pfglEnable( GL_TEXTURE_2D ); -} - -/* ------------------------------------------------------------------------------ - Function: R_Draw_Line -Draw a line on the screen. - - Parameters: nXStart -[in] x-coordinate of starting point. - nYStart -[in] y-coordinate of starting point. - nXEnd -[in] x-coordinate of ending point. - nYEnd -[in] y-coordinate of ending point. - c -[in] Colour value. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void R_Draw_Line( int nXStart, int nYStart, int nXEnd, int nYEnd, int width, colour3_t c ) -{ - pfglDisable( GL_TEXTURE_2D ); - - - pfglColor3ubv( c ); - - - pfglLineWidth( (float)width ); - - pfglBegin( GL_LINES ); - - pfglVertex2i( nXStart, nYStart ); - pfglVertex2i( nXEnd, nYEnd ); - - pfglEnd(); - - pfglColor3f( 1, 1, 1 ); - pfglEnable( GL_TEXTURE_2D ); -} - - diff --git a/wolf3d/newCode/env/opengl_extension.c b/wolf3d/newCode/env/opengl_extension.c deleted file mode 100644 index 7c3b654..0000000 --- a/wolf3d/newCode/env/opengl_extension.c +++ /dev/null @@ -1,1024 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - - 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. - -*/ - -/* - * myopengl_extension.c: Interface to OpenGL extensions. - * - * Author: Michael Liebscher - * Date: 2004 - * - */ - -/* - - This module implements the binding of OpenGL extensions - to our function pointers. - - To use this module call the function GL_ConfigExtensions(). - -*/ - -#include - -#include "myopengl.h" -#include "opengl_local.h" -#include "myopengl_extension.h" -#include "../../common/common_utils.h" -#include "../../common/common.h" - - - - /* Implemented here */ - - -// Define what you require here. -// If hardware does not meet these defines, then extension load will fail. -#define MY_MAX_ARB_TEXTURESTAGES 4 - -#define MY_GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTR 128 -#define MY_GL_MAX_VERTEX_SHADER_LOCALS_EXT 68 -#define MY_GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 2 -#define MY_GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 97 -#define MY_GL_MAX_VERTEX_SHADER_VARIANTS_EXT 4 - - - - -GL_Extensions gl_ext; - - - -////////////////////////////// -// -// ARB Functions -// -////////////////////////////// - -PRIVATE W8 ConfigARBMultiTexture( const char *glext ) -{ - if( strstr( glext, "GL_ARB_multitexture" ) == NULL ) - { - Com_Printf( "...GL_ARB_multitexture not found\n" ); - return 0; - } - - if( ! (pfglActiveTextureARB = ( void * )pfwglGetProcAddress( "glActiveTextureARB" )) ) return 0; - if( ! (pfglClientActiveTextureARB = ( void * )pfwglGetProcAddress("glClientActiveTextureARB")))return 0; - - if( ! (pfglMultiTexCoord1sARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord1sARB" ))) return 0; - if( ! (pfglMultiTexCoord1iARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord1iARB" ))) return 0; - if( ! (pfglMultiTexCoord1fARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord1fARB" ))) return 0; - if( ! (pfglMultiTexCoord1dARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord1dARB" ))) return 0; - if( ! (pfglMultiTexCoord2sARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord2sARB" ))) return 0; - if( ! (pfglMultiTexCoord2iARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord2iARB" ))) return 0; - if( ! (pfglMultiTexCoord2fARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord2fARB" ))) return 0; - if( ! (pfglMultiTexCoord2dARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord2dARB" ))) return 0; - if( ! (pfglMultiTexCoord3sARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord3sARB" ))) return 0; - if( ! (pfglMultiTexCoord3iARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord3iARB" ))) return 0; - if( ! (pfglMultiTexCoord3fARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord3fARB" ))) return 0; - if( ! (pfglMultiTexCoord3dARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord3dARB" ))) return 0; - if( ! (pfglMultiTexCoord4sARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord4sARB" ))) return 0; - if( ! (pfglMultiTexCoord4iARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord4iARB" ))) return 0; - if( ! (pfglMultiTexCoord4fARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord4fARB" ))) return 0; - if( ! (pfglMultiTexCoord4dARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord4dARB" ))) return 0; - - if( ! (pfglMultiTexCoord1svARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord1svARB" ))) return 0; - if( ! (pfglMultiTexCoord1ivARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord1ivARB" ))) return 0; - if( ! (pfglMultiTexCoord1fvARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord1fvARB" ))) return 0; - if( ! (pfglMultiTexCoord1dvARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord1dvARB" ))) return 0; - if( ! (pfglMultiTexCoord2svARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord2svARB" ))) return 0; - if( ! (pfglMultiTexCoord2ivARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord2ivARB" ))) return 0; - if( ! (pfglMultiTexCoord2fvARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord2fvARB" ))) return 0; - if( ! (pfglMultiTexCoord2dvARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord2dvARB" ))) return 0; - if( ! (pfglMultiTexCoord3svARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord3svARB" ))) return 0; - if( ! (pfglMultiTexCoord3ivARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord3ivARB" ))) return 0; - if( ! (pfglMultiTexCoord3fvARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord3fvARB" ))) return 0; - if( ! (pfglMultiTexCoord3dvARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord3dvARB" ))) return 0; - if( ! (pfglMultiTexCoord4svARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord4svARB" ))) return 0; - if( ! (pfglMultiTexCoord4ivARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord4ivARB" ))) return 0; - if( ! (pfglMultiTexCoord4fvARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord4fvARB" ))) return 0; - if( ! (pfglMultiTexCoord4dvARB = ( void * )pfwglGetProcAddress( "glMultiTexCoord4dvARB" ))) return 0; - - - Com_Printf( "...enabling GL_ARB_multitexture\n" ); - - return 1; -} - - -PRIVATE W8 ConfigARBTextureCompression( const char *glext ) -{ - if( strstr( glext, "GL_ARB_texture_compression" ) == NULL ) - { - Com_Printf( "...GL_ARB_texture_compression not found\n" ); - return 0; - } - - if( ! (pfglCompressedTexImage3DARB = ( void * )pfwglGetProcAddress( "glCompressedTexImage3DARB" ))) return 0; - if( ! (pfglCompressedTexImage2DARB = ( void * )pfwglGetProcAddress( "glCompressedTexImage2DARB" ))) return 0; - if( ! (pfglCompressedTexImage1DARB = ( void * )pfwglGetProcAddress( "glCompressedTexImage1DARB" ))) return 0; - if( ! (pfglCompressedTexSubImage3DARB = ( void * )pfwglGetProcAddress( "glCompressedTexSubImage3DARB" ))) return 0; - if( ! (pfglCompressedTexSubImage2DARB = ( void * )pfwglGetProcAddress( "glCompressedTexSubImage2DARB" ))) return 0; - if( ! (pfglCompressedTexSubImage1DARB = ( void * )pfwglGetProcAddress( "glCompressedTexSubImage1DARB" ))) return 0; - if( ! (pfglGetCompressedTexImageARB = ( void * )pfwglGetProcAddress( "glGetCompressedTexImageARB" ))) return 0; - - Com_Printf( "...enabling GL_ARB_texture_compression\n" ); - - return 1; -} - - -PRIVATE W8 CheckARBTextureCubeMap( const char *glext ) -{ - if( strstr( glext, "GL_ARB_texture_cube_map" ) == NULL ) - { - Com_Printf( "...GL_ARB_texture_cube_map not found\n" ); - return 0; - } - - Com_Printf( "...enabling GL_ARB_texture_cube_map\n" ); - - return 1; -} - -PRIVATE W8 ConfigARBVertexProgram( const char *glext ) -{ - if( strstr( glext, "GL_ARB_vertex_program" ) == NULL ) - { - return 0; - } - - if( ! (pfglVertexAttrib1sARB = ( void * )pfwglGetProcAddress("glVertexAttrib1sARB"))) return 0; - if( ! (pfglVertexAttrib1fARB = ( void * )pfwglGetProcAddress("glVertexAttrib1fARB"))) return 0; - if( ! (pfglVertexAttrib1dARB = ( void * )pfwglGetProcAddress("glVertexAttrib1dARB"))) return 0; - if( ! (pfglVertexAttrib2sARB = ( void * )pfwglGetProcAddress("glVertexAttrib2sARB"))) return 0; - if( ! (pfglVertexAttrib2fARB = ( void * )pfwglGetProcAddress("glVertexAttrib2fARB"))) return 0; - if( ! (pfglVertexAttrib2dARB = ( void * )pfwglGetProcAddress("glVertexAttrib2dARB"))) return 0; - if( ! (pfglVertexAttrib3sARB = ( void * )pfwglGetProcAddress("glVertexAttrib3sARB"))) return 0; - if( ! (pfglVertexAttrib3fARB = ( void * )pfwglGetProcAddress("glVertexAttrib3fARB"))) return 0; - if( ! (pfglVertexAttrib3dARB = ( void * )pfwglGetProcAddress("glVertexAttrib3dARB"))) return 0; - if( ! (pfglVertexAttrib4sARB = ( void * )pfwglGetProcAddress("glVertexAttrib4sARB"))) return 0; - if( ! (pfglVertexAttrib4fARB = ( void * )pfwglGetProcAddress("glVertexAttrib4fARB"))) return 0; - if( ! (pfglVertexAttrib4dARB = ( void * )pfwglGetProcAddress("glVertexAttrib4dARB"))) return 0; - if( ! (pfglVertexAttrib4NubARB = ( void * )pfwglGetProcAddress("glVertexAttrib4NubARB"))) return 0; - if( ! (pfglVertexAttrib1svARB = ( void * )pfwglGetProcAddress("glVertexAttrib1svARB"))) return 0; - if( ! (pfglVertexAttrib1fvARB = ( void * )pfwglGetProcAddress("glVertexAttrib1fvARB"))) return 0; - if( ! (pfglVertexAttrib1dvARB = ( void * )pfwglGetProcAddress("glVertexAttrib1dvARB"))) return 0; - if( ! (pfglVertexAttrib2svARB = ( void * )pfwglGetProcAddress("glVertexAttrib2svARB"))) return 0; - if( ! (pfglVertexAttrib2fvARB = ( void * )pfwglGetProcAddress("glVertexAttrib2fvARB"))) return 0; - if( ! (pfglVertexAttrib2dvARB = ( void * )pfwglGetProcAddress("glVertexAttrib2dvARB"))) return 0; - if( ! (pfglVertexAttrib3svARB = ( void * )pfwglGetProcAddress("glVertexAttrib3svARB"))) return 0; - if( ! (pfglVertexAttrib3fvARB = ( void * )pfwglGetProcAddress("glVertexAttrib3fvARB"))) return 0; - if( ! (pfglVertexAttrib3dvARB = ( void * )pfwglGetProcAddress("glVertexAttrib3dvARB"))) return 0; - if( ! (pfglVertexAttrib4bvARB = ( void * )pfwglGetProcAddress("glVertexAttrib4bvARB"))) return 0; - if( ! (pfglVertexAttrib4svARB = ( void * )pfwglGetProcAddress("glVertexAttrib4svARB"))) return 0; - if( ! (pfglVertexAttrib4ivARB = ( void * )pfwglGetProcAddress("glVertexAttrib4ivARB"))) return 0; - if( ! (pfglVertexAttrib4ubvARB = ( void * )pfwglGetProcAddress("glVertexAttrib4ubvARB"))) return 0; - if( ! (pfglVertexAttrib4usvARB = ( void * )pfwglGetProcAddress("glVertexAttrib4usvARB"))) return 0; - if( ! (pfglVertexAttrib4uivARB = ( void * )pfwglGetProcAddress("glVertexAttrib4uivARB"))) return 0; - if( ! (pfglVertexAttrib4fvARB = ( void * )pfwglGetProcAddress("glVertexAttrib4fvARB"))) return 0; - if( ! (pfglVertexAttrib4dvARB = ( void * )pfwglGetProcAddress("glVertexAttrib4dvARB"))) return 0; - if( ! (pfglVertexAttrib4NbvARB = ( void * )pfwglGetProcAddress("glVertexAttrib4NbvARB"))) return 0; - if( ! (pfglVertexAttrib4NsvARB = ( void * )pfwglGetProcAddress("glVertexAttrib4NsvARB"))) return 0; - if( ! (pfglVertexAttrib4NivARB = ( void * )pfwglGetProcAddress("glVertexAttrib4NivARB"))) return 0; - if( ! (pfglVertexAttrib4NubvARB = ( void * )pfwglGetProcAddress("glVertexAttrib4NubvARB"))) return 0; - if( ! (pfglVertexAttrib4NusvARB = ( void * )pfwglGetProcAddress("glVertexAttrib4NusvARB"))) return 0; - if( ! (pfglVertexAttrib4NuivARB = ( void * )pfwglGetProcAddress("glVertexAttrib4NuivARB"))) return 0; - if( ! (pfglVertexAttribPointerARB = ( void * )pfwglGetProcAddress("glVertexAttribPointerARB"))) return 0; - if( ! (pfglEnableVertexAttribArrayARB = ( void * )pfwglGetProcAddress("glEnableVertexAttribArrayARB"))) return 0; - if( ! (pfglDisableVertexAttribArrayARB = ( void * )pfwglGetProcAddress("glDisableVertexAttribArrayARB"))) return 0; - if( ! (pfglProgramStringARB = ( void * )pfwglGetProcAddress("glProgramStringARB"))) return 0; - if( ! (pfglBindProgramARB = ( void * )pfwglGetProcAddress("glBindProgramARB"))) return 0; - if( ! (pfglDeleteProgramsARB = ( void * )pfwglGetProcAddress("glDeleteProgramsARB"))) return 0; - if( ! (pfglGenProgramsARB = ( void * )pfwglGetProcAddress("glGenProgramsARB"))) return 0; - if( ! (pfglProgramEnvParameter4fARB = ( void * )pfwglGetProcAddress("glProgramEnvParameter4fARB"))) return 0; - if( ! (pfglProgramEnvParameter4dARB = ( void * )pfwglGetProcAddress("glProgramEnvParameter4dARB"))) return 0; - if( ! (pfglProgramEnvParameter4fvARB = ( void * )pfwglGetProcAddress("glProgramEnvParameter4fvARB"))) return 0; - if( ! (pfglProgramEnvParameter4dvARB = ( void * )pfwglGetProcAddress("glProgramEnvParameter4dvARB"))) return 0; - if( ! (pfglProgramLocalParameter4fARB = ( void * )pfwglGetProcAddress("glProgramLocalParameter4fARB"))) return 0; - if( ! (pfglProgramLocalParameter4dARB = ( void * )pfwglGetProcAddress("glProgramLocalParameter4dARB"))) return 0; - if( ! (pfglProgramLocalParameter4fvARB = ( void * )pfwglGetProcAddress("glProgramLocalParameter4fvARB"))) return 0; - if( ! (pfglProgramLocalParameter4dvARB = ( void * )pfwglGetProcAddress("glProgramLocalParameter4dvARB"))) return 0; - if( ! (pfglGetProgramEnvParameterfvARB = ( void * )pfwglGetProcAddress("glGetProgramEnvParameterfvARB"))) return 0; - if( ! (pfglGetProgramEnvParameterdvARB = ( void * )pfwglGetProcAddress("glGetProgramEnvParameterdvARB"))) return 0; - if( ! (pfglGetProgramLocalParameterfvARB = ( void * )pfwglGetProcAddress("glGetProgramLocalParameterfvARB"))) return 0; - if( ! (pfglGetProgramLocalParameterdvARB = ( void * )pfwglGetProcAddress("glGetProgramLocalParameterdvARB"))) return 0; - if( ! (pfglGetProgramivARB = ( void * )pfwglGetProcAddress("glGetProgramivARB"))) return 0; - if( ! (pfglGetProgramStringARB = ( void * )pfwglGetProcAddress("glGetProgramStringARB"))) return 0; - if( ! (pfglGetVertexAttribdvARB = ( void * )pfwglGetProcAddress("glGetVertexAttribdvARB"))) return 0; - if( ! (pfglGetVertexAttribfvARB = ( void * )pfwglGetProcAddress("glGetVertexAttribfvARB"))) return 0; - if( ! (pfglGetVertexAttribivARB = ( void * )pfwglGetProcAddress("glGetVertexAttribivARB"))) return 0; - if( ! (pfglGetVertexAttribPointervARB = ( void * )pfwglGetProcAddress("glGetVertexAttribPointervARB"))) return 0; - if( ! (pfglIsProgramARB = ( void * )pfwglGetProcAddress("glIsProgramARB"))) return 0; - - Com_Printf( "...enabling GL_ARB_vertex_program\n" ); - - return 1; -} - - -//////////////////////////////////////////////////////////// - - - - -////////////////////////////// -// -// EXT Functions -// -////////////////////////////// - - -PRIVATE W8 CheckEXTTextureCompressionS3TC( const char *glext ) -{ - if( strstr( glext, "GL_EXT_texture_compression_s3tc" ) == NULL ) - { - Com_Printf( "...GL_EXT_texture_compression_s3tc not found\n" ); - return 0; - } - - Com_Printf( "...enabling GL_EXT_texture_compression_s3tc\n" ); - - return 1; -} - -PRIVATE W8 CheckEXTTextureEnvCombine( const char *glext ) -{ - if( strstr( glext, "GL_EXT_texture_env_combine" ) == NULL ) - { - Com_Printf( "...GL_EXT_texture_env_combine not found\n" ); - return 0; - } - - Com_Printf( "...enabling GL_EXT_texture_env_combine\n" ); - - return 1; -} - - - -PRIVATE W8 ConfigEXTSecondaryColor( const char *glext ) -{ - if( strstr( glext, "GL_EXT_secondary_color" ) == NULL ) - { - Com_Printf( "...GL_EXT_secondary_color not found\n" ); - return 0; - } - - - if( ! (pfglSecondaryColor3bEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3bEXT"))) return 0; - if( ! (pfglSecondaryColor3bvEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3bvEXT"))) return 0; - if( ! (pfglSecondaryColor3dEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3dEXT"))) return 0; - if( ! (pfglSecondaryColor3dvEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3dvEXT"))) return 0; - if( ! (pfglSecondaryColor3fEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3fEXT"))) return 0; - if( ! (pfglSecondaryColor3fvEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3fvEXT"))) return 0; - if( ! (pfglSecondaryColor3iEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3iEXT"))) return 0; - if( ! (pfglSecondaryColor3ivEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3ivEXT"))) return 0; - if( ! (pfglSecondaryColor3sEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3sEXT"))) return 0; - if( ! (pfglSecondaryColor3svEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3svEXT"))) return 0; - if( ! (pfglSecondaryColor3ubEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3ubEXT"))) return 0; - if( ! (pfglSecondaryColor3ubvEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3ubvEXT"))) return 0; - if( ! (pfglSecondaryColor3uiEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3uiEXT"))) return 0; - if( ! (pfglSecondaryColor3uivEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3uivEXT"))) return 0; - if( ! (pfglSecondaryColor3usEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3usEXT"))) return 0; - if( ! (pfglSecondaryColor3usvEXT = ( void * )pfwglGetProcAddress("glSecondaryColor3usvEXT"))) return 0; - if( ! (pfglSecondaryColorPointerEXT = ( void * )pfwglGetProcAddress("glSecondaryColorPointerEXT"))) return 0; - - Com_Printf( "...enabling GL_EXT_secondary_color\n" ); - - return 1; -} - -PRIVATE W8 ConfigEXTBlendColor( const char *glext ) -{ - if( strstr( glext, "GL_EXT_blend_color" ) == NULL ) - { - Com_Printf( "...GL_EXT_blend_color not found\n" ); - return 0; - } - - if( ! (pfglBlendColorEXT = (void *)pfwglGetProcAddress( "glBlendColorEXT" ))) return 0; - - Com_Printf( "...enabling GL_EXT_blend_color\n" ); - - return 1; -} - -PRIVATE W8 ConfigEXTVertexShader( const char *glext ) -{ - GLint glnum; - - if( strstr( glext, "GL_EXT_vertex_shader" ) == NULL ) - { - return 0; - } - - if( ! (pfglBeginVertexShaderEXT = ( void * )pfwglGetProcAddress("glBeginVertexShaderEXT"))) return 0; - if( ! (pfglEndVertexShaderEXT = ( void * )pfwglGetProcAddress("glEndVertexShaderEXT"))) return 0; - if( ! (pfglBindVertexShaderEXT = ( void * )pfwglGetProcAddress("glBindVertexShaderEXT"))) return 0; - if( ! (pfglGenVertexShadersEXT = ( void * )pfwglGetProcAddress("glGenVertexShadersEXT"))) return 0; - if( ! (pfglDeleteVertexShaderEXT = ( void * )pfwglGetProcAddress("glDeleteVertexShaderEXT"))) return 0; - if( ! (pfglShaderOp1EXT = ( void * )pfwglGetProcAddress("glShaderOp1EXT"))) return 0; - if( ! (pfglShaderOp2EXT = ( void * )pfwglGetProcAddress("glShaderOp2EXT"))) return 0; - if( ! (pfglShaderOp3EXT = ( void * )pfwglGetProcAddress("glShaderOp3EXT"))) return 0; - if( ! (pfglSwizzleEXT = ( void * )pfwglGetProcAddress("glSwizzleEXT"))) return 0; - if( ! (pfglWriteMaskEXT = ( void * )pfwglGetProcAddress("glWriteMaskEXT"))) return 0; - if( ! (pfglInsertComponentEXT = ( void * )pfwglGetProcAddress("glInsertComponentEXT"))) return 0; - if( ! (pfglExtractComponentEXT = ( void * )pfwglGetProcAddress("glExtractComponentEXT"))) return 0; - if( ! (pfglGenSymbolsEXT = ( void * )pfwglGetProcAddress("glGenSymbolsEXT"))) return 0; - if( ! (pfglSetInvariantEXT = ( void * )pfwglGetProcAddress("glSetInvariantEXT"))) return 0; - if( ! (pfglSetLocalConstantEXT = ( void * )pfwglGetProcAddress("glSetLocalConstantEXT"))) return 0; - if( ! (pfglVariantPointerEXT = ( void * )pfwglGetProcAddress("glVariantPointerEXT"))) return 0; - if( ! (pfglEnableVariantClientStateEXT = ( void * )pfwglGetProcAddress("glEnableVariantClientStateEXT"))) return 0; - if( ! (pfglDisableVariantClientStateEXT = ( void * )pfwglGetProcAddress("glDisableVariantClientStateEXT"))) return 0; - if( ! (pfglBindLightParameterEXT = ( void * )pfwglGetProcAddress("glBindLightParameterEXT"))) return 0; - if( ! (pfglBindMaterialParameterEXT = ( void * )pfwglGetProcAddress("glBindMaterialParameterEXT"))) return 0; - if( ! (pfglBindTexGenParameterEXT = ( void * )pfwglGetProcAddress("glBindTexGenParameterEXT"))) return 0; - if( ! (pfglBindTextureUnitParameterEXT = ( void * )pfwglGetProcAddress("glBindTextureUnitParameterEXT"))) return 0; - if( ! (pfglBindParameterEXT = ( void * )pfwglGetProcAddress("glBindParameterEXT"))) return 0; - if( ! (pfglIsVariantEnabledEXT = ( void * )pfwglGetProcAddress("glIsVariantEnabledEXT"))) return 0; - if( ! (pfglGetVariantBooleanvEXT = ( void * )pfwglGetProcAddress("glGetVariantBooleanvEXT"))) return 0; - if( ! (pfglGetVariantIntegervEXT = ( void * )pfwglGetProcAddress("glGetVariantIntegervEXT"))) return 0; - if( ! (pfglGetVariantFloatvEXT = ( void * )pfwglGetProcAddress("glGetVariantFloatvEXT"))) return 0; - if( ! (pfglGetVariantPointervEXT = ( void * )pfwglGetProcAddress("glGetVariantPointervEXT"))) return 0; - if( ! (pfglGetInvariantBooleanvEXT = ( void * )pfwglGetProcAddress("glGetInvariantBooleanvEXT"))) return 0; - if( ! (pfglGetInvariantIntegervEXT = ( void * )pfwglGetProcAddress("glGetInvariantIntegervEXT"))) return 0; - if( ! (pfglGetInvariantFloatvEXT = ( void * )pfwglGetProcAddress("glGetInvariantFloatvEXT"))) return 0; - if( ! (pfglGetLocalConstantBooleanvEXT = ( void * )pfwglGetProcAddress("glGetLocalConstantBooleanvEXT"))) return 0; - if( ! (pfglGetLocalConstantIntegervEXT = ( void * )pfwglGetProcAddress("glGetLocalConstantIntegervEXT"))) return 0; - if( ! (pfglGetLocalConstantFloatvEXT = ( void * )pfwglGetProcAddress("glGetLocalConstantFloatvEXT"))) return 0; - -// -// Checks to see if hardware is able to run our stuff -// - pfglGetIntegerv( GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT, &glnum ); - if( glnum < MY_GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTR ) - { - return 0; - } - - - pfglGetIntegerv( GL_MAX_VERTEX_SHADER_LOCALS_EXT, &glnum ); - if( glnum < MY_GL_MAX_VERTEX_SHADER_LOCALS_EXT ) - { - Com_Printf( "...Some vertex programs may fail to load" ); - return 0; - } - - - pfglGetIntegerv( GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT, &glnum ); - if( glnum < MY_GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT ) - { - return 0; - } - - - pfglGetIntegerv( GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT, &glnum ); - if( glnum < MY_GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT ) - { - return 0; - } - - - pfglGetIntegerv( GL_MAX_VERTEX_SHADER_VARIANTS_EXT, &glnum ); - if( glnum < MY_GL_MAX_VERTEX_SHADER_VARIANTS_EXT ) - { - return 0; - } - - - Com_Printf( "...enabling GL_EXT_vertex_shader\n" ); - - return 1; -} - - -PRIVATE W8 ConfigEXTVertexWeighting( const char *glext ) -{ - if( strstr( glext, "GL_EXT_vertex_weighting" ) == NULL ) - { - Com_Printf( "...GL_EXT_vertex_weighting not found\n" ); - return 0; - } - - - if( ! (pfglVertexWeightfEXT = ( void * )pfwglGetProcAddress( "glVertexWeightfEXT" ))) return 0; - if( ! (pfglVertexWeightfvEXT = ( void * )pfwglGetProcAddress( "glVertexWeightfvEXT" ))) return 0; - if( ! (pfglVertexWeightPointerEXT = ( void * )pfwglGetProcAddress( "glVertexWeightPointerEXT" ))) return 0; - - Com_Printf( "...enabling GL_EXT_vertex_weighting\n" ); - - return 1; -} - -PRIVATE W8 CheckEXTTextureFilterAnisotropic( const char *glext ) -{ - if( strstr( glext, "GL_EXT_texture_filter_anisotropic" ) == NULL ) - { - Com_Printf( "...GL_EXT_texture_filter_anisotropic not found\n" ); - return 0; - } - - Com_Printf( "...enabling GL_EXT_texture_filter_anisotropic\n" ); - - return 1; -} - -//////////////////////////////////////////////////////////// - - - - - -////////////////////////////// -// -// Nvidia Functions -// -////////////////////////////// - -PRIVATE W8 ConfigNVVertexArrayRange( const char *glext ) -{ - // Test if VAR is present. - if( strstr( glext, "GL_NV_vertex_array_range" ) == NULL ) - { - return 0; - } - - // Test if Fence - if( strstr( glext, "GL_NV_fence" ) == NULL ) - { - return 0; - } - - - // Setup Vertex Array Range - if( ! (pfglFlushVertexArrayRangeNV = ( void * )pfwglGetProcAddress("glFlushVertexArrayRangeNV")))return 0; - if( ! (pfglVertexArrayRangeNV = ( void * )pfwglGetProcAddress("glVertexArrayRangeNV")))return 0; - -#ifdef _WIN32 - - if( ! (pfwglAllocateMemoryNV = ( void * )pfwglGetProcAddress("wglAllocateMemoryNV"))) return 0; - if( ! (pfwglFreeMemoryNV = ( void * )pfwglGetProcAddress("wglFreeMemoryNV"))) return 0; - -#elif __unix__ - - if( ! (pfwglAllocateMemoryNV = ( void * )pfwglGetProcAddress( "glXAllocateMemoryNV" ))) return 0; - if( ! (pfwglFreeMemoryNV = ( void * )pfwglGetProcAddress( "glXFreeMemoryNV" ))) return 0; - -#else - - #error "Please define OS interface to GL_NV_vertex_array_range" - -#endif - - - // Setup fence - if( ! (pfglDeleteFencesNV = ( void * )pfwglGetProcAddress( "glDeleteFencesNV" ))) return 0; - if( ! (pfglGenFencesNV = ( void * )pfwglGetProcAddress( "glGenFencesNV" ))) return 0; - if( ! (pfglIsFenceNV = ( void * )pfwglGetProcAddress( "glIsFenceNV" ))) return 0; - if( ! (pfglTestFenceNV = ( void * )pfwglGetProcAddress( "glTestFenceNV" ))) return 0; - if( ! (pfglGetFenceivNV = ( void * )pfwglGetProcAddress( "glGetFenceivNV" ))) return 0; - if( ! (pfglFinishFenceNV = ( void * )pfwglGetProcAddress( "glFinishFenceNV" ))) return 0; - if( ! (pfglSetFenceNV = ( void * )pfwglGetProcAddress( "glSetFenceNV" ))) return 0; - - Com_Printf( "...enabling GL_NV_vertex_array_range & GL_NV_fence\n" ); - - return 1; -} - -PRIVATE W8 CheckNVVertexArrayRange2( const char *glext ) -{ - if( strstr( glext, "GL_NV_vertex_array_range2" ) == NULL ) - { - Com_Printf( "...GL_NV_vertex_array_range2 not found\n" ); - return 0; - } - - Com_Printf( "...enabling GL_NV_vertex_array_range2\n" ); - - return 1; -} - -PRIVATE W8 CheckNVTextureEnvCombine4( const char *glext ) -{ - if( strstr( glext, "GL_NV_texture_env_combine4") == NULL ) - { - Com_Printf( "...GL_NV_texture_env_combine4 not found\n" ); - return 0; - } - - Com_Printf( "...enabling GL_NV_texture_env_combine4\n" ); - - return 1; -} - -PRIVATE W8 ConfigNVVertexProgram( const char *glext ) -{ - if( strstr( glext, "GL_NV_vertex_program" ) == NULL ) - return 0; - - - if( ! (pfglAreProgramsResidentNV = ( void * )pfwglGetProcAddress("glAreProgramsResidentNV"))) return 0; - if( ! (pfglBindProgramNV = ( void * )pfwglGetProcAddress("glBindProgramNV"))) return 0; - if( ! (pfglDeleteProgramsNV = ( void * )pfwglGetProcAddress("glDeleteProgramsNV"))) return 0; - if( ! (pfglExecuteProgramNV = ( void * )pfwglGetProcAddress("glExecuteProgramNV"))) return 0; - if( ! (pfglGenProgramsNV = ( void * )pfwglGetProcAddress("glGenProgramsNV"))) return 0; - if( ! (pfglGetProgramParameterdvNV = ( void * )pfwglGetProcAddress("glGetProgramParameterdvNV"))) return 0; - if( ! (pfglGetProgramParameterfvNV = ( void * )pfwglGetProcAddress("glGetProgramParameterfvNV"))) return 0; - if( ! (pfglGetProgramivNV = ( void * )pfwglGetProcAddress("glGetProgramivNV"))) return 0; - if( ! (pfglGetProgramStringNV = ( void * )pfwglGetProcAddress("glGetProgramStringNV"))) return 0; - if( ! (pfglGetTrackMatrixivNV = ( void * )pfwglGetProcAddress("glGetTrackMatrixivNV"))) return 0; - if( ! (pfglGetVertexAttribdvNV = ( void * )pfwglGetProcAddress("glGetVertexAttribdvNV"))) return 0; - if( ! (pfglGetVertexAttribfvNV = ( void * )pfwglGetProcAddress("glGetVertexAttribfvNV"))) return 0; - if( ! (pfglGetVertexAttribivNV = ( void * )pfwglGetProcAddress("glGetVertexAttribivNV"))) return 0; - if( ! (pfglGetVertexAttribPointervNV = ( void * )pfwglGetProcAddress("glGetVertexAttribPointervNV"))) return 0; - if( ! (pfglIsProgramNV = ( void * )pfwglGetProcAddress("glIsProgramNV"))) return 0; - if( ! (pfglLoadProgramNV = ( void * )pfwglGetProcAddress("glLoadProgramNV"))) return 0; - if( ! (pfglProgramParameter4dNV = ( void * )pfwglGetProcAddress("glProgramParameter4dNV"))) return 0; - if( ! (pfglProgramParameter4dvNV = ( void * )pfwglGetProcAddress("glProgramParameter4dvNV"))) return 0; - if( ! (pfglProgramParameter4fNV = ( void * )pfwglGetProcAddress("glProgramParameter4fNV"))) return 0; - if( ! (pfglProgramParameter4fvNV = ( void * )pfwglGetProcAddress("glProgramParameter4fvNV"))) return 0; - if( ! (pfglProgramParameters4dvNV = ( void * )pfwglGetProcAddress("glProgramParameters4dvNV"))) return 0; - if( ! (pfglProgramParameters4fvNV = ( void * )pfwglGetProcAddress("glProgramParameters4fvNV"))) return 0; - if( ! (pfglRequestResidentProgramsNV = ( void * )pfwglGetProcAddress("glRequestResidentProgramsNV"))) return 0; - if( ! (pfglTrackMatrixNV = ( void * )pfwglGetProcAddress("glTrackMatrixNV"))) return 0; - if( ! (pfglVertexAttribPointerNV = ( void * )pfwglGetProcAddress("glVertexAttribPointerNV"))) return 0; - if( ! (pfglVertexAttrib1dNV = ( void * )pfwglGetProcAddress("glVertexAttrib1dNV"))) return 0; - if( ! (pfglVertexAttrib1dvNV = ( void * )pfwglGetProcAddress("glVertexAttrib1dvNV"))) return 0; - if( ! (pfglVertexAttrib1fNV = ( void * )pfwglGetProcAddress("glVertexAttrib1fNV"))) return 0; - if( ! (pfglVertexAttrib1fvNV = ( void * )pfwglGetProcAddress("glVertexAttrib1fvNV"))) return 0; - if( ! (pfglVertexAttrib1sNV = ( void * )pfwglGetProcAddress("glVertexAttrib1sNV"))) return 0; - if( ! (pfglVertexAttrib1svNV = ( void * )pfwglGetProcAddress("glVertexAttrib1svNV"))) return 0; - if( ! (pfglVertexAttrib2dNV = ( void * )pfwglGetProcAddress("glVertexAttrib2dNV"))) return 0; - if( ! (pfglVertexAttrib2dvNV = ( void * )pfwglGetProcAddress("glVertexAttrib2dvNV"))) return 0; - if( ! (pfglVertexAttrib2fNV = ( void * )pfwglGetProcAddress("glVertexAttrib2fNV"))) return 0; - if( ! (pfglVertexAttrib2fvNV = ( void * )pfwglGetProcAddress("glVertexAttrib2fvNV"))) return 0; - if( ! (pfglVertexAttrib2sNV = ( void * )pfwglGetProcAddress("glVertexAttrib2sNV"))) return 0; - if( ! (pfglVertexAttrib2svNV = ( void * )pfwglGetProcAddress("glVertexAttrib2svNV"))) return 0; - if( ! (pfglVertexAttrib3dNV = ( void * )pfwglGetProcAddress("glVertexAttrib3dNV"))) return 0; - if( ! (pfglVertexAttrib3dvNV = ( void * )pfwglGetProcAddress("glVertexAttrib3dvNV"))) return 0; - if( ! (pfglVertexAttrib3fNV = ( void * )pfwglGetProcAddress("glVertexAttrib3fNV"))) return 0; - if( ! (pfglVertexAttrib3fvNV = ( void * )pfwglGetProcAddress("glVertexAttrib3fvNV"))) return 0; - if( ! (pfglVertexAttrib3sNV = ( void * )pfwglGetProcAddress("glVertexAttrib3sNV"))) return 0; - if( ! (pfglVertexAttrib3svNV = ( void * )pfwglGetProcAddress("glVertexAttrib3svNV"))) return 0; - if( ! (pfglVertexAttrib4dNV = ( void * )pfwglGetProcAddress("glVertexAttrib4dNV"))) return 0; - if( ! (pfglVertexAttrib4dvNV = ( void * )pfwglGetProcAddress("glVertexAttrib4dvNV"))) return 0; - if( ! (pfglVertexAttrib4fNV = ( void * )pfwglGetProcAddress("glVertexAttrib4fNV"))) return 0; - if( ! (pfglVertexAttrib4fvNV = ( void * )pfwglGetProcAddress("glVertexAttrib4fvNV"))) return 0; - if( ! (pfglVertexAttrib4sNV = ( void * )pfwglGetProcAddress("glVertexAttrib4sNV"))) return 0; - if( ! (pfglVertexAttrib4svNV = ( void * )pfwglGetProcAddress("glVertexAttrib4svNV"))) return 0; - if( ! (pfglVertexAttrib4ubvNV = ( void * )pfwglGetProcAddress("glVertexAttrib4ubvNV"))) return 0; - if( ! (pfglVertexAttribs1dvNV = ( void * )pfwglGetProcAddress("glVertexAttribs1dvNV"))) return 0; - if( ! (pfglVertexAttribs1fvNV = ( void * )pfwglGetProcAddress("glVertexAttribs1fvNV"))) return 0; - if( ! (pfglVertexAttribs1svNV = ( void * )pfwglGetProcAddress("glVertexAttribs1svNV"))) return 0; - if( ! (pfglVertexAttribs2dvNV = ( void * )pfwglGetProcAddress("glVertexAttribs2dvNV"))) return 0; - if( ! (pfglVertexAttribs2fvNV = ( void * )pfwglGetProcAddress("glVertexAttribs2fvNV"))) return 0; - if( ! (pfglVertexAttribs2svNV = ( void * )pfwglGetProcAddress("glVertexAttribs2svNV"))) return 0; - if( ! (pfglVertexAttribs3dvNV = ( void * )pfwglGetProcAddress("glVertexAttribs3dvNV"))) return 0; - if( ! (pfglVertexAttribs3fvNV = ( void * )pfwglGetProcAddress("glVertexAttribs3fvNV"))) return 0; - if( ! (pfglVertexAttribs3svNV = ( void * )pfwglGetProcAddress("glVertexAttribs3svNV"))) return 0; - if( ! (pfglVertexAttribs4dvNV = ( void * )pfwglGetProcAddress("glVertexAttribs4dvNV"))) return 0; - if( ! (pfglVertexAttribs4fvNV = ( void * )pfwglGetProcAddress("glVertexAttribs4fvNV"))) return 0; - if( ! (pfglVertexAttribs4svNV = ( void * )pfwglGetProcAddress("glVertexAttribs4svNV"))) return 0; - if( ! (pfglVertexAttribs4ubvNV = ( void * )pfwglGetProcAddress("glVertexAttribs4ubvNV"))) return 0; - - - Com_Printf( "...enabling GL_NV_vertex_program\n" ); - - return 1; -} - - - - - -PRIVATE W8 CheckNVTextureShader( const char *glext ) -{ - if( strstr( glext, "GL_NV_texture_shader" ) == NULL ) - { - return 0; - } - - Com_Printf( "...enabling GL_NV_texture_shader\n" ); - - return 1; -} - -//////////////////////////////////////////////////////////// - - -////////////////////////////// -// -// ATI Functions -// -////////////////////////////// - - -PRIVATE W8 ConfigATIVertexArrayObject( const char *glext ) -{ - if( strstr( glext, "GL_ATI_vertex_array_object" ) == NULL ) - { - return 0; - } - - if( ! (pfglBlendColorEXT = ( void * )pfwglGetProcAddress("glBlendColorEXT"))) return 0; - if( ! (pfglNewObjectBufferATI = ( void * )pfwglGetProcAddress("glNewObjectBufferATI"))) return 0; - if( ! (pfglIsObjectBufferATI = ( void * )pfwglGetProcAddress("glIsObjectBufferATI"))) return 0; - if( ! (pfglUpdateObjectBufferATI = ( void * )pfwglGetProcAddress("glUpdateObjectBufferATI"))) return 0; - if( ! (pfglGetObjectBufferfvATI = ( void * )pfwglGetProcAddress("glGetObjectBufferfvATI"))) return 0; - if( ! (pfglGetObjectBufferivATI = ( void * )pfwglGetProcAddress("glGetObjectBufferivATI"))) return 0; - - if( ! (pfglFreeObjectBufferATI = ( void * )pfwglGetProcAddress("glFreeObjectBufferATI"))) return 0; - - if( ! (pfglArrayObjectATI = ( void * )pfwglGetProcAddress("glArrayObjectATI"))) return 0; - if( ! (pfglGetArrayObjectfvATI = ( void * )pfwglGetProcAddress("glGetArrayObjectfvATI"))) return 0; - if( ! (pfglGetArrayObjectivATI = ( void * )pfwglGetProcAddress("glGetArrayObjectivATI"))) return 0; - if( ! (pfglVariantArrayObjectATI = ( void * )pfwglGetProcAddress("glVariantArrayObjectATI"))) return 0; - if( ! (pfglGetVariantArrayObjectfvATI = ( void * )pfwglGetProcAddress("glGetVariantArrayObjectfvATI"))) return 0; - if( ! (pfglGetVariantArrayObjectivATI = ( void * )pfwglGetProcAddress("glGetVariantArrayObjectivATI"))) return 0; - - Com_Printf( "...enabling GL_ATI_vertex_array_object\n" ); - - return 1; -} - - -PRIVATE W8 ConfigATIMapObjectBuffer( const char *glext ) -{ - if( strstr( glext, "GL_ATI_map_object_buffer" ) == NULL ) - { - return 0; - } - - if( ! (pfglMapObjectBufferATI = ( void * )pfwglGetProcAddress("glMapObjectBufferATI"))) return 0; - if( ! (pfglUnmapObjectBufferATI = ( void * )pfwglGetProcAddress("glUnmapObjectBufferATI"))) return 0; - - Com_Printf( "...enabling GL_ATI_map_object_buffer\n" ); - - return 1; -} - - - - -PRIVATE W8 ConfigATIFragmentShader( const char *glext ) -{ - if( strstr( glext, "GL_ATI_fragment_shader" ) == NULL ) - { - return 0; - } - - if( ! (pfglGenFragmentShadersATI = ( void * )pfwglGetProcAddress("glGenFragmentShadersATI"))) return 0; - if( ! (pfglBindFragmentShaderATI = ( void * )pfwglGetProcAddress("glBindFragmentShaderATI"))) return 0; - if( ! (pfglDeleteFragmentShaderATI = ( void * )pfwglGetProcAddress("glDeleteFragmentShaderATI"))) return 0; - if( ! (pfglBeginFragmentShaderATI = ( void * )pfwglGetProcAddress("glBeginFragmentShaderATI"))) return 0; - if( ! (pfglEndFragmentShaderATI = ( void * )pfwglGetProcAddress("glEndFragmentShaderATI"))) return 0; - if( ! (pfglPassTexCoordATI = ( void * )pfwglGetProcAddress("glPassTexCoordATI"))) return 0; - if( ! (pfglSampleMapATI = ( void * )pfwglGetProcAddress("glSampleMapATI"))) return 0; - if( ! (pfglColorFragmentOp1ATI = ( void * )pfwglGetProcAddress("glColorFragmentOp1ATI"))) return 0; - if( ! (pfglColorFragmentOp2ATI = ( void * )pfwglGetProcAddress("glColorFragmentOp2ATI"))) return 0; - if( ! (pfglColorFragmentOp3ATI = ( void * )pfwglGetProcAddress("glColorFragmentOp3ATI"))) return 0; - if( ! (pfglAlphaFragmentOp1ATI = ( void * )pfwglGetProcAddress("glAlphaFragmentOp1ATI"))) return 0; - if( ! (pfglAlphaFragmentOp2ATI = ( void * )pfwglGetProcAddress("glAlphaFragmentOp2ATI"))) return 0; - if( ! (pfglAlphaFragmentOp3ATI = ( void * )pfwglGetProcAddress("glAlphaFragmentOp3ATI"))) return 0; - if( ! (pfglSetFragmentShaderConstantATI = ( void * )pfwglGetProcAddress("glSetFragmentShaderConstantATI"))) return 0; - - Com_Printf( "...enabling GL_ATI_fragment_shader\n" ); - - return 1; -} - -PRIVATE W8 CheckATITextureEnvCombine3( const char *glext ) -{ - if( strstr( glext, "GL_ATI_texture_env_combine3" ) == NULL ) - { - return 0; - } - - Com_Printf( "...enabling GL_ATI_texture_env_combine3\n" ); - - return 1; -} - - -PRIVATE W8 CheckATIXTextureEnvRoute(const char *glext) -{ - if( strstr( glext, "GL_ATIX_texture_env_route" ) == NULL ) - { - return 0; - } - - Com_Printf( "...enabling GL_ATIX_texture_env_route\n" ); - - return 1; -} - - -PRIVATE W8 ConfigATIEnvMapBumpMap( const char *glext ) -{ - if( strstr( glext, "GL_ATI_envmap_bumpmap" ) == NULL ) - { - return 0; - } - - if( ! (pfglTexBumpParameterivATI = ( void * ) pfwglGetProcAddress("glTexBumpParameterivATI"))) return 0; - if( ! (pfglTexBumpParameterfvATI = ( void * ) pfwglGetProcAddress("glTexBumpParameterfvATI"))) return 0; - if( ! (pfglGetTexBumpParameterivATI = ( void * ) pfwglGetProcAddress("glGetTexBumpParameterivATI"))) return 0; - if( ! (pfglGetTexBumpParameterfvATI = ( void * ) pfwglGetProcAddress("glGetTexBumpParameterfvATI"))) return 0; - - Com_Printf( "...enabling GL_ATI_envmap_bumpmap\n" ); - - return 1; -} -/* -PRIVATE W8 ConfigARBFragmentProgram( const char *glext ) -{ - if( strstr( glext, "GL_ARB_fragment_program" ) == NULL ) - { - return 0; - } - - if( ! (pfglProgramStringARB = ( void * )pfwglGetProcAddress("glProgramStringARB"))) return 0; - if( ! (pfglBindProgramARB = ( void * )pfwglGetProcAddress("glBindProgramARB"))) return 0; - if( ! (pfglDeleteProgramsARB = ( void * )pfwglGetProcAddress("glDeleteProgramsARB"))) return 0; - if( ! (pfglGenProgramsARB = ( void * )pfwglGetProcAddress("glGenProgramsARB"))) return 0; - if( ! (pfglProgramEnvParameter4dARB = ( void * )pfwglGetProcAddress("glProgramEnvParameter4dARB"))) return 0; - if( ! (pfglProgramEnvParameter4dvARB = ( void * )pfwglGetProcAddress("glProgramEnvParameter4dvARB"))) return 0; - if( ! (pfglProgramEnvParameter4fARB = ( void * )pfwglGetProcAddress("glProgramEnvParameter4fARB"))) return 0; - if( ! (pfglProgramEnvParameter4fvARB = ( void * )pfwglGetProcAddress("glProgramEnvParameter4fvARB"))) return 0; - if( ! (pfglGetProgramLocalParameter4dARB = ( void * )pfwglGetProcAddress("glProgramLocalParameter4dARB"))) return 0; - if( ! (pfglGetProgramLocalParameter4dvARB = ( void * )pfwglGetProcAddress("glProgramLocalParameter4dvARB"))) return 0; - if( ! (pfglGetProgramLocalParameter4fARB = ( void * )pfwglGetProcAddress("glProgramLocalParameter4fARB"))) return 0; - if( ! (pfglGetProgramLocalParameter4fvARB = ( void * )pfwglGetProcAddress("glProgramLocalParameter4fvARB"))) return 0; - if( ! (pfglGetProgramEnvParameterdvARB = ( void * )pfwglGetProcAddress("glGetProgramEnvParameterdvARB"))) return 0; - if( ! (pfglGetProgramEnvParameterfvARB = ( void * )pfwglGetProcAddress("glGetProgramEnvParameterfvARB"))) return 0; - if( ! (pfglGetProgramLocalParameterdvARB = ( void * )pfwglGetProcAddress("glGetProgramLocalParameterdvARB"))) return 0; - if( ! (pfglGetProgramLocalParameterfvARB = ( void * )pfwglGetProcAddress("glGetProgramLocalParameterfvARB"))) return 0; - if( ! (pfglGetProgramivARB = ( void * )pfwglGetProcAddress("glGetProgramivARB"))) return 0; - if( ! (pfglGetProgramStringARB = ( void * )pfwglGetProcAddress("glGetProgramStringARB"))) return 0; - if( ! (pfglIsProgramARB = ( void * )pfwglGetProcAddress("glIsProgramARB"))) return 0; - - return 1; -} - - -PRIVATE W8 ConfigARBVertexBufferObject( const char *glext ) -{ - if( strstr( glext, "GL_ARB_vertex_buffer_object" ) == NULL ) - return 0; - - if( ! (pfglBindBufferARB = ( void * )pfwglGetProcAddress("glBindBufferARB"))) return 0; - if( ! (pfglDeleteBuffersARB = ( void * )pfwglGetProcAddress("glDeleteBuffersARB"))) return 0; - if( ! (pfglGenBuffersARB = ( void * )pfwglGetProcAddress("glGenBuffersARB"))) return 0; - if( ! (pfglIsBufferARB = ( void * )pfwglGetProcAddress("glIsBufferARB"))) return 0; - if( ! (pfglBufferDataARB = ( void * )pfwglGetProcAddress("glBufferDataARB"))) return 0; - if( ! (pfglBufferSubDataARB = ( void * )pfwglGetProcAddress("glBufferSubDataARB"))) return 0; - if( ! (pfglGetBufferSubDataARB = ( void * )pfwglGetProcAddress("glGetBufferSubDataARB"))) return 0; - if( ! (pfglMapBufferARB = ( void * )pfwglGetProcAddress("glMapBufferARB"))) return 0; - if( ! (pfglUnmapBufferARB = ( void * )pfwglGetProcAddress("glUnmapBufferARB"))) return 0; - if( ! (pfglGetBufferParameterivARB = ( void * )pfwglGetProcAddress("glGetBufferParameterivARB"))) return 0; - if( ! (pfglGetBufferPointervARB = ( void * )pfwglGetProcAddress("glGetBufferPointervARB"))) return 0; - - return 1; -}*/ - - - - -#ifdef _WIN32 - -PRIVATE W8 ConfigWGLARBPBuffer( const char *glext ) -{ - if( strstr( glext, "WGL_ARB_pbuffer" ) == NULL ) - { - Com_Printf( "...WGL_ARB_pbuffer not found\n" ); - return 0; - } - - if( ! (pfwglCreatePbufferARB = ( void * )pfwglGetProcAddress( "wglCreatePbufferARB" ))) return 0; - if( ! (pfwglGetPbufferDCARB = ( void * )pfwglGetProcAddress( "wglGetPbufferDCARB" ))) return 0; - if( ! (pfwglReleasePbufferDCARB = ( void * )pfwglGetProcAddress( "wglReleasePbufferDCARB" ))) return 0; - if( ! (pfwglDestroyPbufferARB = ( void * )pfwglGetProcAddress( "wglDestroyPbufferARB" ))) return 0; - if( ! (pfwglQueryPbufferARB = ( void * )pfwglGetProcAddress( "wglQueryPbufferARB" ))) return 0; - - Com_Printf( "...enabling WGL_ARB_pbuffer\n" ); - - return 1; -} - - -PRIVATE W8 ConfigWGLARBPixelFormat ( const char *glext ) -{ - if( strstr( glext, "WGL_ARB_pixel_format" ) == NULL ) - { - Com_Printf( "...WGL_ARB_pixel_format not found\n" ); - return 0; - } - - if( ! (pfwglGetPixelFormatAttribivARB = ( void * )pfwglGetProcAddress( "wglGetPixelFormatAttribivARB" ))) return 0; - if( ! (pfwglGetPixelFormatAttribfvARB = ( void * )pfwglGetProcAddress( "wglGetPixelFormatAttribfvARB" ))) return 0; - if( ! (pfwglChoosePixelFormatARB = ( void * )pfwglGetProcAddress( "wglChoosePixelFormatARB" ))) return 0; - - Com_Printf( "...enabling WGL_ARB_pixel_format\n" ); - - return 1; -} - -PRIVATE W8 ConfigWGLEXTSwapControl( const char *glext ) -{ - if( strstr( glext, "WGL_EXT_swap_control" ) == NULL ) - { - Com_Printf( "...WGL_EXT_swap_control not found\n" ); - return 0; - } - - if( ! (pfwglSwapIntervalEXT = (WGLSWAPINTERVALEXT)pfwglGetProcAddress( "wglSwapIntervalEXT" ) ) ) return 0; - if( ! (pfwglGetSwapIntervalEXT = (WGLGETSWAPINTERVALEXT)pfwglGetProcAddress( "wglGetSwapIntervalEXT" ) ) ) return 0; - - Com_Printf( "...enabling WGL_EXT_swap_control\n" ); - - return 1; -} - -#endif /* _WIN32 */ - - - - - - - - - - -/* ------------------------------------------------------------------------------ - Function: GL_ConfigExtensions - - - Parameters: glext -[in] Pointer to string containing the gl extension names. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void GL_ConfigExtensions( const char *glext ) -{ - GLint ntext; - - - memset( &gl_ext, 0, sizeof( GL_Extensions ) ); - - gl_ext.ARBMultiTexture = ConfigARBMultiTexture( glext ); - if( gl_ext.ARBMultiTexture ) - { - pfglGetIntegerv( GL_MAX_TEXTURE_UNITS_ARB, &ntext ); - - // There could be more than MY_MAX_ARB_TEXTURESTAGES, but we only - // require MY_MAX_ARB_TEXTURESTAGES texture stages so take min. - gl_ext.nTextureStages = ( ntext < ( (GLint)MY_MAX_ARB_TEXTURESTAGES) ? ntext : MY_MAX_ARB_TEXTURESTAGES ); - } - - - gl_ext.EXTTextureFilterAnisotropic = CheckEXTTextureFilterAnisotropic( glext ); - if( gl_ext.EXTTextureFilterAnisotropic ) - { - pfglGetFloatv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &gl_ext.nMaxAnisotropy ); - - if( gl_ext.nMaxAnisotropy < 2.0f ) - { - gl_ext.nMaxAnisotropy = 0; - } - - } - - - gl_ext.EXTTextureEnvCombine = CheckEXTTextureEnvCombine( glext ); - - - gl_ext.ARBTextureCompression = ConfigARBTextureCompression( glext ); - - - gl_ext.EXTTextureCompressionS3TC = (gl_ext.ARBTextureCompression && CheckEXTTextureCompressionS3TC( glext ) ); - - - gl_ext.ARBTextureCubeMap = CheckARBTextureCubeMap( glext ); - - - gl_ext.EXTSecondaryColor = ConfigEXTSecondaryColor( glext ); - - - gl_ext.EXTBlendColor = ConfigEXTBlendColor( glext ); - - - // nVidia extensions - // ----------------- - - - gl_ext.NVVertexArrayRange = ConfigNVVertexArrayRange( glext ); - if( gl_ext.NVVertexArrayRange ) - { - GLint nverts; - pfglGetIntegerv( (GLenum)GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV, &nverts ); - gl_ext.NVVertexArrayRangeMaxVertex = nverts; - } - - - gl_ext.EXTVertexWeighting = ConfigEXTVertexWeighting( glext ); - - - gl_ext.NVVertexArrayRange2 = CheckNVVertexArrayRange2( glext ); - if( gl_ext.NVVertexArrayRange2 ) - { - // VBHard swap without flush of the VAR. - gl_ext.NVStateVARWithoutFlush = GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV; - } - else - { - // VBHard with unusefull flush of the VAR. - gl_ext.NVStateVARWithoutFlush = GL_VERTEX_ARRAY_RANGE_NV; - } - - - gl_ext.NVTextureEnvCombine4 = CheckNVTextureEnvCombine4( glext ); - - - if( ! gl_ext.DisableHardwareVertexProgram ) - { - gl_ext.NVVertexProgram = ConfigNVVertexProgram( glext ); - gl_ext.EXTVertexShader = ConfigEXTVertexShader( glext ); - gl_ext.ARBVertexProgram= ConfigARBVertexProgram( glext ); - } - else - { - gl_ext.NVVertexProgram = false; - gl_ext.EXTVertexShader = false; - gl_ext.ARBVertexProgram = false; - } - - - gl_ext.NVTextureShader = CheckNVTextureShader( glext ); - if( gl_ext.NVVertexProgram && ! gl_ext.NVTextureShader ) - { - // if GL_NV_texture_shader is not here, - // then we are not on a GeForce3. - gl_ext.NVVertexProgramEmulated = true; - } - - - // ATI extensions - // -------------- - - gl_ext.ATIVertexArrayObject = ConfigATIVertexArrayObject( glext ); - gl_ext.ATIMapObjectBuffer = ConfigATIMapObjectBuffer( glext ); - - - gl_ext.ATITextureEnvCombine3 = CheckATITextureEnvCombine3( glext ); - - gl_ext.ATIXTextureEnvRoute = CheckATIXTextureEnvRoute( glext ); - - gl_ext.ATIEnvMapBumpMap = ConfigATIEnvMapBumpMap( glext ); - -// gl_ext.ATIFragmentShader = setupATIFragmentShader( glext ); - - - - - - -#ifdef _WIN32 - - - ConfigWGLARBPBuffer( glext ); - - - ConfigWGLARBPixelFormat( glext ); - - - ConfigWGLEXTSwapControl( glext ); - - -#endif - - - - -} diff --git a/wolf3d/newCode/env/opengl_local.h b/wolf3d/newCode/env/opengl_local.h deleted file mode 100644 index 3102bcf..0000000 --- a/wolf3d/newCode/env/opengl_local.h +++ /dev/null @@ -1,256 +0,0 @@ -/* - - Copyright (C) 1997-2001 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 __OPENGL_LOCAL_H__ -#define __OPENGL_LOCAL_H__ - -extern int glMaxTexSize; // maximum texture size - - -//=================================================================== - - -extern void GL_SetDefaultState( void ); -extern void GL_UpdateSwapInterval( void ); - -extern float gldepthmin, gldepthmax; - - - -//==================================================== - - - -extern int gl_filter_min, gl_filter_max; - -// -// view origin -// -extern vec3_t vup; -extern vec3_t vpn; -extern vec3_t vright; -extern vec3_t r_origin; - -// -// screen size info -// -//extern refdef_t r_newrefdef; -extern int r_viewcluster, r_viewcluster2, r_oldviewcluster, r_oldviewcluster2; - -extern cvar_t *r_norefresh; -extern cvar_t *r_lefthand; -extern cvar_t *r_speeds; -extern cvar_t *r_novis; -extern cvar_t *r_nocull; - - -extern cvar_t *gl_vertex_arrays; - -extern cvar_t *gl_ext_swapinterval; -extern cvar_t *gl_ext_palettedtexture; -extern cvar_t *gl_ext_multitexture; -extern cvar_t *gl_ext_pointparameters; -extern cvar_t *gl_ext_compiled_vertex_array; - - -extern cvar_t *gl_nosubimage; -extern cvar_t *gl_bitdepth; -extern cvar_t *gl_mode; -extern cvar_t *gl_lightmap; -extern cvar_t *gl_shadows; -extern cvar_t *gl_dynamic; -extern cvar_t *gl_nobind; -extern cvar_t *gl_round_down; -extern cvar_t *gl_picmip; -extern cvar_t *gl_skymip; -extern cvar_t *gl_showtris; -extern cvar_t *gl_finish; -extern cvar_t *gl_ztrick; -extern cvar_t *gl_clear; -extern cvar_t *gl_cull; -extern cvar_t *gl_poly; -extern cvar_t *gl_texsort; -extern cvar_t *gl_polyblend; -extern cvar_t *gl_flashblend; -extern cvar_t *gl_lightmaptype; -extern cvar_t *gl_modulate; -extern cvar_t *gl_playermip; -extern cvar_t *gl_drawbuffer; -extern cvar_t *gl_driver; -extern cvar_t *gl_swapinterval; -extern cvar_t *gl_texturemode; -extern cvar_t *gl_saturatelighting; - -extern cvar_t *r_fullscreen; -extern cvar_t *vid_gamma; - -extern cvar_t *intensity; - -extern int gl_lightmap_format; -extern int gl_solid_format; -extern int gl_alpha_format; -extern int gl_tex_alpha_format; - - - - -extern void R_Bind( int texnum ); -extern void R_MBind( GLenum target, int texnum ); -extern void R_TexEnv( GLenum value ); -extern void R_EnableMultitexture( _boolean enable ); -extern void R_SelectTexture( GLenum ); - - -//==================================================================== - - -extern int registration_sequence; - - - -typedef struct -{ - const char *renderer_string; - const char *vendor_string; - const char *version_string; - const char *extensions_string; - _boolean Version_1_2; - -} glconfig_t; - -typedef struct -{ - float inverse_intensity; - _boolean fullscreen; - - int prev_mode; - - int lightmap_textures; - - int currenttextures[2]; - int currenttmu; - - -} glstate_t; - -extern glconfig_t gl_config; -extern glstate_t gl_state; - - -////////////////////////////////////////////////////// - - -typedef struct -{ - _boolean ARBMultiTexture; - int nTextureStages; // Number of texture stages supported - _boolean EXTTextureEnvCombine; - - _boolean EXTTextureFilterAnisotropic; - float nMaxAnisotropy; - // NB: Fence extension is not here, because NVVertexArrayRange is false if GL_NV_fence is not here. - _boolean NVVertexArrayRange; - int NVVertexArrayRangeMaxVertex; - _boolean EXTTextureCompressionS3TC; - _boolean EXTVertexWeighting; - _boolean EXTSeparateSpecularColor; - _boolean NVTextureEnvCombine4; - _boolean ARBTextureCubeMap; - _boolean NVVertexProgram; - _boolean EXTVertexShader; - _boolean NVTextureShader; - // true if NVVertexProgram and if we know that VP is emulated - _boolean NVVertexProgramEmulated; - _boolean EXTSecondaryColor; - _boolean EXTBlendColor; - // NVVertexArrayRange2. - _boolean NVVertexArrayRange2; - // equal to GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV if possible, or GL_VERTEX_ARRAY_RANGE_NV - int NVStateVARWithoutFlush; - - /* WGL ARB Extensions */ - _boolean WGLARBPBuffer; - _boolean WGLARBPixelFormat; - _boolean WGLEXTSwapControl; - - /* ATI Extensions */ - _boolean ATIVertexArrayObject; - _boolean ATIMapObjectBuffer; - _boolean ATITextureEnvCombine3; - _boolean ATIEnvMapBumpMap; - _boolean ATIFragmentShader; - _boolean ATIXTextureEnvRoute; - - /* ARB Extensions */ - _boolean ARBTextureCompression; - _boolean ARBFragmentProgram; - _boolean ARBVertexBufferObject; - _boolean ARBVertexProgram; - - /* Disable Hardware feature */ - _boolean DisableHardwareVertexProgram; - _boolean DisableHardwareTextureShader; - -} GL_Extensions; - -extern GL_Extensions gl_ext; - - -extern void GL_ConfigExtensions( const char *glext ); - -extern void MYgluPerspective( GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar ); - - -extern void PrintGLError( W32 err, const char *from ); - - - - -/* -==================================================================== - -IMPLEMENTATION SPECIFIC FUNCTIONS - -==================================================================== -*/ - -#ifdef __cplusplus -extern "C" { -#endif - -void GLimp_BeginFrame(); -void GLimp_EndFrame( void ); -_boolean GLimp_Init( void *hinstance, void *hWnd ); -void GLimp_Shutdown( void ); -int GLimp_SetMode( int *pwidth, int *pheight, int mode, _boolean fullscreen ); -void GLimp_AppActivate( _boolean active ); - -#ifdef __cplusplus -} -#endif - - - - - - - - -#endif /* __OPENGL_LOCAL_H__ */ diff --git a/wolf3d/newCode/env/opengl_main.c b/wolf3d/newCode/env/opengl_main.c deleted file mode 100644 index 61eae74..0000000 --- a/wolf3d/newCode/env/opengl_main.c +++ /dev/null @@ -1,497 +0,0 @@ -/* - - Copyright (C) 1997-2001 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 "../wolfiphone.h" - - -viddef_t viddef; - -float gldepthmin, gldepthmax; - -glconfig_t gl_config; -glstate_t gl_state; - - - - - -// -// view origin -// -vec3_t vup; -vec3_t vpn; -vec3_t vright; -vec3_t r_origin; - -cvar_t *r_norefresh; -cvar_t *r_speeds; -cvar_t *r_novis; -cvar_t *r_nocull; -cvar_t *r_lefthand; - - -cvar_t *gl_nosubimage; - - -cvar_t *gl_vertex_arrays; - - - -cvar_t *gl_ext_swapinterval; -cvar_t *gl_ext_palettedtexture; -cvar_t *gl_ext_multitexture; -cvar_t *gl_ext_pointparameters; -cvar_t *gl_ext_compiled_vertex_array; - -//cvar_t *gl_ext_TextureCompressionS3TC; - -cvar_t *gl_bitdepth; -cvar_t *gl_drawbuffer; -cvar_t *gl_driver; -cvar_t *gl_lightmap; -cvar_t *gl_shadows; -cvar_t *gl_mode; -cvar_t *gl_dynamic; -cvar_t *gl_modulate; -cvar_t *gl_nobind; -cvar_t *gl_round_down; -cvar_t *gl_picmip; -cvar_t *gl_skymip; -cvar_t *gl_showtris; -cvar_t *gl_ztrick; -cvar_t *gl_finish; -cvar_t *gl_clear; -cvar_t *gl_cull; -cvar_t *gl_polyblend; -cvar_t *gl_flashblend; -cvar_t *gl_playermip; -cvar_t *gl_saturatelighting; -cvar_t *gl_swapinterval; -cvar_t *gl_texturemode; - -cvar_t *r_fullscreen; -cvar_t *vid_gamma; -cvar_t *r_ref; - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void MYgluPerspective( GLdouble fovy, GLdouble aspect, - GLdouble zNear, GLdouble zFar ) -{ - GLdouble xmin, xmax, ymin, ymax; - - ymax = zNear * tan( fovy * M_PI / 360.0 ); - ymin = -ymax; - - xmin = ymin * aspect; - xmax = ymax * aspect; - - xmin += -( 2 * 0 ) / zNear; - xmax += -( 2 * 0 ) / zNear; - - pfglFrustum( xmin, xmax, ymin, ymax, zNear, zFar ); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PRIVATE void R_ScreenShot_f( void ) -{ - W8 *buffer; - char picname[ 80 ]; - char checkname[ MAX_OSPATH ]; - int i; - FILE *f; - - // create the scrnshots directory if it doesn't exist - my_snprintf( checkname, sizeof( checkname ), "%s/scrnshot", FS_Gamedir() ); - FS_CreateDirectory( checkname ); - -// -// find a file name to save it to -// - my_strlcpy( picname, "scrn00.tga", sizeof( picname ) ); - - for( i = 0 ; i <= 99 ; ++i ) - { - picname[ 4 ] = i / 10 + '0'; - picname[ 5 ] = i % 10 + '0'; - my_snprintf( checkname, sizeof( checkname ), "%s/scrnshot/%s", FS_Gamedir(), picname ); - f = fopen( checkname, "rb" ); - if( ! f ) - { - break; // file doesn't exist - } - - fclose( f ); - } - - if( i == 100 ) - { - Com_Printf( "R_ScreenShot_f: Couldn't create a file\n" ); - return; - } - - - buffer = MM_MALLOC( viddef.width * viddef.height * 3 ); - - - pfglReadPixels( 0, 0, viddef.width, viddef.height, GL_RGB, GL_UNSIGNED_BYTE, buffer ); - - - WriteTGA( checkname, 24, viddef.width, viddef.height, buffer, 1, 1 ); - - - MM_FREE( buffer ); - Com_Printf( "Wrote %s\n", picname ); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PRIVATE void R_Strings_f( void ) -{ - Com_Printf( "GL_VENDOR: %s\n", gl_config.vendor_string ); - Com_Printf( "GL_RENDERER: %s\n", gl_config.renderer_string ); - Com_Printf( "GL_VERSION: %s\n", gl_config.version_string ); - Com_Printf( "GL_EXTENSIONS: %s\n", gl_config.extensions_string ); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PRIVATE void R_Register( void ) -{ - gl_round_down = Cvar_Get ("gl_round_down", "1", CVAR_INIT); - - r_lefthand = Cvar_Get( "hand", "0", CVAR_USERINFO | CVAR_ARCHIVE ); - r_norefresh = Cvar_Get ("r_norefresh", "0", CVAR_INIT); - r_novis = Cvar_Get ("r_novis", "0", CVAR_INIT); - r_nocull = Cvar_Get ("r_nocull", "0", CVAR_INIT); - r_speeds = Cvar_Get ("r_speeds", "0", CVAR_INIT); - - - gl_nosubimage = Cvar_Get( "gl_nosubimage", "0", CVAR_INIT ); - - - gl_modulate = Cvar_Get ("gl_modulate", "1", CVAR_ARCHIVE ); - gl_bitdepth = Cvar_Get( "gl_bitdepth", "0", CVAR_INIT ); - gl_mode = Cvar_Get( "gl_mode", "0", CVAR_ARCHIVE ); - gl_lightmap = Cvar_Get ("gl_lightmap", "0", CVAR_INIT); - gl_dynamic = Cvar_Get ("gl_dynamic", "1", CVAR_INIT); - gl_nobind = Cvar_Get ("gl_nobind", "0", CVAR_INIT); - gl_picmip = Cvar_Get ("gl_picmip", "0", CVAR_INIT); - gl_skymip = Cvar_Get ("gl_skymip", "0", CVAR_INIT); - gl_showtris = Cvar_Get( "gl_showtris", "0", CVAR_INIT ); - gl_ztrick = Cvar_Get( "gl_ztrick", "0", CVAR_INIT ); - gl_finish = Cvar_Get( "gl_finish", "0", CVAR_ARCHIVE ); - gl_clear = Cvar_Get( "gl_clear", "0", CVAR_INIT ); - gl_cull = Cvar_Get( "gl_cull", "1", CVAR_INIT ); - gl_polyblend = Cvar_Get( "gl_polyblend", "1", CVAR_INIT ); - gl_flashblend = Cvar_Get( "gl_flashblend", "0", CVAR_INIT ); - gl_playermip = Cvar_Get( "gl_playermip", "0", CVAR_INIT ); - gl_driver = Cvar_Get( "gl_driver", OPENGL_DLL_NAME, CVAR_ARCHIVE ); - - gl_vertex_arrays = Cvar_Get( "gl_vertex_arrays", "0", CVAR_ARCHIVE ); - - gl_ext_swapinterval = Cvar_Get( "gl_ext_swapinterval", "1", CVAR_ARCHIVE ); - gl_ext_palettedtexture = Cvar_Get( "gl_ext_palettedtexture", "1", CVAR_ARCHIVE ); - gl_ext_multitexture = Cvar_Get( "gl_ext_multitexture", "1", CVAR_ARCHIVE ); - gl_ext_pointparameters = Cvar_Get( "gl_ext_pointparameters", "1", CVAR_ARCHIVE ); - gl_ext_compiled_vertex_array = Cvar_Get( "gl_ext_compiled_vertex_array", "1", CVAR_ARCHIVE ); - - gl_drawbuffer = Cvar_Get( "gl_drawbuffer", "GL_BACK", CVAR_INIT ); - gl_swapinterval = Cvar_Get( "gl_swapinterval", "1", CVAR_ARCHIVE ); - -// gl_saturatelighting = Cvar_Get( "gl_saturatelighting", "0", CVAR_INIT ); - - r_fullscreen = Cvar_Get( "r_fullscreen", "0", CVAR_ARCHIVE ); - vid_gamma = Cvar_Get( "vid_gamma", "1.0", CVAR_ARCHIVE ); - r_ref = Cvar_Get( "r_ref", "gl", CVAR_ARCHIVE ); - - Cmd_AddCommand( "screenshot", R_ScreenShot_f ); - Cmd_AddCommand( "r_strings", R_Strings_f ); -} - - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void R_Init() -{ - char renderer_buffer[ 1000 ]; - char vendor_buffer[ 1000 ]; - int err; - int a, b; - - - Com_Printf( "\n------ Display Initialization ------\n" ); - - Com_Printf( "Initializing OpenGL Subsystem\n" ); - - R_Register(); - - // set our "safe" modes - gl_state.prev_mode = 0; - - viddef.width = 480; - viddef.height = 320; - - // get various GL strings - gl_config.vendor_string = (char *)pfglGetString( GL_VENDOR ); - Com_Printf( "GL_VENDOR: %s\n", gl_config.vendor_string ); - - gl_config.renderer_string = (char *)pfglGetString( GL_RENDERER ); - Com_Printf( "GL_RENDERER: %s\n", gl_config.renderer_string ); - - gl_config.version_string = (char *)pfglGetString( GL_VERSION ); - Com_Printf( "GL_VERSION: %s\n", gl_config.version_string ); - - gl_config.extensions_string = (char *)pfglGetString( GL_EXTENSIONS ); - Com_Printf( "GL_EXTENSIONS: %s\n", gl_config.extensions_string ); - - my_strlcpy( renderer_buffer, gl_config.renderer_string, sizeof( renderer_buffer ) ); - (void)my_strlwr( renderer_buffer ); - - my_strlcpy( vendor_buffer, gl_config.vendor_string, sizeof( vendor_buffer ) ); - (void)my_strlwr( vendor_buffer ); - - - sscanf( gl_config.version_string, "%d.%d", &a, &b ); - if( a >= 1 && b >= 2 ) - { - gl_config.Version_1_2 = true; - } - - pfglGetIntegerv( GL_MAX_TEXTURE_SIZE, &glMaxTexSize ); - Com_Printf( "GL_MAX_TEXTURE_SIZE: %d\n", glMaxTexSize); - - GL_SetDefaultState(); - - TM_Init(); - Font_Init(); - - err = pfglGetError(); - if( err != GL_NO_ERROR ) - { - Com_Printf( "glGetError() = 0x%x\n", err ); - } -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void R_Shutdown( void ) -{ -// Cmd_RemoveCommand ("modellist"); -// Cmd_RemoveCommand ("screenshot"); -// Cmd_RemoveCommand ("imagelist"); -// Cmd_RemoveCommand ("gl_strings"); - -// Mod_FreeAll (); - - TM_Shutdown(); - - /* - ** shut down OS specific OpenGL stuff like contexts, etc. - */ - GLimp_Shutdown(); - - /* - ** shutdown our OpenGL subsystem - */ -#ifndef IPHONE - OpenGL_Shutdown(); -#endif -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void R_EndFrame( void ) -{ - GLimp_EndFrame(); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void R_AppActivate( _boolean active ) -{ - GLimp_AppActivate( active ); -} - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void GL_UpdateSwapInterval( void ) -{ - if ( gl_swapinterval->modified ) - { - gl_swapinterval->modified = false; - -#ifdef _WIN32 - - if ( pfwglSwapIntervalEXT ) - { - pfwglSwapIntervalEXT( FloatToInt( gl_swapinterval->value ) ); - } - -#endif - - } -} - - - -/* ------------------------------------------------------------------------------ - Function: PrintGLError -Print OpenGL error message. - - Parameters: err -[in] Error code. - from -[in] function name that produced the error. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void PrintGLError( W32 err, const char *from ) -{ - if( err == GL_NO_ERROR ) - { - return; - } - - if( from != "" ) - { - Com_Printf( "\n\n\nGL Error: %s\n", from ); - } - - switch( err ) - { - case GL_NO_ERROR: - Com_Printf( "GL_NO_ERROR:\nNo error has been recorded. The value of this symbolic constant is guaranteed to be zero.\n" ); - break; - - case GL_INVALID_ENUM: - Com_Printf( "GL_INVALID_ENUM:\nAn unacceptable value is specified for an enumerated argument. The offending function is ignored, having no side effect other than to set the error flag.\n" ); - break; - - case GL_INVALID_VALUE: - Com_Printf( "GL_INVALID_VALUE:\nA numeric argument is out of range. The offending function is ignored, having no side effect other than to set the error flag.\n" ); - break; - - case GL_INVALID_OPERATION: - Com_Printf( "GL_INVALID_OPERATION:\nThe specified operation is not allowed in the current state. The offending function is ignored, having no side effect other than to set the error flag.\n" ); - break; - - case GL_STACK_OVERFLOW: - Com_Printf( "GL_STACK_OVERFLOW:\nThis function would cause a stack overflow. The offending function is ignored, having no side effect other than to set the error flag.\n" ); - break; - - case GL_STACK_UNDERFLOW: - Com_Printf( "GL_STACK_UNDERFLOW:\nThis function would cause a stack underflow. The offending function is ignored, having no side effect other than to set the error flag.\n" ); - break; - - case GL_OUT_OF_MEMORY: - Com_Printf( "GL_OUT_OF_MEMORY:\nThere is not enough memory left to execute the function. The state of OpenGL is undefined, except for the state of the error flags, after this error is recorded.\n" ); - break; - - default: - Com_Printf( "Unknown GL error flag 0x%x\n", err ); - } -} diff --git a/wolf3d/newCode/env/opengl_texture.c b/wolf3d/newCode/env/opengl_texture.c deleted file mode 100644 index eabeb77..0000000 --- a/wolf3d/newCode/env/opengl_texture.c +++ /dev/null @@ -1,253 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * opengl_texture.c: OpenGL Texture Manager. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -#include "../wolfiphone.h" - -int currentTextures[ 4 ]; -int currenttmu; - -int glMaxTexSize; - -// *************************************************************************** - -// *************************************************************************** - - - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void R_DeleteTexture( unsigned int texnum ) -{ - pfglDeleteTextures( 1, &texnum ); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void R_TexEnv( GLenum mode ) -{ - static int lastmodes[ 4 ] = { -1, -1, -1, -1 }; - - if ( mode != lastmodes[ currenttmu ] ) - { - pfglTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, mode ); - lastmodes[ currenttmu ] = mode; - } -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void R_SelectTexture( GLenum texture ) -{ - int tmu; - -#ifndef IPHONE - if( ! pfglActiveTextureARB ) - { - return; - } -#endif - - if( texture == GL_TEXTURE0 ) - { - tmu = 0; - } - else if( texture == GL_TEXTURE1 ) - { - tmu = 1; - } - else if( texture == GL_TEXTURE2 ) - { - tmu = 2; - } - else - { - tmu = 3; - } - - if( tmu == currenttmu ) - { - return; - } - - - currenttmu = tmu; - - pfglActiveTextureARB( texture ); - pfglClientActiveTextureARB( texture ); - -} - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void R_Bind( int texnum ) -{ - // Is this texture already bound - if( currentTextures[ currenttmu ] == texnum ) - { - return; - } - - currentTextures[ currenttmu ] = texnum; - - pfglBindTexture( GL_TEXTURE_2D, texnum ); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void R_MBind( GLenum target, int texnum ) -{ - R_SelectTexture( target ); - - if( target == GL_TEXTURE0 ) - { - if ( currentTextures[ 0 ] == texnum ) - { - return; - } - } - else if( target == GL_TEXTURE1 ) - { - if( currentTextures[ 1 ] == texnum ) - { - return; - } - } - else if( target == GL_TEXTURE2 ) - { - if( currentTextures[ 2 ] == texnum ) - { - return; - } - } - else - { - if( currentTextures[ 3 ] == texnum ) - { - return; - } - } - - R_Bind( texnum ); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void R_EnableMultitexture( _boolean enable ) -{ -#ifndef IPHONE - if( ! pfglActiveTextureARB ) - { - return; - } -#endif - - if( enable ) - { - R_SelectTexture( GL_TEXTURE1 ); - pfglEnable( GL_TEXTURE_2D ); - R_TexEnv( GL_REPLACE ); - } - else - { - R_SelectTexture( GL_TEXTURE1 ); - pfglDisable( GL_TEXTURE_2D ); - R_TexEnv( GL_REPLACE ); - } - - R_SelectTexture( GL_TEXTURE0 ); - R_TexEnv( GL_REPLACE ); - -} - diff --git a/wolf3d/newCode/env/random_number.c b/wolf3d/newCode/env/random_number.c deleted file mode 100644 index 7256694..0000000 --- a/wolf3d/newCode/env/random_number.c +++ /dev/null @@ -1,107 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - - 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. - -*/ - -/* - * random_number.c: Wolfenstein3-D random number generator. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from Wolfenstein3-D, and was originally - * written by Id Software, Inc. - * - */ - - -#include "../wolfiphone.h" - -/* This is just John Carmack's table driven pseudo-random number generator */ - -W32 rndtable[] = { - 0, 8, 109, 220, 222, 241, 149, 107, 75, 248, 254, 140, 16, 66, - 74, 21, 211, 47, 80, 242, 154, 27, 205, 128, 161, 89, 77, 36, - 95, 110, 85, 48, 212, 140, 211, 249, 22, 79, 200, 50, 28, 188, - 52, 140, 202, 120, 68, 145, 62, 70, 184, 190, 91, 197, 152, 224, - 149, 104, 25, 178, 252, 182, 202, 182, 141, 197, 4, 81, 181, 242, - 145, 42, 39, 227, 156, 198, 225, 193, 219, 93, 122, 175, 249, 0, - 175, 143, 70, 239, 46, 246, 163, 53, 163, 109, 168, 135, 2, 235, - 25, 92, 20, 145, 138, 77, 69, 166, 78, 176, 173, 212, 166, 113, - 94, 161, 41, 50, 239, 49, 111, 164, 70, 60, 2, 37, 171, 75, - 136, 156, 11, 56, 42, 146, 138, 229, 73, 146, 77, 61, 98, 196, - 135, 106, 63, 197, 195, 86, 96, 203, 113, 101, 170, 247, 181, 113, - 80, 250, 108, 7, 255, 237, 129, 226, 79, 107, 112, 166, 103, 241, - 24, 223, 239, 120, 198, 58, 60, 82, 128, 3, 184, 66, 143, 224, - 145, 224, 81, 206, 163, 45, 63, 90, 168, 114, 59, 33, 159, 95, - 28, 139, 123, 98, 125, 196, 15, 70, 194, 253, 54, 14, 109, 226, - 71, 17, 161, 93, 186, 87, 244, 138, 20, 52, 123, 251, 26, 36, - 17, 46, 52, 231, 232, 76, 31, 221, 84, 37, 216, 165, 212, 106, - 197, 242, 98, 43, 39, 175, 254, 145, 190, 84, 118, 222, 187, 136, - 120, 163, 236, 249 -}; - -W32 rndindex = 0; - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void US_InitRndT( int randomize ) -{ - if( randomize ) - { - rndindex = time( NULL ) & 0xFF; - } - else - { - rndindex = 0; - } -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC int US_RndT( void ) -{ - rndindex++; - rndindex &= 0xFF; - - return rndtable[ rndindex ]; -} - - diff --git a/wolf3d/newCode/env/random_number.h b/wolf3d/newCode/env/random_number.h deleted file mode 100644 index 6fae19d..0000000 --- a/wolf3d/newCode/env/random_number.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - - 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. - -*/ - -/* - * mymath.h: Math routines. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from Wolfenstein3-D, and was originally - * written by Id Software, Inc. - * - */ - -#ifndef __RANDOM_NUMBER_H__ -#define __RANDOM_NUMBER_H__ - - -#define random() ( (rand() & 0x7fff) / ((float)0x7fff) ) -#define crandom() ( 2.0 * (random() - 0.5) ) - - -extern void US_InitRndT( int randomize ); -extern int US_RndT( void ); - - - - - -#endif /* __RANDOM_NUMBER_H__ */ diff --git a/wolf3d/newCode/env/renderer.h b/wolf3d/newCode/env/renderer.h deleted file mode 100644 index f0fe712..0000000 --- a/wolf3d/newCode/env/renderer.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * renderer.h: Interface to graphics API. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -/* - - Notes: - - This module communicates with the graphics API. The API can be any graphics - API, e.g OpenGL, DirectX, SDL, GDI, etc; as long as the functions listed in - this header are implemented. - -*/ - -#ifndef __RENDERER_H__ -#define __RENDERER_H__ - - -#ifdef _WIN32 - - #define OPENGL_DLL_NAME "opengl32.dll" - -#elif __unix__ - - #define OPENGL_DLL_NAME "libGL.so.1" - -#elif IPHONE - - #define OPENGL_DLL_NAME "not applicable" - -#else - - #error "Define OPENGL_DLL_NAME" - -#endif - - - - - -typedef enum -{ - rserr_ok, - - rserr_invalid_fullscreen, - rserr_invalid_mode, - - rserr_unknown - -} rserr_t; - - -extern int registration_sequence; - -extern void R_Init( void ); -extern void R_Shutdown( void ); - -extern void R_BeginRegistration( const char *model ); -extern void R_BeginFrame( void ); -extern void R_EndFrame( void ); - -extern void R_AppActivate( _boolean active ); -extern void R_SwapBuffers( int ); -extern void R_SetPalette( const unsigned char *palette); - - -extern void R_DeleteTexture( unsigned int texnum ); - - -extern void R_Draw_Pic( int x, int y, const char *name ); -extern void R_Draw_StretchPic( int x, int y, int w, int h, const char *name ); -extern void R_Draw_Character( int x, int y, int num, font_t *myfont ); -extern void R_Draw_Tile( int x, int y, int w, int h, const char *name ); -extern void R_Draw_Fill( int x, int y, int w, int h, colour3_t c ); -extern void R_Draw_Line( int nXStart, int nYStart, int nXEnd, int nYEnd, int width, colour3_t c ); - - -#endif /* __RENDERER_H__ */ diff --git a/wolf3d/newCode/env/share.c b/wolf3d/newCode/env/share.c deleted file mode 100644 index 26b2da2..0000000 --- a/wolf3d/newCode/env/share.c +++ /dev/null @@ -1,189 +0,0 @@ -/* - - Copyright (C) 1997-2001 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 "../wolfiphone.h" - - -char com_token[128]; - - - - -/* -============================================================================ - - BYTE ORDER FUNCTIONS - -============================================================================ -*/ - - - -/* ------------------------------------------------------------------------------ - Function: va() -Does a varargs printf into a temp buffer, so I don't need to - have varargs versions of all text functions. - - Parameters: format -[in] Format-control string. - ... -[in] Optional arguments. - - Returns: Formatted string. - - Notes: - If format string is longer than 1024 it will be truncated. ------------------------------------------------------------------------------ -*/ -PUBLIC char *va( char *format, ... ) -{ - va_list argptr; - static char string[ 1024 ]; - - va_start( argptr, format ); - (void)vsnprintf( string, sizeof( string ), format, argptr ); - va_end( argptr ); - - string[ sizeof( string ) - 1 ] = '\0'; - - return string; -} - - -/* ------------------------------------------------------------------------------ - Function: COM_Parse() -Parse a token out of a string. - - Parameters: data_p -[in] String to parse. - - Returns: On success it will return the token string, otherwise it will - return "". - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC char *COM_Parse( char **data_p ) -{ - int c; - int len; - char *data; - - data = *data_p; - len = 0; - com_token[ 0 ] = 0; - - if( ! data ) - { - *data_p = NULL; - return ""; - } - -// skip whitespace -skipwhite: - while( (c = *data) <= ' ') - { - if( c == 0 ) - { - *data_p = NULL; - return ""; - } - data++; - } - -// skip // comments - if( c == '/' && data[ 1 ] == '/' ) - { - while( *data && *data != '\n' ) - { - data++; - } - goto skipwhite; - } - -// handle quoted strings specially - if( c == '\"' ) - { - data++; - while( 1 ) - { - c = *data++; - if( c == '\"' || ! c ) - { - com_token[ len ] = 0; - *data_p = data; - return com_token; - } - if( len < MAX_TOKEN_CHARS ) - { - com_token[ len ] = c; - len++; - } - } - } - -// parse a regular word - do - { - if( len < MAX_TOKEN_CHARS ) - { - com_token[ len ] = c; - len++; - } - data++; - c = *data; - - } while( c > 32 ); - - if( len == MAX_TOKEN_CHARS ) - { -// Com_Printf ("Token exceeded %i chars, discarded.\n", MAX_TOKEN_CHARS); - len = 0; - } - com_token[ len ] = 0; - - *data_p = data; - - return com_token; -} - - -/* ------------------------------------------------------------------------------ - Function: Com_PageInMemory() - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -int paged_total; - -PUBLIC void Com_PageInMemory( PW8 buffer, int size ) -{ - int i; - - for( i = size - 1 ; i > 0 ; i -= 4096 ) - { - paged_total += buffer[ i ]; - } -} - diff --git a/wolf3d/newCode/env/sound.c b/wolf3d/newCode/env/sound.c deleted file mode 100644 index 9332e79..0000000 --- a/wolf3d/newCode/env/sound.c +++ /dev/null @@ -1,791 +0,0 @@ -/* - - Copyright (C) 2004-2005 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * sound.c: - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - * Acknowledgement: - * Portion of this code was derived from Quake II Evolved. - * - */ - -#include "../wolfiphone.h" - - -#define MAX_PLAYSOUNDS 128 - -#define MAX_CHANNELS 64 - -PRIVATE playSound_t s_playSounds[ MAX_PLAYSOUNDS ]; -PRIVATE playSound_t s_freePlaySounds; -PRIVATE playSound_t s_pendingPlaySounds; - -PRIVATE channel_t s_channels[ MAX_CHANNELS ]; -PRIVATE int s_numChannels; - -PRIVATE listener_t s_listener; - -PRIVATE int s_frameCount; - -PRIVATE _boolean s_activeApp; - -_boolean sound_initialized = false; - -cvar_t *s_initSound; -cvar_t *s_masterVolume; -cvar_t *s_sfxVolume; -cvar_t *s_musicVolume; -cvar_t *s_minDistance; -cvar_t *s_maxDistance; -cvar_t *s_rolloffFactor; -cvar_t *s_dopplerFactor; -cvar_t *s_dopplerVelocity; - - - -///////////////////////////////////////////////////////////////////// -// -// Sound Channels -// -///////////////////////////////////////////////////////////////////// - - -/* ------------------------------------------------------------------------------ - Function: Sound_AllocChannels -Allocate sound channels. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void Sound_AllocChannels( void ) -{ - channel_t *ch; - int i; - - for( i = 0, ch = s_channels ; i < MAX_CHANNELS ; ++i, ++ch ) - { - pfalGenSources( 1, &ch->sourceName ); - - if( pfalGetError() != AL_NO_ERROR ) - { - break; - } - - s_numChannels++; - } -} - -/* ------------------------------------------------------------------------------ - Function: Sound_FreeChannels -Free sound channels. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void Sound_FreeChannels( void ) -{ - channel_t *ch; - int i; - - for( i = 0, ch = s_channels; i < s_numChannels; i++, ch++) - { - pfalDeleteSources( 1, &ch->sourceName ); - - memset( ch, 0, sizeof( *ch ) ); - } - - s_numChannels = 0; -} - -/* ------------------------------------------------------------------------------ - Function: Sound_FreeChannels -Free sound channels. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE int Sound_ChannelState( channel_t *ch ) -{ - int state; - - pfalGetSourcei( ch->sourceName, AL_SOURCE_STATE, &state ); - - return state; -} - - -PRIVATE void Sound_PlayChannel( channel_t *ch, sfx_t *sfx ) -{ - ch->sfx = sfx; - - pfalSourcei( ch->sourceName, AL_BUFFER, sfx->bufferNum ); - pfalSourcei( ch->sourceName, AL_LOOPING, ch->loopSound ); - pfalSourcei( ch->sourceName, AL_SOURCE_RELATIVE, AL_FALSE ); - pfalSourcePlay( ch->sourceName ); -} - - -PRIVATE void Sound_StopChannel( channel_t *ch ) -{ - ch->sfx = NULL; - - pfalSourceStop( ch->sourceName ); - pfalSourcei( ch->sourceName, AL_BUFFER, 0 ); -#ifdef IPHONE - // OpenAL on the iphone doesn't seem to stop sounds properly. - // Maybe regenning the source will work... - pfalDeleteSources( 1, &ch->sourceName ); - pfalGenSources( 1, &ch->sourceName ); -#endif -} - - -PRIVATE void Sound_SpatializeChannel( channel_t *ch ) -{ -// vec3_t position, velocity; - - // Update position and velocity - if( ch->entNum == 0 || ! ch->distanceMult ) - { - pfalSourcefv( ch->sourceName, AL_POSITION, s_listener.position ); - pfalSourcefv( ch->sourceName, AL_VELOCITY, s_listener.velocity ); - } - else - { - if( ch->fixedPosition ) - { - pfalSource3f( ch->sourceName, AL_POSITION, ch->position[1], ch->position[2], -ch->position[0] ); - pfalSource3f( ch->sourceName, AL_VELOCITY, 0, 0, 0 ); - } -/* else - { - if( ch->loopSound ) - { - Client_GetEntitySoundSpatialization( ch->loopNum, position, velocity ); - } - else - { - Client_GetEntitySoundSpatialization( ch->entNum, position, velocity ); - } - - pfalSource3f( ch->sourceName, AL_POSITION, position[1], position[2], -position[0] ); - pfalSource3f( ch->sourceName, AL_VELOCITY, velocity[1], velocity[2], -velocity[0] ); - } -*/ - } - - // Update min/max distance - if( ch->distanceMult ) - { - pfalSourcef( ch->sourceName, AL_REFERENCE_DISTANCE, s_minDistance->value * ch->distanceMult ); - } - else - { - pfalSourcef( ch->sourceName, AL_REFERENCE_DISTANCE, s_maxDistance->value ); - } - - pfalSourcef( ch->sourceName, AL_MAX_DISTANCE, s_maxDistance->value ); - - // Update volume and rolloff factor - pfalSourcef( ch->sourceName, AL_GAIN, s_sfxVolume->value * ch->volume ); - pfalSourcef( ch->sourceName, AL_ROLLOFF_FACTOR, s_rolloffFactor->value ); -} - - -/* ------------------------------------------------------------------------------ - Function: Sound_PickChannel - - - Parameters: - - Returns: - - Notes: - Tries to find a free channel, or tries to replace an active channel. ------------------------------------------------------------------------------ -*/ -PUBLIC channel_t *Sound_PickChannel( W32 entNum, W32 entChannel ) -{ - channel_t *ch; - int i; - int firstToDie = -1; - int oldestTime = iphoneFrameNum; - - for( i = 0, ch = s_channels ; i < s_numChannels ; ++i, ++ch ) - { - // Don't let game sounds override streaming sounds - if( ch->streaming ) - { - continue; - } - - // Check if this channel is active - if( ! ch->sfx ) - { - // Free channel - firstToDie = i; - break; - } - - // Channel 0 never overrides - if( entChannel != 0 && (ch->entNum == entNum && ch->entChannel == entChannel ) ) - { - // Always override sound from same entity - firstToDie = i; - break; - } - - // Replace the oldest sound - if( ch->startTime < oldestTime ) - { - oldestTime = ch->startTime; - firstToDie = i; - } - } - - if( firstToDie == -1 ) - { - return NULL; - } - - ch = &s_channels[ firstToDie ]; - - ch->entNum = entNum; - ch->entChannel = entChannel; - ch->startTime = iphoneFrameNum; - - // Make sure this channel is stopped - Sound_StopChannel( ch ); - - return ch; -} - -///////////////////////////////////////////////////////////////////// -// End of Sound Channels -///////////////////////////////////////////////////////////////////// - - -/* ------------------------------------------------------------------------------ - Function: Sound_AddLoopingSounds - - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - Entities with a a->sound field will generate looping sounds that are - automatically started and stopped as the entities are sent to the - client. ------------------------------------------------------------------------------ -*/ -PRIVATE void Sound_AddLoopingSounds( void ) -{ - -} - - - -PRIVATE playSound_t *Sound_AllocPlaySound( void ) -{ - playSound_t *ps; - - ps = s_freePlaySounds.next; - if( ps == &s_freePlaySounds ) - { - return NULL; // No free playSounds - } - - ps->prev->next = ps->next; - ps->next->prev = ps->prev; - - return ps; -} - - -PRIVATE void Sound_FreePlaySound( playSound_t *ps ) -{ - ps->prev->next = ps->next; - ps->next->prev = ps->prev; - - // Add to free list - ps->next = s_freePlaySounds.next; - s_freePlaySounds.next->prev = ps; - ps->prev = &s_freePlaySounds; - s_freePlaySounds.next = ps; -} - -/* ------------------------------------------------------------------------------ - Function: Sound_IssuePlaySounds - - - Parameters: - - Returns: Nothing. - - Notes: - Take the next playsound and begin it on the channel. - This is never called directly by Sound_StartSound*, but only by the update loop. ------------------------------------------------------------------------------ -*/ -PRIVATE void Sound_IssuePlaySounds( void ) -{ - playSound_t *ps; - channel_t *ch; - - while( 1 ) - { - ps = s_pendingPlaySounds.next; - if( ps == &s_pendingPlaySounds ) - { - break; // No more pending playSounds - } - - if( ps->beginTime > iphoneFrameNum ) - { - break; // No more pending playSounds this frame - } - - // Pick a channel and start the sound effect - ch = Sound_PickChannel( ps->entNum, ps->entChannel ); - if( ! ch ) - { - if( ps->sfx->name[ 0 ] == '#' ) - Com_DPrintf( "Dropped sound %s\n", &ps->sfx->name[1]); - else - Com_DPrintf( "Dropped sound sound/%s\n", ps->sfx->name); - - Sound_FreePlaySound( ps ); - continue; - } - - ch->loopSound = false; - ch->fixedPosition = ps->fixedPosition; - vectorCopy( ps->position, ch->position ); - ch->volume = ps->volume; - - if( ps->attenuation != ATTN_NONE ) - { - ch->distanceMult = 1.0f / ps->attenuation; - } - else - { - ch->distanceMult = 0.0; - } - - Sound_SpatializeChannel( ch ); - - Sound_PlayChannel( ch, ps->sfx ); - - // Free the playSound - Sound_FreePlaySound( ps ); - } -} - - -/* ------------------------------------------------------------------------------ - Function: Sound_StartSound - - - Parameters: - - Returns: Nothing. - - Notes: - Validates the parms and queues the sound up. - If origin is NULL, the sound will be dynamically sourced from the - entity. - entChannel 0 will never override a playing sound. ------------------------------------------------------------------------------ -*/ -PUBLIC void Sound_StartSound( const vec3_t position, int entNum, int entChannel, sfx_t *sfx, float volume, float attenuation, int timeOfs ) -{ - playSound_t *ps, *sort; - - if( ! sound_initialized ) - { - return; - } - - if( ! sfx ) - { - return; - } - - - // Make sure the sound is loaded - if( ! Sound_LoadSound( sfx ) ) - { - return; - } - - // Allocate a playSound - ps = Sound_AllocPlaySound(); - if( ! ps ) - { - if( sfx->name[0] == '#' ) - Com_DPrintf( "Dropped sound %s\n", &sfx->name[1] ); - else - Com_DPrintf( "Dropped sound sound/%s\n", sfx->name); - - return; - } - - ps->sfx = sfx; - ps->entNum = entNum; - ps->entChannel = entChannel; - - if( position ) - { - ps->fixedPosition = true; - vectorCopy( position, ps->position ); - } - else - { - ps->fixedPosition = false; - } - - ps->volume = volume; - ps->attenuation = attenuation; - ps->beginTime = iphoneFrameNum; - - // Sort into the pending playSounds list - for( sort = s_pendingPlaySounds.next ; sort != &s_pendingPlaySounds && sort->beginTime < ps->beginTime ; sort = sort->next ) - { - ; - } - - ps->next = sort; - ps->prev = sort->prev; - - ps->next->prev = ps; - ps->prev->next = ps; -} - - -PUBLIC void Sound_StartLocalSound( const char *filename ) -{ - sfx_t *sfx; - - if( ! sound_initialized ) - { - return; - } - - sfx = Sound_RegisterSound( filename ); - if( ! sfx ) - { - Com_Printf( "Sound_StartLocalSound: could not cache (%s)\n", filename ); - return; - } - - Sound_StartSound( NULL, 0, 0, sfx, 1, ATTN_NONE, 0 ); -} - - -PUBLIC void Sound_StopAllSounds( void ) -{ - channel_t *ch; - int i; - - if( ! sound_initialized ) - { - return; - } - - // Clear all the playSounds - memset( s_playSounds, 0, sizeof( s_playSounds ) ); - - s_freePlaySounds.next = s_freePlaySounds.prev = &s_freePlaySounds; - s_pendingPlaySounds.next = s_pendingPlaySounds.prev = &s_pendingPlaySounds; - - for( i = 0 ; i < MAX_PLAYSOUNDS ; ++i ) - { - s_playSounds[ i ].prev = &s_freePlaySounds; - s_playSounds[ i ].next = s_freePlaySounds.next; - s_playSounds[ i ].prev->next = &s_playSounds[ i ]; - s_playSounds[ i ].next->prev = &s_playSounds[ i ]; - } - - // Stop all the channels - for( i = 0, ch = s_channels ; i < s_numChannels ; ++i, ++ch ) - { - if( ! ch->sfx ) - { - continue; - } - - Sound_StopChannel( ch ); - } - - // Reset frame count - s_frameCount = 0; -} - - -/* ------------------------------------------------------------------------------ - Function: Sound_Update - - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - Called once each time through the main loop. ------------------------------------------------------------------------------ -*/ -PUBLIC void Sound_Update( const vec3_t position, const vec3_t velocity, const vec3_t at, const vec3_t up) -{ - channel_t *ch; - int i, total = 0; - - if( ! sound_initialized ) - { - return; - } - - // Bump frame count - s_frameCount++; - - // Set up listener - vectorSet( s_listener.position, position[1], position[2], -position[0] ); - vectorSet( s_listener.velocity, velocity[1], velocity[2], -velocity[0] ); - vectorSet( &s_listener.orientation[0], at[1], -at[2], -at[0] ); - vectorSet( &s_listener.orientation[3], up[1], -up[2], -up[0] ); - - pfalListenerfv( AL_POSITION, s_listener.position ); - pfalListenerfv( AL_VELOCITY, s_listener.velocity ); - pfalListenerfv( AL_ORIENTATION, s_listener.orientation ); - pfalListenerf( AL_GAIN, (s_activeApp) ? s_masterVolume->value : 0.0); - - // Set state - pfalDistanceModel( AL_INVERSE_DISTANCE_CLAMPED ); - - pfalDopplerFactor( s_dopplerFactor->value ); - pfalDopplerVelocity( s_dopplerVelocity->value ); - - // Stream background track - Sound_StreamBGTrack(); - - // Add looping sounds - Sound_AddLoopingSounds(); - - // Issue playSounds - Sound_IssuePlaySounds(); - - // Update spatialization for all sounds - for( i = 0, ch = s_channels ; i < s_numChannels ; ++i, ++ch ) - { - if( ! ch->sfx ) - { - continue; // Not active - } - - // Check for stop - if( ch->loopSound ) - { - if( ch->loopFrame != s_frameCount ) - { - Sound_StopChannel( ch ); - - continue; - } - } - else - { - if( Sound_ChannelState(ch) == AL_STOPPED ) - { - Sound_StopChannel( ch ); - - continue; - } - } - - // Respatialize channel - Sound_SpatializeChannel( ch ); - - total++; - } - - -} - - -PUBLIC void Sound_Activate( _boolean active ) -{ - s_activeApp = active; - - if( ! sound_initialized ) - { - return; - } - - pfalListenerf( AL_GAIN, ( active ) ? s_masterVolume->value : 0.0 ); - -} - - -///////////////////////////////////////////////////////////////////// -// -// Console Commands -// -///////////////////////////////////////////////////////////////////// - -PRIVATE void Sound_Play_f( void ) -{ - - int i = 1; - char name[ MAX_GAMEPATH ]; - - if( Cmd_Argc() == 1 ) - { - Com_Printf( "Usage: play \n" ); - return; - } - - while( i < Cmd_Argc() ) - { - my_strlcpy( name, Cmd_Argv( i ), sizeof( name ) ); - - Sound_StartLocalSound( name ); - - i++; - } -} - -PRIVATE void Sound_StopSound_f( void ) -{ - Sound_StopAllSounds(); -} - - -/* ------------------------------------------------------------------------------ - Function: Sound_Restart_f -Console function to restart the sound module. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - Restart the sound subsystem so it can pick up new parameters and flush - all sounds. ------------------------------------------------------------------------------ -*/ -PRIVATE void Sound_Restart_f( void ) -{ - Sound_Shutdown(); - Sound_Init(); -} - -///////////////////////////////////////////////////////////////////// -// End of Console Commands -///////////////////////////////////////////////////////////////////// - - -extern void Sound_SoundList_f( void ); - - -PRIVATE void Sound_Register( void ) -{ - s_initSound = Cvar_Get( "s_initSound", "1", CVAR_INIT ); - s_masterVolume = Cvar_Get( "s_masterVolume", "1.0", CVAR_ARCHIVE ); - s_sfxVolume = Cvar_Get( "s_sfxVolume", "1.0", CVAR_ARCHIVE ); - s_musicVolume = Cvar_Get( "s_musicVolume", "1.0", CVAR_ARCHIVE ); - s_minDistance = Cvar_Get( "s_minDistance", "0.0", CVAR_ARCHIVE ); - s_maxDistance = Cvar_Get( "s_maxDistance", "1.0", CVAR_ARCHIVE ); - s_rolloffFactor = Cvar_Get( "s_rolloffFactor", "1.0", CVAR_ARCHIVE ); - s_dopplerFactor = Cvar_Get( "s_dopplerFactor", "1.0", CVAR_ARCHIVE ); - s_dopplerVelocity = Cvar_Get( "s_dopplerVelocity", "0.0", CVAR_ARCHIVE ); - - Cmd_AddCommand( "play", Sound_Play_f ); - Cmd_AddCommand( "stopsound", Sound_StopSound_f ); - Cmd_AddCommand( "listSounds", Sound_SoundList_f ); - Cmd_AddCommand( "snd_restart", Sound_Restart_f ); -} - - -PUBLIC void Sound_Init( void ) -{ - Com_Printf( "\n------- Sound Initialization -------\n" ); - - - Sound_Register(); - - - if( ! Sound_Device_Setup() ) - { - Com_Printf( "------------------------------------\n" ); - return; - } - - sound_initialized = true; - - Sound_AllocChannels(); - Sound_StopAllSounds(); - - - Com_Printf( "------------------------------------\n" ); -} - - -PUBLIC void Sound_Shutdown( void ) -{ - Cmd_RemoveCommand( "play" ); - Cmd_RemoveCommand( "stopsound" ); - Cmd_RemoveCommand( "listSounds" ); - Cmd_RemoveCommand( "snd_restart" ); - - if( ! sound_initialized ) - { - return; - } - - Sound_FreeSounds(); - Sound_FreeChannels(); - - Sound_Device_Shutdown(); - - sound_initialized = false; -} diff --git a/wolf3d/newCode/env/sound.h b/wolf3d/newCode/env/sound.h deleted file mode 100644 index 92a25f4..0000000 --- a/wolf3d/newCode/env/sound.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - - Copyright (C) 2004-2005 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * sound.h: - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - * Acknowledgement: - * Portion of this code was derived from Quake II Evolved. - * - */ - -#ifndef __SOUND_H__ -#define __SOUND_H__ - -// Sound channels -// Channel 0 never willingly overrides -// Other channels (1-7) always override a playing sound on that channel -#define CHAN_AUTO 0 -#define CHAN_WEAPON 1 -#define CHAN_VOICE 2 -#define CHAN_ITEM 3 -#define CHAN_BODY 4 - -// Modifier flags -#define CHAN_NO_PHS_ADD 8 // Send to all clients, not just ones in PHS (ATTN 0 will also do this) -#define CHAN_RELIABLE 16 // Send by reliable message, not datagram - -// Sound attenuation values -#define ATTN_NONE 0 // Full volume the entire level -#define ATTN_NORM 1 -#define ATTN_IDLE 2 -#define ATTN_STATIC 3 // Diminish very rapidly with distance - - -extern cvar_t *s_device; -extern cvar_t *s_masterVolume; -extern cvar_t *s_sfxVolume; -extern cvar_t *s_musicVolume; - -extern char *sound_devices[ 12 ]; -extern W16 numSoundDevices; -extern W16 numDefaultSoundDevice; - -extern W8 sound_initialized; - -extern void Sound_Init( void ); -extern void Sound_Shutdown( void ); - -extern void Sound_Update( const vec3_t position, const vec3_t velocity, const vec3_t at, const vec3_t up); - -extern void Sound_Activate( _boolean active ); - -extern channel_t *Sound_PickChannel( W32 entNum, W32 entChannel ); - -extern sfx_t *Sound_RegisterSound( const char *name ); -extern void Sound_StartLocalSound( const char *filename ); - -extern void Sound_StreamBGTrack( void ); -extern void Sound_StartStreaming( void ); -extern void Sound_StopStreaming( void ); -extern void Sound_StartBGTrack( const char *introTrack, const char *loopTrack ); -extern void Sound_StopBGTrack( void ); - -extern void Sound_StartSound( const vec3_t position, int entNum, int entChannel, sfx_t *sfx, float volume, float attenuation, int timeOfs ); - -extern void Sound_StopAllSounds( void ); - - -#endif /* __SOUND_H__ */ diff --git a/wolf3d/newCode/env/sound_local.h b/wolf3d/newCode/env/sound_local.h deleted file mode 100644 index 94246a8..0000000 --- a/wolf3d/newCode/env/sound_local.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - - Copyright (C) 2004-2005 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * sound_local.h: - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - * Acknowledgement: - * Portion of this code was derived from Quake II Evolved. - * - */ - - -#ifndef __SOUND_LOCAL_H__ -#define __SOUND_LOCAL_H__ - - -typedef struct sfx_s -{ - char name[ MAX_GAMEPATH ]; - _boolean defaulted; - _boolean loaded; - - int samples; - int rate; - unsigned format; /* Sound samples: format specifier */ - unsigned bufferNum; - - struct sfx_s *nextHash; - -} sfx_t; - -// A playSound will be generated by each call to S_StartSound. -// When the mixer reaches playSound->beginTime, the playSound will be -// assigned to a channel. -typedef struct playSound_s -{ - struct playSound_s *prev, *next; - sfx_t *sfx; - int entNum; - int entChannel; - _boolean fixedPosition; // Use position instead of fetching entity's origin - vec3_t position; // Only use if fixedPosition is set - float volume; - float attenuation; - int beginTime; // Begin at this time - -} playSound_t; - -typedef struct -{ - _boolean streaming; - sfx_t *sfx; // NULL if unused - int entNum; // To allow overriding a specific sound - int entChannel; - int startTime; // For overriding oldest sounds - _boolean loopSound; // Looping sound - int loopNum; // Looping entity number - int loopFrame; // For stopping looping sounds - _boolean fixedPosition; // Use position instead of fetching entity's origin - vec3_t position; // Only use if fixedPosition is set - float volume; - float distanceMult; - unsigned sourceName; // OpenAL sourceName - -} channel_t; - -typedef struct -{ - vec3_t position; - vec3_t velocity; - float orientation[ 6 ]; - -} listener_t; - - - -// extern void Sound_SoundList_f( void ); -extern _boolean Sound_LoadSound( sfx_t *sfx ); -extern sfx_t *Sound_FindSound( const char *name ); -extern void Sound_FreeSounds( void ); - -extern _boolean Sound_Device_Setup( void ); -extern void Sound_Device_Shutdown( void ); - - -#endif /* __SOUND_LOCAL_H__ */ - diff --git a/wolf3d/newCode/env/sound_sfx_id.c b/wolf3d/newCode/env/sound_sfx_id.c deleted file mode 100644 index 99e5155..0000000 --- a/wolf3d/newCode/env/sound_sfx_id.c +++ /dev/null @@ -1,314 +0,0 @@ -/* - - Copyright (C) 2004-2005 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * sound_sfx_id.c: - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - * Acknowledgement: - * Portion of this code was derived from Quake II Evolved. - * - */ - -#include "../wolfiphone.h" - - - -#define SFX_HASHSIZE 256 - -#define MAX_SFX 1024 - -PRIVATE sfx_t *s_sfxHash[ SFX_HASHSIZE ]; -PRIVATE sfx_t *s_sfx[ MAX_SFX ]; -PRIVATE int s_numSfx; - - -PRIVATE _boolean s_registering = false; -PRIVATE W32 s_registration_sequence = 0; - - - - -void Sound_SoundList_f( void ) -{ - -} - - - -/* ------------------------------------------------------------------------------ - Function: Sound_UploadSound -Upload sound data to buffer. - - Parameters: data -[in] Sound data. - sample_size -[in] Sound sample size. - channels -[in] Number of sound channels. - sfx -[in] valid pointer to sfx_t structure. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void Sound_UploadSound( W8 *data, int sample_size, int channels, sfx_t *sfx ) -{ - int size; - - // Calculate buffer size - size = sfx->samples * sample_size * channels; - - // Set buffer format - if( sample_size == 2 ) - { - if( channels == 2 ) - { - sfx->format = AL_FORMAT_STEREO16; - } - else - { - sfx->format = AL_FORMAT_MONO16; - } - - // Upload the sound - pfalGenBuffers( 1, &sfx->bufferNum ); - pfalBufferData( sfx->bufferNum, sfx->format, data, size, sfx->rate ); - } - else - { - /* - We upsample the sound to 16 bit here because the iphone - pops at the beginning and end of buffers with 8 bit. -Cass - (Brian Harris wants to be acknowledeged for helping find - this workaround.) - */ - short *d = (short *)malloc( size * 2 ); - for ( int i = 0; i < size; i++ ) { - d[i] = ((short)data[i] - 128) * 256; - } - if( channels == 2 ) - { - sfx->format = AL_FORMAT_STEREO16; - } - else - { - sfx->format = AL_FORMAT_MONO16; - } - - // Upload the sound - pfalGenBuffers( 1, &sfx->bufferNum ); - pfalBufferData( sfx->bufferNum, sfx->format, d, size * 2, sfx->rate ); - free( d ); - } -} - -/* ------------------------------------------------------------------------------ - Function: Sound_LoadSound -Load sound data. - - Parameters: sfx -[in] Pointer to valid sfx_t structure. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC _boolean Sound_LoadSound( sfx_t *sfx ) -{ - char name[ MAX_GAMEPATH ]; - W8 *data; - soundInfo_t info; - - if( sfx->name[ 0 ] == '*' ) - { - return false; - } - - // See if still in memory - if( sfx->loaded ) - { - return true; - } - - my_strlcpy( name, sfx->name, sizeof( name ) ); - - - if( ! LoadWavInfo( name, &data, &info ) ) - { - if ( ! LoadOggInfo( name, &data, &info ) ) { - sfx->defaulted = true; - - Com_Printf( "Could not find sound (%s)\n", name ); - - return false; - } - } - - sfx->loaded = true; - sfx->samples = info.samples; - sfx->rate = info.sample_rate; - - Sound_UploadSound( data, info.sample_size, info.channels, sfx ); - - Z_Free( data ); - - return true; -} - -/* ------------------------------------------------------------------------------ - Function: Sound_FindSound -Load sound data. - - Parameters: sfx -[in] Pointer to valid sfx_t structure. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC sfx_t *Sound_FindSound( const char *name ) -{ - sfx_t *sfx; - unsigned hashKey; - - if( ! name || ! name[ 0 ] ) - { - Com_Printf( "Sound_FindSound: NULL sound name\n" ); - - return NULL; - } - - if( strlen( name ) >= MAX_GAMEPATH ) - { - Com_Printf( "Sound_FindSound: sound name exceeds MAX_GAMEPATH\n"); - - return NULL; - } - - // See if already loaded - hashKey = (my_strhash( name ) % SFX_HASHSIZE); - - for( sfx = s_sfxHash[ hashKey ] ; sfx ; sfx = sfx->nextHash ) - { - if( ! my_stricmp( sfx->name, name ) ) - { - return sfx; - } - } - - // Create a new sfx_t - if( s_numSfx == MAX_SFX ) - { - Com_Printf( "Sound_FindSound: MAX_SFX hit\n" ); - - return NULL; - } - - s_sfx[ s_numSfx++ ] = sfx = Z_Malloc( sizeof( sfx_t ) ); - - my_strlcpy( sfx->name, name, sizeof( sfx->name ) ); - - // Add to hash table - sfx->nextHash = s_sfxHash[ hashKey ]; - s_sfxHash[ hashKey ] = sfx; - - return sfx; -} - - -PUBLIC void Sound_BeginRegistration( void ) -{ - s_registration_sequence++; - s_registering = true; -} - -PUBLIC sfx_t *Sound_RegisterSound( const char *name ) -{ - sfx_t *sfx; - - if( ! sound_initialized ) - { - return NULL; - } - - if( g_version->value == 1 ) - { - char tempname[ 256 ]; - - my_snprintf( tempname, sizeof( tempname ), "sod%s", name ); - - sfx = Sound_FindSound( tempname ); - } - else - { - sfx = Sound_FindSound( name ); - } - - if( ! s_registering ) - { - Sound_LoadSound( sfx ); - } - - return sfx; -} - -PUBLIC void Sound_EndRegistration( void ) -{ - - s_registering = false; -} - - - - - - -void Sound_FreeSounds( void ) -{ - sfx_t *sfx; - int i; - - // Stop all sounds - Sound_StopAllSounds(); - - // Free all sounds - for( i = 0 ; i < s_numSfx ; ++i ) - { - sfx = s_sfx[ i ]; - - pfalDeleteBuffers( 1, &sfx->bufferNum ); - - Z_Free( sfx ); - } - - memset( s_sfxHash, 0, sizeof( s_sfxHash ) ); - memset( s_sfx, 0, sizeof( s_sfx ) ); - - s_numSfx = 0; -} diff --git a/wolf3d/newCode/env/sound_stream.c b/wolf3d/newCode/env/sound_stream.c deleted file mode 100644 index 567c948..0000000 --- a/wolf3d/newCode/env/sound_stream.c +++ /dev/null @@ -1,516 +0,0 @@ -/* - - Copyright (C) 2005 Michael Liebscher - - 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. - -*/ - -/* - * sound_stream.c: Sound Stream manager. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from Quake II Evolved. - * - */ - -#include "../wolfiphone.h" - - -typedef struct -{ - char introName[ MAX_GAMEPATH ]; - char loopName[ MAX_GAMEPATH ]; - _boolean looping; - - filehandle_t *hFile; - - - int start; - int rate; - unsigned format; - void *vorbisFile; - -} musicTrack_t; - - -// anything greater than 1<<13 caused crashes on iphone OS 2.1 (on a 3G iphone) -#define BUFFER_SIZE (1<<13) - -PRIVATE musicTrack_t bgTrack; - -PRIVATE channel_t *s_streamingChannel; - - -extern void Sound_StopBGTrack( void ); - - - -/* ------------------------------------------------------------------------------ - Function: ovc_read -OGG read Callback. Reads data from a stream. - - Parameters: - ptr -[in] Storage location for data. - size -[in] Item size in bytes. - nmemb -[in] Maximum number of items to be read. - datasource -[in] music track data structure. - - Returns: Nothing - - Notes: ------------------------------------------------------------------------------ -*/ -PRIVATE size_t ovc_read( void *ptr, size_t size, size_t nmemb, void *datasource ) -{ - musicTrack_t *track = (musicTrack_t *)datasource; - - - if( ! size || ! nmemb ) - { - return 0; - } - - - return FS_ReadFile( ptr, size, nmemb, track->hFile ); -} - -/* ------------------------------------------------------------------------------ - Function: ovc_read -OGG seek Callback. Moves the file pointer to a specified - location. - - Parameters: - datasource -[in] music track data structure. - offset -[in] Number of bytes from whence. - whence -[in] Initial position. - - - Returns: - If successful, fseek returns 0. Otherwise, it returns a nonzero - value. - - Notes: ------------------------------------------------------------------------------ -*/ -PRIVATE int ovc_seek( void *datasource, ogg_int64_t offset, int whence ) -{ - musicTrack_t *track = (musicTrack_t *)datasource; - - return FS_FileSeek( track->hFile, offset, whence ); -} - -/* ------------------------------------------------------------------------------ - Function: ovc_close -OGG close Callback. Closes a stream. - - Parameters: datasource -[in] music track data structure. - - Returns: 0 if the stream is successfully closed, otherwise nonzero. - - Notes: ------------------------------------------------------------------------------ -*/ -PRIVATE int ovc_close( void *datasource ) -{ - return 0; -} - -/* ------------------------------------------------------------------------------ - Function: ovc_tell -OGG tell Callback. Gets the current position of a file - pointer. - - Parameters: datasource -[in] music track data structure. - - Returns: The current file position. - - Notes: ------------------------------------------------------------------------------ -*/ -PRIVATE long ovc_tell( void *datasource ) -{ - musicTrack_t *track = (musicTrack_t *)datasource; - - return FS_FileTell( track->hFile ); -} - -/* ------------------------------------------------------------------------------ - Function: Sound_OpenBGTrack -OGG read Callback. - - Parameters: - name -[in] File name to open. - track -[in/out] Music track data structure. - - Returns: False on error, otherwise true. - - Notes: ------------------------------------------------------------------------------ -*/ -PRIVATE _boolean Sound_OpenBGTrack( const char *name, musicTrack_t *track ) -{ - OggVorbis_File *vorbisFile; - vorbis_info *vorbisInfo; - ov_callbacks vorbisCallbacks = {ovc_read, ovc_seek, ovc_close, ovc_tell}; - int ret; - extern cvar_t *music; - - if ( music->value == 0 ) { - return 0; - } - - track->hFile = FS_OpenFile( name, 0 ); - if( ! track->hFile ) - { - return false; - } - - - track->vorbisFile = vorbisFile = Z_Malloc( sizeof( OggVorbis_File ) ); - - if( (ret = ov_open_callbacks( track, vorbisFile, NULL, 0, vorbisCallbacks )) < 0 ) - { - switch( ret ) - { - case OV_EREAD: - Com_DPrintf( "A read from media returned an error.(%s)\n", name ); - break; - case OV_ENOTVORBIS: - Com_DPrintf( "Bitstream is not Vorbis data.(%s)\n", name ); - break; - case OV_EVERSION: - Com_DPrintf( "Vorbis version mismatch.(%s)\n", name ); - break; - case OV_EBADHEADER: - Com_DPrintf( "Invalid Vorbis bitstream header.(%s)\n", name ); - break; - case OV_EFAULT: - Com_DPrintf( "Internal logic fault; indicates a bug or heap/stack corruption.(%s)\n", name ); - break; - - } - Com_DPrintf( "Could not open OGG stream (%s)\n", name ); - - return false; - } - - vorbisInfo = ov_info( vorbisFile, -1 ); - if( vorbisInfo->channels != 1 && vorbisInfo->channels != 2 ) - { - Com_DPrintf( "Only mono and stereo OGG files supported (%s)\n", name ); - - return false; - } - - track->start = ov_raw_tell( vorbisFile ); - track->rate = vorbisInfo->rate; - track->format = (vorbisInfo->channels == 2) ? AL_FORMAT_STEREO16 : AL_FORMAT_MONO16; - - return true; -} - -/* ------------------------------------------------------------------------------ - Function: Sound_CloseBGTrack -Close out background music track. - - Parameters: track -[in] Music track to close. - - Returns: Nothing - - Notes: ------------------------------------------------------------------------------ -*/ -PRIVATE void Sound_CloseBGTrack( musicTrack_t *track ) -{ - if( track->vorbisFile ) - { - ov_clear( track->vorbisFile ); - - Z_Free( track->vorbisFile ); - track->vorbisFile = NULL; - } - - if( track->hFile ) - { - FS_CloseFile( track->hFile ); - } -} - -/* ------------------------------------------------------------------------------ - Function: Sound_StreamBGTrack -Called each frame to update streaming music - track. - - Parameters: Nothing - - Returns: Nothing - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void Sound_StreamBGTrack( void ) -{ - - W8 data[BUFFER_SIZE]; - int processed, queued, state; - int size, read, dummy; - unsigned buffer; - - if( ! s_musicVolume->value ) - { - return; - } - - if( ! s_streamingChannel ) - { - return; - } - - // Unqueue and delete any processed buffers - pfalGetSourcei( s_streamingChannel->sourceName, AL_BUFFERS_PROCESSED, &processed ); - if( processed > 0 ) - { - while (processed--) - { - pfalSourceUnqueueBuffers( s_streamingChannel->sourceName, 1, &buffer ); - pfalDeleteBuffers( 1, &buffer ); - } - } - - // Make sure we always have at least 4 buffers in the queue - pfalGetSourcei( s_streamingChannel->sourceName, AL_BUFFERS_QUEUED, &queued ); - while( queued < 4 ) - { - size = 0; - - // Stream from disk - while( size < BUFFER_SIZE ) - { - read = ov_read( bgTrack.vorbisFile, (char *)data + size, BUFFER_SIZE - size, &dummy ); - if( read == 0 ) - { - // End of file - if( ! bgTrack.looping) - { - // Close the intro track - Sound_CloseBGTrack( &bgTrack ); - - // Open the loop track - if( ! Sound_OpenBGTrack( bgTrack.loopName, &bgTrack ) ) - { - Sound_StopBGTrack(); - return; - } - - bgTrack.looping = true; - } - - // Restart the track, skipping over the header - ov_raw_seek( bgTrack.vorbisFile, (ogg_int64_t)bgTrack.start ); - - // Try streaming again - read = ov_read( bgTrack.vorbisFile, (char *)data + size, BUFFER_SIZE - size, &dummy ); - } - - if( read <= 0 ) - { - // An error occurred - Sound_StopBGTrack(); - return; - } - - size += read; - } - - // Upload and queue the new buffer - pfalGenBuffers( 1, &buffer ); - pfalBufferData( buffer, bgTrack.format, data, size, bgTrack.rate ); - pfalSourceQueueBuffers( s_streamingChannel->sourceName, 1, &buffer ); - - queued++; - } - - // Update volume - pfalSourcef( s_streamingChannel->sourceName, AL_GAIN, s_musicVolume->value ); - - // If not playing, then do so - pfalGetSourcei( s_streamingChannel->sourceName, AL_SOURCE_STATE, &state ); - if( state != AL_PLAYING ) - { - pfalSourcePlay(s_streamingChannel->sourceName); - } -} - -/* ------------------------------------------------------------------------------ - Function: Sound_StartStreaming -Start streaming background music track. - - Parameters: Nothing - - Returns: Nothing - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void Sound_StartStreaming( void ) -{ - if( ! sound_initialized ) - { - return; - } - - if( s_streamingChannel ) - { - return; - } - - s_streamingChannel = Sound_PickChannel( 0, 0 ); - if( ! s_streamingChannel ) - { - return; - } - - s_streamingChannel->streaming = true; - - // hmmm... - pfalDeleteSources( 1, &s_streamingChannel->sourceName ); - pfalGenSources( 1, &s_streamingChannel->sourceName ); - - // Set up the source - pfalSourcei( s_streamingChannel->sourceName, AL_BUFFER, 0 ); - pfalSourcei( s_streamingChannel->sourceName, AL_LOOPING, AL_FALSE ); - pfalSourcei( s_streamingChannel->sourceName, AL_SOURCE_RELATIVE, AL_TRUE ); - pfalSourcefv( s_streamingChannel->sourceName, AL_POSITION, vec3_origin ); - pfalSourcefv( s_streamingChannel->sourceName, AL_VELOCITY, vec3_origin ); - pfalSourcef( s_streamingChannel->sourceName, AL_REFERENCE_DISTANCE, 1.0 ); - pfalSourcef( s_streamingChannel->sourceName, AL_MAX_DISTANCE, 1.0 ); - pfalSourcef( s_streamingChannel->sourceName, AL_ROLLOFF_FACTOR, 0.0 ); -} - -/* ------------------------------------------------------------------------------ - Function: Sound_StopStreaming -Stop playing streaming music track. - - Parameters: Nothing - - Returns: Nothing - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void Sound_StopStreaming( void ) -{ - int processed; - unsigned buffer; - - if( ! sound_initialized ) - { - return; - } - - if( ! s_streamingChannel ) - { - return; - } - - s_streamingChannel->streaming = false; - - - pfalSourceStop( s_streamingChannel->sourceName ); - - pfalGetSourcei( s_streamingChannel->sourceName, AL_BUFFERS_PROCESSED, &processed ); - if( processed > 0 ) - { - while( processed-- ) - { - pfalSourceUnqueueBuffers( s_streamingChannel->sourceName, 1, &buffer ); - pfalDeleteBuffers( 1, &buffer ); - } - } - - pfalSourcei( s_streamingChannel->sourceName, AL_BUFFER, 0 ); - - // hmmm... - pfalDeleteSources( 1, &s_streamingChannel->sourceName ); - pfalGenSources( 1, &s_streamingChannel->sourceName ); - - s_streamingChannel = NULL; -} - -/* ------------------------------------------------------------------------------ - Function: Sound_StartBGTrack -Play background music track. - - Parameters: - introTrack -[in] File name of intro track. - loopTrack -[in] File name of loop track. - - Returns: Nothing - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void Sound_StartBGTrack( const char *introTrack, const char *loopTrack ) -{ - if( ! sound_initialized ) - { - return; - } - - Sound_StopBGTrack(); - - - my_strlcpy( bgTrack.introName, introTrack, sizeof( bgTrack.introName ) ); - my_strlcpy( bgTrack.loopName, loopTrack, sizeof( bgTrack.loopName) ); - - Sound_StartStreaming(); - - if( ! Sound_OpenBGTrack( bgTrack.introName, &bgTrack ) ) - { - Sound_StopBGTrack(); - return; - } - - Sound_StreamBGTrack(); -} - -/* ------------------------------------------------------------------------------ - Function: Sound_StopBGTrack -Stop playing background track. - - Parameters: Nothing - - Returns: Nothing - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void Sound_StopBGTrack( void ) -{ - if( ! sound_initialized ) - { - return; - } - - Sound_StopStreaming(); - - Sound_CloseBGTrack( &bgTrack ); - - memset( &bgTrack, 0, sizeof( musicTrack_t ) ); -} diff --git a/wolf3d/newCode/env/texture_manager.c b/wolf3d/newCode/env/texture_manager.c deleted file mode 100644 index 815c855..0000000 --- a/wolf3d/newCode/env/texture_manager.c +++ /dev/null @@ -1,1379 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 Id Software, Inc. - Copyright (C) 1995 Spencer Kimball and Peter Mattis. - - 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. - -*/ - -/* - * texture_manager.c: Texture manager. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from - * The GIMP (an image manipulation program) and was originally - * written by Spencer Kimball and Peter Mattis. - * - * Portion of this code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -#include "../wolfiphone.h" - -PRIVATE texture_t ttextures[ MAX_TEXTURES ]; -PRIVATE int numttextures; - -PRIVATE texture_t *r_notexture; // use for bad textures - -cvar_t *gl_round_down; - -int registration_sequence; -W32 texture_registration_sequence; - -extern int currentTextures[ 4 ]; -extern int currenttmu; -extern int glMaxTexSize; - -PRIVATE INLINECALL GLenum WrapToGL( TWrapMode mode ) -{ - if( mode == Repeat ) - { - return GL_REPEAT; - } - else - { - return GL_CLAMP_TO_EDGE; - } -} - -PRIVATE INLINECALL GLenum MagFilterToGL( TMagFilter MagFilter ) -{ - switch( MagFilter ) - { - case Nearest: - return GL_NEAREST; - - case Linear: - return GL_LINEAR; - - default: - break; - } - - return GL_LINEAR; -} - - - -PRIVATE INLINECALL GLenum MinFilterToGL( _boolean MipMap, TMinFilter MinFilter ) -{ - if( MipMap ) - { - switch( MinFilter ) - { - case NearestMipMapOff: - return GL_NEAREST; - - case NearestMipMapNearest: - return GL_NEAREST_MIPMAP_NEAREST; - - case NearestMipMapLinear: - return GL_NEAREST_MIPMAP_LINEAR; - - case LinearMipMapOff: - return GL_LINEAR; - - case LinearMipMapNearest: - return GL_LINEAR_MIPMAP_NEAREST; - - case LinearMipMapLinear: - return GL_LINEAR_MIPMAP_LINEAR; - - default: - break; - } - } - else - { - switch( MinFilter ) - { - case NearestMipMapOff: - case NearestMipMapNearest: - case NearestMipMapLinear: - return GL_NEAREST; - - case LinearMipMapOff: - case LinearMipMapNearest: - case LinearMipMapLinear: - return GL_LINEAR; - - default: - break; - } - } - - return GL_LINEAR; -} - - -/* ------------------------------------------------------------------------------ - Function: TM_TextureList_f -Console function to list loaded textures. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void TM_TextureList_f( void ) -{ - int i; - texture_t *image; - int texels; - const char *palstrings[ 2 ] = - { - "RGB", - "PAL" - }; - - Com_Printf( "------------------\n" ); - texels = 0; - - for( i = 0, image = ttextures ; i < numttextures ; ++i, ++image ) - { - if( image->texnum <= 0 ) - continue; - - texels += image->upload_width * image->upload_height; - - switch( image->type ) - { - case TT_Sprite: - Com_Printf( "S" ); - break; - - case TT_Wall: - Com_Printf( "W" ); - break; - - case TT_Pic: - Com_Printf( "P" ); - break; - - default: - Com_Printf( " " ); - break; - } - - Com_Printf( " %3i %3i %s: %s\n", - image->upload_width, image->upload_height, palstrings[ 0 ], image->name ); - } - - Com_Printf( "Total texel count (not counting mipmaps): %i\n", texels ); - -} - -texture_t *TM_AllocateTexture( const char *name ) { - texture_t *tex; - int i; - - assert( strlen( name ) < sizeof( tex->name ) ); - - // find a free texture_t space - for( i = 0, tex = ttextures; i < numttextures; ++i, ++tex ) - { - if( ! tex->texnum ) - { - break; - } - } - - if( i == numttextures ) - { - if( numttextures == MAX_TEXTURES ) - { - Com_DPrintf( "MAX_TEXTURES reached\n" ); - return r_notexture; - } - - numttextures++; - } - tex = &ttextures[ i ]; - memset( tex, 0, sizeof( *tex ) ); - my_strlcpy( tex->name, name, MAX_GAMEPATH ); - tex->registration_sequence = texture_registration_sequence; - - // don't let R_Bind skip the next bind call - currentTextures[ currenttmu ] = -1; - - pfglGenTextures( 1, &tex->texnum ); - pfglBindTexture( GL_TEXTURE_2D, tex->texnum ); - - return tex; -} - -/* ------------------------------------------------------------------------------ - Function: TM_LoadTexture -Load raw image into video memory. - - Parameters: - name -[in] Name of texture image. - data -[in] Raw pixel data in the format described by PixelFormat. - width -[in] Width of image in pixels. - height -[in] Height of image in pixels. - type -[in] - PixelFormat [in] - - Returns: Pointer to filled out texture_t structure. - - Notes: Any texture that was not touched on this registration sequence will be freed. ------------------------------------------------------------------------------ -*/ -PUBLIC texture_t *TM_LoadTexture( const char *name, W8 *data, int width, int height, texturetype_t type, W16 bytes ) -{ - texture_t *tex; - W8 *scaled; - W16 scaled_width, scaled_height; - - tex = TM_AllocateTexture( name ); - - tex->width = width; - tex->height = height; - tex->type = type; - tex->bytes = bytes; - - switch( type ) - { - case TT_Pic: - tex->MipMap = false; - tex->WrapS = Clamp; - tex->WrapT = Clamp; - tex->MinFilter = Nearest; - tex->MagFilter = NearestMipMapOff; - break; - - case TT_Wall: - tex->MipMap = true; - tex->WrapS = Repeat; - tex->WrapT = Repeat; -// tex->MinFilter = LinearMipMapLinear; - tex->MinFilter = LinearMipMapNearest; - tex->MagFilter = Linear; - break; - - default: - tex->WrapS = Repeat; - tex->WrapT = Repeat; - tex->MinFilter = Nearest; - tex->MagFilter = NearestMipMapOff; - break; - } - - - for( scaled_width = 1 ; scaled_width < tex->width ; scaled_width <<= 1 ) - { - ; - } - - if( gl_round_down->value && scaled_width > tex->width && tex->MipMap ) - { - scaled_width >>= 1; - } - - for( scaled_height = 1 ; scaled_height < tex->height ; scaled_height <<= 1 ) - { - ; - } - - if( gl_round_down->value && scaled_height > tex->height && tex->MipMap ) - { - scaled_height >>= 1; - } - - // let people sample down the world textures for speed - if( tex->MipMap ) - { - scaled_width >>= (int)gl_picmip->value; - scaled_height >>= (int)gl_picmip->value; - } - - // don't ever bother with > glMaxTexSize textures - if( scaled_width > glMaxTexSize ) - { - scaled_width = glMaxTexSize; - } - if( scaled_height > glMaxTexSize ) - { - scaled_height = glMaxTexSize; - } - - if( scaled_width < 1 ) - { - scaled_width = 1; - } - if( scaled_height < 1 ) - { - scaled_height = 1; - } - - tex->upload_width = scaled_width; - tex->upload_height = scaled_height; - - if( scaled_width == tex->width && scaled_height == tex->height ) - { - scaled = data; - } - else - { - scaled = Z_Malloc( scaled_width * scaled_height * tex->bytes ); - TM_ResampleTexture( data, tex->width, tex->height, scaled, scaled_width, scaled_height, tex->bytes, INTERPOLATION_NONE ); - } - - { - // upload base image - GLenum internalFormat[] = { GL_LUMINANCE, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_RGB, GL_RGBA }; -#if 0 - GLenum externalFormat[] = { GL_LUMINANCE, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_UNSIGNED_SHORT_5_6_5, GL_UNSIGNED_SHORT_5_5_5_1 }; - pfglTexImage2D( GL_TEXTURE_2D, 0, internalFormat[ tex->bytes ], scaled_width, scaled_height, 0, tex->bytes == 4 ? GL_RGBA : GL_RGB, externalFormat[ tex->bytes ], scaled ); -#else - pfglTexImage2D( GL_TEXTURE_2D, 0, internalFormat[ tex->bytes ], scaled_width, scaled_height, 0, tex->bytes == 4 ? GL_RGBA : GL_RGB, GL_UNSIGNED_BYTE, scaled ); -#endif - - - // upload mipmaps if required -#ifdef IPHONE - glGenerateMipmapOES( GL_TEXTURE_2D ); -#else - if( tex->MipMap ) - { - int miplevel = 0; - - while( TM_MipMap( scaled, &scaled_width, &scaled_height, tex->bytes ) ) - { - pfglTexImage2D( GL_TEXTURE_2D, ++miplevel, internalFormat[ tex->bytes ], scaled_width, scaled_height, 0, tex->bytes == 4 ? GL_RGBA : GL_RGB, GL_UNSIGNED_BYTE, scaled ); - } - } -#endif - } - - if ( scaled != data ) { - Z_Free( scaled ); - } - - pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, WrapToGL( tex->WrapS ) ); - pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, WrapToGL( tex->WrapT ) ); - pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, MinFilterToGL( tex->MipMap, tex->MinFilter ) ); - pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, MagFilterToGL( tex->MagFilter ) ); - -#ifdef IPHONE - if ( type == TT_Wall ) { - pfglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 2.0f ); - } else { - pfglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 0 ); - } -#endif - - - return tex; -} - - -/* ------------------------------------------------------------------------------ - Function: TM_FreeUnusedTextures -Free unused textures. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: Any texture that was not touched on this registration sequence will be freed. ------------------------------------------------------------------------------ -*/ -PUBLIC void TM_FreeUnusedTextures( void ) -{ -#if 0 - int i; - texture_t *tex; - - // never free r_notexture texture - r_notexture->registration_sequence = texture_registration_sequence; - - for( i = 0, tex = ttextures ; i < numttextures ; ++i, ++tex ) - { - if( tex->registration_sequence == texture_registration_sequence ) - continue; // used this sequence - - if( ! tex->registration_sequence ) - continue; // free image_t slot - - if( tex->type == TT_Pic ) - continue; // don't free pics - - // free texture - R_DeleteTexture( tex->texnum ); - memset( tex, 0, sizeof( *tex ) ); - } -#endif -} - - -/* ------------------------------------------------------------------------------ - Function: TM_FindTexture -Find texture. - - Parameters: name -[in] Name of the texture to find. - type -[in] Type of texture (see texturetype_t). - - Returns: r_notexture if the texture is not found, otherwise it will - return a valid texture_t structure. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC texture_t *TM_FindTexture( const char *name, texturetype_t type ) -{ - texture_t *tex; - int i, len; - W8 *data; /* raw texture data */ - W16 width, height; /* width, height of texture */ - W16 bytes; - char digested[1024]; - filehandle_t *fh; - - if( ! name || ! *name ) - { - return r_notexture; - } - - // Check for file extension - len = strlen( name ); - if( len < 5 ) - { - return r_notexture; - } - - // look for it in the texture cache - for( i = 0, tex = ttextures; i < numttextures; ++i, ++tex ) - { - if( ! strcmp( name, tex->name ) ) - { - tex->registration_sequence = texture_registration_sequence; - return tex; - } - } - - // - // load the texture from disk - // - data = NULL; - if( strcmp( name + len - 4, ".tga" ) ) { - return r_notexture; - } - - // look for the pre-digested 5551 version - strcpy( digested, name ); - strcpy( digested + len - 4, ".5551" ); - fh = FS_OpenFile( digested, 0 ); - if ( fh ) { - picHeader_t *ph = (picHeader_t *)fh->filedata; - int w = ph->uploadWidth; - int h = ph->uploadHeight; - int l = 0; - texture_t *tx = TM_AllocateTexture( name ); - tx->width = w; - tx->height = h; - tx->upload_width = w; - tx->upload_height = h; - tx->header = *ph; - unsigned short *s = (unsigned short *)(ph+1); - while( 1 ) { - pfglTexImage2D( GL_TEXTURE_2D, l, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, s ); - if ( w == 1 && h == 1 ) { - break; - } - l++; - s += w*h; - w >>= 1; - if ( w == 0 ) { - w = 1; - } - h >>= 1; - if ( h == 0 ) { - h = 1; - } - } - FS_CloseFile( fh ); - pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); - pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); - pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR ); - pfglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - - if ( type == TT_Wall ) { - pfglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 2.0f ); - } else { - pfglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 0 ); - } - return tx; - } - - // load a normal TGA - LoadTGA( name, &data, &width, &height, &bytes ); - if ( data ) { - tex = TM_LoadTexture( name, data, width, height, type, bytes ); - MM_FREE( data ); - return tex; - } - - // load a jpg - { - int jpgSize = 0; - W8 *jpgData; - void iPhoneLoadJPG( W8* jpegData, int jpegBytes, W8 **pic, W16 *width, W16 *height, W16 *bytes ); - // try jpeg if no tga exists - strcpy( digested, name ); - strcpy( digested + len - 4, ".jpg" ); - fh = FS_OpenFile( digested, 0 ); - if ( fh == NULL ) { - Com_Printf( "Failed to find texture %s\n", name ); - return r_notexture; - } - jpgSize = FS_GetFileSize( fh ); - jpgData = fh->ptrStart; - - iPhoneLoadJPG( jpgData, jpgSize, &data, &width, &height, &bytes ); - FS_CloseFile( fh ); - - if ( ! data ) { - free( jpgData ); - return r_notexture; - } - tex = TM_LoadTexture( name, data, width, height, type, bytes ); - MM_FREE( data ); - return tex; - } - - return NULL; -} - -/* ------------------------------------------------------------------------------ - Function: TM_GetTextureSize -Find texture. - - Parameters:width -[out] Width of texture. - height -[out] Height of texture. - name -[in] Name of the texture to get dimensions of. - - - Returns: Nothing. - - Notes: If texture is not found, width and height are -1. ------------------------------------------------------------------------------ -*/ -PUBLIC void TM_GetTextureSize( SW32 *width, SW32 *height, const char *name ) -{ - texture_t *tex; - - tex = TM_FindTexture( name, TT_Pic ); - if( ! tex ) - { - *width = *height = -1; - return; - } - - *width = tex->width; - *height = tex->height; -} - - - - - - - -/* Note: cubic function no longer clips result */ -PRIVATE INLINECALL double -cubic (double dx, - int jm1, - int j, - int jp1, - int jp2) -{ - /* Catmull-Rom - not bad */ - return (double) ((( ( - jm1 + 3 * j - 3 * jp1 + jp2 ) * dx + - ( 2 * jm1 - 5 * j + 4 * jp1 - jp2 ) ) * dx + - ( - jm1 + jp1 ) ) * dx + (j + j) ) / 2.0; -} - -_boolean pixel_region_has_alpha( int bytes ) -{ - if( bytes == 2 || bytes == 4 ) - { - return true; - } - else - { - return false; - } -} - - -PRIVATE void -expand_line( double *dest, - double *src, - int bytes, - int old_width, - int width ) -{ - double ratio; - int x,b; - int src_col; - double frac; - double *s; - - ratio = old_width / (double) width; - - /* we can overflow src's boundaries, so we expect our caller to have - allocated extra space for us to do so safely (see scale_region ()) */ - - /* this could be optimized much more by precalculating the coefficients for - each x */ - - for( x = 0; x < width; ++x ) - { - src_col = ((int) (x * ratio + 2.0 - 0.5)) - 2; - /* +2, -2 is there because (int) rounds towards 0 and we need - to round down */ - frac = (x * ratio - 0.5) - src_col; - s = &src[ src_col * bytes ]; - for( b = 0 ; b < bytes ; b++ ) - dest[ b ] = cubic( frac, (int)s[ b - bytes ], (int)s[ b ], (int)s[ b + bytes ], (int)s[ b + bytes * 2 ] ); - - dest += bytes; - } - -} - - -PRIVATE void -shrink_line( double *dest, - double *src, - int bytes, - int old_width, - int width ) -{ - int x; - int b; - double *srcp; - double *destp; - double accum[4]; - double slice; - const double avg_ratio = (double) width / old_width; - const double inv_width = 1.0 / width; - int slicepos; /* slice position relative to width */ - -#if 0 - - Com_DPrintf( "shrink_line bytes=%d old_width=%d width=%d interp=%d " - "avg_ratio=%f\n", - bytes, old_width, width, interp, avg_ratio); - -#endif - -// g_return_if_fail( bytes <= 4 ); - - /* This algorithm calculates the weighted average of pixel data that - each output pixel must receive, taking into account that it always - scales down, i.e. there's always more than one input pixel per each - output pixel. */ - - srcp = src; - destp = dest; - - slicepos = 0; - - /* Initialize accum to the first pixel slice. As there is no partial - pixel at start, that value is 0. The source data is interleaved, so - we maintain BYTES accumulators at the same time to deal with that - many channels simultaneously. */ - for( b = 0 ; b < bytes ; ++b ) - { - accum[ b ] = 0.0; - } - - for( x = 0 ; x < width ; x++ ) - { - /* Accumulate whole pixels. */ - do - { - for( b = 0 ; b < bytes ; b++ ) - accum[ b ] += *srcp++; - - slicepos += width; - } - while( slicepos < old_width ); - slicepos -= old_width; - - if( ! (slicepos < width)) - Com_Printf( "Assertion (slicepos < width) failed. Please report.\n" ); - - if( slicepos == 0 ) - { - /* Simplest case: we have reached a whole pixel boundary. Store - the average value per channel and reset the accumulators for - the next round. - - The main reason to treat this case separately is to avoid an - access to out-of-bounds memory for the first pixel. */ - for (b = 0; b < bytes; b++) - { - *destp++ = accum[b] * avg_ratio; - accum[b] = 0.0; - } - } - else - { - for( b = 0; b < bytes; b++ ) - { - /* We have accumulated a whole pixel per channel where just a - slice of it was needed. Subtract now the previous pixel's - extra slice. */ - slice = srcp[- bytes + b] * slicepos * inv_width; - *destp++ = (accum[b] - slice) * avg_ratio; - - /* That slice is the initial value for the next round. */ - accum[b] = slice; - } - } - } - - /* Sanity check: srcp should point to the next-to-last position, and - slicepos should be zero. */ - if( ! (srcp - src == old_width * bytes && slicepos == 0) ) - { - Com_Printf ("Assertion (srcp - src == old_width * bytes && slicepos == 0)" - " failed. Please report."); - } -} - -PRIVATE void pixel_region_get_row( W8 *src, int y, int width, W8 *tmp_src, int BytesPerPixel ) -{ - int i; - unsigned long k = 0; - unsigned char *scanline = tmp_src; - unsigned char *ptr = src; - - for( i = 0 ; i < (width * BytesPerPixel) ; ++i ) - { - scanline[ k++ ] = ptr[ y * width * BytesPerPixel + i ]; - } -} - -PRIVATE void pixel_region_set_row( W8 *dest, - int BytesPerPixel, - int y, - int width, - W8 *data ) -{ - int i; - unsigned long k = 0; - unsigned char *scanline = dest; - unsigned char *ptr = data; - - for( i = 0 ; i < (width * BytesPerPixel) ; ++i ) - { - scanline[ y * width * BytesPerPixel + i ] = ptr[ k++ ]; - } -} - -PRIVATE void -get_premultiplied_double_row( W8 *in, - int PRbytes, - int x, - int y, - int w, - double *row, - W8 *tmp_src, - int n ) -{ - int b; - int bytes = PRbytes; - - pixel_region_get_row( in, y, w, tmp_src, bytes ); - - if( pixel_region_has_alpha( bytes ) ) - { - /* premultiply the alpha into the double array */ - double *irow = row; - int alpha = bytes - 1; - double mod_alpha; - - for( x = 0; x < w; ++x ) - { - mod_alpha = tmp_src[ alpha ] / 255.0; - for( b = 0; b < alpha; ++b ) - { - irow[ b ] = mod_alpha * tmp_src[ b ]; - } - - irow[ b ] = tmp_src[ alpha ]; - irow += bytes; - tmp_src += bytes; - } - } - else /* no alpha */ - { - for( x = 0; x < w * bytes; ++x ) - { - row[ x ] = tmp_src[ x ]; - } - } - - /* set the off edge pixels to their nearest neighbor */ - for( b = 0; b < 2 * bytes; b++ ) - { - row[ b - 2 * bytes ] = row[ b % bytes ]; - } - - for( b = 0; b < bytes * 2; b++ ) - { - row[ b + w * bytes ] = row[ (w - 1) * bytes + b % bytes ]; - } -} - - -PRIVATE INLINECALL void -rotate_pointers( W8 **p, W32 n ) -{ - W32 i; - W8 *tmp; - - tmp = p[ 0 ]; - for( i = 0 ; i < n-1 ; i++ ) - { - p[ i ] = p[ i + 1 ]; - } - - p[ i ] = tmp; -} - -PRIVATE void -get_scaled_row( double **src, - int y, - int new_width, - double *row, - W8 *src_tmp, - W8 *srcPR, - int old_width, - int old_height, - int bytes ) -{ - /* get the necesary lines from the source image, scale them, - and put them into src[] */ - rotate_pointers( (unsigned char **)src, 4 ); - - if( y < 0 ) - { - y = 0; - } - - if( y < old_height ) - { - get_premultiplied_double_row( srcPR, bytes, 0, y, old_width, - row, src_tmp, 1 ); - if( new_width > old_width ) - { - expand_line( src[3], row, bytes, old_width, new_width ); - } - else if( old_width > new_width ) - { - shrink_line( src[3], row, bytes, old_width, new_width ); - } - else /* no scailing needed */ - { - memcpy( src[3], row, sizeof( double ) * new_width * bytes ); - } - } - else - { - memcpy( src[3], src[2], sizeof( double ) * new_width * bytes ); - } -} - - -/* -non-interpolating scale_region. - */ -PRIVATE void -scale_region_no_resample( W8 *in, int inwidth, int inheight, - W8 *out, int outwidth, int outheight, char bytes ) -{ - int *x_src_offsets; - int *y_src_offsets; - W8 *src; - W8 *dest; - int width, height, orig_width, orig_height; - int last_src_y; - int row_bytes; - int x, y, b; - - - orig_width = inwidth; - orig_height = inheight; - - width = outwidth; - height = outheight; - - - /* the data pointers... */ - x_src_offsets = (int *) MM_MALLOC( sizeof( int ) * width * bytes ); - y_src_offsets = (int *) MM_MALLOC( sizeof( int ) * height ); - src = (unsigned char *) MM_MALLOC( orig_width * bytes); - dest = (unsigned char *) MM_MALLOC( width * bytes); - - /* pre-calc the scale tables */ - for( b = 0; b < bytes; b++ ) - { - for( x = 0; x < width; x++ ) - { - x_src_offsets[ b + x * bytes ] = - b + bytes * ((x * orig_width + orig_width / 2) / width); - } - } - - for( y = 0; y < height; y++ ) - { - y_src_offsets[ y ] = (y * orig_height + orig_height / 2) / height; - } - - /* do the scaling */ - row_bytes = width * bytes; - last_src_y = -1; - for( y = 0; y < height; y++ ) - { - /* if the source of this line was the same as the source - * of the last line, there's no point in re-rescaling. - */ - if( y_src_offsets[ y ] != last_src_y ) - { - pixel_region_get_row( in, y_src_offsets[ y ], orig_width, src, bytes ); - //pixel_region_get_row( srcPR, 0, y_src_offsets[y], orig_width, src, 1 ); - for( x = 0 ; x < row_bytes ; x++ ) - { - dest[ x ] = src[ x_src_offsets[ x ] ]; - } - last_src_y = y_src_offsets[ y ]; - } - - pixel_region_set_row( out, bytes, y, width, dest ); - } - - MM_FREE( x_src_offsets ); - MM_FREE( y_src_offsets ); - MM_FREE( src ); - MM_FREE( dest ); -} - - -/* ------------------------------------------------------------------------------ - Function: TM_ResampleTexture -Resize texture. - - Parameters: - in -[in] Original texture data. - inwidth -[in] Original width of texture in pixels. - inheight -[in] Original height of texture in pixels. - out -[in/out] Resized texture data. - outwidth -[in] New width of texture in pixels. - outheight -[in] New height of texture in pixels. - bytes -[in] Number of bytes per pixel. - interpolation -[in] see InterpolationType - - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void TM_ResampleTexture( W8 *in, int inwidth, int inheight, W8 *out, int outwidth, int outheight, W8 bytes, InterpolationType interpolation ) -{ - double *src[ 4 ]; - W8 *src_tmp; - W8 *dest; - double *row, *accum; - int b; - int width, height; - int orig_width, orig_height; - double y_rat; - int i; - int old_y = -4; - int new_y; - int x, y; - - - if( interpolation == INTERPOLATION_NONE ) - { - scale_region_no_resample( in, inwidth, inheight, out, outwidth, outheight, bytes ); - return; - } - - - orig_width = inwidth; - orig_height = inheight; - - width = outwidth; - height = outheight; - -#if 0 - - Com_DPrintf( "scale_region: (%d x %d) -> (%d x %d)\n", - orig_width, orig_height, width, height ); - -#endif - - /* find the ratios of old y to new y */ - y_rat = (double) orig_height / (double) height; - - - /* the data pointers... */ - for( i = 0 ; i < 4 ; ++i ) - { - src[ i ] = (double *) MM_MALLOC( sizeof( double ) * width * bytes ); - } - - dest = (PW8) MM_MALLOC( width * bytes); - - src_tmp = (PW8) MM_MALLOC( orig_width * bytes ); - - /* offset the row pointer by 2*bytes so the range of the array - is [-2*bytes] to [(orig_width + 2)*bytes] */ - row = (double *) MM_MALLOC( sizeof( double ) * (orig_width + 2 * 2) * bytes ); - row += bytes * 2; - - accum = (double *) MM_MALLOC( sizeof( double ) * width * bytes ); - - - /* Scale the selected region */ - - for( y = 0 ; y < height ; y++ ) - { - - if( height < orig_height ) - { - int max; - double frac; - const double inv_ratio = 1.0 / y_rat; - - if( y == 0 ) /* load the first row if this is the first time through */ - { - get_scaled_row( &src[0], 0, width, row, src_tmp, in, orig_width, orig_height, bytes ); - } - - new_y = (int)(y * y_rat); - frac = 1.0 - (y * y_rat - new_y); - for( x = 0 ; x < width * bytes; ++x ) - { - accum[x] = src[3][x] * frac; - } - - max = (int) ((y + 1) * y_rat) - new_y - 1; - - get_scaled_row( &src[ 0 ], ++new_y, width, row, src_tmp, in, orig_width, orig_height, bytes ); - - while( max > 0 ) - { - for( x = 0 ; x < width * bytes ; ++x ) - { - accum[x] += src[ 3 ][ x ]; - } - - get_scaled_row( &src[ 0 ], ++new_y, width, row, src_tmp, in, orig_width, orig_height, bytes ); - max--; - } - - frac = (y + 1) * y_rat - ((int) ((y + 1) * y_rat)); - for( x = 0 ; x < width * bytes ; ++x ) - { - accum[ x ] += frac * src[ 3 ][ x ]; - accum[ x ] *= inv_ratio; - } - } - else if( height > orig_height ) - { - double p0, p1, p2, p3; - double dy; - - new_y = (int)floor( y * y_rat - 0.5 ); - - while( old_y <= new_y ) - { - /* get the necesary lines from the source image, scale them, - and put them into src[] */ - get_scaled_row( &src[ 0 ], old_y + 2, width, row, src_tmp, in, orig_width, orig_height, bytes ); - old_y++; - } - - dy = (y * y_rat - 0.5) - new_y; - - p0 = cubic( dy, 1, 0, 0, 0 ); - p1 = cubic( dy, 0, 1, 0, 0 ); - p2 = cubic( dy, 0, 0, 1, 0 ); - p3 = cubic( dy, 0, 0, 0, 1 ); - - for( x = 0 ; x < width * bytes ; ++x ) - { - accum[ x ] = ( p0 * src[ 0 ][ x ] + p1 * src[ 1 ][ x ] + - p2 * src[ 2 ][ x ] + p3 * src[ 3 ][ x ] ); - } - - - } - else /* height == orig_height */ - { - get_scaled_row( &src[ 0 ], y, width, row, src_tmp, in, orig_width, orig_height, bytes ); - memcpy( accum, src[ 3 ], sizeof( double ) * width * bytes ); - } - - if( pixel_region_has_alpha( bytes ) ) - { - /* unmultiply the alpha */ - double inv_alpha; - double *p = accum; - int alpha = bytes - 1; - int result; - W8 *d = dest; - - for( x = 0 ; x < width ; ++x ) - { - if( p[ alpha ] > 0.001 ) - { - inv_alpha = 255.0 / p[ alpha ]; - for( b = 0 ; b < alpha ; b++ ) - { - result = RINT( inv_alpha * p[ b ] ); - if( result < 0 ) - { - d[ b ] = 0; - } - else if( result > 255 ) - { - d[ b ] = 255; - } - else - { - d[ b ] = result; - } - } - result = RINT( p[ alpha ] ); - if( result > 255 ) - { - d[ alpha ] = 255; - } - else - { - d[ alpha ] = result; - } - } - else /* alpha <= 0 */ - { - for( b = 0 ; b <= alpha ; ++b ) - { - d[ b ] = 0; - } - } - - d += bytes; - p += bytes; - } - } - else - { - int w = width * bytes; - - for( x = 0 ; x < w ; ++x ) - { - if( accum[ x ] < 0.0 ) - { - dest[ x ] = 0; - } - else if( accum[ x ] > 255.0 ) - { - dest[ x ] = 255; - } - else - { - dest[ x ] = RINT( accum[ x ] ); - } - } - } - pixel_region_set_row( out, bytes, y, width, dest ); - } - - /* free up temporary arrays */ - MM_FREE( accum ); - - for( i = 0 ; i < 4 ; ++i ) - { - MM_FREE( src[ i ] ); - } - - MM_FREE( src_tmp ); - MM_FREE( dest ); - - row -= 2 * bytes; - MM_FREE( row ); -} - - -/* ------------------------------------------------------------------------------ - Function: TM_MipMap -Generate MipMap. - - Parameters: - in -[in/out] Texture data. - width -[in] Width of texture in pixels. - height -[in] Height of texture in pixels. - - Returns: Nothing. - - Notes: Operates in place, quartering the size of the texture. ------------------------------------------------------------------------------ -*/ -PUBLIC _boolean TM_MipMap( PW8 in, W16 *width, W16 *height, W16 bytes ) -{ - W16 new_width, new_height; - - if( *width == 1 && *height == 1 ) - { - return false; - } - - - if( *width < 2 ) - { - new_width = 1; - } - else - { - new_width = *width >> 1; - } - - if( *height < 2 ) - { - new_height = 1; - } - else - { - new_height = *height >> 1; - } - - TM_ResampleTexture( in, *width, *height, in, new_width, new_height, bytes, INTERPOLATION_CUBIC ); - - *width = new_width; - *height = new_height; - - return true; -} - - -/* ------------------------------------------------------------------------------ - Function: TM_Init -Initialize Texture Manager. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: Generates default texture. ------------------------------------------------------------------------------ -*/ -PUBLIC void TM_Init( void ) -{ - W8 *ptr; - W8 *data; - int x, y; - - gl_round_down = Cvar_Get ("gl_round_down", "1", CVAR_INIT); - - texture_registration_sequence = 1; - -// create a checkerboard texture - data = MM_MALLOC( 16 * 16 * 4 ); - for( y = 0; y < 16; ++y ) - { - for( x = 0; x < 16; ++x ) - { - ptr = &data[ (y * 16 + x) * 4 ]; - if( (y < 8) ^ (x < 8) ) - { - ptr[ 0 ] = ptr[ 1 ] = ptr[ 2 ] = 0x00; - ptr[ 3 ] = 0xFF; - } - else - { - ptr[ 0 ] = ptr[ 1 ] = ptr[ 2 ] = 0xFF; - ptr[ 3 ] = 0xFF; - } - } - } - - r_notexture = TM_LoadTexture( "***r_notexture***", data, 16, 16, TT_Pic, 4 ); - - MM_FREE( data ); - - - Cmd_AddCommand( "listTextures", TM_TextureList_f ); - - -} - -/* ------------------------------------------------------------------------------ - Function: TM_Shutdown -Shutdown Texture Manager. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void TM_Shutdown( void ) -{ - int i; - texture_t *tex; - - for( i = 0, tex = ttextures; i < numttextures; ++i, ++tex ) - { - if( ! tex->registration_sequence ) - { - continue; // free image_t slot - } - - // free texture - R_DeleteTexture( tex->texnum ); - memset( tex, 0, sizeof( *tex ) ); - } - - Cmd_RemoveCommand( "listTextures" ); -} - diff --git a/wolf3d/newCode/env/texture_manager.h b/wolf3d/newCode/env/texture_manager.h deleted file mode 100644 index abc4d1b..0000000 --- a/wolf3d/newCode/env/texture_manager.h +++ /dev/null @@ -1,176 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 Id Software, Inc. - Copyright (C) 1995 Spencer Kimball and Peter Mattis. - - 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. - -*/ - -/* - * texture_manager.c: Texture manager. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from - * The GIMP (an image manipulation program) and was originally - * written by Spencer Kimball and Peter Mattis. - * - * Portion of this code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -#ifndef __TEXTURE_MANAGER_H__ -#define __TEXTURE_MANAGER_H__ - -#define MAX_TEXTURES 1024 - - -typedef enum -{ - TT_Sprite, - TT_Wall, - TT_Pic, - - TextureTypeCount - -} texturetype_t; - -typedef enum -{ - Repeat = 0, - Clamp, - - WrapModeCount // Number of Wrap modes - -} TWrapMode; - -typedef enum -{ - Auto = 0, - RGBA8888, - RGBA4444, - RGBA5551, - RGB888, - RGB565, - DXTC1, - DXTC1Alpha, - DXTC3, - DXTC5, - Luminance, - Alpha, - AlphaLuminance, - DsDt, - - UpImageFormatCount // Number of Upload formats - -} TTexFormat; - -typedef enum -{ - Nearest = 0, - Linear, - - MagFilterCount // Number of Magnification filters - -} TMagFilter; - -typedef enum -{ - NearestMipMapOff = 0, - NearestMipMapNearest, - NearestMipMapLinear, - LinearMipMapOff, - LinearMipMapNearest, - LinearMipMapLinear, - - MinFilterCount // Number of Min filters - -} TMinFilter; - -// this is the header from the pre-digested binary files with sprite bounds -typedef struct { - int hasAlpha; - int srcWidth; - int srcHeight; - int uploadWidth; - int uploadHeight; - int numBounds; - int bounds[2][2][2]; -} picHeader_t; - - -typedef struct texture_s -{ - _boolean MipMap; - _boolean isTextureCube; - TTexFormat UploadFormat; - TWrapMode WrapS; - TWrapMode WrapT; - TWrapMode WrapR; - TMinFilter MinFilter; - TMagFilter MagFilter; - W32 registration_sequence; // 0 = free - W16 width, height; - W16 upload_width, upload_height; - unsigned int texnum; - W16 bytes; - texturetype_t type; - char name[ MAX_GAMEPATH ]; // game path, including extension - picHeader_t header; -} texture_t; - - - -typedef enum -{ - - INTERPOLATION_NONE, /* None (Fastest) */ - INTERPOLATION_LINEAR, /* Linear */ - INTERPOLATION_CUBIC /* Cubic (Best) */ - -} InterpolationType; - - -extern W32 texture_registration_sequence; - - - -extern void TM_Init( void ); -extern void TM_Shutdown( void ); - - -extern _boolean TM_MipMap( PW8 in, W16 *width, W16 *height, W16 bytes ); - -extern texture_t *wallTextures[1000]; -extern texture_t *spriteTextures[1000]; - -extern texture_t *TM_FindTexture( const char *name, texturetype_t type ); - -extern void TM_GetTextureSize( SW32 *width, SW32 *height, const char *name ); - -extern void TM_ResampleTexture( PW8 in, int inwidth, int inheight, PW8 out, int outwidth, int outheight, W8 bytes, InterpolationType interpolation ); - -extern void TM_FreeUnusedTextures( void ); - - - - - -#endif /* __TEXTURE_MANAGER_H__ */ diff --git a/wolf3d/newCode/env/tga.c b/wolf3d/newCode/env/tga.c deleted file mode 100644 index 82312db..0000000 --- a/wolf3d/newCode/env/tga.c +++ /dev/null @@ -1,783 +0,0 @@ -/* - - Copyright (C) 2004-2005 Michael Liebscher - Copyright (C) 1995 Spencer Kimball and Peter Mattis - - 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. - -*/ - -/* - * tga.h: Handle Targa file format. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * Portion of this code was derived from The GIMP -- an image manipulation - * program, and was originally written by Spencer Kimball and Peter Mattis. - * - */ - -/* - Notes: - -*/ - -#include "../wolfiphone.h" - - -#define TGA_HEADER_SIZE 18 - -#ifndef IPHONE -PRIVATE W8 *p_buf; // current pointer to tga data block -#endif - - - /* TRUEVISION-XFILE magic signature string */ -static W8 magic[ 18 ] = -{ - 0x54, 0x52, 0x55, 0x45, 0x56, 0x49, 0x53, 0x49, 0x4f, - 0x4e, 0x2d, 0x58, 0x46, 0x49, 0x4c, 0x45, 0x2e, 0x0 -}; - - -typedef struct _TargaHeader -{ - W8 idLength; - W8 colorMapType; - - W8 imageType; -/* Known image types. */ -#define TGA_TYPE_MAPPED 1 -#define TGA_TYPE_COLOR 2 -#define TGA_TYPE_GRAY 3 - - W8 imageCompression; -/* Only known compression is RLE */ -#define TGA_COMP_NONE 0 -#define TGA_COMP_RLE 1 - -/* Color Map Specification. */ - W16 colorMapIndex; - W16 colorMapLength; - W8 colorMapSize; - -/* Image Specification. */ - W16 xOrigin; - W16 yOrigin; - - W16 width; - W16 height; - - W8 bpp; - W8 bytes; - - W8 alphaBits; - W8 flipHoriz; - W8 flipVert; - -} TargaHeader; - - - -PRIVATE void flip_line( W8 *buffer, TargaHeader *info ) -{ - W8 temp; - W8 *alt; - SW32 x, s; - - alt = buffer + (info->bytes * (info->width - 1)); - - for( x = 0; x * 2 <= info->width; ++x ) - { - for( s = 0; s < info->bytes; ++s ) - { - temp = buffer[ s ]; - buffer[ s ] = alt[ s ]; - alt[ s ] = temp; - } - - buffer += info->bytes; - alt -= info->bytes; - } -} - -PRIVATE void upsample( W8 *dest, W8 *src, - W32 width, W32 bytes, W8 alphaBits ) -{ - W32 x; - - for( x = 0 ; x < width ; ++x ) - { - dest[0] = ((src[1] << 1) & 0xf8); - dest[0] += (dest[0] >> 5); - - dest[1] = ((src[0] & 0xe0) >> 2) + ((src[1] & 0x03) << 6); - dest[1] += (dest[1] >> 5); - - dest[2] = ((src[0] << 3) & 0xf8); - dest[2] += (dest[2] >> 5); - - switch( alphaBits ) - { - case 1: - dest[ 3 ] = (src[ 1 ] & 0x80) ? 0 : 255; - dest += 4; - break; - - default: - dest += 3; - } - - src += bytes; - } -} - -PRIVATE void bgr2rgb( W8 *dest, W8 *src, - W32 width, W32 bytes, W32 alpha ) -{ - W32 x; - - if( alpha ) - { - for( x = 0 ; x < width ; ++x ) - { - *(dest++) = src[2]; - *(dest++) = src[1]; - *(dest++) = src[0]; - - *(dest++) = src[3]; - - src += bytes; - } - } - else - { - for( x = 0 ; x < width ; ++x ) - { - *(dest++) = src[2]; - *(dest++) = src[1]; - *(dest++) = src[0]; - - src += bytes; - } - } - - -} - -PRIVATE SW32 rle_read( filehandle_t *fp, W8 *buffer, - TargaHeader *info ) -{ - static SW32 repeat = 0; - static SW32 direct = 0; - static W8 sample[ 4 ]; - SW32 head; - W8 temphead; - SW32 x, k; - - for( x = 0; x < info->width; ++x ) - { - if( repeat == 0 && direct == 0 ) - { - FS_ReadFile( &temphead, 1, 1, fp ); - head = temphead; - - if( head >= 128 ) - { - repeat = head - 127; - - if( FS_ReadFile( sample, info->bytes, 1, fp ) < 1 ) - { - return EOF; - } - } - else - { - direct = head + 1; - } - } - - if( repeat > 0 ) - { - for( k = 0 ; k < info->bytes ; ++k ) - { - buffer[ k ] = sample[ k ]; - } - - repeat--; - } - else /* direct > 0 */ - { - if( FS_ReadFile( buffer, info->bytes, 1, fp ) < 1 ) - { - return EOF; - } - - direct--; - } - - buffer += info->bytes; - } - - return 0; -} - - -PRIVATE void read_line( filehandle_t *fp, - W8 *row, - W8 *buffer, - TargaHeader *info ) -{ - if( info->imageCompression == TGA_COMP_RLE ) - { - if( rle_read( fp, buffer, info ) == EOF ) - { - return; - } - } - else - { - FS_ReadFile( buffer, info->bytes, info->width, fp ); - } - - if( info->flipHoriz ) - { - flip_line( buffer, info ); - } - - if( info->imageType == TGA_TYPE_COLOR ) - { - if( info->bpp == 16 || info->bpp == 15 ) - { - upsample( row, buffer, info->width, info->bytes, info->alphaBits ); - } - else - { - bgr2rgb( row, buffer, info->width, info->bytes, info->bytes == 4 ? 1 : 0 ); - } - } - else - { - memcpy( row, buffer, info->width * info->bpp ); - } -} - - - -PUBLIC void LoadTGA( const char *filename, W8 **pic, W16 *width, W16 *height, W16 *bytes ) -{ - TargaHeader targa_header; - W8 header[ 18 ]; - W8 footer[ 26 ]; - W8 extension[ 495 ]; - W32 cmap_bytes; - SW32 offset; - W8 tga_cmap[4 * 256], gimp_cmap[3 * 256]; - W8 *buffer, *data, *row; - int i; - SW32 datalength; - filehandle_t *hFile; - - - - *pic = NULL; - -// -// Load the file -// - hFile = FS_OpenFile( filename, 0 ); - if( ! hFile ) - { - Com_DPrintf( "Could not open (%s) for reading\n", filename ); - - goto TGALOADFAILED; - } - - datalength = FS_GetFileSize( hFile ); - - if( ! FS_FileSeek( hFile, -26L, SEEK_END ) ) - { - /* Is file big enough for a footer? */ - if( FS_ReadFile( footer, sizeof( footer ), 1, hFile ) != 1 ) - { - Com_DPrintf( "Cannot read footer from (%s)\n" , filename ); - - goto TGALOADFAILED; - } - else if( memcmp( footer + 8, magic, sizeof( magic ) ) == 0 ) - { - /* Check the signature. */ - offset = footer[ 0 ] + (footer[ 1 ] * 256) + (footer[ 2 ] * 65536) - + (footer[ 3 ] * 16777216); - - if( offset != 0 ) - { - if( FS_FileSeek( hFile, offset, SEEK_SET ) || - FS_ReadFile( extension, sizeof( extension ), 1, hFile ) != 1 ) - { - Com_DPrintf( "Cannot read extension from '%s'\n", filename ); - - goto TGALOADFAILED; - } - - /* Eventually actually handle version 2 TGA here */ - - } - } - - } - - -// -// Get header information. -// - if( datalength < TGA_HEADER_SIZE ) - { - Com_Printf( "Could not read header from (%s)\n", filename ); - - goto TGALOADFAILED; - } - - if( FS_FileSeek( hFile, 0, SEEK_SET ) || - FS_ReadFile( header, sizeof( header ), 1, hFile ) != 1 ) - { - Com_Printf( "Cannot read header from (%s)\n", filename ); - - goto TGALOADFAILED; - } - - - - targa_header.idLength = header[ 0 ]; - targa_header.colorMapType = header[ 1 ]; - - switch( header[ 2 ] ) - { - case 1: - targa_header.imageType = TGA_TYPE_MAPPED; - targa_header.imageCompression = TGA_COMP_NONE; - break; - - case 2: - targa_header.imageType = TGA_TYPE_COLOR; - targa_header.imageCompression = TGA_COMP_NONE; - break; - - case 3: - targa_header.imageType = TGA_TYPE_GRAY; - targa_header.imageCompression = TGA_COMP_NONE; - break; - - - - case 9: - targa_header.imageType = TGA_TYPE_MAPPED; - targa_header.imageCompression = TGA_COMP_RLE; - break; - - case 10: - targa_header.imageType = TGA_TYPE_COLOR; - targa_header.imageCompression = TGA_COMP_RLE; - break; - - case 11: - targa_header.imageType = TGA_TYPE_GRAY; - targa_header.imageCompression = TGA_COMP_RLE; - break; - - - default: - targa_header.imageType = 0; - } - - targa_header.colorMapIndex = header[ 3 ] + header[ 4 ] * 256; - targa_header.colorMapLength = header[ 5 ] + header[ 6 ] * 256; - targa_header.colorMapSize = header[ 7 ]; - - targa_header.xOrigin = header[ 8 ] + header[ 9 ] * 256; - targa_header.yOrigin = header[ 10 ] + header[ 11 ] * 256; - targa_header.width = header[ 12 ] + header[ 13 ] * 256; - targa_header.height = header[ 14 ] + header[ 15 ] * 256; - - targa_header.bpp = header[ 16 ]; - targa_header.bytes = (targa_header.bpp + 7) / 8; - targa_header.alphaBits = header[ 17 ] & 0x0f; /* Just the low 4 bits */ - targa_header.flipHoriz = (header[ 17 ] & 0x10) ? 1 : 0; - targa_header.flipVert = (header[ 17 ] & 0x20) ? 0 : 1; - -// -// Analyze header information. -// - switch( targa_header.imageType ) - { - case TGA_TYPE_MAPPED: - if( targa_header.bpp != 8 ) - { - Com_DPrintf( "Unhandled sub-format in (%s)\n", filename ); - - goto TGALOADFAILED; - } - - goto TGALOADFAILED; - - break; - - case TGA_TYPE_COLOR: - if( targa_header.bpp != 15 && targa_header.bpp != 16 && targa_header.bpp != 24 - && targa_header.bpp != 32 ) - { - Com_DPrintf( "Unhandled sub-format in (%s)\n", filename ); - goto TGALOADFAILED; - } - break; - - case TGA_TYPE_GRAY: - if( targa_header.bpp != 8 && (targa_header.alphaBits != 8 || (targa_header.bpp != 16 && targa_header.bpp != 15 ))) - { - Com_DPrintf( "Unhandled sub-format in (%s)\n", filename ); - goto TGALOADFAILED; - } - - - goto TGALOADFAILED; - - - break; - - default: - Com_DPrintf( "Unknown image type for (%s)\n", filename ); - goto TGALOADFAILED; - - } /* end of switch targa_header.imageType */ - - /* Plausible but unhandled formats */ - if( targa_header.bytes * 8 != targa_header.bpp && ! (targa_header.bytes == 2 && targa_header.bpp == 15) ) - { - Com_DPrintf( "No support yet for TGA with these parameters\n" ); - - goto TGALOADFAILED; - } - - /* Check that we have a color map only when we need it. */ - if( targa_header.imageType == TGA_TYPE_MAPPED && targa_header.colorMapType != 1 ) - { - Com_DPrintf( "Indexed image has invalid color map type %d\n", - targa_header.colorMapType ); - - goto TGALOADFAILED; - } - else if( targa_header.imageType != TGA_TYPE_MAPPED && targa_header.colorMapType != 0 ) - { - Com_DPrintf( "Non-indexed image has invalid color map type %d\n", - targa_header.colorMapType ); - - goto TGALOADFAILED; - } - - /* Skip the image ID field. */ - if( targa_header.idLength && FS_FileSeek( hFile, targa_header.idLength, SEEK_CUR ) ) - { - Com_DPrintf( "File (%s) is truncated or corrupted\n", filename ); - - goto TGALOADFAILED; - } - - - - /* Handle colormap */ - if( targa_header.colorMapType == 1 ) - { - cmap_bytes = (targa_header.colorMapSize + 7 ) / 8; - if( cmap_bytes <= 4 && - FS_ReadFile( tga_cmap, targa_header.colorMapLength * cmap_bytes, 1, hFile ) == 1 ) - { - if( targa_header.colorMapSize == 32 ) - { - bgr2rgb( gimp_cmap, tga_cmap, targa_header.colorMapLength, cmap_bytes, 1); - } - else if( targa_header.colorMapSize == 24 ) - { - bgr2rgb( gimp_cmap, tga_cmap, targa_header.colorMapLength, cmap_bytes, 0); - } - else if( targa_header.colorMapSize == 16 || targa_header.colorMapSize == 15 ) - { - upsample( gimp_cmap, tga_cmap, targa_header.colorMapLength, cmap_bytes, targa_header.alphaBits); - } - - } - else - { - Com_DPrintf( "File (%s) is truncated or corrupted\n", filename ); - - goto TGALOADFAILED; - } - } - - - /* Allocate the data. */ - data = MM_MALLOC( targa_header.width * targa_header.height * targa_header.bytes ); - if( data == NULL ) - { - MM_OUTOFMEM( "data" ); - } - - buffer = (PW8) MM_MALLOC( targa_header.width * targa_header.bytes ); - if( buffer == NULL ) - { - MM_FREE( data ); - MM_OUTOFMEM( "buffer" ); - } - - if( targa_header.flipVert ) - { - for( i = targa_header.height-1 ; i >= 0 ; --i ) - { - row = data + (targa_header.width * targa_header.bytes * i); - read_line( hFile, row, buffer, &targa_header ); - } - } - else - { - for( i = 0 ; i < targa_header.height ; ++i ) - { - row = data + (targa_header.width * targa_header.bytes * i); - read_line( hFile, row, buffer, &targa_header ); - } - } - - - MM_FREE( buffer ); - - FS_CloseFile( hFile ); - - *pic = data; - *width = targa_header.width; - *height = targa_header.height; - *bytes = targa_header.bytes; - - return; - - - -TGALOADFAILED: - *pic = NULL; - *width = 0; - *height = 0; - *bytes = 0; - - if( hFile ) - { - FS_CloseFile( hFile ); - } - -} - -/* ------------------------------------------------------------------------------ - Function: rle_write -Run length encode scanline. - - Parameters: fp -[in] Pointer to valid FILE structure. - buffer -[in] Scanline data. - width -[in] Image scanline width. - bytes -[in] Bytes per pixel. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PRIVATE void rle_write( FILE *fp, - W8 *buffer, - W32 width, - W32 bytes ) -{ - SW32 repeat = 0; - SW32 direct = 0; - W8 *from = buffer; - W32 x; - - for( x = 1 ; x < width ; ++x ) - { - if( memcmp( buffer, buffer + bytes, bytes ) ) - { - /* next pixel is different */ - if( repeat ) - { - putc( 128 + repeat, fp ); - fwrite( from, bytes, 1, fp ); - from = buffer + bytes; /* point to first different pixel */ - repeat = 0; - direct = 0; - } - else - { - direct += 1; - } - } - else - { - /* next pixel is the same */ - if( direct ) - { - putc( direct - 1, fp ); - fwrite( from, bytes, direct, fp ); - from = buffer; /* point to first identical pixel */ - direct = 0; - repeat = 1; - } - else - { - repeat += 1; - } - } - - if( repeat == 128 ) - { - putc( 255, fp ); - fwrite( from, bytes, 1, fp ); - from = buffer + bytes; - direct = 0; - repeat = 0; - } - else if( direct == 128 ) - { - putc( 127, fp ); - fwrite( from, bytes, direct, fp ); - from = buffer + bytes; - direct = 0; - repeat = 0; - } - - buffer += bytes; - } - - if( repeat > 0 ) - { - putc( 128 + repeat, fp ); - fwrite( from, bytes, 1, fp ); - } - else - { - putc( direct, fp ); - fwrite( from, bytes, direct + 1, fp ); - } -} - - -/* ------------------------------------------------------------------------------ - Function: WriteTGA -Write targa image file. - - Parameters: filename -[in] Name of TGA file to save as. - bpp -[in] Bits per pixel. (16, 24 or 32). - width -[in] Width of image. - height -[in] Height of image. - Data -[in] Raw image data. - upsideDown -[in] Is the data upside down? 1 yes, 0 no. - rle -[in] Run Length encode? 1 yes, 0 no. - - Returns: 0 on error, otherwise 1. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC W8 WriteTGA( const char *filename, W16 bpp, W16 width, W16 height, - void *Data, W8 upsideDown, W8 rle ) -{ - W16 i, x, y, BytesPerPixel; - W8 *scanline; - W8 header[ 18 ]; - FILE *filestream; - W8 *ptr = (PW8) Data; - W8 temp; - - BytesPerPixel = bpp >> 3; - - filestream = fopen( filename, "wb" ); - if( filestream == NULL ) - { - Com_DPrintf( "Could not open file (%s) for write!\n", filename ); - return 0; - } - - memset( header, 0, 18 ); - header[2] = rle ? 10 : 2; - - header[12] = width & 255; // width low - header[13] = width >> 8; // width high - - header[14] = height & 255; // height low - header[15] = height >> 8; // height high - - header[16] = bpp & 255; // pixel size - - if( upsideDown ) - { - header[17] |= 1 << 5; // Image Descriptor - } - - - fwrite( header, sizeof( W8 ), sizeof( header ), filestream ); - - - - scanline = (PW8) MM_MALLOC( width * BytesPerPixel ); - if( scanline == NULL ) - { - fclose( filestream ); - - return 0; - } - - for( y = 0; y < height; ++y ) - { - W32 k = 0; - - for( i = 0; i < (width * BytesPerPixel); ++i ) - { - scanline[ k++ ] = ptr[ (height - y - 1) * width * BytesPerPixel + i ]; - } - - - - if( bpp == 24 || bpp == 32 ) - { - // swap rgb to bgr - for( x = 0; x < (width * BytesPerPixel); x += BytesPerPixel ) - { - temp = scanline[ x ]; - scanline[ x ] = scanline[ x + 2 ]; - scanline[ x + 2 ] = temp; - } - } - - - if( rle ) - { - rle_write( filestream, scanline, width, BytesPerPixel ); - } - else - { - fwrite( scanline, sizeof( W8 ), width * BytesPerPixel, filestream ); - } - } - - MM_FREE( scanline ); - - fclose( filestream ); - - return 1; -} diff --git a/wolf3d/newCode/env/tga.h b/wolf3d/newCode/env/tga.h deleted file mode 100644 index 509c90b..0000000 --- a/wolf3d/newCode/env/tga.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 Id Software, Inc. - Copyright (C) 1995 Spencer Kimball and Peter Mattis - - 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. - -*/ - -/* - * tga.h: Handle Targa file format. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from Quake II, and was - * originally written by id Software, Inc. - * - * Portion of this code was derived from The GIMP -- an image manipulation - * program, and was originally written by Spencer Kimball and Peter Mattis. - */ - -#ifndef __TGA_H__ -#define __TGA_H__ - -extern void LoadTGA( const char *filename, W8 **pic, W16 *width, W16 *height, W16 *bytes ); - - - -extern W8 WriteTGA( const char *filename, W16 bpp, W16 width, W16 height, - void *Data, W8 upsideDown, W8 rle ); - - -#endif /* __TGA_H__ */ - diff --git a/wolf3d/newCode/env/timer.h b/wolf3d/newCode/env/timer.h deleted file mode 100644 index c9aca45..0000000 --- a/wolf3d/newCode/env/timer.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - - Copyright (C) 1997-2001 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. - -*/ - -/* - * timer.h: Timer. - * - * Author: Id Software, Inc. - * Date: 1997-2001 - * - */ - -/* - Notes: - This module is implemented by win_timer.c or unix_timer.c. - -*/ - -#ifndef __TIMER_H__ -#define __TIMER_H__ - -extern W32 curtime; // time returned by last Sys_Milliseconds() - -extern W32 Sys_Milliseconds( void ); - - -#endif /* __TIMER_H__ */ - diff --git a/wolf3d/newCode/env/unix_file.c b/wolf3d/newCode/env/unix_file.c deleted file mode 100644 index adc34ba..0000000 --- a/wolf3d/newCode/env/unix_file.c +++ /dev/null @@ -1,286 +0,0 @@ -/* - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * unix_file.c: Handles non-portable file services. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -#include "../wolfiphone.h" - - -PRIVATE char findbase[ MAX_OSPATH ]; -PRIVATE char findpath[ MAX_OSPATH ]; -PRIVATE char findpattern[ MAX_OSPATH ]; -PRIVATE DIR *fdir; - - -/* ------------------------------------------------------------------------------ - Function: FS_CreateDirectory() -Creates a new directory. - - Parameters: dirname -[in] Pointer to a NUL-terminated string that specifies - the path of the directory to be created. - - Returns: On success nonzero, otherwise zero. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC W8 FS_CreateDirectory( const char *dirname ) -{ - int ret_val = mkdir( dirname, S_IRUSR | S_IWUSR | S_IXUSR ); - - if( ret_val == -1 && errno == EEXIST ) - { - return 1; - } - - return (W8)(! ret_val); -} - -/* ------------------------------------------------------------------------------ - Function: FS_ChangeCurrentDirectory() -Changes the current directory - - Parameters: path -[in] Pointer to a NUL-terminated string that specifies - the path to the new directory. - - Returns: On success nonzero, otherwise zero. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC W8 FS_ChangeCurrentDirectory( const char *path ) -{ - return ! chdir( path ); -} - -/* ------------------------------------------------------------------------------ - Function: CompareAttributes() -Compare directory and file attributes. - - Parameters: path -[in] Specifies the path to compare file attributes. - musthave -[in] File or directory must have these attributes. - canthave- [in] File or directory can not have these attributes. - - Returns: On success true, otherwise false. - - Notes: ------------------------------------------------------------------------------ -*/ -PRIVATE _boolean CompareAttributes( const char *path, W32 musthave, W32 canthave ) -{ - struct stat st; - - if( stat( path, &st ) == -1 ) - { - return false; - } - - if( ( st.st_mode & S_IFDIR ) && ( canthave & FA_DIR ) ) - { - return false; - } - - if( ( musthave & FA_DIR ) && !( st.st_mode & S_IFDIR ) ) - { - return false; - } - - return true; -} - -/* ------------------------------------------------------------------------------ - Function: FS_FindFirstFile() -Searches a directory for a file. - - Parameters: path -[in] Pointer to a NUL-terminated string that specifies - a valid directory or path and file name. - musthave -[in] File or directory must have these attributes. - canthave- [in] File or directory can not have these attributes. - - Returns: On success string of file name or directory, otherwise NULL. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC char *FS_FindFirst( const char *path, W32 musthave, W32 canthave ) -{ - struct dirent *d; - char *p; - p; - - if( fdir ) - { - Com_Printf( "FS_FindFirst without close\n" ); - - return NULL; - } - - FS_FilePath( (char *)path, findbase ); - my_strlcpy( (char *)findpattern, FS_SkipPath( (char *)path ), sizeof( findpattern ) ); - - if( ! *findbase ) - { - if( (fdir = opendir( "." )) == NULL ) - { - return NULL; - } - } - else - { - if( (fdir = opendir( findbase )) == NULL ) - { - return NULL; - } - } - - while( (d = readdir( fdir )) != NULL ) - { - if( ! *findpattern || glob_match( findpattern, d->d_name ) ) - { - if( ! *findbase ) - { - my_strlcpy( findpath, d->d_name, sizeof( findpath ) ); - } - else - { - my_snprintf( findpath, sizeof( findpath ), "%s/%s", findbase, d->d_name ); - } - - if( CompareAttributes( findpath, musthave, canthave ) ) - { - return findpath; - } - } - } - - return NULL; - -} - -/* ------------------------------------------------------------------------------ - Function: FS_FindNext -Continues a file search from a previous call to - the FS_FindFirst function. - - Parameters: musthave -[in] File or directory must have these attributes. - canthave- [in] File or directory can not have these attributes. - - Returns: On success string of file name or directory, otherwise NULL. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC char *FS_FindNext( W32 musthave, W32 canthave ) -{ - struct dirent *d; - - if( fdir == NULL ) - { - return NULL; - } - - while( (d = readdir( fdir ) ) != NULL) - { - if( ! *findpattern || glob_match( findpattern, d->d_name ) ) - { - if( ! *findbase ) - { - my_strlcpy( findpath, d->d_name, sizeof( findpath ) ); - } - else - { - my_snprintf( findpath, sizeof( findpath ), "%s/%s", findbase, d->d_name ); - } - - if( CompareAttributes( findpath, musthave, canthave ) ) - { - return findpath; - } - } - } - - return NULL; -} - -/* ------------------------------------------------------------------------------ - Function: FS_FindClose() -Closes the search handle. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void FS_FindClose( void ) -{ - if( fdir ) - { - closedir( fdir ); - } - - fdir = NULL; -} - -/* ------------------------------------------------------------------------------ - Function: FS_DeleteFile() -Deletes an existing file. - - Parameters: filename -[in] Pointer to a NUL-terminated string that - specifies the file to be deleted. - - Returns: If successful the return value is nonzero, otherwise zero. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC _boolean FS_DeleteFile( const char *filename ) -{ - return( ! unlink( filename ) ); -} - -/* ------------------------------------------------------------------------------ - Function: FS_RemoveDirectory() -Deletes an existing empty directory. - - Parameters: pathname -[in] Pointer to a NUL-terminated string that - specifies the directory to be deleted. - - Returns: If successful the return value is nonzero, otherwise zero. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC _boolean FS_RemoveDirectory( const char *pathname ) -{ - return( ! rmdir( pathname ) ); -} - diff --git a/wolf3d/newCode/env/unix_timer.c b/wolf3d/newCode/env/unix_timer.c deleted file mode 100644 index 38b6f42..0000000 --- a/wolf3d/newCode/env/unix_timer.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * unix_timer.c: unix timer. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -#include "../wolfiphone.h" - -PUBLIC W32 curtime; - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC W32 Sys_Milliseconds( void ) -{ - struct timeval tp; - struct timezone tzp; - static int secbase; - - gettimeofday( &tp, &tzp ); - - if( ! secbase ) - { - secbase = tp.tv_sec; - return tp.tv_usec / 1000; - } - - curtime = (tp.tv_sec - secbase) * 1000 + tp.tv_usec / 1000; - - return curtime; -} diff --git a/wolf3d/newCode/env/vector.c b/wolf3d/newCode/env/vector.c deleted file mode 100644 index 9d200b1..0000000 --- a/wolf3d/newCode/env/vector.c +++ /dev/null @@ -1,650 +0,0 @@ -/* - - Copyright (C) 2005 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * vector.h: 2D and 3D vector math routines. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * Portion of this code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -#include "../wolfiphone.h" - -vec3_t vec3_origin = { 0, 0, 0 }; - - -vec_t _VectorNormalize( vec3_t v ); - -vec_t (*pfVectorNormalize)( vec3_t v ) = _VectorNormalize; - - -/* ------------------------------------------------------------------------------ - Function: _VectorNormalize -Normalize a 3D vector. - - Parameters: v -[in] 3D vector to normalize. - - Returns: Unit vector value. - - Notes: - For a given vector, the process of finding a unit vector which is - parallel to it. This is done by dividing the given vector by its - magnitude. ------------------------------------------------------------------------------ -*/ -PUBLIC vec_t _VectorNormalize( vec3_t v ) -{ - float length, ilength; - - length = (float)pfSqrt( v[ 0 ] * v[ 0 ] + v[ 1 ] * v[ 1 ] + v[ 2 ] * v[ 2 ] ); - - if( length ) - { - ilength = 1 / length; - v[ 0 ] *= ilength; - v[ 1 ] *= ilength; - v[ 2 ] *= ilength; - } - - return length; -} - -/* ------------------------------------------------------------------------------ - Function: ProjectPointOnPlane -Project a point onto a plane. - - Parameters: dst -[out] Destination Point on Plane. - p -[in] Point to project onto the plane. - normal -[in] A vector to specify the orientation of the plane. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void ProjectPointOnPlane( vec3_t dst, const vec3_t p, const vec3_t normal ) -{ - float d; - vec3_t n; - float inv_denom; - - inv_denom = 1.0f / DotProduct( normal, normal ); - - d = DotProduct( normal, p ) * inv_denom; - - n[ 0 ] = normal[ 0 ] * inv_denom; - n[ 1 ] = normal[ 1 ] * inv_denom; - n[ 2 ] = normal[ 2 ] * inv_denom; - - dst[ 0 ] = p[ 0 ] - d * n[ 0 ]; - dst[ 1 ] = p[ 1 ] - d * n[ 1 ]; - dst[ 2 ] = p[ 2 ] - d * n[ 2 ]; -} - -/* ------------------------------------------------------------------------------ - Function: PerpendicularVector - - - Parameters:dst -[out] Perpendicular Vector. - src -[in] Normalized vector. - - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void PerpendicularVector( vec3_t dst, const vec3_t src ) -{ - int pos; - int i; - float minelem = 1.0F; - vec3_t tempvec; - - /* find the smallest magnitude axially aligned vector */ - for( pos = 0, i = 0 ; i < 3 ; ++i ) - { - if( fabs( src[ i ] ) < minelem ) - { - pos = i; - minelem = (float)fabs( src[ i ] ); - } - } - tempvec[ 0 ] = tempvec[ 1 ] = tempvec[ 2 ] = 0.0F; - tempvec[ pos ] = 1.0F; - - /* project the point onto the plane defined by src */ - ProjectPointOnPlane( dst, tempvec, src ); - - /* normalize the result */ - pfVectorNormalize( dst ); -} - -/* ------------------------------------------------------------------------------ - Function: RotatePointAroundVector -Rotate a point around a vector. - - Parameters: dst -[out] Point after rotation. - dir -[in] vector. - point -[in] Point. - degrees -[in] Degrees of rotation. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t point, float degrees ) -{ - mat3_t m; - mat3_t im; - mat3_t zrot; - mat3_t tmpmat; - mat3_t rot; - vec3_t vr, vup, vf; - float rad; - - vf[0] = dir[0]; - vf[1] = dir[1]; - vf[2] = dir[2]; - - PerpendicularVector( vr, dir ); - vectorCrossProduct( vr, vf, vup ); - - m[0] = vr[0]; - m[3] = vr[1]; - m[6] = vr[2]; - - m[1] = vup[0]; - m[4] = vup[1]; - m[7] = vup[2]; - - m[2] = vf[0]; - m[5] = vf[1]; - m[8] = vf[2]; - - memcpy( im, m, sizeof( im ) ); - - im[1] = m[3]; - im[2] = m[6]; - im[3] = m[1]; - im[5] = m[7]; - im[6] = m[2]; - im[7] = m[5]; - - memset( zrot, 0, sizeof( zrot ) ); - zrot[0] = zrot[4] = zrot[8] = 1.0F; - - rad = DEG2RAD( degrees ); - zrot[0] = (float)cos( rad ); - zrot[1] = (float)sin( rad ); - zrot[3] = (float)-sin( rad ); - zrot[4] = (float)cos( rad ); - - Matrix3x3Multiply( m, zrot, tmpmat ); - Matrix3x3Multiply( tmpmat, im, rot ); - - dst[0] = rot[0] * point[0] + rot[1] * point[1] + rot[2] * point[2]; - dst[1] = rot[3] * point[0] + rot[4] * point[1] + rot[5] * point[2]; - dst[2] = rot[6] * point[0] + rot[7] * point[1] + rot[8] * point[2]; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC float RadiusFromBounds( const vec3_t mins, const vec3_t maxs ) -{ - int i; - vec3_t corner; - float a, b; - - for( i = 0; i < 3; ++i ) - { - a = (float)fabs( mins[i] ); - b = (float)fabs( maxs[i] ); - corner[i] = a > b ? a : b; - } - - return vectorLength( corner ); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void AddPointToBounds( vec3_t v, vec3_t mins, vec3_t maxs ) -{ - if ( v[0] < mins[0] ) - { - mins[0] = v[0]; - } - if ( v[0] > maxs[0]) - { - maxs[0] = v[0]; - } - - if ( v[1] < mins[1] ) - { - mins[1] = v[1]; - } - if ( v[1] > maxs[1]) - { - maxs[1] = v[1]; - } - - if ( v[2] < mins[2] ) - { - mins[2] = v[2]; - } - if ( v[2] > maxs[2]) - { - maxs[2] = v[2]; - } -} - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void AngleVectors( const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up ) -{ - float angle; - static float sr, sp, sy, cr, cp, cy; - // static to help MS compiler fp bugs - - angle = angles[YAW] * ( M_PI*2 / 360 ); - sy = (float)sin( angle ); - cy = (float)cos( angle ); - angle = angles[PITCH] * ( M_PI*2 / 360 ); - sp = (float)sin( angle ); - cp = (float)cos( angle ); - angle = angles[ROLL] * ( M_PI*2 / 360 ); - sr = (float)sin( angle ); - cr = (float)cos( angle ); - - if( forward ) - { - forward[0] = cp*cy; - forward[1] = cp*sy; - forward[2] = -sp; - } - - if( right ) - { - right[0] = (-1*sr*sp*cy+-1*cr*-sy); - right[1] = (-1*sr*sp*sy+-1*cr*cy); - right[2] = -1*sr*cp; - } - - if( up ) - { - up[0] = (cr*sp*cy+-sr*-sy); - up[1] = (cr*sp*sy+-sr*cy); - up[2] = cr*cp; - } -} - -/* ------------------------------------------------------------------------------ - Function: vectorCompare -Compares two vectors for equality. - - Parameters: v1, v2 -[in] 3d vectors to compare. - - Returns: 1 if they are equal, otherwise 0. - - Notes: ------------------------------------------------------------------------------ -*/ -INLINECALL int vectorCompare( const vec3_t v1, const vec3_t v2 ) -{ - if( v1[ 0 ] != v2[ 0 ] || - v1[ 1 ] != v2[ 1 ] || - v1[ 2 ] != v2[ 2 ] ) - { - return 0; - } - - return 1; -} - -/* ------------------------------------------------------------------------------ - Function: vectorLength -Get the length of a vector. - - Parameters: v -[in] 3D vector to get the length of. - - Returns: The length of the vector. - - Notes: - Since the square of length is a sum of squares, and squares - (of real numbers) are always positive, length is always positive. - The only time the length of a 3D vector is zero is when the vector - is the zero vector. ------------------------------------------------------------------------------ -*/ -INLINECALL vec_t vectorLength( const vec3_t v ) -{ - return (vec_t)pfSqrt( v[ 0 ] * v[ 0 ] + v[ 1 ] * v[ 1 ] + v[ 2 ] * v[ 2 ] ); -} - -/* ------------------------------------------------------------------------------ - Function: CrossProduct -Calulates the cross product of two vectors. - - Parameters: v1, v2 -[in] 3D vectors. - cross -[out] The vector cross product. - - Returns: Nothing - - Notes: - The vector cross product takes two vector operands to produce a - vector result. The result, like all geometric vectors, has two - properties: length and orientation. - - To find a vector perpendicular to a particular plane, compute the - cross product of two vectors in that plane. But there are two - directions perpendicular to the plane. Which one does the cross - product give you? That is determined by the right hand rule. - - The cross product of two vectors is perpendicular to both; the right - hand rule picks the one out of two possible perpendicular directions. - - Computing Cross Product from Column Matrices: - u × v = ( uj vk - uk vj , uk vi - ui vk , ui vj - uj vi )T ------------------------------------------------------------------------------ -*/ -PUBLIC void vectorCrossProduct( const vec3_t v1, const vec3_t v2, vec3_t cross ) -{ - cross[ 0 ] = v1[ 1 ] * v2[ 2 ] - v1[ 2 ] * v2[ 1 ]; // X - cross[ 1 ] = v1[ 2 ] * v2[ 0 ] - v1[ 0 ] * v2[ 2 ]; // Y - cross[ 2 ] = v1[ 0 ] * v2[ 1 ] - v1[ 1 ] * v2[ 0 ]; // Z -} - - -#if defined(__i386__) && defined(_MSC_VER) - -// Taken from an article written by Michael Abrash that originally appeared in -// Dr. Dobb's Journal. -PUBLIC void vectorCrossProduct_asm( const vec3_t v1, const vec3_t v2, vec3_t cross ) -{ - __asm - { - mov eax, cross - mov ecx, v2 - mov edx, v1 - - ;optimized cross product; 22 cycles - fld dword ptr [ecx+4] ;starts & ends on cycle 0 - fmul dword ptr [edx+8] ;starts on cycle 1 - fld dword ptr [ecx+8] ;starts & ends on cycle 2 - fmul dword ptr [edx+0] ;starts on cycle 3 - fld dword ptr [ecx+0] ;starts & ends on cycle 4 - fmul dword ptr [edx+4] ;starts on cycle 5 - fld dword ptr [ecx+8] ;starts & ends on cycle 6 - fmul dword ptr [edx+4] ;starts on cycle 7 - fld dword ptr [ecx+0] ;starts & ends on cycle 8 - fmul dword ptr [edx+8] ;starts on cycle 9 - fld dword ptr [ecx+4] ;starts & ends on cycle 10 - fmul dword ptr [edx+0] ;starts on cycle 11 - fxch st(2) ;no cost - fsubrp st(5),st(0) ;starts on cycle 12 - fsubrp st(3),st(0) ;starts on cycle 13 - fsubrp st(1),st(0) ;starts on cycle 14 - fxch st(2) ;no cost, stalls for cycle 15 - fstp dword ptr [eax+0] ;starts on cycle 16, ends on cycle 17 - fstp dword ptr [eax+4] ;starts on cycle 18, ends on cycle 19 - fstp dword ptr [eax+8] ;starts on cycle 20, ends on cycle 21 - } -} - -#endif /* __i386__ */ - - - -/* ------------------------------------------------------------------------------ - Function: _DotProduct -Calculates the dot product. - - Parameters: v1, v2 -[in] 3D vectors to compute dot product. - - Returns: the dot product - - Notes: - Dot product, which takes two vectors as operands and produces a real - number as its output. Sometimes the dot product is called the inner - product or the scalar product. - The dot product is: - a · b = a1b1 + a2b2 + a3b3 ------------------------------------------------------------------------------ -*/ -PUBLIC vec_t _vectorDotProduct( const vec3_t v1, const vec3_t v2 ) -{ - return v1[ 0 ] * v2[ 0 ] + v1[ 1 ] * v2[ 1 ] + v1[ 2 ] * v2[ 2 ]; -} - - -#if defined(__i386__) && defined(_MSC_VER) - -// Taken from an article written by Michael Abrash that originally appeared in -// Dr. Dobb's Journal. -PUBLIC vec_t _vectorDotProduct_asm( const vec3_t v1, const vec3_t v2 ) -{ - float dotret; - - __asm - { - mov eax, v2 - mov ecx, v1 - - ;optimized dot product; 15 cycles - fld dword ptr [eax+0] ;starts & ends on cycle 0 - fmul dword ptr [ecx+0] ;starts on cycle 1 - fld dword ptr [eax+4] ;starts & ends on cycle 2 - fmul dword ptr [ecx+4] ;starts on cycle 3 - fld dword ptr [eax+8] ;starts & ends on cycle 4 - fmul dword ptr [ecx+8] ;starts on cycle 5 - fxch st(1) ;no cost - faddp st(2),st(0) ;starts on cycle 6, stalls for cycles 7-8 - faddp st(1),st(0) ;starts on cycle 9, stalls for cycles 10-12 - fstp dword ptr [dotret] ;starts on cycle 13, ends on cycle 14 - } - - return dotret; -} - -#endif /* __i386__ */ - - - -/* ------------------------------------------------------------------------------ - Function: _vectorSubtract -Vector Difference. - - Parameters: veca, vecb -[in] 3D vectors. - out -[out] The vector difference of vectors A and B. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -INLINECALL void _vectorSubtract( const vec3_t veca, const vec3_t vecb, vec3_t out ) -{ - out[ 0 ] = veca[ 0 ] - vecb[ 0 ]; - out[ 1 ] = veca[ 1 ] - vecb[ 1 ]; - out[ 2 ] = veca[ 2 ] - vecb[ 2 ]; -} - -/* ------------------------------------------------------------------------------ - Function: _vectorAdd -Vector addition. - - Parameters: veca, vecb -[in] 3D vectors. - out -[out] The vector sum of vectors A and B - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -INLINECALL void _vectorAdd( const vec3_t veca, const vec3_t vecb, vec3_t out ) -{ - out[ 0 ] = veca[ 0 ] + vecb[ 0 ]; - out[ 1 ] = veca[ 1 ] + vecb[ 1 ]; - out[ 2 ] = veca[ 2 ] + vecb[ 2 ]; -} - -/* ------------------------------------------------------------------------------ - Function: _vectorCopy -Copy a vector. - - Parameters: in -[in] Source vector. - out -[out] Destination vector. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -INLINECALL void _vectorCopy( const vec3_t in, vec3_t out ) -{ - out[ 0 ] = in[ 0 ]; - out[ 1 ] = in[ 1 ]; - out[ 2 ] = in[ 2 ]; -} - -/* ------------------------------------------------------------------------------ - Function: _vectorScale -Scale a vector. - - Parameters: in -[in] Source vector. - scale -[in] Scale vector. - out -[out] Destination vector. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -INLINECALL void _vectorScale( const vec3_t in, const vec_t scale, vec3_t out ) -{ - out[ 0 ] = in[ 0 ] * scale; - out[ 1 ] = in[ 1 ] * scale; - out[ 2 ] = in[ 2 ] * scale; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -INLINECALL void _vectorMA( const vec3_t veca, float scale, const vec3_t vecb, vec3_t vecc ) -{ - vecc[ 0 ] = veca[ 0 ] + scale * vecb[ 0 ]; - vecc[ 1 ] = veca[ 1 ] + scale * vecb[ 1 ]; - vecc[ 2 ] = veca[ 2 ] + scale * vecb[ 2 ]; -} - - - - - - -///////////////////////////////////////////////////////////////////// -// -// 2D Vector routines -// -///////////////////////////////////////////////////////////////////// - - -/* ------------------------------------------------------------------------------ - Function: vector2DCompare -Compares two vectors for equality. - - Parameters: v1, v2 -[in] 2d vectors to compare. - - Returns: 1 if they are equal, otherwise 0. - - Notes: ------------------------------------------------------------------------------ -*/ -INLINECALL W32 vector2DCompare( const vec2_t v1, const vec2_t v2 ) -{ - if( v1[ 0 ] != v2[ 0 ] || v1[ 1 ] != v2[ 1 ] ) - { - return 0; - } - - return 1; -} - -/* ------------------------------------------------------------------------------ - Function: vector2DLength -Get the length of a vector. - - Parameters: v -[in] 2D vector to get the length of. - - Returns: The length of the vector. - - Notes: ------------------------------------------------------------------------------ -*/ -INLINECALL vec_t vector2DLength( const vec2_t v ) -{ - return (vec_t)pfSqrt( v[ 0 ] * v[ 0 ] + v[ 1 ] * v[ 1 ] ); -} - - - diff --git a/wolf3d/newCode/env/vector.h b/wolf3d/newCode/env/vector.h deleted file mode 100644 index c2ef60c..0000000 --- a/wolf3d/newCode/env/vector.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - - Copyright (C) 2005 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * vector.h: 2D and 3D vector math routines. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * Portion of this code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -#ifndef __VECTOR_H__ -#define __VECTOR_H__ - -typedef float vec_t; -typedef vec_t vec2_t[ 2 ]; -typedef vec_t vec3_t[ 3 ]; -typedef vec_t vec4_t[ 4 ]; -typedef vec_t vec5_t[ 5 ]; - - - -extern vec3_t vec3_origin; - - -///////////////////////////////////////////////////////////////////// -// -// 3D Vector routines -// -///////////////////////////////////////////////////////////////////// - -#define vectorClear( a ) ( (a)[ 0 ] = (a)[ 1 ] = (a)[ 2 ] = 0 ) -#define vectorNegate( a, b ) ( (b)[ 0 ] = (-a)[ 0 ], (b)[ 1 ] = (-a)[ 1 ], (b)[ 2 ] = (-a)[ 2 ] ) -#define vectorSet( v, x, y, z ) ( (v)[ 0 ] = ( x ), (v)[ 1 ] = ( y ), (v)[ 2 ] = ( z ) ) -#define vectorInverse( a ) ( (a)[ 0 ] = (-a)[ 0 ], (a)[ 1 ] = (-a)[ 1 ], (a)[ 2 ] = (-a)[ 2 ] ) - -#if 1 - - #define DotProduct( x, y ) ( (x)[ 0 ] * (y)[ 0 ] + (x)[ 1 ] * (y)[ 1 ] + (x)[ 2 ] * (y)[ 2 ] ) - #define vectorSubtract( a, b, c ) ( (c)[ 0 ] = (a)[ 0 ] - (b)[ 0 ], (c)[ 1 ] = (a)[ 1 ] - (b)[ 1 ], (c)[ 2 ] = (a)[ 2 ] - (b)[ 2 ] ) - #define vectorAdd( a, b, c ) ( (c)[ 0 ] = (a)[ 0 ] + (b)[ 0 ], (c)[ 1 ] = (a)[ 1 ] + (b)[ 1 ], (c)[ 2 ] = (a)[ 2 ] + (b)[ 2 ] ) - #define vectorCopy( a, b ) ( (b)[ 0 ] = (a)[ 0 ], (b)[ 1 ] = (a)[ 1 ], (b)[ 2 ] = (a)[ 2 ] ) - #define vectorScale( v, s, o ) ( (o)[ 0 ] = (v)[ 0 ] * (s),(o)[ 1 ] = (v)[ 1 ] * (s), (o)[ 2 ] = (v)[ 2 ] * (s) ) - #define vectorMA( v, s, b, o ) ( (o)[ 0 ] = (v)[ 0 ] + (b)[ 0 ]*(s),(o)[ 1 ] = (v)[ 1 ] + (b)[ 1 ] * (s),(o)[ 2 ] = (v)[ 2 ] + (b)[ 2 ] * (s) ) - -#else - - /* just in case you don't want to use the macros */ - #define DotProduct( x, y ) _vectorDotProduct( x, y ) - #define vectorSubtract( a, b, c ) _vectorSubtract( a, b, c ) - #define vectorAdd( a, b, c ) _vectorAdd( a, b, c ) - #define vectorCopy( a, b ) _vectorCopy( a, b ) - #define vectorScale( v, s, o ) _vectorScale( v, s, o ) - #define vectorMA( v, s, b, o ) _vectorMA( v, s, b, o ) - -#endif - - -extern void vectorCrossProduct( const vec3_t v1, const vec3_t v2, vec3_t cross ); - - -extern int vectorCompare( const vec3_t v1, const vec3_t v2 ); -extern vec_t vectorLength( const vec3_t v ); -extern vec_t (*pfVectorNormalize)( vec3_t vec ); - -extern void angleVectors( const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up ); - - -extern void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t point, float degrees ); -extern void PerpendicularVector( vec3_t dst, const vec3_t src ); -extern void ProjectPointOnPlane( vec3_t dst, const vec3_t p, const vec3_t normal ); - - -extern void AddPointToBounds( vec3_t v, vec3_t mins, vec3_t maxs ); -extern float RadiusFromBounds( const vec3_t mins, const vec3_t maxs ); - - - -///////////////////////////////////////////////////////////////////// -// -// 2D Vector routines -// -///////////////////////////////////////////////////////////////////// - -#define vector2DClear( a ) ( (a)[ 0 ] = (a)[ 1 ] = 0 ) -#define vector2DNegate( a, b ) ( (b)[ 0 ] = (-a)[ 0 ], (b)[ 1 ] = (-a)[ 1 ] ) -#define vector2DSet( v, x, y ) ( (v)[ 0 ] = ( x ), (v)[ 1 ] = ( y ) ) -#define vector2DInverse( a ) ( (a)[ 0 ] = (-a)[ 0 ], (a)[ 1 ] = (-a)[ 1 ] ) - -#define vector2DPerpDot( a, b ) ( (a)[ 0 ] * (b)[ 1 ] - (a)[ 1 ] * (b)[ 0 ] ) -#define vector2DDotProduct( x, y ) ( (x)[ 0 ] * (y)[ 0 ] + (x)[ 1 ] * (y)[ 1 ] ) -#define vector2DSubtract( a, b, c ) ( (c)[ 0 ] = (a)[ 0 ] - (b)[ 0 ], (c)[ 1 ] = (a)[ 1 ] - (b)[ 1 ] ) -#define vector2DAdd( a, b, c ) ( (c)[ 0 ] = (a)[ 0 ] + (b)[ 0 ], (c)[ 1 ] = (a)[ 1 ] + (b)[ 1 ] ) -#define vector2DCopy( a, b ) ( (b)[ 0 ] = (a)[ 0 ], (b)[ 1 ] = (a)[ 1 ] ) -#define vector2DScale( v, s, o ) ( (o)[ 0 ] = (v)[ 0 ] * (s), (o)[ 1 ] = (v)[ 1 ] * (s) ) -#define vector2DMA( v, s, b, o ) ( (o)[ 0 ] = (v)[ 0 ] + (b)[ 0 ]*(s), (o)[ 1 ] = (v)[ 1 ] + (b)[ 1 ] * (s) ) - - -extern W32 vector2DCompare( const vec2_t v1, const vec2_t v2 ); -extern vec_t vector2DLength( const vec2_t v ); - - -#endif /* __VECTOR_H__ */ - diff --git a/wolf3d/newCode/env/video.h b/wolf3d/newCode/env/video.h deleted file mode 100644 index 8d12592..0000000 --- a/wolf3d/newCode/env/video.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * video.h -- video driver defs. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -/* - Notes: - This module is implemented by vid_sys.c. - -*/ - - - -#ifndef __VIDEO_H__ -#define __VIDEO_H__ - -typedef struct vrect_s -{ - int x, y, width, height; - -} vrect_t; - -typedef struct -{ - unsigned width, height; // coordinates from main game -} viddef_t; - -extern viddef_t viddef; // global video state - -// Video module initialisation etc -extern void Video_Init( void ); -extern void Video_Shutdown( void ); -extern void Video_CheckChanges( void ); - - -extern void VID_NewWindow ( int width, int height ); -extern _boolean VID_GetModeInfo( int *width, int *height, int mode ); - - -#endif /* __VIDEO_H__ */ diff --git a/wolf3d/newCode/env/wavfile.c b/wolf3d/newCode/env/wavfile.c deleted file mode 100644 index 47e89ea..0000000 --- a/wolf3d/newCode/env/wavfile.c +++ /dev/null @@ -1,241 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * wav.c: Wav file loader. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -#include "../wolfiphone.h" - - -PRIVATE W8 *iff_pdata; -PRIVATE W8 *iff_end; -PRIVATE W8 *iff_last_chunk; -PRIVATE W8 *iff_data; -PRIVATE int iff_chunk_len; - - - -PRIVATE short Wav_GetLittleShort( void ) -{ - short val = 0; - - val = *iff_pdata; - val += (*(iff_pdata + 1) << 8); - - iff_pdata += 2; - - return val; -} - - -PRIVATE int Wav_GetLittleLong( void ) -{ - int val = 0; - - val = *iff_pdata; - val += (*(iff_pdata + 1) << 8); - val += (*(iff_pdata + 2) << 16); - val += (*(iff_pdata + 3) << 24); - - iff_pdata += 4; - - return val; -} - - -PRIVATE void Wav_FindNextChunk( const char *name ) -{ - while( 1 ) - { - iff_pdata = iff_last_chunk; - - if( iff_pdata >= iff_end ) - { - // Didn't find the chunk - iff_pdata = NULL; - return; - } - - iff_pdata += 4; - iff_chunk_len = Wav_GetLittleLong(); - if( iff_chunk_len < 0 ) - { - iff_pdata = NULL; - return; - } - - iff_pdata -= 8; - iff_last_chunk = iff_pdata + 8 + ((iff_chunk_len + 1) & ~1); - if( ! my_strnicmp((const char *)iff_pdata, name, 4) ) - { - return; - } - } -} - - -PRIVATE void Wav_FindChunk( const char *name ) -{ - iff_last_chunk = iff_data; - - Wav_FindNextChunk( name ); -} - -PRIVATE void DumpChunks( void ) -{ - char str[ 5 ]; - - str[ 4 ] = 0; - iff_pdata = iff_data; - do - { - memcpy( str, iff_pdata, 4 ); - iff_pdata += 4; - iff_chunk_len = Wav_GetLittleLong(); - Com_Printf( "0x%x : %s (%d)\n", (int)(iff_pdata - 4), str, iff_chunk_len ); - iff_pdata += (iff_chunk_len + 1) & ~1; - - } while( iff_pdata < iff_end ); - -} - - -/* ------------------------------------------------------------------------------ - Function: LoadWavInfo -Load wav file. - - Parameters: filename -[in] Name of wav file to load. - wav -[out] wav data. - info -[out] wav sound info. - - Returns: True if file loaded, otherwise false. - - Notes: Caller is responsible for freeing wav data by calling Z_Free. - ------------------------------------------------------------------------------ -*/ -PUBLIC _boolean LoadWavInfo( const char *filename, W8 **wav, soundInfo_t *info ) -{ - filehandle_t *hFile; - W8 *data; - W32 wavlength; - - hFile = FS_OpenFile( filename, 0 ); - if( ! hFile ) - { - return false; - } - - data = (PW8)FS_GetLoadedFilePointer( hFile, SEEK_SET ); - wavlength = FS_GetFileSize( hFile ); - - iff_data = data; - iff_end = data + wavlength; - - // look for RIFF signature - Wav_FindChunk( "RIFF" ); - if( ! (iff_pdata && ! my_strnicmp( (const char *)iff_pdata + 8, "WAVE", 4 ) ) ) - { - Com_DPrintf( "[LoadWavInfo]: Missing RIFF/WAVE chunks (%s)\n", filename ); - FS_CloseFile( hFile ); - - return false; - } - - // Get "fmt " chunk - iff_data = iff_pdata + 12; - - Wav_FindChunk( "fmt " ); - if( ! iff_pdata ) - { - Com_DPrintf( "[LoadWavInfo]: Missing fmt chunk (%s)\n", filename ); - FS_CloseFile( hFile ); - - return false; - } - - iff_pdata += 8; - - if( Wav_GetLittleShort() != 1 ) - { - Com_DPrintf( "[LoadWavInfo]: Microsoft PCM format only (%s)\n", filename ); - FS_CloseFile( hFile ); - - return false; - } - - info->channels = Wav_GetLittleShort(); - info->sample_rate = Wav_GetLittleLong(); - - iff_pdata += 4; - - info->sample_size = Wav_GetLittleShort(); // Bytes Per Sample - - if (info->sample_size != 1 && info->sample_size != 2) - { - Com_DPrintf( "[LoadWavInfo]: only 8 and 16 bit WAV files supported (%s)\n", filename ); - FS_CloseFile( hFile ); - - return false; - } - - iff_pdata += 2; - - - // Find data chunk - Wav_FindChunk( "data" ); - if( ! iff_pdata ) - { - Com_DPrintf( "[LoadWavInfo]: missing 'data' chunk (%s)\n", filename ); - FS_CloseFile( hFile ); - - return false; - } - - iff_pdata += 4; - info->samples = Wav_GetLittleLong() / info->sample_size; - - if( info->samples <= 0 ) - { - Com_DPrintf( "[LoadWavInfo]: file with 0 samples (%s)\n", filename ); - FS_CloseFile( hFile ); - - return false; - } - - // Load the data - *wav = Z_Malloc( info->samples * info->sample_size ); - memcpy( *wav, data + (iff_pdata - data), info->samples * info->sample_size ); - - FS_CloseFile( hFile ); - - return true; -} - diff --git a/wolf3d/newCode/env/wavfile.h b/wolf3d/newCode/env/wavfile.h deleted file mode 100644 index c06ec21..0000000 --- a/wolf3d/newCode/env/wavfile.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * wav.h: Wav file loader. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -#ifndef __WAV_H__ -#define __WAV_H__ - - -// Structure used to describe a sound. -typedef struct -{ - W32 sample_rate; // Sample rate in Hz - W32 channels; // Number of Channels (0x01 = Mono, 0x02 = Stereo) - W32 sample_size; // Bytes per sample - // 1 = 8 bit Mono - // 2 = 8 bit Stereo or 16 bit Mono - // 4 = 16 bit Stereo - W32 samples; - -} soundInfo_t; - - -extern _boolean LoadWavInfo( const char *filename, W8 **wav, soundInfo_t *info ); - -#endif /* __WAV_H__ */ diff --git a/wolf3d/newCode/env/zmem.c b/wolf3d/newCode/env/zmem.c deleted file mode 100644 index 872d594..0000000 --- a/wolf3d/newCode/env/zmem.c +++ /dev/null @@ -1,191 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * zmem.c: Zone memory management. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -/* - Notes: - - Add the following line in your initization function: - z_chain.next = z_chain.prev = &z_chain; - -*/ - -#include "../wolfiphone.h" - - -// just cleared malloc with counters now... - - -#define Z_MAGIC 0x1d1d - - -PRIVATE int z_count, z_bytes; - -zhead_t z_chain; - - - -/* ------------------------------------------------------------------------------ - Function: Z_Free -Deallocates or frees a zone memory block. - - Parameters: memblock -[in] Previously allocated zone memory block to be freed. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void Z_Free( void *memblock ) -{ - zhead_t *z; - - z = ( (zhead_t *)memblock ) - 1; - - if( z->magic != Z_MAGIC ) - { - Com_Error( ERR_FATAL, "Z_Free: bad magic" ); - } - - z->prev->next = z->next; - z->next->prev = z->prev; - - z_count--; - z_bytes -= z->size; - - MM_FREE( z ); -} - -/* ------------------------------------------------------------------------------ - Function: Z_Stats_f -Console function to list zone memory usage. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: Lists number of bytes and blocks of zone memory allocated. ------------------------------------------------------------------------------ -*/ -PUBLIC void Z_Stats_f( void ) -{ - Com_Printf( "%i bytes in %i blocks\n", z_bytes, z_count ); -} - - -/* ------------------------------------------------------------------------------ - Function: Z_FreeTags -Free allocated zone memory blocks based on tag. - - Parameters: tag -[in] Tag of zone memory blocks to free (see header for tag). - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void Z_FreeTags( int tag ) -{ - zhead_t *z, *next; - - for( z = z_chain.next; z != &z_chain; z = next ) - { - next = z->next; - if( z->tag == tag ) - { - Z_Free( (void *)(z+1) ); - } - } -} - -/* ------------------------------------------------------------------------------ - Function: Z_TagMalloc -Allocates zone memory blocks. - - Parameters: - size -[in] Bytes to allocate. - tag -[in] Tag to associate with memory (see header for tag). - - Returns: - A void pointer to the allocated space, or will shutdown application - if there is insufficient memory available. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void *Z_TagMalloc( size_t size, int tag ) -{ - zhead_t *z; - - // Allocate memory - size += sizeof( zhead_t ); - z = MM_MALLOC( size ); - - - if( ! z ) - { - Com_Error( ERR_FATAL, "Z_Malloc: failed on allocation of %i bytes", size ); - } - - // Set memory block to zero and fill in header. - memset( z, 0, size ); - z_count++; - z_bytes += size; - z->magic = Z_MAGIC; - z->tag = tag; - z->size = size; - - // Add new memory block to chain. - z->next = z_chain.next; - z->prev = &z_chain; - z_chain.next->prev = z; - z_chain.next = z; - - return (void *)(z+1); -} - -/* ------------------------------------------------------------------------------ - Function: Z_Malloc -Allocates zone memory blocks. - - Parameters: size -[in] Bytes to allocate. - - Returns: - A void pointer to the allocated space, or will shutdown application - if there is insufficient memory available. - - Notes: Calls Z_TagMalloc() with tag set to zero. ------------------------------------------------------------------------------ -*/ -PUBLIC void *Z_Malloc( size_t size ) -{ - return Z_TagMalloc( size, 0 ); -} diff --git a/wolf3d/newCode/env/zmem.h b/wolf3d/newCode/env/zmem.h deleted file mode 100644 index 855fc89..0000000 --- a/wolf3d/newCode/env/zmem.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * zmem.h: Zone memory management. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -/* - Notes: - This module is implemented by zmem.c - -*/ - -#ifndef __ZMEM_H__ -#define __ZMEM_H__ - -#include - -// memory tags to allow dynamic memory to be cleaned up -#define TAG_GAME 765 /* clear when unloading the dll */ -#define TAG_LEVEL 766 /* clear when loading a new level */ -#define TAG_LEVEL_SCP 767 /* clear when unloading level script */ - - - -typedef struct zhead_s -{ - struct zhead_s *prev, *next; - - short magic; - short tag; // for group free - int size; - -} zhead_t; - -extern zhead_t z_chain; - - -// Returns 0 filled memory block -extern void *Z_Malloc( size_t size ); - -extern void *Z_TagMalloc( size_t size, int tag ); -extern void Z_Free( void *memblock ); -extern void Z_FreeTags( int tag ); - -extern void Z_Stats_f( void ); - - -#endif /* __ZMEM_H__ */ diff --git a/wolf3d/newCode/iphone/.DS_Store b/wolf3d/newCode/iphone/.DS_Store deleted file mode 100644 index 219174a8a7de41747d0eb3c023797a6c0a35d147..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKK}rKb5bV|n0WUdvoG0iHh7e!i2V@P(!jc>$=DIiUzSyei7P2gXoIGeXbk|N# z*X(W`rf1B|*N5$c*~-k8aH4%O%#HK(nO$Xu=xvSd>#@J@hJ81yJ(nQ&#yUG#Z-brk z+b5CMzwAD^K5SC?ejN6@H)OxsoPrdP0#ZNivk!5vs~TocDY%)mUTz@U0wF+AwVm#nLaV_?wD+ncdYzS;AJ z;(2ZG(#p+iprRCz0#gO9W4L1fe}td8|4&I8NdYPFrxftT=4rFWFJ*6?{TzF3fj`54 n47IHsVR8t-fUWrMq^|H8bv1DeY;@!s9jJo -#import -#import -#import - -/* -This class wraps the CAEAGLLayer from CoreAnimation into a convenient UIView subclass. -The view content is basically an EAGL surface you render your OpenGL scene into. -Note that setting the view non-opaque will only work if the EAGL surface has an alpha channel. -*/ -@interface EAGLView : UIView { -@public - UITextField *textField; - -@private - /* The pixel dimensions of the backbuffer */ - GLint backingWidth; - GLint backingHeight; - - EAGLContext *context; - - /* OpenGL names for the renderbuffer and framebuffers used to render to this view */ - GLuint viewRenderbuffer, viewFramebuffer; - - /* OpenGL name for the depth buffer that is attached to viewFramebuffer, if it exists (0 if it does not exist) */ - GLuint depthRenderbuffer; - - NSTimer *animationTimer; - NSTimeInterval animationInterval; - -} - -@property NSTimeInterval animationInterval; - -- (void)drawView; - -@end diff --git a/wolf3d/newCode/iphone/EAGLView.m b/wolf3d/newCode/iphone/EAGLView.m deleted file mode 100644 index 34a41f4..0000000 --- a/wolf3d/newCode/iphone/EAGLView.m +++ /dev/null @@ -1,293 +0,0 @@ -// -// EAGLView.m -// wolf3d -// -// Created by Cass Everitt on 2/20/09. -// Copyright Id Software 2009. All rights reserved. -// - - - -#import -#import - -#import "EAGLView.h" -#import "wolf3dAppDelegate.h" - -#include "wolfiphone.h" - -EAGLView *eaglview; - -// A class extension to declare private methods -@interface EAGLView () - -@property (nonatomic, retain) EAGLContext *context; -@property (nonatomic, assign) NSTimer *animationTimer; - -- (void) destroyFramebuffer; -- (void) swapBuffers; - -@end - - -@implementation EAGLView - -@synthesize context; -@synthesize animationTimer; -@synthesize animationInterval; - - -// You must implement this method -+ (Class)layerClass { - return [CAEAGLLayer class]; -} - - -//The GL view is stored in the nib file. When it's unarchived it's sent -initWithCoder: -- (id)initWithCoder:(NSCoder*)coder { - self = [super initWithCoder:coder]; - - eaglview = self; - - // Get the layer - CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer; - - eaglLayer.opaque = YES; - eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys: - - [NSNumber numberWithBool:NO], - kEAGLDrawablePropertyRetainedBacking, - - kEAGLColorFormatRGB565, - /* kEAGLColorFormatRGBA8, */ - kEAGLDrawablePropertyColorFormat, - - nil]; - - context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; - assert( context ); - - if ( ![EAGLContext setCurrentContext:context]) { - [self release]; - return nil; - } - self.multipleTouchEnabled = true; - - [EAGLContext setCurrentContext:context]; - - glGenFramebuffersOES(1, &viewFramebuffer); - glGenRenderbuffersOES(1, &viewRenderbuffer); - - glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); - glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); - [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer]; - glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer); - - glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); - glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); - - glGenRenderbuffersOES(1, &depthRenderbuffer); - glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); - glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight); - glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer); - - if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) { - NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES)); - } - - self.animationTimer = [NSTimer scheduledTimerWithTimeInterval:0.032 - target:self - selector:@selector(drawView) - userInfo:nil repeats:YES]; - return self; -} - -- (void)drawView { - int start, end; - - [EAGLContext setCurrentContext:context]; - - glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); - - [ (wolf3dAppDelegate *)[UIApplication sharedApplication].delegate restartAccelerometerIfNeeded]; - - start = Sys_Milliseconds(); - - extern void iphoneFrame(); - iphoneFrame(); - - end = Sys_Milliseconds(); -// Com_Printf( "msec: %i\n", end - start ); - - [self swapBuffers]; -} - -void GLimp_EndFrame() { - [eaglview swapBuffers]; -} - -- (void)swapBuffers { - glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); - [context presentRenderbuffer:GL_RENDERBUFFER_OES]; -} - -- (void)layoutSubviews { - [self drawView]; -} - - - -- (void)destroyFramebuffer { - - glDeleteFramebuffersOES(1, &viewFramebuffer); - viewFramebuffer = 0; - glDeleteRenderbuffersOES(1, &viewRenderbuffer); - viewRenderbuffer = 0; - glDeleteRenderbuffersOES(1, &depthRenderbuffer); - depthRenderbuffer = 0; -} - - -- (void)dealloc { - if ([EAGLContext currentContext] == context) { - [EAGLContext setCurrentContext:nil]; - } - - [context release]; - [super dealloc]; -} - -void WolfensteinTouches( int numTouches, int touches[16] ); - -- (void) handleTouches:(NSSet*)touches withEvent:(UIEvent*)event { - int touchCount = 0; - int points[16]; - static int previousTouchCount; - - NSSet *t = [event allTouches]; - for (UITouch *myTouch in t) - { - CGPoint touchLocation = [myTouch locationInView:nil]; - - points[ 2 * touchCount + 0 ] = touchLocation.x; - points[ 2 * touchCount + 1 ] = touchLocation.y; // ( h - 1 ) - touchLocation.y; - - touchCount++; - - if (myTouch.phase == UITouchPhaseBegan) { - // new touch handler - } - if (myTouch.phase == UITouchPhaseMoved) { - // touch moved handler - } - if (myTouch.phase == UITouchPhaseEnded) { - touchCount--; - } - } - - // toggle the console with four touches - if ( touchCount == 4 && previousTouchCount != 4 ) { - if ( textField == nil ) { - void iphoneActivateConsole(); - textField = [UITextField alloc]; - [textField initWithFrame:CGRectMake( 0, 0, 20, 20 ) ]; - [self addSubview:textField]; - [textField release]; - textField.hidden = true; - textField.delegate = self; - textField.autocapitalizationType = UITextAutocapitalizationTypeNone; - textField.autocorrectionType = UITextAutocorrectionTypeNo; - [textField becomeFirstResponder]; - - iphoneActivateConsole(); - } else { - void iphoneDeactivateConsole(); - [textField resignFirstResponder]; - [textField removeFromSuperview]; - textField = nil; - - iphoneDeactivateConsole(); - } - } - previousTouchCount = touchCount; - - WolfensteinTouches( touchCount, points ); -} - - -- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { - [self handleTouches:touches withEvent:event]; -} - -- (void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event { - [self handleTouches:touches withEvent:event]; -} - -- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { - [self handleTouches:touches withEvent:event]; -} - - -- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { - [self handleTouches:touches withEvent:event]; -} - - - -@end - - -@implementation EAGLView (UITextFieldDelegate) - -- (BOOL)textFieldShouldReturn:(UITextField *)_textField -{ - void iphoneExecuteCommandLine(); - iphoneExecuteCommandLine(); - return YES; -} - -@end - -const char * GetCurrentCommandLine() { - assert( eaglview->textField != nil ); - return [ eaglview->textField.text UTF8String ]; -} - -void SetCurrentCommandLine( const char * str) { - assert( eaglview->textField != nil ); - eaglview->textField.text = [ NSString stringWithUTF8String: str ]; -} - -void OpenURL( const char *url ) { - Com_Printf( "OpenURL char *: %s\n", url ); - - NSString *nss = [NSString stringWithCString: url encoding: NSASCIIStringEncoding]; - [[UIApplication sharedApplication] openURL:[NSURL URLWithString: nss]]; -} - - -void iPhoneLoadJPG( W8* jpegData, int jpegBytes, W8 **pic, W16 *width, W16 *height, W16 *bytes ) { - CFDataRef data; - int dataBytes = 0; - UIImage *img = [ UIImage imageWithData: [NSData dataWithBytes: (const char *)jpegData length: (NSUInteger)jpegBytes ] ]; - int imgBytes; - *width = img.size.width; - *height = img.size.height; - imgBytes = (int)(*width) * (int)(*height) * 4; - data = CGDataProviderCopyData( CGImageGetDataProvider( img.CGImage ) ); - dataBytes = CFDataGetLength( data ); - *bytes = 4; - if ( dataBytes > imgBytes ) { - *pic = NULL; - return; - } - *pic = (W8 *)malloc( imgBytes ); - CFDataGetBytes( data, CFRangeMake(0, dataBytes), *pic ); - // convert BGRA to RGBA - for ( imgBytes = 0; imgBytes < dataBytes; imgBytes+= 4 ) { - W8 tmp = pic[0][ imgBytes + 0 ]; - pic[0][ imgBytes + 0 ] = pic[0][ imgBytes + 2 ]; - pic[0][ imgBytes + 2 ] = tmp; - } -} - diff --git a/wolf3d/newCode/iphone/Info.plist b/wolf3d/newCode/iphone/Info.plist deleted file mode 100644 index 75d10f1..0000000 --- a/wolf3d/newCode/iphone/Info.plist +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - CFBundleDevelopmentRegion - English - CFBundleDisplayName - ${PRODUCT_NAME} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - ${PRODUCT_NAME}_icon.png - CFBundleIdentifier - com.idsoftware.${PRODUCT_NAME:identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleSignature - ???? - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - NSMainNibFile - MainWindow - UIInterfaceOrientation - UIInterfaceOrientationLandscapeLeft - UIStatusBarHidden - - - diff --git a/wolf3d/newCode/iphone/MainWindow.xib b/wolf3d/newCode/iphone/MainWindow.xib deleted file mode 100644 index fc76dc5..0000000 --- a/wolf3d/newCode/iphone/MainWindow.xib +++ /dev/null @@ -1,223 +0,0 @@ - - - - 528 - 9E17 - 672 - 949.33 - 352.00 - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - IBFilesOwner - - - IBFirstResponder - - - - - 1316 - - YES - - - 1298 - {320, 480} - - - 3 - MQA - - 2 - - - NO - - - - {320, 480} - - - 1 - MSAxIDEAA - - NO - YES - - - - - YES - - - delegate - - - - 4 - - - - window - - - - 5 - - - - glView - - - - 9 - - - - - YES - - 0 - - YES - - - - - - 2 - - - YES - - - - - - -1 - - - RmlsZSdzIE93bmVyA - - - 3 - - - - - 8 - - - - - -2 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 2.IBAttributePlaceholdersKey - 2.IBEditorWindowLastContentRect - 2.IBPluginDependency - 3.CustomClassName - 3.IBPluginDependency - 8.CustomClassName - 8.IBPluginDependency - - - YES - UIApplication - UIResponder - - YES - - YES - - - YES - - - {{500, 343}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - wolf3dAppDelegate - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - EAGLView - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - YES - - - YES - - - - - YES - - YES - - - YES - - - - 9 - - - - YES - - EAGLView - UIView - - IBProjectSource - Classes/EAGLView.h - - - - wolf3dAppDelegate - NSObject - - YES - - YES - glView - window - - - YES - EAGLView - UIWindow - - - - IBProjectSource - Classes/wolf3dAppDelegate.h - - - - - 0 - wolf3d.xcodeproj - 3 - - diff --git a/wolf3d/newCode/iphone/default.png b/wolf3d/newCode/iphone/default.png deleted file mode 100644 index ed576c0632a6547bbea2ec018f184e2b229afea5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 336799 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≥e0`u~Ov=>CtDx(75 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�Q1` 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%0A>9MZvnzb@% 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�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 diff --git a/wolf3d/newCode/iphone/dist.plist b/wolf3d/newCode/iphone/dist.plist deleted file mode 100644 index ce373e1..0000000 --- a/wolf3d/newCode/iphone/dist.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - get-task-allow - - - diff --git a/wolf3d/newCode/iphone/gles_glue.c b/wolf3d/newCode/iphone/gles_glue.c deleted file mode 100644 index 08ac8f7..0000000 --- a/wolf3d/newCode/iphone/gles_glue.c +++ /dev/null @@ -1,134 +0,0 @@ -/* - - Copyright (C) 2009 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 "wolfiphone.h" - -//int registration_sequence; - -#include "iphone_qgl.h" - - -#ifdef QGL_LOG_GL_CALLS -unsigned int QGLLogGLCalls = 1; -FILE *QGLDebugFile(void) { - return stdout; -} -#endif - -void QGLCheckError(const char *message) { - GLint err = qglGetError(); - if ( err != GL_NO_ERROR ) { - printf( "GL ERROR %d from %s\n", err, message ); - } -} - -unsigned int QGLBeginStarted = 0; - - - - -struct Vertex { - float xyz[3]; - float st[2]; - GLubyte c[4]; -}; - -#define MAX_VERTS 16384 - -typedef struct Vertex Vertex; -Vertex immediate[ MAX_VERTS ]; -Vertex vab; -short quad_indexes[MAX_VERTS * 3 / 2 ]; -int curr_vertex; -GLenum curr_prim; - -void InitImmediateModeGL() { - for ( int i = 0; i < MAX_VERTS * 3 / 2; i+=6 ) { - int q = i / 6 * 4; - quad_indexes[ i + 0 ] = q + 0; - quad_indexes[ i + 1 ] = q + 1; - quad_indexes[ i + 2 ] = q + 2; - - quad_indexes[ i + 3 ] = q + 0; - quad_indexes[ i + 4 ] = q + 2; - quad_indexes[ i + 5 ] = q + 3; - } - - qglVertexPointer( 3, GL_FLOAT, sizeof( Vertex ), immediate[ 0 ].xyz ); - qglTexCoordPointer( 2, GL_FLOAT, sizeof( Vertex ), immediate[ 0 ].st ); - qglColorPointer( 4, GL_UNSIGNED_BYTE, sizeof( Vertex ), immediate[ 0 ].c ); - qglEnableClientState( GL_VERTEX_ARRAY ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); - qglEnableClientState( GL_COLOR_ARRAY ); -} - -void pfglBegin( GLenum prim ) { - curr_vertex = 0; - curr_prim = prim; -} - -void pfglVertex3f( float x, float y, float z ) { - assert( curr_vertex < MAX_VERTS ); - vab.xyz[ 0 ] = x; - vab.xyz[ 1 ] = y; - vab.xyz[ 2 ] = z; - immediate[ curr_vertex ] = vab; - curr_vertex++; -} -void pfglVertex2i( GLint x, GLint y ) { - assert( curr_vertex < MAX_VERTS ); - vab.xyz[ 0 ] = (float)x; - vab.xyz[ 1 ] = (float)y; - vab.xyz[ 2 ] = 0.0f; - immediate[ curr_vertex ] = vab; - curr_vertex++; -} -void pfglColor4ub( GLubyte r, GLubyte g, GLubyte b, GLubyte a ) { - vab.c[ 0 ] = r; - vab.c[ 1 ] = g; - vab.c[ 2 ] = b; - vab.c[ 3 ] = a; -} -void pfglColor4f( GLfloat r, GLfloat g, GLfloat b, GLfloat a ) { - vab.c[ 0 ] = (GLubyte) ( r * 255 ); - vab.c[ 1 ] = (GLubyte) ( g * 255 ); - vab.c[ 2 ] = (GLubyte) ( b * 255 ); - vab.c[ 3 ] = (GLubyte) ( a * 255 ); -} -void pfglTexCoord2i( GLint s, GLint t ) { - vab.st[ 0 ] = (float)s; - vab.st[ 1 ] = (float)t; -} -void pfglTexCoord2f( GLfloat s, GLfloat t ) { - vab.st[ 0 ] = s; - vab.st[ 1 ] = t; -} - -void pfglEnd() { - if ( curr_prim == GL_QUADS ) { - qglDrawElements( GL_TRIANGLES, curr_vertex / 4 * 6, GL_UNSIGNED_SHORT, quad_indexes ); - } else { - qglDrawArrays( curr_prim, 0, curr_vertex ); - } - curr_vertex = 0; - curr_prim = 0; -} - diff --git a/wolf3d/newCode/iphone/gles_glue.h b/wolf3d/newCode/iphone/gles_glue.h deleted file mode 100644 index 6eca2a8..0000000 --- a/wolf3d/newCode/iphone/gles_glue.h +++ /dev/null @@ -1,77 +0,0 @@ - - -#ifndef __GLES_GLUE_H__ -#define __GLES_GLUE_H__ - -#include "iphone_qgl.h" - -typedef GLfloat GLdouble; - -#define pfglEnable qglEnable -#define pfglDisable qglDisable -#define pfglActiveTextureARB qglActiveTexture -#define pfglGenTextures qglGenTextures -#define pfglDeleteTextures qglDeleteTextures -#define pfglDepthRange qglDepthRangef -#define pfglDepthFunc qglDepthFunc -#define pfglCullFace qglCullFace -#define pfglColor3f(r,g,b) pfglColor4f(r,g,b,1.0f) -#define pfglColor3ubv(c) pfglColor4ub( (c)[0], (c)[1], (c)[2], 255 ) -#define pfglColor4ubv(c) pfglColor4ub( (c)[0], (c)[1], (c)[2], (c)[3] ) -#define pfglBlendFunc qglBlendFunc -#define pfglClearColor qglClearColor -#define pfglClear qglClear -#define pfglDrawBuffer(buffer) -#define pfglLineWidth qglLineWidth -#define pfglBindTexture qglBindTexture -#define pfglTexParameteri qglTexParameteri -#define pfglTexParameterf qglTexParameterf -#define pfglTexImage2D qglTexImage2D -#define pfglFrustum qglFrustumf -#define pfglOrtho qglOrthof -#define pfglLoadIdentity qglLoadIdentity -#define pfglMatrixMode qglMatrixMode -#define pfglShadeModel qglShadeModel -#define pfglRotatef qglRotatef -#define pfglTranslatef qglTranslatef -#define pfglReadPixels qglReadPixels -#define pfglAlphaFunc qglAlphaFunc -#define pfglViewport qglViewport -#define pfglTexEnvi qglTexEnvi -#define pfglClientActiveTextureARB qglClientActiveTexture - -#define pfglGetIntegerv qglGetIntegerv -#define pfglGetString qglGetString -#define pfglGetError qglGetError - - -#define GL_QUADS 888 - -/* -void GLimp_BeginFrame(); -void GLimp_EndFrame( void ); -_boolean GLimp_Init( void *hinstance, void *hWnd ); -void GLimp_Shutdown( void ); -int GLimp_SetMode( int *pwidth, int *pheight, int mode, _boolean fullscreen ); -void GLimp_AppActivate( _boolean active ); -*/ - -#ifdef __cplusplus -extern "C" { -#endif - -void pfglBegin( GLenum prim ); -void pfglVertex3f( float x, float y, float z ); -void pfglVertex2i( GLint x, GLint y ); -void pfglColor4ub( GLubyte r, GLubyte g, GLubyte b, GLubyte a ); -void pfglColor4f( GLfloat r, GLfloat g, GLfloat b, GLfloat a ); -void pfglTexCoord2i( GLint s, GLint t ); -void pfglTexCoord2f( GLfloat s, GLfloat t ); - -void pfglEnd(); - -#ifdef __cplusplus -} -#endif - -#endif \ No newline at end of file diff --git a/wolf3d/newCode/iphone/iphone_loop.c b/wolf3d/newCode/iphone/iphone_loop.c deleted file mode 100644 index a64902a..0000000 --- a/wolf3d/newCode/iphone/iphone_loop.c +++ /dev/null @@ -1,1025 +0,0 @@ -/* - remove wolf_render.c - for the iphone build, we only need the following lsfx files: - - 001 - 003 - 008 - 009 - 012 - 023 - 028 - 030 - 031 - 033 - 034 - 035 - 036 - 037 - 038 - 040 - 044 - 045 - 061 - 062 - 064 - 069 - 076 - 078 - 080 - 085 - 086 - - */ - -#include "../wolfiphone.h" - -currentMap_t currentMap; - -vec3_t vnull = { 0, 0, 0 }; - -int iphoneFrameNum; -int intermissionTriggerFrame; -int slowAIFrame; - -// console mode -int consoleActive; - -// the native iPhone code should set the following each frame: -int numTouches; -int touches[5][2]; // [0] = x, [1] = y in landscape mode, raster order with y = 0 at top -float tilt; // -1.0 to 1.0 -float tiltPitch; - -#define MAX_TILT_HISTORY 64 -float tiltHistory[MAX_TILT_HISTORY][4]; -int tiltHistoryNum; - -// so we can detect button releases -int numPrevTouches; -int prevTouches[5][2]; - - -// the layout drawing code sets these, which are then used -// by the touch processing -int fireButtonX, fireButtonY, fireButtonSize; -int moveAxisX, moveAxisY, moveAxisSize; -int turnAxisX, turnAxisY, turnAxisSize; - -texture_t *numberPics[10]; - -int damageflash; -int bonusFrameNum; -int attackDirTime[2]; - -/* - ================== - iphoneActivateConsole - - ================== - */ -void iphoneActivateConsole() { - extern float scr_conlines; - scr_conlines = 0.5f; - consoleActive = 1; -} - -/* - ================== - iphoneDeactivateConsole - - ================== - */ -void iphoneDeactivateConsole() { - extern float scr_conlines; - scr_conlines = 0.0f; - consoleActive = 0; -} - -/* - ================== - iphoneExecuteCommandLine - - ================== - */ -void iphoneExecuteCommandLine() { - const char * GetCurrentCommandLine(); - void SetCurrentCommandLine(const char *); - char buf[256]; - strcpy( buf, GetCurrentCommandLine() ); - - Cmd_ExecuteString( buf ); - SetCurrentCommandLine( "" ); -} - - - -/* - ================== - iphoneSavePrevTouches - - ================== - */ -void iphoneSavePrevTouches() { - numPrevTouches = numTouches; - memcpy( prevTouches, touches, sizeof( prevTouches ) ); -#if 0 - // display the touch locations - for ( int i = 0 ; i < numTouches ; i++ ) { - int w = 32; - iphoneDrawPic( touches[i][0] - w/2, touches[i][1] - w/2, w, w, "iphone/diractional_02.tga" ); - } -#endif -} - -/* - ================== - iphoneCenterText - - Returns the width in pixels - ================== - */ -extern font_t *myfonts[ 1 ]; -int iphoneCenterText( int x, int y, const char *str ) { - int l = strlen( str ); - int i; - font_t *myfont = myfonts[0]; - int scale; - int step = 10; - - scale = 16; - - x -= l * step / 2; - - R_Bind( myfont->texfont->texnum ); - pfglBegin( GL_QUADS ); - - for ( i = 0 ; i < l ; i++, x += step ) { - int row, col; - float frow, fcol; - int num = str[i]; - - if ( num == ' ' ) { - continue; - } - - row = (num >> 4) - 2; - col = num & 15; - - frow = row * myfont->hFrac; - fcol = col * myfont->wFrac; - - pfglTexCoord2f( fcol, frow ); - pfglVertex2i( x, y ); - - pfglTexCoord2f( fcol+myfont->wFrac, frow ); - pfglVertex2i( x+scale, y ); - - pfglTexCoord2f( fcol+myfont->wFrac, frow+myfont->hFrac ); - pfglVertex2i( x+scale, y+scale ); - - pfglTexCoord2f( fcol, frow+myfont->hFrac ); - pfglVertex2i( x, y+scale ); - } - - pfglEnd(); - - return l * step; -} - - -/* - ================== - TouchDown - - Checks all touches against a square - ================== - */ -int TouchDown( int x, int y, int w, int h ) { - int i; - for ( i = 0 ; i < numTouches ; i++ ) { - if ( touches[i][0] >= x && touches[i][1] >= y - && touches[i][0] < x + w && touches[i][1] < y + h ) { - return 1; - } - } - return 0; -} - -/* - ================== - TouchReleased - - Perform an action when released in the box. - If not down this frame, but down the previous frame, it is released - ================== - */ -int TouchReleased( int x, int y, int w, int h ) { - int i; - int downPrev = 0; - int downNow = 0; - - for ( i = 0 ; i < numPrevTouches ; i++ ) { - if ( prevTouches[i][0] >= x && prevTouches[i][1] >= y - && prevTouches[i][0] < x + w && prevTouches[i][1] < y + h ) { - downPrev = 1; - break; - } - } - - // see if not down this frame - for ( i = 0 ; i < numTouches ; i++ ) { - if ( touches[i][0] >= x && touches[i][1] >= y - && touches[i][0] < x + w && touches[i][1] < y + h ) { - downNow = 1; - break; - } - } - - if ( !downPrev ) { - if ( downNow ) { - Sound_StartLocalSound( "iphone/bdown_01.wav" ); - } - // wasn't down the previous frame - return 0; - } - - if ( downNow ) { - // still down - return 0; - } - - if ( numTouches != 0 ) { - // finger dragged off - Sound_StartLocalSound( "iphone/baborted_01.wav" ); - return 0; - } - - // released - Sound_StartLocalSound( "iphone/baction_01.wav" ); - return 1; -} - -/* - ================== - iphoneSet2D - - ================== - */ -void iphoneSet2D( void ) { - pfglViewport( 0,0, 480, 320 ); - pfglMatrixMode( GL_MODELVIEW ); - pfglLoadIdentity(); - pfglDisable( GL_DEPTH_TEST ); - pfglDisable( GL_CULL_FACE ); - pfglEnable( GL_BLEND ); - pfglBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); - pfglDisable( GL_ALPHA_TEST ); - pfglColor4f( 1,1,1,1 ); - - pfglMatrixMode( GL_PROJECTION ); - pfglLoadIdentity(); - pfglRotatef( 90, 0, 0, 1 ); - pfglOrtho( 0, 480, 320, 0, -99999, 99999 ); -} - - -/* - ================== - DeadBandAdjust - - Compresses the 0.0 - 1.0 range into deadband - 1.0 - ================== - */ -float DeadBandAdjust( float f, float deadBand ) { - if ( f < 0 ) { - return -DeadBandAdjust( -f, deadBand ); - } - if ( f > 1.0 ) { - return 1.0; - } - if ( f < deadBand ) { - return 0; - } - return (f-deadBand) / (1.0 - deadBand); -} - -/* -================== -AxisHit - -Returns a -1 to 1 range - -If activeFraction is less than 1.0, the range will clamp -to the limits before the edge of the box is hit. -================== -*/ -float AxisHit( int x, int y, int size, int isXaxis, float activeFraction ) { - int i; - - // allow the touches to go outside the indicated bounds with clamping - x -= size/2; - y -= size/2; - size *= 2; - activeFraction *= 0.5f; - - for ( i = 0 ; i < numTouches ; i++ ) { - if ( touches[i][0] >= x && touches[i][1] >= y - && touches[i][0] < x + size && touches[i][1] < y + size ) { - float f; - if ( isXaxis ) { - f = (float)( touches[i][0] - x ) / size * 2.0f - 1.0f; - } else { - f = (float)( touches[i][1] - y ) / size * 2.0f - 1.0f; - } - f /= activeFraction; - if ( f > 1.0f ) { - f = 1.0f; - } else if ( f < -1.0f ) { - f = -1.0f; - } - if ( f > -stickDeadBand->value && f < stickDeadBand->value ) { - f = 0; - } - return f; - } - } - return 0; -} - -void WolfensteinTouches( int _numTouches, int _touches[16] ) { - numTouches = _numTouches; - for ( int i = 0 ; i < numTouches ; i++ ) { - touches[i][0] = 480 - _touches[i*2+1]; - touches[i][1] = _touches[i*2+0]; - } -} - -void WolfensteinTilts( float *tilts ) { - int i; - int j; - int c; - float sum[3]; - static float prevTime; - - c = tiltAverages->value; - if ( c < 1 ) { - c = 1; - } else if ( c > MAX_TILT_HISTORY ) { - c = MAX_TILT_HISTORY; - } - - // acc[0] - [2] are accelerometer values, ax[3] is the timestamp - for ( i = 0 ; i < 3 ; i++ ) { - tiltHistory[tiltHistoryNum&(MAX_TILT_HISTORY-1)][i] = tilts[i]; - sum[i] = 0; - for ( j = 0 ; j < c ; j++ ) { - sum[i] += tiltHistory[(tiltHistoryNum-j)&(MAX_TILT_HISTORY-1)][i]; - } - sum[i] /= c; - } - // save the timestamp for analysis - tiltHistory[tiltHistoryNum&(MAX_TILT_HISTORY-1)][3] = tilts[3] - prevTime; - prevTime = tilts[3]; - tiltHistoryNum++; - - tilt = sum[1]; - tiltPitch = sum[0]; -// Com_Printf( "%4.2f %4.2f %4.2f\n", tilts[0], tilts[1], tilts[2] ); -} - -void ShowTilt() { - int i; - int axis = (int)showTilt->value; - colour4_t fillColor = { 255, 0, 0, 255 }; - colour4_t whiteColor = { 255, 255, 255, 255 }; - colour4_t nowColor = { 0, 255, 0, 255 }; - float x; - - if ( axis < 0 || axis > 2 ) { - return; - } - for ( i = 0 ; i < MAX_TILT_HISTORY ; i++ ) { - x = tiltHistory[(tiltHistoryNum-1-i)&(MAX_TILT_HISTORY-1)][axis] * ( 10 / 0.018168604 ); - if ( x < 0 ) { - R_Draw_Fill( 240 + x, i*4, -x, 4, fillColor ); - } else if ( x > 0 ) { - R_Draw_Fill( 240, i*4, x, 4, fillColor ); - } - } - x = tilt * ( 10 / 0.018168604 ); - if ( x < 0 ) { - R_Draw_Fill( 240 + x, i*4, -x, 4, nowColor ); - } else if ( x > 0 ) { - R_Draw_Fill( 240, i*4, x, 4, nowColor ); - } - R_Draw_Fill( 240, 0, 1, MAX_TILT_HISTORY*4, whiteColor ); -} - - -/* -================== -CreateIphoneUserCmd - -Build the movement, angles, and buttons for a frame of action: - -Player.position.angle -Player.cmd.buttons -Player.cmd.forwardMove -Player.cmd.sideMove -================== -*/ -PRIVATE void CreateIphoneUserCmd() -{ - float stickTurnValue; - float stickMoveValue; - - stickTurnValue = stickTurnBase->value + stickTurnScale->value * sensitivity->value; - stickMoveValue = stickMoveBase->value + stickMoveScale->value * sensitivity->value; - - usercmd_t *cmd = &Player.cmd; - memset( cmd, 0, sizeof( *cmd ) ); - - if ( TouchDown( fireButtonX, fireButtonY, fireButtonSize, fireButtonSize ) ) { - cmd->buttons |= BUTTON_ATTACK; - } - if ( tiltFire->value > 0 && tiltPitch < tiltFire->value ) { - cmd->buttons |= BUTTON_ATTACK; - } - - cmd->forwardmove = -stickMoveValue * AxisHit( moveAxisX, moveAxisY, moveAxisSize, 0, 0.8f ); - - if( controlScheme->value == 0 || controlScheme->value == 1 ) { - Player.position.angle += -stickTurnValue * AxisHit( moveAxisX, moveAxisY, moveAxisSize, 1, 0.8f ); - } else { - Player.position.angle += -stickTurnValue * AxisHit( turnAxisX, turnAxisY, turnAxisSize, 1, 0.8f ); - cmd->sidemove = stickMoveValue * AxisHit( moveAxisX, moveAxisY, moveAxisSize, 1, 0.8f ); - } - - // accelerometer tilting - cmd->sidemove += tiltMove->value * DeadBandAdjust( tilt, tiltDeadBand->value ); - Player.position.angle -= tiltTurn->value * DeadBandAdjust( tilt, tiltDeadBand->value ); - - // always use - if ( iphoneFrameNum & 1 ) { - cmd->buttons |= BUTTON_USE; - } -} - - -/* -================== -iphoneHighlightPicWhenTouched - -Draw transparent except when touched -================= -*/ -void iphoneHighlightPicWhenTouched( int x, int y, int w, int h, const char *pic ) { - if ( TouchDown( x, y, w, h ) ) { - pfglColor4f(1,1,1,1); - } else { - pfglColor4f(1,1,1,0.5); - } - R_Draw_StretchPic( x, y, w, h, pic ); - pfglColor4f(1,1,1,1); -} -int iphoneActivatePicWhenTouched( int x, int y, int w, int h, const char *pic ) { - iphoneHighlightPicWhenTouched( x, y, w, h, pic ); - return TouchReleased( x, y, w, h ); -} - - -/* -================== -iphoneDrawControls - - scheme 0: turnstick on left - scheme 1: turnstick on right - scheme 2: dualstick, move on left - scheme 3: dualstick, move on right -================= -*/ -static const int BUTTON_SIZE = 100; -void iphoneDrawControls( void ) { - int ss = (int)stickSize->value; - - switch ( (int)controlScheme->value ) { - case 0: - moveAxisX = 0; - moveAxisY = 320 - ss; - moveAxisSize = ss; - iphoneHighlightPicWhenTouched( moveAxisX, moveAxisY, moveAxisSize, moveAxisSize, "iphone/diractional_02.tga" ); - - fireButtonX = 480 - BUTTON_SIZE; - fireButtonY = 320 - BUTTON_SIZE; - fireButtonSize = BUTTON_SIZE; - break; - - case 1: - moveAxisX = 480 - ss; - moveAxisY = 320 - ss; - moveAxisSize = ss; - iphoneHighlightPicWhenTouched( moveAxisX, moveAxisY, moveAxisSize, moveAxisSize, "iphone/diractional_02.tga" ); - - fireButtonX = 0; - fireButtonY = 320 - BUTTON_SIZE; - fireButtonSize = BUTTON_SIZE; - break; - - case 2: - moveAxisX = 0; - moveAxisY = 320 - ss; - moveAxisSize = ss; - iphoneHighlightPicWhenTouched( moveAxisX, moveAxisY, moveAxisSize, moveAxisSize, "iphone/diractional_01.tga" ); - - turnAxisX = 480 - ss; - turnAxisY = 320 - ss; - turnAxisSize = ss; - iphoneHighlightPicWhenTouched( turnAxisX, turnAxisY, turnAxisSize, turnAxisSize, "iphone/diractional_03.tga" ); - - fireButtonX = 480-BUTTON_SIZE; - fireButtonY = 0; - fireButtonSize = BUTTON_SIZE; - break; - case 3: - moveAxisX = 480 - ss; - moveAxisY = 320 - ss; - moveAxisSize = ss; - iphoneHighlightPicWhenTouched( moveAxisX, moveAxisY, moveAxisSize, moveAxisSize, "iphone/diractional_01.tga" ); - - turnAxisX = 0; - turnAxisY = 320 - ss; - turnAxisSize = ss; - iphoneHighlightPicWhenTouched( turnAxisX, turnAxisY, turnAxisSize, turnAxisSize, "iphone/diractional_03.tga" ); - - fireButtonX = 480-BUTTON_SIZE; - fireButtonY = 0; - fireButtonSize = BUTTON_SIZE; - break; - } - - iphoneHighlightPicWhenTouched( fireButtonX, fireButtonY, fireButtonSize, fireButtonSize, "iphone/shoot.tga" ); -} - -/* - ================== - iphoneDrawWeapon - - ================== - */ -void iphoneDrawWeapon( void ) { - char name[ 32 ]; - texture_t *tex; - static int w = 200; - static int h = 200; - int x = (viddef.width - w ) >> 1; - int y = viddef.height - 80 - h; - int frame; - - if ( gunFrame->value ) { - // screenshots look better with the muzzle flash - frame = Player.weapon * 5 + gunFrame->value + SPR_KNIFEREADY; - } else { - frame = Player.weapon * 5 + Player.weaponframe + SPR_KNIFEREADY; - } - - my_snprintf( name, sizeof( name ), "%s/%d.tga", spritelocation, frame); - tex = TM_FindTexture( name, TT_Pic ); - - R_Bind( tex->texnum ); - - pfglBegin( GL_QUADS ); - - pfglTexCoord2f( 0.01f, 0.01f ); pfglVertex2i( x, y ); - pfglTexCoord2f( 0.99f, 0.01f ); pfglVertex2i( x + w, y ); - pfglTexCoord2f( 0.99f, 0.99f ); pfglVertex2i( x + w, y + h ); - pfglTexCoord2f( 0.01f, 0.99f ); pfglVertex2i( x, y + h ); - - pfglEnd(); -} - -/* - ================== - iphoneDrawNumber - - ================== - */ -void iphoneDrawNumber( int x, int y, int number, int charWidth, int charHeight ) { - texture_t *tex; - int i; - char string[ 20 ]; - W32 length; - float charStep = charWidth * 0.8; // trim off extra width - - if ( number < 0 ) { - number = 0; - } - my_snprintf( string, sizeof( string ), "%d", number ); - length = strlen( string ); - - x -= length * charStep / 2; - - for( i = 0 ; i < length ; i++ ) { - int digit = string[i] - '0'; - tex = numberPics[digit]; - R_Bind( tex->texnum ); - pfglBegin( GL_QUADS ); - - pfglTexCoord2f( 0, 0 ); pfglVertex2i( x, y ); - pfglTexCoord2f( 1, 0 ); pfglVertex2i( x+charWidth, y ); - pfglTexCoord2f( 1, 1 ); pfglVertex2i( x+charWidth, y+charHeight ); - pfglTexCoord2f( 0, 1 ); pfglVertex2i( x, y+charHeight ); - - pfglEnd(); - x += charStep; - } -} - -/* - ================== - iphoneDrawHUD - - ================== - */ -void iphoneDrawHUD( void ) { - int y; - - if( Player.items & ITEM_KEY_1 ) { - R_Draw_Pic( 0, 100, "iphone/GOLDKEYPIC.tga" ); - } - - if( Player.items & ITEM_KEY_2 ) { - R_Draw_Pic( 0, 130, "iphone/SILVERKEYPIC.tga" ); - } - - iphoneDrawNumber( 240, 304, Player.health, 16, 16 ); - if ( fireButtonY < 160 ) { - y = fireButtonY + fireButtonSize + 8; - } else { - y = fireButtonY - 8 - 48; - } - iphoneDrawNumber( fireButtonX + fireButtonSize/2, y, Player.ammo[AMMO_BULLETS], 48, 48 ); -} - -/* - ================== - iphoneDrawFace - - ================== - */ -void iphoneDrawFace( void ) { - int i; - int w = 64; - int h = 80; - int x = (viddef.width - w ) >> 1; - int y = viddef.height - h; - const char *pic; - static const char *mugshotnames[ 24 ] = - { - "iphone/newhead/FACE1APIC.tga", - "iphone/newhead/FACE1BPIC.tga", - "iphone/newhead/FACE1CPIC.tga", - - "iphone/newhead/FACE2APIC.tga", - "iphone/newhead/FACE2BPIC.tga", - "iphone/newhead/FACE2CPIC.tga", - - "iphone/newhead/FACE3APIC.tga", - "iphone/newhead/FACE3BPIC.tga", - "iphone/newhead/FACE3CPIC.tga", - - "iphone/newhead/FACE4APIC.tga", - "iphone/newhead/FACE4BPIC.tga", - "iphone/newhead/FACE4CPIC.tga", - - "iphone/newhead/FACE5APIC.tga", - "iphone/newhead/FACE5BPIC.tga", - "iphone/newhead/FACE5CPIC.tga", - - "iphone/newhead/FACE6APIC.tga", - "iphone/newhead/FACE6BPIC.tga", - "iphone/newhead/FACE6CPIC.tga", - - "iphone/newhead/FACE7APIC.tga", - "iphone/newhead/FACE7BPIC.tga", - "iphone/newhead/FACE7CPIC.tga", - - "iphone/newhead/FACE8APIC.tga" - }; - - static const char *godmugshotnames[] = - { - "iphone/newhead/GODMODEFACE0PIC.tga", - "iphone/newhead/GODMODEFACE1PIC.tga", - "iphone/newhead/GODMODEFACE2PIC.tga" - }; - - iphoneDrawPic( 240 - 64, 320 - 80, 128, 80, "iphone/status_hud.tga" ); - - Player.facecount += tics; - if ( Player.face_gotgun && Player.facecount > 0 ) { - // gotgun will set facecount to a negative number initially, go back - // to normal face with random look after expired. - Player.face_gotgun = false; - } - if( Player.facecount > US_RndT() ) - { - Player.face_gotgun = Player.face_ouch = false; - Player.faceframe = US_RndT() >> 6; - if( Player.faceframe == 3 ) - { - Player.faceframe = 0; - } - - Player.facecount = 0; - } - - if( Player.health ) - { - if( g_version->value == SPEAROFDESTINY && Player.flags & FL_GODMODE ) - { - pic = godmugshotnames[ Player.faceframe ]; - } - else if( Player.face_gotgun ) - { - pic = "iphone/newhead/GOTGATLINGPIC.tga"; - } - else - { - int h = Player.health; - if ( h > 100 ) { - h = 100; - } - if ( h < 0 ) { - h = 0; - } - pic = mugshotnames[ 3*((100-h)/16)+Player.faceframe ]; - } - } - else - { -#if 0 // forgot to convert the mutant face pic... - if( Player.LastAttacker && Player.LastAttacker->type == en_needle ) - { - pic = "iphone/MUTANTBJPIC.tga"; - } - else -#endif - { - pic = "iphone/newhead/FACE8APIC.tga"; - } - } - - R_Draw_StretchPic( x, y, w, h, pic ); - - // blend the right / left damage indicators on the side - for ( i = 0 ; i < 2 ; i++ ) { - float f; - if ( attackDirTime[i] == 0 ) { - continue; - } - f = iphoneFrameNum - attackDirTime[i]; - if ( f > 30 ) { - attackDirTime[i] = 0; - continue; - } - if ( f < 20 ) { - f = 1.0; - } else { - f = ( 30 - f ) * 0.1; - } - pfglColor4f( 1, 1, 1, f ); - if ( i == 0 ) { - iphoneDrawPic( 240 - 64, 320 - 80, 40, 80, "iphone/L_damage.tga" ); - } else { - iphoneDrawPic( 240 + 64 - 40, 320 - 80, 40, 80, "iphone/R_damage.tga" ); - } - pfglColor4f( 1, 1, 1, 1 ); - } -} - -/* - ================== - iphoneSetNotifyText - - Notify text is a single centered line for "got a key", "found a secret", etc - ================== - */ -char notifyText[128]; -int notifyFrameNum; -void iphoneSetNotifyText( const char *str, ... ) { - va_list argptr; - - va_start( argptr, str ); - (void)vsnprintf( notifyText, sizeof( notifyText )-1, str, argptr ); - va_end( argptr ); - - notifyFrameNum = iphoneFrameNum; -} - -void iphoneDrawNotifyText() { - if ( notifyFrameNum == 0 ) { - return; - } - // display for three seconds, then fade over 0.3 - float f = iphoneFrameNum - notifyFrameNum - 80; - if ( f < 0 ) { - f = 1.0; - } else { - f = 1.0 - f * 0.1f; - if ( f < 0 ) { - notifyFrameNum = 0; - return; - } - } - - pfglColor4f( 1, 1, 1, f ); - iphoneCenterText( 240, 20, notifyText ); - pfglColor4f( 1, 1, 1, 1 ); -} - -void iphoneStartBonusFlash() { - bonusFrameNum = iphoneFrameNum; -} - -void iphoneStartDamageFlash( int damage ) { - damageflash += damage; - if ( damageflash > 64 ) { - damageflash = 64; - } - if ( damageflash < 10 ) { - damageflash = 10; - } -} - -/* - ================== - iphoneSetAttackDirection - - +1 = attacked from the left - -1 = attacked from the right - ================== - */ -void iphoneSetAttackDirection( int dir ) { - if ( dir > 0 ) { - attackDirTime[0] = iphoneFrameNum; - } - if ( dir < 0 ) { - attackDirTime[1] = iphoneFrameNum; - } -} - - -/* -================== -iphoneFrame - -================== -*/ -void iphoneFrame() { - unsigned char blendColor[4]; - - int msec = 14; // fixed time - - iphoneFrameNum++; - - // check for delayed intermission trigger after boss kill - if ( intermissionTriggerFrame > 0 && iphoneFrameNum >= intermissionTriggerFrame ) { - iphoneStartIntermission( 0 ); - } - - // toggle / scroll down the console - Client_Screen_RunConsole(); - - - // fixed frame timing, assume we go 30hz - tics = 2; // wolf's global rate counter - - Sound_Update( vnull, vnull, vnull, vnull ); - - if ( consoleActive ) { - iphoneSet2D(); - - Client_Screen_DrawConsole(); - - iphoneSavePrevTouches(); - GLimp_EndFrame(); - return; - } - if ( menuState != IPM_GAME ) { - iphoneSet2D(); - - iphoneDrawMenus(); - - iphoneSavePrevTouches(); - GLimp_EndFrame(); - return; - } - - //------------------ - // normal gameplay - //------------------ - - if( Player.playstate != ex_dead ) - { - CreateIphoneUserCmd(); - Player.position.angle = NormalizeAngle( Player.position.angle ); - - PL_Process( &Player, r_world ); // Player processing - if ( !slowAI->value || --slowAIFrame < 0 ) { - // slowAIframe is for slow-motion screenshot capture - slowAIFrame += slowAI->value; - ProcessGuards(); - } - PushWall_Process(); - Door_ProcessDoors_e( &r_world->Doors, tics, msec ); - - levelstate.time += tics; - } - - // fill the floor and ceiling - R_Draw_Fill( 0, 0, viddef.width, viddef.height >> 1, r_world->ceilingColour ); - R_Draw_Fill( 0, viddef.height >> 1, viddef.width, viddef.height, r_world->floorColour ); - - // draw 3D world - R_SetGL3D( Player.position ); - R_RayCast( Player.position, r_world ); - R_DrawSprites(); - - // draw 2D overlays - iphoneSet2D(); - - // do a full screen blend for damage, death, and bonus pickup - if( Player.playstate == ex_dead ) { - static int deathFadeIntensity; - blendColor[0] = 255; - blendColor[1] = 0; - blendColor[2] = 0; - blendColor[3] = deathFadeIntensity; - deathFadeIntensity += 2; - if( deathFadeIntensity >= 240 ) { - deathFadeIntensity = 0; - PL_NewGame( &Player ); - iphoneStartMap( currentMap.episode, currentMap.map, currentMap.skill ); - } - } else { - iphoneDrawWeapon(); - if( damageflash ) { - blendColor[0] = 255; - blendColor[1] = 0; - blendColor[2] = 0; - blendColor[3] = damageflash >= 64 ? 255 : damageflash * 4; - - if( (damageflash -= 1) < 0 ) { - damageflash = 0; - } - } else if ( bonusFrameNum ) { - float f = ( iphoneFrameNum - bonusFrameNum ) * 0.1; - if ( f > 1.0 ) { - bonusFrameNum = 0; - } else { - blendColor[0] = 255; - blendColor[1] = 255; - blendColor[2] = 128; - blendColor[3] = ( 1.0 - f ) * 64; - } - } - } - if ( blendColor[3] != 0 && blends->value != 0 ) { - R_DrawBox( 0, 0, viddef.width, viddef.height, *(int *)blendColor ); - } - - iphoneDrawNotifyText(); - - iphoneDrawFace(); - - iphoneDrawControls(); - - iphoneDrawHUD(); - - // draw menu and map buttons - if ( controlScheme->value < 2 ) { - if ( iphoneActivatePicWhenTouched( 480-50, 0, 50, 50, "iphone/menu.tga" ) ) { - menuState = IPM_MAIN; - } - if ( iphoneActivatePicWhenTouched( 0, 0, 50, 50, "iphone/map.tga" ) ) { - iphoneOpenAutomap(); - } - } else { - if ( iphoneActivatePicWhenTouched( 0, 50, 50, 50, "iphone/menu.tga" ) ) { - menuState = IPM_MAIN; - } - if ( iphoneActivatePicWhenTouched( 0, 0, 50, 50, "iphone/map.tga" ) ) { - iphoneOpenAutomap(); - } - } - - Client_Screen_DrawConsole(); - - ShowTilt(); - - iphoneSavePrevTouches(); - - // do the swapbuffers - GLimp_EndFrame(); -} diff --git a/wolf3d/newCode/iphone/iphone_main.c b/wolf3d/newCode/iphone/iphone_main.c deleted file mode 100644 index bbcd626..0000000 --- a/wolf3d/newCode/iphone/iphone_main.c +++ /dev/null @@ -1,244 +0,0 @@ -/* - - Copyright (C) 2004-2005 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * unix_main.c: UNIX interface to application. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * This code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -#include "../wolfiphone.h" - - -cvar_t *controlScheme; -cvar_t *sensitivity; -cvar_t *stickSize; -cvar_t *stickTurnBase; -cvar_t *stickTurnScale; -cvar_t *stickMoveBase; -cvar_t *stickMoveScale; -cvar_t *stickDeadBand; -cvar_t *tiltTurn; -cvar_t *tiltMove; -cvar_t *tiltDeadBand; -cvar_t *tiltAverages; -cvar_t *tiltFire; -cvar_t *music; -cvar_t *showTilt; -cvar_t *cropSprites; -cvar_t *blends; -cvar_t *gunFrame; -cvar_t *slowAI; - -W32 sys_frame_time; - -void Sys_Error( const char *format, ... ) -{ - va_list argptr; - char string[ 1024 ]; - - va_start( argptr, format ); - (void)vsnprintf( string, sizeof( string ), format, argptr ); - va_end( argptr ); - - fprintf( stderr, "Error: %s\n", string ); - - _exit( 1 ); - -} - -void Sys_Quit (void) -{ - _exit( 0 ); -} - -void Sys_SendKeyEvents (void) -{ -} - -char *Sys_GetClipboardData( void ) -{ - return NULL; -} - -void Reset_f() { - memset( ¤tMap, 0, sizeof( currentMap ) ); - currentMap.skill = 1; - cvar_vars = NULL; // don't write any cvars to the config file - iphoneShutdown(); -} - -/* - ================== - iphoneStartup - - ================== - */ -void iphoneStartup() { - int i; - char *s; - int start = Sys_Milliseconds(); - - z_chain.next = z_chain.prev = &z_chain; - - InitImmediateModeGL(); - - // Prepare enough of the subsystems to handle - // cvar and command buffer management. - COM_InitArgv( 0, NULL ); // FIXME: get args... - - Cmd_Init(); - Cvar_Init(); - Con_Init(); - FS_InitFilesystem(); - - // We need to add the early commands twice, because - // a basedir or cddir needs to be set before execing - // config files, but we want other parms to override - // the settings of the config files. - Cbuf_AddEarlyCommands( false ); - Cbuf_Execute(); - - R_Init(); - - Cmd_AddCommand( "reset", Reset_f ); - - developer = Cvar_Get( "developer", "0", CVAR_INIT ); - logfile_active = Cvar_Get( "logfile", "0", CVAR_INIT ); - - s = va( "%s %s %s %s %s %s", APP_VERSION, RELEASENAME, CPUSTRING, __DATE__, __TIME__, BUILDSTRING ); - Cvar_Get( "version", s, CVAR_SERVERINFO | CVAR_NOSET ); - - Con_Init(); - - Sound_Init(); - - Game_Init(); // game and player init - - Cbuf_AddText( "exec config.cfg\n" ); - Cbuf_AddEarlyCommands( true ); - Cbuf_Execute(); - - // add + commands from command line - Cbuf_AddLateCommands(); - Cbuf_Execute(); - - for ( i = 0 ; i < 10 ; i++ ) { - char name[64]; - sprintf( name, "iphone/font/%i.tga", i ); - numberPics[i] = TM_FindTexture( name, TT_Pic ); - } - - Com_Printf( "\n====== Application Initialized ======\n\n" ); - - Sound_Activate( true ); - consoleActive = 0; - - controlScheme = Cvar_Get( "controlScheme", "0", CVAR_ARCHIVE ); - sensitivity = Cvar_Get( "sensitivity", "0.3", CVAR_ARCHIVE ); - - stickSize = Cvar_Get( "stickSize", "120", CVAR_ARCHIVE ); - stickTurnBase = Cvar_Get( "stickTurnBase", "300", CVAR_ARCHIVE ); - stickTurnScale = Cvar_Get( "stickTurnScale", "500", CVAR_ARCHIVE ); - stickMoveBase = Cvar_Get( "stickMoveBase", "3000", CVAR_ARCHIVE ); - stickMoveScale = Cvar_Get( "stickMoveScale", "5000", CVAR_ARCHIVE ); - stickDeadBand = Cvar_Get( "stickDeadBand", "0.2", CVAR_ARCHIVE ); - tiltTurn = Cvar_Get( "tiltTurn", "0", CVAR_ARCHIVE ); - tiltMove = Cvar_Get( "tiltMove", "0", CVAR_ARCHIVE ); - tiltFire = Cvar_Get( "tiltFire", "0", CVAR_ARCHIVE ); - music = Cvar_Get( "music", "1", CVAR_ARCHIVE ); - tiltDeadBand = Cvar_Get( "tiltDeadBand", "0.08", CVAR_ARCHIVE ); - tiltAverages = Cvar_Get( "tiltAverages", "3", CVAR_ARCHIVE ); - cropSprites = Cvar_Get( "cropSprites", "1", 0 ); - showTilt = Cvar_Get( "showTilt", "-1", 0 ); - blends = Cvar_Get( "blends", "1", 0 ); - gunFrame = Cvar_Get( "gunFrame", "0", 0 ); - slowAI = Cvar_Get( "slowAI", "0", 0 ); - - // these should get overwritten by LoadTheGame - currentMap.skill = 1; - currentMap.episode = 0; - - if ( !LoadTheGame() ) { - memset( currentMap.mapFlags, 0,sizeof( currentMap.mapFlags ) ); - PL_NewGame( &Player ); - iphoneStartMap( 0, 0, 1 ); - } - - // always start at main menu - menuState = IPM_MAIN; - - Com_Printf( "startup time: %i msec\n", Sys_Milliseconds() - start ); -} - -/* - ================== - iphoneWriteConfig - - ================== - */ -void iphoneWriteConfig( void ) { - FILE *fp; - char path[ MAX_OSPATH]; - cvar_t *var; - char buffer[1024]; - - my_snprintf( path, sizeof( path ), "%s/config.cfg", iphoneDocDirectory ); - fp = fopen( path, "w" ); - if( ! fp ) { - Com_Printf( "Could not write config.cfg.\n" ); - return; - } - - // write out commands to set the archived cvars - for( var = cvar_vars ; var ; var = var->next ) { - if( var->flags & CVAR_ARCHIVE ) { - my_snprintf( buffer, sizeof( buffer ), "set %s \"%s\"\n", var->name, var->string ); - fprintf( fp, "%s", buffer ); - Com_Printf( "%s", buffer ); - } - } - - fclose( fp ); -} - - -/* - ================== - iphoneShutdown - - Save the game at this position - ================== - */ -void iphoneShutdown() { - Sound_StopAllSounds(); - Sound_StopBGTrack(); - iphoneWriteConfig(); - SaveTheGame(); - exit( 0 ); -} - diff --git a/wolf3d/newCode/iphone/iphone_menus.c b/wolf3d/newCode/iphone/iphone_menus.c deleted file mode 100644 index 91ba1d6..0000000 --- a/wolf3d/newCode/iphone/iphone_menus.c +++ /dev/null @@ -1,1061 +0,0 @@ -/* - - Copyright (C) 2009 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 "../wolfiphone.h" - -int intermissionStartFrameNum; -int hasReleased; - -menuState_t menuState; -colour4_t highlightColor = { 128, 128, 128, 255 }; -colour4_t colorPressed = { 128, 128, 0, 255 }; - -/* - ================== - iphoneDrawPic - - ================== - */ -void iphoneDrawPic( int x, int y, int w, int h, const char *pic ) { - R_Draw_StretchPic( x, y, w, h, pic ); -} - -/* - ================== - iphoneDrawPicWithTouch - - ================== - */ -int iphoneDrawPicWithTouch( int x, int y, int w, int h, const char *pic ) { - int r = TouchReleased( x, y, w, h ); - - if ( r ) { - // make sure it is full intensity if it is touch-released, even if - // it wasn't active previously - pfglColor3f( 1, 1, 1 ); - } - R_Draw_StretchPic( x, y, w, h, pic ); - if ( TouchDown( x, y, w, h ) ) { - colour4_t color = { 255, 255, 255, 64 }; - R_Draw_Blend( x, y, w, h, color ); - } - return r; -} - - - -/* - ================== - iphoneSlider - - ================== - */ -void iphoneSlider( int x, int y, int w, int h, const char *title, cvar_t *cvar, - float min, float max ) { - float value = cvar->value; - char str[80]; - float f = ( value - min ) / ( max - min ); - colour4_t backColor = { 32, 32, 80, 255 }; - colour4_t highlightColor = { 64, 64, 160, 255 }; - - if ( f < 0 ) { - f = 0; - } - if ( f > 1 ) { - f = 1; - } - - // draw the background - R_Draw_Fill( x, y, w, h, backColor ); - - // draw the current range - R_Draw_Fill( x+2, y+2, f*(w-4), h-4, highlightColor ); - - // draw the title and fraction - sprintf( str, "%s : %i%%", title, (int)(f*100) ); - iphoneCenterText( x+ w/2, y+h/2-8, str ); - - // check for touches - if ( numTouches > 0 && touches[0][0] >= x && touches[0][0] < x + w - && touches[0][1] >= y && touches[0][1] < y+ h ) { - float newValue; - float delta; - - f = (float)( touches[0][0] - x ) / w; - // round to tenths - f = (int)( ( f + 0.05 ) * 10 ) * 0.1f; - if ( f < 0 ) { - f = 0; - } - if ( f > 1.0 ) { - f = 1.0; - } - - newValue = min + f * ( max - min ); - delta = fabs( newValue - cvar->value ); - if ( f == 0 && cvar->value == 0 ) { - // special case of disable-at-0 - } else if ( delta > 0.01 ) { - Cvar_SetValue( cvar->name, newValue ); - Sound_StartLocalSound( "iphone/slide_01.wav" ); - } - } - -} - -/* - ================== - BackButton - - ================== - */ -int BackButton() { - if ( iphoneDrawPicWithTouch( 0, 0, 64, 32, "iphone/button_back.tga" ) ) { - return 1; - } - return 0; -} - -void GetMoreLevels( int x, int y ) { - if ( iphoneDrawPicWithTouch( x, y, 128, 64, "iphone/button_levels.tga" ) ) { - // directly to the app store for more levels - OpenURL( "http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=304694876" ); - } -} - - -/* - ================== - SaveTheGame - - ================== - */ -extern W8 areaconnect[ NUMAREAS ][ NUMAREAS ]; -extern _boolean areabyplayer[ NUMAREAS ]; - -void SaveTheGame() { - FILE *f; - char path[1024]; - int version = SAVEGAME_VERSION; - int i; - - my_snprintf( path, sizeof( path ), "%s/savegame.bin", iphoneDocDirectory ); - f = fopen( path, "wb" ); - if( ! f ) { - Com_Printf( "Could not open savegame.bin.\n" ); - return; - } - - // turn the r_world->Doors.doors from pointers to indexes - // ok to be destructive, because we are quiting - for ( i = 0 ; i < r_world->Doors.doornum ; i++ ) { - int index = r_world->Doors.Doors[i] - &r_world->Doors.DoorMap[0][0]; - assert( index >= 0 && index < 4096 ); - r_world->Doors.Doors[i] = (void *)index; - } - - // this is only used for the mutant death face, so just - // clear it instead of fixing it up - Player.LastAttacker = NULL; - - currentMap.version = SAVEGAME_VERSION; - fwrite( ¤tMap, 1,sizeof(currentMap), f ); - fwrite( r_world, 1,sizeof(*r_world), f ); - fwrite( &LevelRatios, 1,sizeof(LevelRatios), f ); - fwrite( &levelstate, 1,sizeof(levelstate), f ); - fwrite( Guards, 1,sizeof(Guards), f ); - fwrite( areaconnect, 1,sizeof(areaconnect), f ); - fwrite( areabyplayer, 1,sizeof(areabyplayer), f ); - fwrite( &PWall, 1,sizeof(PWall), f ); - fwrite( &Player, 1,sizeof(Player), f ); - fwrite( &version, 1,sizeof(version), f ); - - fclose( f ); -} - -/* - ================== - LoadTheGame - - ================== - */ -int LoadTheGame() { - FILE *f; - char path[1024]; - int version; - int i; - int oldCompleted; - - my_snprintf( path, sizeof( path ), "%s/savegame.bin", iphoneDocDirectory ); - f = fopen( path, "rb" ); - if( ! f ) { - Com_Printf( "Could not open savegame.bin.\n" ); - return 0; - } - - fread( ¤tMap, 1,sizeof(currentMap) , f); - - if ( currentMap.version != SAVEGAME_VERSION ) { - Com_Printf( "Savegame header version mismatch: %i != %i\n", currentMap.version, SAVEGAME_VERSION ); - fclose( f ); - return 0; - } - - // do a normal map start - Cvar_SetValue( skill->name, currentMap.skill ); - PL_NewGame( &Player ); - - oldCompleted = currentMap.levelCompleted; - iphoneStartMap( currentMap.episode, currentMap.map, currentMap.skill ); - currentMap.levelCompleted = oldCompleted; - - // load modifiactions on top - r_world = Z_Malloc( sizeof( *r_world ) ); - fread( r_world, 1,sizeof(*r_world), f); - fread( &LevelRatios, 1,sizeof(LRstruct), f ); - fread( &levelstate, 1,sizeof(levelstate), f ); - fread( Guards, 1,sizeof(Guards), f ); - fread( areaconnect, 1,sizeof(areaconnect), f ); - fread( areabyplayer, 1,sizeof(areabyplayer), f ); - fread( &PWall, 1,sizeof(PWall), f ); - fread( &Player, 1,sizeof(Player), f ); - fread( &version, 1,sizeof(version), f ); - - fclose( f ); - - if ( version != SAVEGAME_VERSION ) { - Com_Printf( "Savegame trailer version mismatch: %i != %i\n", version, SAVEGAME_VERSION ); - return 0; - } - - // turn the r_world->Doors.doors back to pointers - for ( i = 0 ; i < r_world->Doors.doornum ; i++ ) { - int index = (int)r_world->Doors.Doors[i]; - assert( index >= 0 && index < 4096 ); - r_world->Doors.Doors[i] = &r_world->Doors.DoorMap[0][0] + index; - } - return 1; -} - - -/* - ================== - iphoneStartMap - - This does not reset the player, so call PL_NewGame( &Player ) if it is a new start. - ================== - */ -void iphoneStartMap( int episodeNum, int mapNum, int skillLevel ) { - char command[128]; - int levelNum = episodeNum*10+mapNum; - - Com_Printf( "iphoneStartMap( %i, %i, %i )\n", episodeNum, mapNum, skillLevel ); - - // get the sound playing - Sound_Update( vnull, vnull, vnull, vnull ); - - // clean up game feedback - damageflash = 0; - bonusFrameNum = 0; - attackDirTime[0] = 0; - attackDirTime[1] = 0; - - // note that this has been tried now - currentMap.mapFlags[currentMap.skill][levelNum] |= MF_TRIED; - - // start the game - currentMap.episode = episodeNum; - currentMap.map = mapNum; - currentMap.skill = skillLevel; - currentMap.levelCompleted = 0; - - Cvar_SetValue( skill->name, skillLevel ); - Cvar_SetValue( episode->name, episodeNum ); - sprintf( command, "w%i%i", currentMap.episode, currentMap.map ); - Client_PrepRefresh( command ); - - menuState = IPM_GAME; -} - -/* - ================== - iphoneMainMenu - - ================== - */ -void iphoneMainMenu() { - char str[80]; - float scale = 40 / 32.0; - - iphoneDrawPic( 480-256, 0, 256, 128, "iphone/wolf_logo.tga" ); -#ifdef EPISODE1 - iphoneDrawPic( -20, 0, 256, 64, "iphone/ep_1.tga" ); - GetMoreLevels( 0, 96 ); -#else - iphoneDrawPic( -20, 0, 256, 64, "iphone/ep_1_6.tga" ); -#endif - iphoneDrawPic( 0, 320 - 128, 128, 128, "iphone/id_logo.tga" ); - - if ( iphoneDrawPicWithTouch( 300 - 64*scale, 80, 128*scale, 64*scale, "iphone/button_resume.tga" ) ) { - // if the game was saved at the intermission screen, immediately - // bring it back up when it is loaded - if ( currentMap.levelCompleted ) { - iphoneStartIntermission( 0 ); - } else { - menuState = IPM_GAME; - } - } - sprintf( str, "E%iM%i", currentMap.episode+1, currentMap.map+1 ); - iphoneCenterText( 300, 80+34*scale, str ); - - if ( iphoneDrawPicWithTouch( 300 - 64*scale, 170, 128*scale, 32*scale, "iphone/button_control.tga" ) ) { - menuState = IPM_CONTROLS; - } - if ( iphoneDrawPicWithTouch( 300 - 64*scale, 220, 128*scale, 32*scale, "iphone/button_new.tga" ) ) { - menuState = IPM_SKILL; - } - if ( iphoneDrawPicWithTouch( 300 - 64*scale, 270, 128*scale, 32*scale, "iphone/button_web.tga" ) ) { - OpenURL( "http://www.idsoftware.com/wolfenstein3dclassic/" ); - } - -} - - -/* - ================== - iphoneControlMenu - - ================== - */ -void iphoneControlMenu() { - int i; - - if ( BackButton() ) { - menuState = IPM_MAIN; - } - - for ( i = 0 ; i < 4 ; i++ ) { - char str[128]; - int remap[4] = { 3,4,1,2}; // artist named them differently than intended... - sprintf( str, "iphone/layout_%i.tga", remap[i] ); - if ( i != controlScheme->value ) { - pfglColor3f( 0.5, 0.5, 0.5 ); - } - if ( iphoneDrawPicWithTouch( 120 * i, 40, 120, 120, str ) ) { - Cvar_SetValue( controlScheme->name, i ); - } - pfglColor3f( 1, 1, 1 ); - } - - iphoneSlider( 20, 170, 440, 40, "sensitivity", sensitivity, 0, 1 ); - - iphoneSlider( 20, 220, 440, 40, "tilt move speed", tiltMove, 5000, 30000 ); - if ( tiltMove->value == 5000 ) { - Cvar_SetValue( tiltMove->name, 0 ); - } - if ( tiltMove->value ) { - Cvar_SetValue( tiltTurn->name, 0 ); - } - iphoneSlider( 20, 270, 440, 40, "tilt turn speed", tiltTurn, 500, 3000 ); - if ( tiltTurn->value == 500 ) { - Cvar_SetValue( tiltTurn->name, 0 ); - } - if ( tiltTurn->value ) { - Cvar_SetValue( tiltMove->name, 0 ); - } - - //iphoneSlider( 20, 280, 440, 40, "tilt fire", tiltFire, 0, 1 ); - -} - -/* - ================== - iphoneSkillMenu - - ================== - */ -void iphoneSkillMenu() { - int s; - char str[64]; - - if ( BackButton() ) { - menuState = IPM_MAIN; - } - - // highlight the current skill selection - s = (int)skill->value; -// R_Draw_Fill( 80, 40+64*s, 320, 64, highlightColor ); - - for ( s = 0 ; s < 4 ; s++ ) { - my_snprintf( str, sizeof( str ), "iphone/button_skill%i.tga", s+1 ); - - if ( s != (int)skill->value ) { - pfglColor3f( 0.5, 0.5, 0.5 ); - } - if ( iphoneDrawPicWithTouch( 112, 40+64*s, 256, 64, str ) ) { - Cvar_SetValue( skill->name, s ); - menuState = IPM_EPISODE; - } - pfglColor3f( 1, 1, 1 ); - } -} - -/* - ================== - iphoneEpisodeMenu - - ================== - */ -void iphoneEpisodeMenu() { - int e; - char str[64]; -#ifdef EPISODE1 - int numE = 1; -#else - int numE = 6; -#endif - - if ( BackButton() ) { - menuState = IPM_SKILL; - } - - // 96 x 48 images - for ( e = 0 ; e < numE ; e++ ) { - my_snprintf( str, sizeof( str ), "iphone/button_ep%i.tga", e+1 ); - - if ( e != (int)episode->value ) { - pfglColor3f( 0.5, 0.5, 0.5 ); - } - if ( iphoneDrawPicWithTouch( 48, 32+48*e, 384, 48, str ) ) { - Cvar_SetValue( episode->name, e ); - menuState = IPM_MAPS; - } - pfglColor3f( 1, 1, 1 ); - } - -#ifdef EPISODE1 - // buy more episodes button - GetMoreLevels( 240 - 64, 200 ); -#endif -} - -/* - ================== - iphoneMapMenu - - ================== - */ -void iphoneMapMenu() { - int e, m, s; - char str[64]; - - if ( BackButton() ) { - menuState = IPM_EPISODE; - } - - // draw the level selection - e = episode->value; - if ( e < 0 ) { - e = 0; - } - if ( e > 5 ) { - e = 5; - } - s = skill->value; - if ( s < 0 ) { - s = 0; - } - if ( s > 3 ) { - s = 3; - } - - // draw the episode selection - my_snprintf( str, sizeof( str ), "iphone/button_ep%i.tga", e+1 ); - iphoneDrawPicWithTouch( 96, 0, 384, 48, str ); - - // draw the individual maps - for ( m = 0 ; m < 10 ; m++ ) { - int x; - int y; - colour4_t colorSecret = { 32, 32, 32, 255 }; - colour4_t colorNoTry = { 0, 0, 0, 255 }; - colour4_t colorTried = { 80, 80, 0, 255 }; - colour4_t colorCompleted = { 0, 80, 0, 255 }; - - if ( m == 9 ) { - sprintf( str, "SECRET" ); - x = 120; - y = 90 + 160; - } else if ( m == 8 ) { - sprintf( str, "BOSS" ); - x = 360; - y = 90 + 160; - } else { - sprintf( str, "LEVEL %i", m+1 ); - x = 60 + 120 * ( m % 4 ); - y = 90 + 80 * ( m / 4 ); - } - - unsigned char *color = colorNoTry; - // decide on the background color - int levelNum = e*10+m; - int ch = currentMap.mapFlags[s][levelNum]; - // bit1 = attempted - // bit2 = completed - // bit3 = 100% kills - // bit4 = 100% secrets - // bit5 = 100% treasure - if ( m == 9 && !( ch & MF_TRIED ) ) { - color = colorSecret; - } if ( ch & MF_COMPLETED ) { - color = colorCompleted; - } else if ( ch & MF_TRIED ) { - color = colorTried; - } else { - color = colorNoTry; - } - - // blink the level you are currently on - if ( ( iphoneFrameNum & 8 ) && levelNum == currentMap.map && e == currentMap.episode ) { - color = colorNoTry; - } - - // draw the level text and check for button hit - if ( TouchDown( x-46, y-9, 88, 32 ) ) { - color = colorPressed; - } - R_Draw_Fill( x-46, y-9, 88, 32, color ); - iphoneCenterText( x, y, str ); - - // draw awards - if ( ch & MF_KILLS ) { - iphoneDrawPic( x-46,y+23, 22, 22, "iphone/kills.tga" ); - } - if ( ch & MF_SECRETS ) { - iphoneDrawPic( x-24,y+23, 22, 22, "iphone/secrets.tga" ); - } - if ( ch & MF_TREASURE ) { - iphoneDrawPic( x-2,y+23, 22, 22, "iphone/treasure.tga" ); - } - if ( ch & MF_TIME ) { - iphoneDrawPic( x+20,y+23, 22, 22, "iphone/partime.tga" ); - } - - // don't let them go to the secret level unless they earned it - if ( m == 9 && !( ch & MF_TRIED ) ) { - continue; - } - - if ( TouchReleased( x - 46, y - 9, 88, 32 ) ) { - PL_NewGame( &Player ); - iphoneStartMap( e, m, s ); - } - } -} - -/* - ================== - iphoneStartIntermission - - The framesFromNow value allow boss death animations to be triggered - ================== - */ -void iphoneStartIntermission( int framesFromNow ) { - // this goes in the savegame if they save at the intermission point, - // which will cause it to come back up there on return - currentMap.levelCompleted = 1; - - // mark this level as having been completed for the level selection menu - int mapNum = currentMap.episode * 10 + currentMap.map; - - // note that this has been tried now - currentMap.mapFlags[currentMap.skill][mapNum] |= MF_COMPLETED; - - // mark the awards - if ( levelstate.time / 70.0f < levelstate.fpartime * 60 ) { // fpartime is in minutes, time is in tics - currentMap.mapFlags[currentMap.skill][mapNum] |= MF_TIME; - } - if( levelstate.killed_monsters == levelstate.total_monsters ) { - currentMap.mapFlags[currentMap.skill][mapNum] |= MF_KILLS; - } - if( levelstate.found_secrets == levelstate.total_secrets ) { - currentMap.mapFlags[currentMap.skill][mapNum] |= MF_SECRETS; - } - if( levelstate.found_treasure == levelstate.total_treasure ) { - currentMap.mapFlags[currentMap.skill][mapNum] |= MF_TREASURE; - } - - intermissionStartFrameNum = iphoneFrameNum; - - if ( framesFromNow ) { - intermissionTriggerFrame = iphoneFrameNum + framesFromNow; - return; - } - - intermissionTriggerFrame = 0; - menuState = IPM_INTERMISSION; - hasReleased = 0; // ensure touch up before skipping intermission -} - -/* - ================== - DrawDigit - - ================== - */ -void DrawDigit( int x, int y, int digit ) { - R_Bind( numberPics[digit]->texnum ); - pfglBegin( GL_QUADS ); - - pfglTexCoord2f( 0, 0 ); pfglVertex2i( x, y ); - pfglTexCoord2f( 1, 0 ); pfglVertex2i( x+32, y ); - pfglTexCoord2f( 1, 1 ); pfglVertex2i( x+32, y+32 ); - pfglTexCoord2f( 0, 1 ); pfglVertex2i( x, y+32 ); - - pfglEnd(); -} - -void DrawDoubleDigit( int x, int y, int number ) { - int step = 32; - if ( number >= 100 ) { - // cram three digits into the same space - DrawDigit( x-8, y, number / 100 ); - number %= 100; - x += 16; - step = 24; - } - if ( number >= 10 ) { - DrawDigit( x, y, number / 10 ); - number %= 10; - } - DrawDigit( x+step, y, number ); -} - -void DrawTime( int x, int y, int seconds ) { - int min = seconds / 60; - int sec = seconds % 60; - - DrawDoubleDigit( x, y, min ); -// DrawDoubleDigit( x+76, y, sec ); - // always print both digits of seconds, so 2:00 prints correctly - DrawDigit( x+76, y, sec / 10 ); - DrawDigit( x+76+32, y, sec % 10 ); -} - -void DrawRatio( int y, int got, int total, const char *bonusPic ) { - DrawDoubleDigit( 285, y, got ); - DrawDoubleDigit( 361, y, total ); - - // draw the award icon - if ( got == total ) { - iphoneDrawPic( 480 - 40, y, 32, 32, bonusPic ); - } -} - -/* - ================== - iphoneIntermission - - ================== - */ -void iphoneIntermission() { - int nextLevel = 0; - char str[128]; - - iphoneDrawPic( 0, 0, 480, 320, "iphone/intermission.tga" ); - - // episode - my_snprintf( str, sizeof( str ), "iphone/button_ep%i.tga", currentMap.episode+1 ); - iphoneDrawPic( 0, 0, 384, 48, str ); - - // level - iphoneDrawNumber( 430, 0, currentMap.map + 1, 48, 48 ); - - // par / time - DrawTime( 51, 63, levelstate.fpartime * 60 ); // fpartime is in minutes - DrawTime( 285, 63, levelstate.time / 70 ); // levelstate.time is in tics - if ( levelstate.time/70 <= levelstate.fpartime * 60 ) { - iphoneDrawPic( 480 - 40, 63, 32, 32, "iphone/partime.tga" ); - } - - // ratios - DrawRatio( 124, levelstate.killed_monsters, levelstate.total_monsters, "iphone/kills.tga" ); - DrawRatio( 189, levelstate.found_secrets, levelstate.total_secrets, "iphone/secrets.tga" ); - DrawRatio( 255, levelstate.found_treasure, levelstate.total_treasure, "iphone/treasure.tga" ); - - // require all touches off before the intermission can exit - if ( numTouches == 0 && hasReleased == 0 ) { - hasReleased = 1; - return; // don't let the TouchReleased immediately fire - } - if ( !hasReleased ) { - return; - } - - //---------------------- - // tap for next level - //---------------------- - if ( !TouchReleased( 0, 0, 480, 320 ) ) { - return; - } - - menuState = IPM_GAME; - - PL_NextLevel( &Player ); - - if( g_version->value == SPEAROFDESTINY ) { - } - else - { - int currentLevel = currentMap.episode * 10 + currentMap.map; - - if( Player.playstate == ex_secretlevel ) { - switch( currentLevel ) { - case 0: nextLevel = 9; break; - case 10: nextLevel = 19; break; - case 26: nextLevel = 29; break; - case 32: nextLevel = 39; break; - case 44: nextLevel = 49; break; - case 52: nextLevel = 59; break; - } - } else { - switch ( currentLevel ) { - case 8: - case 18: - case 28: - case 38: - case 48: - case 58: - // go back to the episode select screen - menuState = IPM_VICTORY; - Sound_StartBGTrack( "music/URAHERO.ogg", "music/URAHERO.ogg" ); - return; - case 9: nextLevel = 1; break; - case 19: nextLevel = 11; break; - case 29: nextLevel = 27; break; - case 39: nextLevel = 33; break; - case 49: nextLevel = 44; break; - case 59: nextLevel = 53; break; - default: nextLevel = currentLevel + 1; break; - } - } - } - - iphoneStartMap( (nextLevel/10), (nextLevel%10), skill->value ); -} - -/* - ================== - iphoneVictory - - ================== - */ -void iphoneVictory() { - iphoneDrawPic( 0, 0, 480, 320, "iphone/victory.tga" ); - if ( !TouchReleased( 0, 0, 480, 320 ) ) { - return; - } - menuState = IPM_EPISODE; -} - -/* - ================== - iphoneAutomap - - ================== - */ -float mapOrigin[2]; -float mapCenterY; -float mapScale; - -typedef struct { - W8 x, y; - short texnum; -} mapTile_t; -#define MAPTILE_SPRITE_FLAG 1024 -#define MAX_MAP_TILES 5000 // 4096 tiles + sprites -mapTile_t mapTiles[MAX_MAP_TILES]; -int numMapTiles; - -int MapTileSort( const void *a, const void *b ) { - return ((mapTile_t *)a)->texnum - ((mapTile_t *)b)->texnum; -} - -void iphoneOpenAutomap() { - mapTile_t *mt = mapTiles; - numMapTiles = 0; - int x, y; - int xx, yy; - W32 tx, ty, n; - sprite_t* sprt; - - mapOrigin[0] = Player.position.origin[0] / (float)TILEGLOBAL; - mapOrigin[1] = Player.position.origin[1] / (float)TILEGLOBAL; - mapScale = 10; - menuState = IPM_AUTOMAP; - - // identify all the tiles to fill in - for( x = 0 ; x < 64; ++x ) { - for( y = 0 ; y < 64; ++y ) { - if ( r_world->tilemap[ x ][ y ] & ( WALL_TILE | PUSHWALL_TILE ) ) { - int visible = 0; - // check all 8 surrounding tiles for visibility - for ( xx = -1 ; xx <= 1 ; xx++ ) { - if ( x + xx < 0 ) { - continue; - } - if ( x + xx > 63 ) { - continue; - } - for ( yy = -1 ; yy <= 1 ; yy++ ) { - if ( y + yy < 0 ) { - continue; - } - if ( y + yy > 63 ) { - continue; - } - if ( r_world->tileEverVisible[x+xx][y+yy] ) { - visible = 1; - break; - } - } - } - if ( !visible ) { - continue; - } - int tex = r_world->wall_tex_y[ x ][ y ]; - // special hack for the elevator switch tile, which is always - // facing east west for the switch, and north south for the railing - if ( tex == 40 && ( ( x>0 && r_world->tileEverVisible[x+1][y] ) - || ( x < 63 && r_world->tileEverVisible[x-1][y] ) ) ) { - tex = r_world->wall_tex_x[ x ][ y ]; - } - if ( tex < 0x6a ) { // skip pushwall destinations - assert( tex >= 0 && tex < 1000 ); - mt->x = x; - mt->y = y; - mt->texnum = tex; - if ( !wallTextures[mt->texnum] ) { - char name[1024]; - my_snprintf( name, sizeof( name ), "walls/%.3d.tga", mt->texnum ); - wallTextures[mt->texnum] = TM_FindTexture( name, TT_Wall ); - assert( wallTextures[mt->texnum] ); - } - mt++; - continue; - } - } - if ( !r_world->tileEverVisible[x][y] ) { - continue; - } - if( r_world->tilemap[ x ][ y ] & DOOR_TILE ) { - mt->x = x; - mt->y = y; - mt->texnum = r_world->Doors.DoorMap[ x ][ y ].texture; - if ( !wallTextures[ mt->texnum] ) { - char name[1024]; - my_snprintf( name, sizeof( name ), "walls/%.3d.tga", mt->texnum ); - wallTextures[mt->texnum] = TM_FindTexture( name, TT_Wall ); - assert( wallTextures[mt->texnum] ); - } - mt++; - continue; - } - // solid floor - mt->x = x; - mt->y = y; - mt->texnum = -1; - mt++; - } - } - - // add solid sprite objects - for( n = 0, sprt = Spr_Sprites; n < n_of_sprt; ++n, ++sprt ) { - if( sprt->flags & SPRT_REMOVE ) { - continue; - } - if ( sprt->tex[0] >= SPR_GRD_S_1 ) { - // don't draw enemies, only static sprites - continue; - } - - tx = sprt->tilex; - ty = sprt->tiley; - - if( tx > 63 ) { - continue; - } - if( ty > 63 ) { - continue; - } - if ( !r_world->tileEverVisible[tx][ty] ) { - continue; - } - mt->x = tx; - mt->y = ty; - mt->texnum = MAPTILE_SPRITE_FLAG | sprt->tex[0]; - mt++; - - if ( !spriteTextures[ sprt->tex[0] ] ) { - char name[1024]; - my_snprintf( name, sizeof( name ), "sprites/%.3d.tga", sprt->tex[0] ); - spriteTextures[sprt->tex[0]] = TM_FindTexture( name, TT_Sprite ); - } - - if ( mt == &mapTiles[MAX_MAP_TILES] ) { - break; // list is full, some items won't show (shouldn't happen) - } - } - - // sort the tiles to be drawn by texture - numMapTiles = mt - mapTiles; - - qsort( mapTiles, numMapTiles, sizeof( mapTiles[0] ), MapTileSort ); -} - -void iphoneAutomap() { - mapTile_t *mt; - float px, py; - float angle, c, s; - int texnum; - - // do touch ops before drawing for minimum latency - - // drag for scrolling - if ( numTouches == 1 ) { - if ( numPrevTouches == 1 ) { - mapOrigin[0] -= ( touches[0][0] - prevTouches[0][0] ) / mapScale; - mapOrigin[1] += ( touches[0][1] - prevTouches[0][1] ) / mapScale; - } - } - - // pinch for scaling - if ( numTouches == 2 ) { - if ( numPrevTouches == 2 ) { - float curDist = sqrt( - ( touches[0][0] - touches[1][0] ) * ( touches[0][0] - touches[1][0] ) + - ( touches[0][1] - touches[1][1] ) * ( touches[0][1] - touches[1][1] ) ); - float prevDist = sqrt( - ( prevTouches[0][0] - prevTouches[1][0] ) * ( prevTouches[0][0] - prevTouches[1][0] ) + - ( prevTouches[0][1] - prevTouches[1][1] ) * ( prevTouches[0][1] - prevTouches[1][1] ) ); - if ( prevDist == 0 ) { - prevDist = curDist; - } - mapScale *= curDist / prevDist; - if ( mapScale < 4 ) { - mapScale = 4; - } - if ( mapScale > 64 ) { - mapScale = 64; - } - } - - } - - // todo -- double tap for center on player - - - // set up matrix for drawing in tile units - pfglMatrixMode( GL_PROJECTION ); - pfglLoadIdentity(); - pfglRotatef( 90, 0, 0, 1 ); - pfglOrtho( mapOrigin[0]-240.0 / mapScale, mapOrigin[0]+240.0 / mapScale, - mapOrigin[1]-160.0 / mapScale, mapOrigin[1]+160.0 / mapScale, -99999, 99999 ); - - mt = mapTiles; - texnum = 99999; - for ( int i = 0 ; i < numMapTiles ; i++, mt++ ) { - if ( texnum != mt->texnum ) { - texnum = mt->texnum; - if ( i != 0 ) { - pfglEnd(); - } - if ( mt->texnum == -1 ) { - qglDisable( GL_TEXTURE_2D ); - pfglColor3f( r_world->floorColour[0]/255.0, r_world->floorColour[1]/255.0, r_world->floorColour[2]/255.0 ); - } else if ( mt->texnum & MAPTILE_SPRITE_FLAG ) { - qglEnable( GL_TEXTURE_2D ); - pfglColor3f( 1, 1, 1 ); - R_Bind( spriteTextures[mt->texnum&~MAPTILE_SPRITE_FLAG]->texnum ); - } else { - qglEnable( GL_TEXTURE_2D ); - pfglColor3f( 1, 1, 1 ); - R_Bind( wallTextures[mt->texnum]->texnum ); - } - pfglBegin( GL_QUADS ); - } - pfglTexCoord2f( 0, 1 ); - pfglVertex2i( mt->x, mt->y ); - pfglTexCoord2f( 1, 1 ); - pfglVertex2i( mt->x+1, mt->y ); - pfglTexCoord2f( 1, 0 ); - pfglVertex2i( mt->x+1, mt->y+1 ); - pfglTexCoord2f( 0, 0 ); - pfglVertex2i( mt->x, mt->y+1 ); - } - pfglEnd(); - - // draw the yellow player triangle - qglDisable( GL_TEXTURE_2D ); - if ( iphoneFrameNum & 8 ) { // blink it - pfglColor3f( 1, 1, 0 ); - } else { - pfglColor3f( 0.5, 0.5, 0 ); - } - angle = M_PI * Player.position.angle / (float)ANG_180; - c = cos( angle ); - s = sin( angle ); - px = Player.position.origin[0] / (float)TILEGLOBAL; - py = Player.position.origin[1] / (float)TILEGLOBAL; - pfglBegin( GL_TRIANGLES ); - pfglVertex3f( px + c * 0.5, py + s * 0.5, 0 ); - pfglVertex3f( px - c * 0.5 - s * 0.3, py - s * 0.5 + c * 0.3, 0 ); - pfglVertex3f( px - c * 0.5 + s * 0.3, py - s * 0.5 - c * 0.3, 0 ); - pfglEnd(); - - qglEnable( GL_TEXTURE_2D ); - pfglColor3f( 1, 1, 1 ); - - // back button for returning to game - pfglMatrixMode( GL_PROJECTION ); - pfglLoadIdentity(); - pfglRotatef( 90, 0, 0, 1 ); - pfglOrtho( 0, 480, 320, 0, -99999, 99999 ); - if ( BackButton() ) { - menuState = IPM_GAME; - } -} - -void iphoneDrawMenus() { - iphoneDrawPic( 0, 0, 480, 320, "iphone/background_1.tga" ); - - switch ( menuState ) { - case IPM_MAIN: iphoneMainMenu(); break; - case IPM_SKILL: iphoneSkillMenu(); break; - case IPM_EPISODE: iphoneEpisodeMenu(); break; - case IPM_MAPS: iphoneMapMenu(); break; - case IPM_CONTROLS: iphoneControlMenu(); break; - case IPM_INTERMISSION: iphoneIntermission(); break; - case IPM_VICTORY: iphoneVictory(); break; - case IPM_AUTOMAP: iphoneAutomap(); break; - } -} - - diff --git a/wolf3d/newCode/iphone/iphone_qgl.h b/wolf3d/newCode/iphone/iphone_qgl.h deleted file mode 100644 index 793ec74..0000000 --- a/wolf3d/newCode/iphone/iphone_qgl.h +++ /dev/null @@ -1,2392 +0,0 @@ -/**** This file is autogenerated. Run GenerateQGL.pl to update it ****/ - -#ifndef _IPHONE_QGL_H_ -#define _IPHONE_QGL_H_ - -#ifdef QGL_LOG_GL_CALLS -extern unsigned int QGLLogGLCalls; -#ifdef __cplusplus -extern "C" { -#endif - FILE *QGLDebugFile(void); -#ifdef __cplusplus -} -#endif -#endif - -#include "iphone_qgl_enumerants.h" - - -#ifdef __cplusplus -extern "C" { -#endif - void QGLCheckError(const char *message); -#ifdef __cplusplus -} -#endif -extern unsigned int QGLBeginStarted; - -// This has to be done to avoid infinite recursion between our glGetError wrapper and QGLCheckError() -static inline GLenum _glGetError(void) { - return glGetError(); -} - -// void glAlphaFunc (GLenum func, GLclampf ref); -static inline void qglAlphaFunc(GLenum func, GLclampf ref) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glAlphaFunc(func=%s, ref=%f)\n", StringFromGLEnumerant( func ), ref); -#endif - glAlphaFunc(func, ref); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glAlphaFunc"); -#endif -} - -// void glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -static inline void qglClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glClearColor(red=%f, green=%f, blue=%f, alpha=%f)\n", red, green, blue, alpha); -#endif - glClearColor(red, green, blue, alpha); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glClearColor"); -#endif -} - -// void glClearDepthf (GLclampf depth); -static inline void qglClearDepthf(GLclampf depth) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glClearDepthf(depth=%f)\n", depth); -#endif - glClearDepthf(depth); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glClearDepthf"); -#endif -} - -// void glClipPlanef (GLenum plane, const GLfloat *equation); -static inline void qglClipPlanef(GLenum plane, const GLfloat *equation) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glClipPlanef(plane=%s, equation=%p)\n", StringFromGLEnumerant( plane ), equation); -#endif - glClipPlanef(plane, equation); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glClipPlanef"); -#endif -} - -// void glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -// void glDepthRangef (GLclampf zNear, GLclampf zFar); -static inline void qglDepthRangef(GLclampf zNear, GLclampf zFar) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDepthRangef(zNear=%f, zFar=%f)\n", zNear, zFar); -#endif - glDepthRangef(zNear, zFar); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDepthRangef"); -#endif -} - -// void glFogf (GLenum pname, GLfloat param); -static inline void qglFogf(GLenum pname, GLfloat param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glFogf(pname=%s, param=%f)\n", StringFromGLEnumerant( pname ), param); -#endif - glFogf(pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glFogf"); -#endif -} - -// void glFogfv (GLenum pname, const GLfloat *params); -static inline void qglFogfv(GLenum pname, const GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glFogfv(pname=%s, params=%p)\n", StringFromGLEnumerant( pname ), params); -#endif - glFogfv(pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glFogfv"); -#endif -} - -// void glFrustumf (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); -static inline void qglFrustumf(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glFrustumf(left=%f, right=%f, bottom=%f, top=%f, zNear=%f, zFar=%f)\n", left, right, bottom, top, zNear, zFar); -#endif - glFrustumf(left, right, bottom, top, zNear, zFar); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glFrustumf"); -#endif -} - -// void glGetClipPlanef (GLenum pname, GLfloat *equation); -static inline void qglGetClipPlanef(GLenum pname, GLfloat *equation) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetClipPlanef(pname=%s, equation=%p)\n", StringFromGLEnumerant( pname ), equation); -#endif - glGetClipPlanef(pname, equation); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetClipPlanef"); -#endif -} - -// void glGetFloatv (GLenum pname, GLfloat *params); -static inline void qglGetFloatv(GLenum pname, GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetFloatv(pname=%s, params=%p)\n", StringFromGLEnumerant( pname ), params); -#endif - glGetFloatv(pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetFloatv"); -#endif -} - -// void glGetLightfv (GLenum light, GLenum pname, GLfloat *params); -static inline void qglGetLightfv(GLenum light, GLenum pname, GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetLightfv(light=%s, pname=%s, params=%p)\n", StringFromGLEnumerant( light ), StringFromGLEnumerant( pname ), params); -#endif - glGetLightfv(light, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetLightfv"); -#endif -} - -// void glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params); -static inline void qglGetMaterialfv(GLenum face, GLenum pname, GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetMaterialfv(face=%s, pname=%s, params=%p)\n", StringFromGLEnumerant( face ), StringFromGLEnumerant( pname ), params); -#endif - glGetMaterialfv(face, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetMaterialfv"); -#endif -} - -// void glGetTexEnvfv (GLenum env, GLenum pname, GLfloat *params); -static inline void qglGetTexEnvfv(GLenum env, GLenum pname, GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetTexEnvfv(env=%s, pname=%s, params=%p)\n", StringFromGLEnumerant( env ), StringFromGLEnumerant( pname ), params); -#endif - glGetTexEnvfv(env, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetTexEnvfv"); -#endif -} - -// void glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); -static inline void qglGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetTexParameterfv(target=%s, pname=%s, params=%p)\n", StringFromGLEnumerant( target ), StringFromGLEnumerant( pname ), params); -#endif - glGetTexParameterfv(target, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetTexParameterfv"); -#endif -} - -// void glLightModelf (GLenum pname, GLfloat param); -static inline void qglLightModelf(GLenum pname, GLfloat param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLightModelf(pname=%s, param=%f)\n", StringFromGLEnumerant( pname ), param); -#endif - glLightModelf(pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLightModelf"); -#endif -} - -// void glLightModelfv (GLenum pname, const GLfloat *params); -static inline void qglLightModelfv(GLenum pname, const GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLightModelfv(pname=%s, params=%p)\n", StringFromGLEnumerant( pname ), params); -#endif - glLightModelfv(pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLightModelfv"); -#endif -} - -// void glLightf (GLenum light, GLenum pname, GLfloat param); -static inline void qglLightf(GLenum light, GLenum pname, GLfloat param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLightf(light=%s, pname=%s, param=%f)\n", StringFromGLEnumerant( light ), StringFromGLEnumerant( pname ), param); -#endif - glLightf(light, pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLightf"); -#endif -} - -// void glLightfv (GLenum light, GLenum pname, const GLfloat *params); -static inline void qglLightfv(GLenum light, GLenum pname, const GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLightfv(light=%s, pname=%s, params=%p)\n", StringFromGLEnumerant( light ), StringFromGLEnumerant( pname ), params); -#endif - glLightfv(light, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLightfv"); -#endif -} - -// void glLineWidth (GLfloat width); -static inline void qglLineWidth(GLfloat width) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLineWidth(width=%f)\n", width); -#endif - glLineWidth(width); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLineWidth"); -#endif -} - -// void glLoadMatrixf (const GLfloat *m); -static inline void qglLoadMatrixf(const GLfloat *m) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLoadMatrixf(m=%p)\n", m); -#endif - glLoadMatrixf(m); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLoadMatrixf"); -#endif -} - -// void glMaterialf (GLenum face, GLenum pname, GLfloat param); -static inline void qglMaterialf(GLenum face, GLenum pname, GLfloat param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMaterialf(face=%s, pname=%s, param=%f)\n", StringFromGLEnumerant( face ), StringFromGLEnumerant( pname ), param); -#endif - glMaterialf(face, pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMaterialf"); -#endif -} - -// void glMaterialfv (GLenum face, GLenum pname, const GLfloat *params); -static inline void qglMaterialfv(GLenum face, GLenum pname, const GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMaterialfv(face=%s, pname=%s, params=%p)\n", StringFromGLEnumerant( face ), StringFromGLEnumerant( pname ), params); -#endif - glMaterialfv(face, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMaterialfv"); -#endif -} - -// void glMultMatrixf (const GLfloat *m); -static inline void qglMultMatrixf(const GLfloat *m) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMultMatrixf(m=%p)\n", m); -#endif - glMultMatrixf(m); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMultMatrixf"); -#endif -} - -// void glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -static inline void qglMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMultiTexCoord4f(target=%s, s=%f, t=%f, r=%f, q=%f)\n", StringFromGLEnumerant( target ), s, t, r, q); -#endif - glMultiTexCoord4f(target, s, t, r, q); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMultiTexCoord4f"); -#endif -} - -// void glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); -static inline void qglNormal3f(GLfloat nx, GLfloat ny, GLfloat nz) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glNormal3f(nx=%f, ny=%f, nz=%f)\n", nx, ny, nz); -#endif - glNormal3f(nx, ny, nz); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glNormal3f"); -#endif -} - -// void glOrthof (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); -static inline void qglOrthof(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glOrthof(left=%f, right=%f, bottom=%f, top=%f, zNear=%f, zFar=%f)\n", left, right, bottom, top, zNear, zFar); -#endif - glOrthof(left, right, bottom, top, zNear, zFar); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glOrthof"); -#endif -} - -// void glPointParameterf (GLenum pname, GLfloat param); -static inline void qglPointParameterf(GLenum pname, GLfloat param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPointParameterf(pname=%s, param=%f)\n", StringFromGLEnumerant( pname ), param); -#endif - glPointParameterf(pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPointParameterf"); -#endif -} - -// void glPointParameterfv (GLenum pname, const GLfloat *params); -static inline void qglPointParameterfv(GLenum pname, const GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPointParameterfv(pname=%s, params=%p)\n", StringFromGLEnumerant( pname ), params); -#endif - glPointParameterfv(pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPointParameterfv"); -#endif -} - -// void glPointSize (GLfloat size); -static inline void qglPointSize(GLfloat size) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPointSize(size=%f)\n", size); -#endif - glPointSize(size); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPointSize"); -#endif -} - -// void glPolygonOffset (GLfloat factor, GLfloat units); -static inline void qglPolygonOffset(GLfloat factor, GLfloat units) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPolygonOffset(factor=%f, units=%f)\n", factor, units); -#endif - glPolygonOffset(factor, units); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPolygonOffset"); -#endif -} - -// void glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -static inline void qglRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRotatef(angle=%f, x=%f, y=%f, z=%f)\n", angle, x, y, z); -#endif - glRotatef(angle, x, y, z); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRotatef"); -#endif -} - -// void glScalef (GLfloat x, GLfloat y, GLfloat z); -static inline void qglScalef(GLfloat x, GLfloat y, GLfloat z) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glScalef(x=%f, y=%f, z=%f)\n", x, y, z); -#endif - glScalef(x, y, z); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glScalef"); -#endif -} - -// void glTexEnvf (GLenum target, GLenum pname, GLfloat param); -static inline void qglTexEnvf(GLenum target, GLenum pname, GLfloat param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexEnvf(target=%s, pname=%s, param=%f)\n", StringFromGLEnumerant( target ), StringFromGLEnumerant( pname ), param); -#endif - glTexEnvf(target, pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexEnvf"); -#endif -} - -// void glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params); -static inline void qglTexEnvfv(GLenum target, GLenum pname, const GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexEnvfv(target=%s, pname=%s, params=%p)\n", StringFromGLEnumerant( target ), StringFromGLEnumerant( pname ), params); -#endif - glTexEnvfv(target, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexEnvfv"); -#endif -} - -// void glTexParameterf (GLenum target, GLenum pname, GLfloat param); -static inline void qglTexParameterf(GLenum target, GLenum pname, GLfloat param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexParameterf(target=%s, pname=%s, param=%f)\n", StringFromGLEnumerant( target ), StringFromGLEnumerant( pname ), param); -#endif - glTexParameterf(target, pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexParameterf"); -#endif -} - -// void glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); -static inline void qglTexParameterfv(GLenum target, GLenum pname, const GLfloat *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexParameterfv(target=%s, pname=%s, params=%p)\n", StringFromGLEnumerant( target ), StringFromGLEnumerant( pname ), params); -#endif - glTexParameterfv(target, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexParameterfv"); -#endif -} - -// void glTranslatef (GLfloat x, GLfloat y, GLfloat z); -static inline void qglTranslatef(GLfloat x, GLfloat y, GLfloat z) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTranslatef(x=%f, y=%f, z=%f)\n", x, y, z); -#endif - glTranslatef(x, y, z); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTranslatef"); -#endif -} - -// void glActiveTexture (GLenum texture); -static inline void qglActiveTexture(GLenum texture) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glActiveTexture(texture=%s)\n", StringFromGLEnumerant( texture )); -#endif - glActiveTexture(texture); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glActiveTexture"); -#endif -} - -// void glAlphaFuncx (GLenum func, GLclampx ref); -static inline void qglAlphaFuncx(GLenum func, GLclampx ref) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glAlphaFuncx(func=%s, ref=%ld)\n", StringFromGLEnumerant( func ), ref); -#endif - glAlphaFuncx(func, ref); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glAlphaFuncx"); -#endif -} - -// void glBindBuffer (GLenum target, GLuint buffer); -static inline void qglBindBuffer(GLenum target, GLuint buffer) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glBindBuffer(target=%s, buffer=%lu)\n", StringFromGLEnumerant( target ), buffer); -#endif - glBindBuffer(target, buffer); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glBindBuffer"); -#endif -} - -// void glBindTexture (GLenum target, GLuint texture); -static inline void qglBindTexture(GLenum target, GLuint texture) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glBindTexture(target=%s, texture=%lu)\n", StringFromGLEnumerant( target ), texture); -#endif - glBindTexture(target, texture); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glBindTexture"); -#endif -} - -// void glBlendFunc (GLenum sfactor, GLenum dfactor); -static inline void qglBlendFunc(GLenum sfactor, GLenum dfactor) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glBlendFunc(sfactor=%s, dfactor=%s)\n", StringFromGLEnumerant( sfactor ), StringFromGLEnumerant( dfactor )); -#endif - glBlendFunc(sfactor, dfactor); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glBlendFunc"); -#endif -} - -// void glBufferData (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); -static inline void qglBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glBufferData(target=%s, size=%ld, data=%p, usage=%s)\n", StringFromGLEnumerant( target ), size, data, StringFromGLEnumerant( usage )); -#endif - glBufferData(target, size, data, usage); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glBufferData"); -#endif -} - -// void glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); -static inline void qglBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glBufferSubData(target=%s, offset=%ld, size=%ld, data=%p)\n", StringFromGLEnumerant( target ), offset, size, data); -#endif - glBufferSubData(target, offset, size, data); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glBufferSubData"); -#endif -} - -// void glClear (GLbitfield mask); -static inline void qglClear(GLbitfield mask) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glClear(mask=%lu)\n", mask); -#endif - glClear(mask); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glClear"); -#endif -} - -// void glClearColorx (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha); -static inline void qglClearColorx(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glClearColorx(red=%ld, green=%ld, blue=%ld, alpha=%ld)\n", red, green, blue, alpha); -#endif - glClearColorx(red, green, blue, alpha); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glClearColorx"); -#endif -} - -// void glClearDepthx (GLclampx depth); -static inline void qglClearDepthx(GLclampx depth) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glClearDepthx(depth=%ld)\n", depth); -#endif - glClearDepthx(depth); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glClearDepthx"); -#endif -} - -// void glClearStencil (GLint s); -static inline void qglClearStencil(GLint s) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glClearStencil(s=%ld)\n", s); -#endif - glClearStencil(s); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glClearStencil"); -#endif -} - -// void glClientActiveTexture (GLenum texture); -static inline void qglClientActiveTexture(GLenum texture) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glClientActiveTexture(texture=%s)\n", StringFromGLEnumerant( texture )); -#endif - glClientActiveTexture(texture); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glClientActiveTexture"); -#endif -} - -// void glClipPlanex (GLenum plane, const GLfixed *equation); -static inline void qglClipPlanex(GLenum plane, const GLfixed *equation) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glClipPlanex(plane=%s, equation=%p)\n", StringFromGLEnumerant( plane ), equation); -#endif - glClipPlanex(plane, equation); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glClipPlanex"); -#endif -} - -// void glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); -static inline void qglColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor4ub(red=%u, green=%u, blue=%u, alpha=%u)\n", red, green, blue, alpha); -#endif - glColor4ub(red, green, blue, alpha); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor4ub"); -#endif -} - -// void glColor4x (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -static inline void qglColor4x(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColor4x(red=%ld, green=%ld, blue=%ld, alpha=%ld)\n", red, green, blue, alpha); -#endif - glColor4x(red, green, blue, alpha); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColor4x"); -#endif -} - -// void glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -static inline void qglColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColorMask(red=%u, green=%u, blue=%u, alpha=%u)\n", red, green, blue, alpha); -#endif - glColorMask(red, green, blue, alpha); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColorMask"); -#endif -} - -// void glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -static inline void qglColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glColorPointer(size=%ld, type=%s, stride=%ld, pointer=%p)\n", size, StringFromGLEnumerant( type ), stride, pointer); -#endif - glColorPointer(size, type, stride, pointer); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glColorPointer"); -#endif -} - -// void glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -static inline void qglCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glCompressedTexImage2D(target=%s, level=%ld, internalformat=%s, width=%ld, height=%ld, border=%ld, imageSize=%ld, data=%p)\n", StringFromGLEnumerant( target ), level, StringFromGLEnumerant( internalformat ), width, height, border, imageSize, data); -#endif - glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glCompressedTexImage2D"); -#endif -} - -// void glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -static inline void qglCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glCompressedTexSubImage2D(target=%s, level=%ld, xoffset=%ld, yoffset=%ld, width=%ld, height=%ld, format=%s, imageSize=%ld, data=%p)\n", StringFromGLEnumerant( target ), level, xoffset, yoffset, width, height, StringFromGLEnumerant( format ), imageSize, data); -#endif - glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glCompressedTexSubImage2D"); -#endif -} - -// void glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -static inline void qglCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glCopyTexImage2D(target=%s, level=%ld, internalformat=%s, x=%ld, y=%ld, width=%ld, height=%ld, border=%ld)\n", StringFromGLEnumerant( target ), level, StringFromGLEnumerant( internalformat ), x, y, width, height, border); -#endif - glCopyTexImage2D(target, level, internalformat, x, y, width, height, border); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glCopyTexImage2D"); -#endif -} - -// void glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -static inline void qglCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glCopyTexSubImage2D(target=%s, level=%ld, xoffset=%ld, yoffset=%ld, x=%ld, y=%ld, width=%ld, height=%ld)\n", StringFromGLEnumerant( target ), level, xoffset, yoffset, x, y, width, height); -#endif - glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glCopyTexSubImage2D"); -#endif -} - -// void glCullFace (GLenum mode); -static inline void qglCullFace(GLenum mode) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glCullFace(mode=%s)\n", StringFromGLEnumerant( mode )); -#endif - glCullFace(mode); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glCullFace"); -#endif -} - -// void glDeleteBuffers (GLsizei n, const GLuint *buffers); -static inline void qglDeleteBuffers(GLsizei n, const GLuint *buffers) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDeleteBuffers(n=%ld, buffers=%p)\n", n, buffers); -#endif - glDeleteBuffers(n, buffers); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDeleteBuffers"); -#endif -} - -// void glDeleteTextures (GLsizei n, const GLuint *textures); -static inline void qglDeleteTextures(GLsizei n, const GLuint *textures) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDeleteTextures(n=%ld, textures=%p)\n", n, textures); -#endif - glDeleteTextures(n, textures); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDeleteTextures"); -#endif -} - -// void glDepthFunc (GLenum func); -static inline void qglDepthFunc(GLenum func) -{ - func = GL_ALWAYS; -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDepthFunc(func=%s)\n", StringFromGLEnumerant( func )); -#endif - glDepthFunc(func); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDepthFunc"); -#endif -} - -// void glDepthMask (GLboolean flag); -static inline void qglDepthMask(GLboolean flag) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDepthMask(flag=%u)\n", flag); -#endif - glDepthMask(flag); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDepthMask"); -#endif -} - -// void glDepthRangex (GLclampx zNear, GLclampx zFar); -static inline void qglDepthRangex(GLclampx zNear, GLclampx zFar) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDepthRangex(zNear=%ld, zFar=%ld)\n", zNear, zFar); -#endif - glDepthRangex(zNear, zFar); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDepthRangex"); -#endif -} - -// void glDisable (GLenum cap); -static inline void qglDisable(GLenum cap) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDisable(cap=%s)\n", StringFromGLEnumerant( cap )); -#endif - glDisable(cap); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDisable"); -#endif -} - -// void glDisableClientState (GLenum array); -static inline void qglDisableClientState(GLenum array) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDisableClientState(array=%s)\n", StringFromGLEnumerant( array )); -#endif - glDisableClientState(array); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDisableClientState"); -#endif -} - -// void glDrawArrays (GLenum mode, GLint first, GLsizei count); -static inline void qglDrawArrays(GLenum mode, GLint first, GLsizei count) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDrawArrays(mode=%s, first=%ld, count=%ld)\n", StringFromGLEnumerant( mode ), first, count); -#endif - glDrawArrays(mode, first, count); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDrawArrays"); -#endif -} - -// void glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); -static inline void qglDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDrawElements(mode=%s, count=%ld, type=%s, indices=%p)\n", StringFromGLEnumerant( mode ), count, StringFromGLEnumerant( type ), indices); -#endif - glDrawElements(mode, count, type, indices); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDrawElements"); -#endif -} - -// void glEnable (GLenum cap); -static inline void qglEnable(GLenum cap) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glEnable(cap=%s)\n", StringFromGLEnumerant( cap )); -#endif - glEnable(cap); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glEnable"); -#endif -} - -// void glEnableClientState (GLenum array); -static inline void qglEnableClientState(GLenum array) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glEnableClientState(array=%s)\n", StringFromGLEnumerant( array )); -#endif - glEnableClientState(array); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glEnableClientState"); -#endif -} - -// void glFinish (void); -static inline void qglFinish(void) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glFinish(void)\n"); -#endif - glFinish(); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glFinish"); -#endif -} - -// void glFlush (void); -static inline void qglFlush(void) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glFlush(void)\n"); -#endif - glFlush(); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glFlush"); -#endif -} - -// void glFogx (GLenum pname, GLfixed param); -static inline void qglFogx(GLenum pname, GLfixed param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glFogx(pname=%s, param=%ld)\n", StringFromGLEnumerant( pname ), param); -#endif - glFogx(pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glFogx"); -#endif -} - -// void glFogxv (GLenum pname, const GLfixed *params); -static inline void qglFogxv(GLenum pname, const GLfixed *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glFogxv(pname=%s, params=%p)\n", StringFromGLEnumerant( pname ), params); -#endif - glFogxv(pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glFogxv"); -#endif -} - -// void glFrontFace (GLenum mode); -static inline void qglFrontFace(GLenum mode) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glFrontFace(mode=%s)\n", StringFromGLEnumerant( mode )); -#endif - glFrontFace(mode); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glFrontFace"); -#endif -} - -// void glFrustumx (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); -static inline void qglFrustumx(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glFrustumx(left=%ld, right=%ld, bottom=%ld, top=%ld, zNear=%ld, zFar=%ld)\n", left, right, bottom, top, zNear, zFar); -#endif - glFrustumx(left, right, bottom, top, zNear, zFar); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glFrustumx"); -#endif -} - -// void glGetBooleanv (GLenum pname, GLboolean *params); -static inline void qglGetBooleanv(GLenum pname, GLboolean *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetBooleanv(pname=%s, params=%p)\n", StringFromGLEnumerant( pname ), params); -#endif - glGetBooleanv(pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetBooleanv"); -#endif -} - -// void glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); -static inline void qglGetBufferParameteriv(GLenum target, GLenum pname, GLint *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetBufferParameteriv(target=%s, pname=%s, params=%p)\n", StringFromGLEnumerant( target ), StringFromGLEnumerant( pname ), params); -#endif - glGetBufferParameteriv(target, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetBufferParameteriv"); -#endif -} - -// void glGetClipPlanex (GLenum pname, GLfixed eqn[4]); -static inline void qglGetClipPlanex(GLenum pname, GLfixed eqn[4]) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetClipPlanex(pname=%s, eqn=%ld)\n", StringFromGLEnumerant( pname ), eqn); -#endif - glGetClipPlanex(pname, eqn); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetClipPlanex"); -#endif -} - -// void glGenBuffers (GLsizei n, GLuint *buffers); -static inline void qglGenBuffers(GLsizei n, GLuint *buffers) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGenBuffers(n=%ld, buffers=%p)\n", n, buffers); -#endif - glGenBuffers(n, buffers); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGenBuffers"); -#endif -} - -// void glGenTextures (GLsizei n, GLuint *textures); -static inline void qglGenTextures(GLsizei n, GLuint *textures) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGenTextures(n=%ld, textures=%p)\n", n, textures); -#endif - glGenTextures(n, textures); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGenTextures"); -#endif -} - -// GLenum glGetError (void); -static inline GLenum qglGetError(void) -{ - GLenum returnValue; -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetError(void)\n"); -#endif - returnValue = glGetError(); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetError"); -#endif - return returnValue; -} - -// void glGetFixedv (GLenum pname, GLfixed *params); -static inline void qglGetFixedv(GLenum pname, GLfixed *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetFixedv(pname=%s, params=%p)\n", StringFromGLEnumerant( pname ), params); -#endif - glGetFixedv(pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetFixedv"); -#endif -} - -// void glGetIntegerv (GLenum pname, GLint *params); -static inline void qglGetIntegerv(GLenum pname, GLint *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetIntegerv(pname=%s, params=%p)\n", StringFromGLEnumerant( pname ), params); -#endif - glGetIntegerv(pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetIntegerv"); -#endif -} - -// void glGetLightxv (GLenum light, GLenum pname, GLfixed *params); -static inline void qglGetLightxv(GLenum light, GLenum pname, GLfixed *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetLightxv(light=%s, pname=%s, params=%p)\n", StringFromGLEnumerant( light ), StringFromGLEnumerant( pname ), params); -#endif - glGetLightxv(light, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetLightxv"); -#endif -} - -// void glGetMaterialxv (GLenum face, GLenum pname, GLfixed *params); -static inline void qglGetMaterialxv(GLenum face, GLenum pname, GLfixed *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetMaterialxv(face=%s, pname=%s, params=%p)\n", StringFromGLEnumerant( face ), StringFromGLEnumerant( pname ), params); -#endif - glGetMaterialxv(face, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetMaterialxv"); -#endif -} - -// void glGetPointerv (GLenum pname, void **params); -static inline void qglGetPointerv(GLenum pname, void **params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetPointerv(pname=%s, params=%p)\n", StringFromGLEnumerant( pname ), params); -#endif - glGetPointerv(pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetPointerv"); -#endif -} - -// const GLubyte * glGetString (GLenum name); -static inline const GLubyte * qglGetString(GLenum name) -{ - const GLubyte * returnValue; -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetString(name=%s)\n", StringFromGLEnumerant( name )); -#endif - returnValue = glGetString(name); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetString"); -#endif - return returnValue; -} - -// void glGetTexEnviv (GLenum env, GLenum pname, GLint *params); -static inline void qglGetTexEnviv(GLenum env, GLenum pname, GLint *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetTexEnviv(env=%s, pname=%s, params=%p)\n", StringFromGLEnumerant( env ), StringFromGLEnumerant( pname ), params); -#endif - glGetTexEnviv(env, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetTexEnviv"); -#endif -} - -// void glGetTexEnvxv (GLenum env, GLenum pname, GLfixed *params); -static inline void qglGetTexEnvxv(GLenum env, GLenum pname, GLfixed *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetTexEnvxv(env=%s, pname=%s, params=%p)\n", StringFromGLEnumerant( env ), StringFromGLEnumerant( pname ), params); -#endif - glGetTexEnvxv(env, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetTexEnvxv"); -#endif -} - -// void glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); -static inline void qglGetTexParameteriv(GLenum target, GLenum pname, GLint *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetTexParameteriv(target=%s, pname=%s, params=%p)\n", StringFromGLEnumerant( target ), StringFromGLEnumerant( pname ), params); -#endif - glGetTexParameteriv(target, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetTexParameteriv"); -#endif -} - -// void glGetTexParameterxv (GLenum target, GLenum pname, GLfixed *params); -static inline void qglGetTexParameterxv(GLenum target, GLenum pname, GLfixed *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glGetTexParameterxv(target=%s, pname=%s, params=%p)\n", StringFromGLEnumerant( target ), StringFromGLEnumerant( pname ), params); -#endif - glGetTexParameterxv(target, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glGetTexParameterxv"); -#endif -} - -// void glHint (GLenum target, GLenum mode); -static inline void qglHint(GLenum target, GLenum mode) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glHint(target=%s, mode=%s)\n", StringFromGLEnumerant( target ), StringFromGLEnumerant( mode )); -#endif - glHint(target, mode); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glHint"); -#endif -} - -// GLboolean glIsBuffer (GLuint buffer); -static inline GLboolean qglIsBuffer(GLuint buffer) -{ - GLboolean returnValue; -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glIsBuffer(buffer=%lu)\n", buffer); -#endif - returnValue = glIsBuffer(buffer); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glIsBuffer"); -#endif - return returnValue; -} - -// GLboolean glIsEnabled (GLenum cap); -static inline GLboolean qglIsEnabled(GLenum cap) -{ - GLboolean returnValue; -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glIsEnabled(cap=%s)\n", StringFromGLEnumerant( cap )); -#endif - returnValue = glIsEnabled(cap); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glIsEnabled"); -#endif - return returnValue; -} - -// GLboolean glIsTexture (GLuint texture); -static inline GLboolean qglIsTexture(GLuint texture) -{ - GLboolean returnValue; -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glIsTexture(texture=%lu)\n", texture); -#endif - returnValue = glIsTexture(texture); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glIsTexture"); -#endif - return returnValue; -} - -// void glLightModelx (GLenum pname, GLfixed param); -static inline void qglLightModelx(GLenum pname, GLfixed param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLightModelx(pname=%s, param=%ld)\n", StringFromGLEnumerant( pname ), param); -#endif - glLightModelx(pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLightModelx"); -#endif -} - -// void glLightModelxv (GLenum pname, const GLfixed *params); -static inline void qglLightModelxv(GLenum pname, const GLfixed *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLightModelxv(pname=%s, params=%p)\n", StringFromGLEnumerant( pname ), params); -#endif - glLightModelxv(pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLightModelxv"); -#endif -} - -// void glLightx (GLenum light, GLenum pname, GLfixed param); -static inline void qglLightx(GLenum light, GLenum pname, GLfixed param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLightx(light=%s, pname=%s, param=%ld)\n", StringFromGLEnumerant( light ), StringFromGLEnumerant( pname ), param); -#endif - glLightx(light, pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLightx"); -#endif -} - -// void glLightxv (GLenum light, GLenum pname, const GLfixed *params); -static inline void qglLightxv(GLenum light, GLenum pname, const GLfixed *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLightxv(light=%s, pname=%s, params=%p)\n", StringFromGLEnumerant( light ), StringFromGLEnumerant( pname ), params); -#endif - glLightxv(light, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLightxv"); -#endif -} - -// void glLineWidthx (GLfixed width); -static inline void qglLineWidthx(GLfixed width) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLineWidthx(width=%ld)\n", width); -#endif - glLineWidthx(width); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLineWidthx"); -#endif -} - -// void glLoadIdentity (void); -static inline void qglLoadIdentity(void) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLoadIdentity(void)\n"); -#endif - glLoadIdentity(); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLoadIdentity"); -#endif -} - -// void glLoadMatrixx (const GLfixed *m); -static inline void qglLoadMatrixx(const GLfixed *m) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLoadMatrixx(m=%p)\n", m); -#endif - glLoadMatrixx(m); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLoadMatrixx"); -#endif -} - -// void glLogicOp (GLenum opcode); -static inline void qglLogicOp(GLenum opcode) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLogicOp(opcode=%s)\n", StringFromGLEnumerant( opcode )); -#endif - glLogicOp(opcode); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLogicOp"); -#endif -} - -// void glMaterialx (GLenum face, GLenum pname, GLfixed param); -static inline void qglMaterialx(GLenum face, GLenum pname, GLfixed param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMaterialx(face=%s, pname=%s, param=%ld)\n", StringFromGLEnumerant( face ), StringFromGLEnumerant( pname ), param); -#endif - glMaterialx(face, pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMaterialx"); -#endif -} - -// void glMaterialxv (GLenum face, GLenum pname, const GLfixed *params); -static inline void qglMaterialxv(GLenum face, GLenum pname, const GLfixed *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMaterialxv(face=%s, pname=%s, params=%p)\n", StringFromGLEnumerant( face ), StringFromGLEnumerant( pname ), params); -#endif - glMaterialxv(face, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMaterialxv"); -#endif -} - -// void glMatrixMode (GLenum mode); -static inline void qglMatrixMode(GLenum mode) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMatrixMode(mode=%s)\n", StringFromGLEnumerant( mode )); -#endif - glMatrixMode(mode); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMatrixMode"); -#endif -} - -// void glMultMatrixx (const GLfixed *m); -static inline void qglMultMatrixx(const GLfixed *m) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMultMatrixx(m=%p)\n", m); -#endif - glMultMatrixx(m); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMultMatrixx"); -#endif -} - -// void glMultiTexCoord4x (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q); -static inline void qglMultiTexCoord4x(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMultiTexCoord4x(target=%s, s=%ld, t=%ld, r=%ld, q=%ld)\n", StringFromGLEnumerant( target ), s, t, r, q); -#endif - glMultiTexCoord4x(target, s, t, r, q); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMultiTexCoord4x"); -#endif -} - -// void glNormal3x (GLfixed nx, GLfixed ny, GLfixed nz); -static inline void qglNormal3x(GLfixed nx, GLfixed ny, GLfixed nz) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glNormal3x(nx=%ld, ny=%ld, nz=%ld)\n", nx, ny, nz); -#endif - glNormal3x(nx, ny, nz); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glNormal3x"); -#endif -} - -// void glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer); -static inline void qglNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glNormalPointer(type=%s, stride=%ld, pointer=%p)\n", StringFromGLEnumerant( type ), stride, pointer); -#endif - glNormalPointer(type, stride, pointer); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glNormalPointer"); -#endif -} - -// void glOrthox (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); -static inline void qglOrthox(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glOrthox(left=%ld, right=%ld, bottom=%ld, top=%ld, zNear=%ld, zFar=%ld)\n", left, right, bottom, top, zNear, zFar); -#endif - glOrthox(left, right, bottom, top, zNear, zFar); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glOrthox"); -#endif -} - -// void glPixelStorei (GLenum pname, GLint param); -static inline void qglPixelStorei(GLenum pname, GLint param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPixelStorei(pname=%s, param=%ld)\n", StringFromGLEnumerant( pname ), param); -#endif - glPixelStorei(pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPixelStorei"); -#endif -} - -// void glPointParameterx (GLenum pname, GLfixed param); -static inline void qglPointParameterx(GLenum pname, GLfixed param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPointParameterx(pname=%s, param=%ld)\n", StringFromGLEnumerant( pname ), param); -#endif - glPointParameterx(pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPointParameterx"); -#endif -} - -// void glPointParameterxv (GLenum pname, const GLfixed *params); -static inline void qglPointParameterxv(GLenum pname, const GLfixed *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPointParameterxv(pname=%s, params=%p)\n", StringFromGLEnumerant( pname ), params); -#endif - glPointParameterxv(pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPointParameterxv"); -#endif -} - -// void glPointSizex (GLfixed size); -static inline void qglPointSizex(GLfixed size) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPointSizex(size=%ld)\n", size); -#endif - glPointSizex(size); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPointSizex"); -#endif -} - -// void glPolygonOffsetx (GLfixed factor, GLfixed units); -static inline void qglPolygonOffsetx(GLfixed factor, GLfixed units) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPolygonOffsetx(factor=%ld, units=%ld)\n", factor, units); -#endif - glPolygonOffsetx(factor, units); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPolygonOffsetx"); -#endif -} - -// void glPopMatrix (void); -static inline void qglPopMatrix(void) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPopMatrix(void)\n"); -#endif - glPopMatrix(); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPopMatrix"); -#endif -} - -// void glPushMatrix (void); -static inline void qglPushMatrix(void) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPushMatrix(void)\n"); -#endif - glPushMatrix(); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPushMatrix"); -#endif -} - -// void glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); -static inline void qglReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glReadPixels(x=%ld, y=%ld, width=%ld, height=%ld, format=%s, type=%s, pixels=%p)\n", x, y, width, height, StringFromGLEnumerant( format ), StringFromGLEnumerant( type ), pixels); -#endif - glReadPixels(x, y, width, height, format, type, pixels); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glReadPixels"); -#endif -} - -// void glRotatex (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); -static inline void qglRotatex(GLfixed angle, GLfixed x, GLfixed y, GLfixed z) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glRotatex(angle=%ld, x=%ld, y=%ld, z=%ld)\n", angle, x, y, z); -#endif - glRotatex(angle, x, y, z); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glRotatex"); -#endif -} - -// void glSampleCoverage (GLclampf value, GLboolean invert); -static inline void qglSampleCoverage(GLclampf value, GLboolean invert) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glSampleCoverage(value=%f, invert=%u)\n", value, invert); -#endif - glSampleCoverage(value, invert); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glSampleCoverage"); -#endif -} - -// void glSampleCoveragex (GLclampx value, GLboolean invert); -static inline void qglSampleCoveragex(GLclampx value, GLboolean invert) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glSampleCoveragex(value=%ld, invert=%u)\n", value, invert); -#endif - glSampleCoveragex(value, invert); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glSampleCoveragex"); -#endif -} - -// void glScalex (GLfixed x, GLfixed y, GLfixed z); -static inline void qglScalex(GLfixed x, GLfixed y, GLfixed z) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glScalex(x=%ld, y=%ld, z=%ld)\n", x, y, z); -#endif - glScalex(x, y, z); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glScalex"); -#endif -} - -// void glScissor (GLint x, GLint y, GLsizei width, GLsizei height); -static inline void qglScissor(GLint x, GLint y, GLsizei width, GLsizei height) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glScissor(x=%ld, y=%ld, width=%ld, height=%ld)\n", x, y, width, height); -#endif - // fixme - int vidHeight = 320; -glScissor(vidHeight - y - height, x, height, width); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glScissor"); -#endif -} - -// void glShadeModel (GLenum mode); -static inline void qglShadeModel(GLenum mode) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glShadeModel(mode=%s)\n", StringFromGLEnumerant( mode )); -#endif - glShadeModel(mode); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glShadeModel"); -#endif -} - -// void glStencilFunc (GLenum func, GLint ref, GLuint mask); -static inline void qglStencilFunc(GLenum func, GLint ref, GLuint mask) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glStencilFunc(func=%s, ref=%ld, mask=%lu)\n", StringFromGLEnumerant( func ), ref, mask); -#endif - glStencilFunc(func, ref, mask); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glStencilFunc"); -#endif -} - -// void glStencilMask (GLuint mask); -static inline void qglStencilMask(GLuint mask) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glStencilMask(mask=%lu)\n", mask); -#endif - glStencilMask(mask); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glStencilMask"); -#endif -} - -// void glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); -static inline void qglStencilOp(GLenum fail, GLenum zfail, GLenum zpass) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glStencilOp(fail=%s, zfail=%s, zpass=%s)\n", StringFromGLEnumerant( fail ), StringFromGLEnumerant( zfail ), StringFromGLEnumerant( zpass )); -#endif - glStencilOp(fail, zfail, zpass); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glStencilOp"); -#endif -} - -// void glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -static inline void qglTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexCoordPointer(size=%ld, type=%s, stride=%ld, pointer=%p)\n", size, StringFromGLEnumerant( type ), stride, pointer); -#endif - glTexCoordPointer(size, type, stride, pointer); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexCoordPointer"); -#endif -} - -// void glTexEnvi (GLenum target, GLenum pname, GLint param); -static inline void qglTexEnvi(GLenum target, GLenum pname, GLint param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexEnvi(target=%s, pname=%s, param=%ld)\n", StringFromGLEnumerant( target ), StringFromGLEnumerant( pname ), param); -#endif - glTexEnvi(target, pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexEnvi"); -#endif -} - -// void glTexEnvx (GLenum target, GLenum pname, GLfixed param); -static inline void qglTexEnvx(GLenum target, GLenum pname, GLfixed param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexEnvx(target=%s, pname=%s, param=%ld)\n", StringFromGLEnumerant( target ), StringFromGLEnumerant( pname ), param); -#endif - glTexEnvx(target, pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexEnvx"); -#endif -} - -// void glTexEnviv (GLenum target, GLenum pname, const GLint *params); -static inline void qglTexEnviv(GLenum target, GLenum pname, const GLint *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexEnviv(target=%s, pname=%s, params=%p)\n", StringFromGLEnumerant( target ), StringFromGLEnumerant( pname ), params); -#endif - glTexEnviv(target, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexEnviv"); -#endif -} - -// void glTexEnvxv (GLenum target, GLenum pname, const GLfixed *params); -static inline void qglTexEnvxv(GLenum target, GLenum pname, const GLfixed *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexEnvxv(target=%s, pname=%s, params=%p)\n", StringFromGLEnumerant( target ), StringFromGLEnumerant( pname ), params); -#endif - glTexEnvxv(target, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexEnvxv"); -#endif -} - -// void glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -static inline void qglTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexImage2D(target=%s, level=%ld, internalformat=%ld, width=%ld, height=%ld, border=%ld, format=%s, type=%s, pixels=%p)\n", StringFromGLEnumerant( target ), level, internalformat, width, height, border, StringFromGLEnumerant( format ), StringFromGLEnumerant( type ), pixels); -#endif - glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexImage2D"); -#endif -} - -// void glTexParameteri (GLenum target, GLenum pname, GLint param); -static inline void qglTexParameteri(GLenum target, GLenum pname, GLint param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexParameteri(target=%s, pname=%s, param=%ld)\n", StringFromGLEnumerant( target ), StringFromGLEnumerant( pname ), param); -#endif - glTexParameteri(target, pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexParameteri"); -#endif -} - -// void glTexParameterx (GLenum target, GLenum pname, GLfixed param); -static inline void qglTexParameterx(GLenum target, GLenum pname, GLfixed param) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexParameterx(target=%s, pname=%s, param=%ld)\n", StringFromGLEnumerant( target ), StringFromGLEnumerant( pname ), param); -#endif - glTexParameterx(target, pname, param); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexParameterx"); -#endif -} - -// void glTexParameteriv (GLenum target, GLenum pname, const GLint *params); -static inline void qglTexParameteriv(GLenum target, GLenum pname, const GLint *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexParameteriv(target=%s, pname=%s, params=%p)\n", StringFromGLEnumerant( target ), StringFromGLEnumerant( pname ), params); -#endif - glTexParameteriv(target, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexParameteriv"); -#endif -} - -// void glTexParameterxv (GLenum target, GLenum pname, const GLfixed *params); -static inline void qglTexParameterxv(GLenum target, GLenum pname, const GLfixed *params) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexParameterxv(target=%s, pname=%s, params=%p)\n", StringFromGLEnumerant( target ), StringFromGLEnumerant( pname ), params); -#endif - glTexParameterxv(target, pname, params); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexParameterxv"); -#endif -} - -// void glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -static inline void qglTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTexSubImage2D(target=%s, level=%ld, xoffset=%ld, yoffset=%ld, width=%ld, height=%ld, format=%s, type=%s, pixels=%p)\n", StringFromGLEnumerant( target ), level, xoffset, yoffset, width, height, StringFromGLEnumerant( format ), StringFromGLEnumerant( type ), pixels); -#endif - glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTexSubImage2D"); -#endif -} - -// void glTranslatex (GLfixed x, GLfixed y, GLfixed z); -static inline void qglTranslatex(GLfixed x, GLfixed y, GLfixed z) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glTranslatex(x=%ld, y=%ld, z=%ld)\n", x, y, z); -#endif - glTranslatex(x, y, z); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glTranslatex"); -#endif -} - -// void glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -static inline void qglVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glVertexPointer(size=%ld, type=%s, stride=%ld, pointer=%p)\n", size, StringFromGLEnumerant( type ), stride, pointer); -#endif - glVertexPointer(size, type, stride, pointer); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glVertexPointer"); -#endif -} - -// void glViewport (GLint x, GLint y, GLsizei width, GLsizei height); -static inline void qglViewport(GLint x, GLint y, GLsizei width, GLsizei height) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glViewport(x=%ld, y=%ld, width=%ld, height=%ld)\n", x, y, width, height); -#endif -//extern glconfig_t glConfig; - int vidHeight = 320; - glViewport(vidHeight - y - height, x, height, width); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glViewport"); -#endif -} - -// void glCurrentPaletteMatrixOES (GLuint matrixpaletteindex); -static inline void qglCurrentPaletteMatrixOES(GLuint matrixpaletteindex) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glCurrentPaletteMatrixOES(matrixpaletteindex=%lu)\n", matrixpaletteindex); -#endif - glCurrentPaletteMatrixOES(matrixpaletteindex); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glCurrentPaletteMatrixOES"); -#endif -} - -// void glLoadPaletteFromModelViewMatrixOES (void); -static inline void qglLoadPaletteFromModelViewMatrixOES(void) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glLoadPaletteFromModelViewMatrixOES(void)\n"); -#endif - glLoadPaletteFromModelViewMatrixOES(); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glLoadPaletteFromModelViewMatrixOES"); -#endif -} - -// void glMatrixIndexPointerOES (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -static inline void qglMatrixIndexPointerOES(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glMatrixIndexPointerOES(size=%ld, type=%s, stride=%ld, pointer=%p)\n", size, StringFromGLEnumerant( type ), stride, pointer); -#endif - glMatrixIndexPointerOES(size, type, stride, pointer); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glMatrixIndexPointerOES"); -#endif -} - -// void glWeightPointerOES (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -static inline void qglWeightPointerOES(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glWeightPointerOES(size=%ld, type=%s, stride=%ld, pointer=%p)\n", size, StringFromGLEnumerant( type ), stride, pointer); -#endif - glWeightPointerOES(size, type, stride, pointer); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glWeightPointerOES"); -#endif -} - -// void glPointSizePointerOES (GLenum type, GLsizei stride, const GLvoid *pointer); -static inline void qglPointSizePointerOES(GLenum type, GLsizei stride, const GLvoid *pointer) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glPointSizePointerOES(type=%s, stride=%ld, pointer=%p)\n", StringFromGLEnumerant( type ), stride, pointer); -#endif - glPointSizePointerOES(type, stride, pointer); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glPointSizePointerOES"); -#endif -} - -// void glDrawTexsOES (GLshort x, GLshort y, GLshort z, GLshort width, GLshort height); -static inline void qglDrawTexsOES(GLshort x, GLshort y, GLshort z, GLshort width, GLshort height) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDrawTexsOES(x=%d, y=%d, z=%d, width=%d, height=%d)\n", x, y, z, width, height); -#endif - glDrawTexsOES(x, y, z, width, height); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDrawTexsOES"); -#endif -} - -// void glDrawTexiOES (GLint x, GLint y, GLint z, GLint width, GLint height); -static inline void qglDrawTexiOES(GLint x, GLint y, GLint z, GLint width, GLint height) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDrawTexiOES(x=%ld, y=%ld, z=%ld, width=%ld, height=%ld)\n", x, y, z, width, height); -#endif - glDrawTexiOES(x, y, z, width, height); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDrawTexiOES"); -#endif -} - -// void glDrawTexxOES (GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height); -static inline void qglDrawTexxOES(GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDrawTexxOES(x=%ld, y=%ld, z=%ld, width=%ld, height=%ld)\n", x, y, z, width, height); -#endif - glDrawTexxOES(x, y, z, width, height); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDrawTexxOES"); -#endif -} - -// void glDrawTexsvOES (const GLshort *coords); -static inline void qglDrawTexsvOES(const GLshort *coords) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDrawTexsvOES(coords=%p)\n", coords); -#endif - glDrawTexsvOES(coords); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDrawTexsvOES"); -#endif -} - -// void glDrawTexivOES (const GLint *coords); -static inline void qglDrawTexivOES(const GLint *coords) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDrawTexivOES(coords=%p)\n", coords); -#endif - glDrawTexivOES(coords); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDrawTexivOES"); -#endif -} - -// void glDrawTexxvOES (const GLfixed *coords); -static inline void qglDrawTexxvOES(const GLfixed *coords) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDrawTexxvOES(coords=%p)\n", coords); -#endif - glDrawTexxvOES(coords); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDrawTexxvOES"); -#endif -} - -// void glDrawTexfOES (GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height); -static inline void qglDrawTexfOES(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDrawTexfOES(x=%f, y=%f, z=%f, width=%f, height=%f)\n", x, y, z, width, height); -#endif - glDrawTexfOES(x, y, z, width, height); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDrawTexfOES"); -#endif -} - -// void glDrawTexfvOES (const GLfloat *coords); -static inline void qglDrawTexfvOES(const GLfloat *coords) -{ -#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS) - if (QGLLogGLCalls) - fprintf(QGLDebugFile(), "glDrawTexfvOES(coords=%p)\n", coords); -#endif - glDrawTexfvOES(coords); -#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS) - if (!QGLBeginStarted) - QGLCheckError("glDrawTexfvOES"); -#endif -} - -// Prevent calls to the 'normal' GL functions -#define glAlphaFunc CALL_THE_QGL_VERSION_OF_glAlphaFunc -#define glClearColor CALL_THE_QGL_VERSION_OF_glClearColor -#define glClearDepthf CALL_THE_QGL_VERSION_OF_glClearDepthf -#define glClipPlanef CALL_THE_QGL_VERSION_OF_glClipPlanef -#define glDepthRangef CALL_THE_QGL_VERSION_OF_glDepthRangef -#define glFogf CALL_THE_QGL_VERSION_OF_glFogf -#define glFogfv CALL_THE_QGL_VERSION_OF_glFogfv -#define glFrustumf CALL_THE_QGL_VERSION_OF_glFrustumf -#define glGetClipPlanef CALL_THE_QGL_VERSION_OF_glGetClipPlanef -#define glGetFloatv CALL_THE_QGL_VERSION_OF_glGetFloatv -#define glGetLightfv CALL_THE_QGL_VERSION_OF_glGetLightfv -#define glGetMaterialfv CALL_THE_QGL_VERSION_OF_glGetMaterialfv -#define glGetTexEnvfv CALL_THE_QGL_VERSION_OF_glGetTexEnvfv -#define glGetTexParameterfv CALL_THE_QGL_VERSION_OF_glGetTexParameterfv -#define glLightModelf CALL_THE_QGL_VERSION_OF_glLightModelf -#define glLightModelfv CALL_THE_QGL_VERSION_OF_glLightModelfv -#define glLightf CALL_THE_QGL_VERSION_OF_glLightf -#define glLightfv CALL_THE_QGL_VERSION_OF_glLightfv -#define glLineWidth CALL_THE_QGL_VERSION_OF_glLineWidth -#define glLoadMatrixf CALL_THE_QGL_VERSION_OF_glLoadMatrixf -#define glMaterialf CALL_THE_QGL_VERSION_OF_glMaterialf -#define glMaterialfv CALL_THE_QGL_VERSION_OF_glMaterialfv -#define glMultMatrixf CALL_THE_QGL_VERSION_OF_glMultMatrixf -#define glMultiTexCoord4f CALL_THE_QGL_VERSION_OF_glMultiTexCoord4f -#define glNormal3f CALL_THE_QGL_VERSION_OF_glNormal3f -#define glOrthof CALL_THE_QGL_VERSION_OF_glOrthof -#define glPointParameterf CALL_THE_QGL_VERSION_OF_glPointParameterf -#define glPointParameterfv CALL_THE_QGL_VERSION_OF_glPointParameterfv -#define glPointSize CALL_THE_QGL_VERSION_OF_glPointSize -#define glPolygonOffset CALL_THE_QGL_VERSION_OF_glPolygonOffset -#define glRotatef CALL_THE_QGL_VERSION_OF_glRotatef -#define glScalef CALL_THE_QGL_VERSION_OF_glScalef -#define glTexEnvf CALL_THE_QGL_VERSION_OF_glTexEnvf -#define glTexEnvfv CALL_THE_QGL_VERSION_OF_glTexEnvfv -#define glTexParameterf CALL_THE_QGL_VERSION_OF_glTexParameterf -#define glTexParameterfv CALL_THE_QGL_VERSION_OF_glTexParameterfv -#define glTranslatef CALL_THE_QGL_VERSION_OF_glTranslatef -#define glActiveTexture CALL_THE_QGL_VERSION_OF_glActiveTexture -#define glAlphaFuncx CALL_THE_QGL_VERSION_OF_glAlphaFuncx -#define glBindBuffer CALL_THE_QGL_VERSION_OF_glBindBuffer -#define glBindTexture CALL_THE_QGL_VERSION_OF_glBindTexture -#define glBlendFunc CALL_THE_QGL_VERSION_OF_glBlendFunc -#define glBufferData CALL_THE_QGL_VERSION_OF_glBufferData -#define glBufferSubData CALL_THE_QGL_VERSION_OF_glBufferSubData -#define glClear CALL_THE_QGL_VERSION_OF_glClear -#define glClearColorx CALL_THE_QGL_VERSION_OF_glClearColorx -#define glClearDepthx CALL_THE_QGL_VERSION_OF_glClearDepthx -#define glClearStencil CALL_THE_QGL_VERSION_OF_glClearStencil -#define glClientActiveTexture CALL_THE_QGL_VERSION_OF_glClientActiveTexture -#define glClipPlanex CALL_THE_QGL_VERSION_OF_glClipPlanex -#define glColor4ub CALL_THE_QGL_VERSION_OF_glColor4ub -#define glColor4x CALL_THE_QGL_VERSION_OF_glColor4x -#define glColorMask CALL_THE_QGL_VERSION_OF_glColorMask -#define glColorPointer CALL_THE_QGL_VERSION_OF_glColorPointer -#define glCompressedTexImage2D CALL_THE_QGL_VERSION_OF_glCompressedTexImage2D -#define glCompressedTexSubImage2D CALL_THE_QGL_VERSION_OF_glCompressedTexSubImage2D -#define glCopyTexImage2D CALL_THE_QGL_VERSION_OF_glCopyTexImage2D -#define glCopyTexSubImage2D CALL_THE_QGL_VERSION_OF_glCopyTexSubImage2D -#define glCullFace CALL_THE_QGL_VERSION_OF_glCullFace -#define glDeleteBuffers CALL_THE_QGL_VERSION_OF_glDeleteBuffers -#define glDeleteTextures CALL_THE_QGL_VERSION_OF_glDeleteTextures -#define glDepthFunc CALL_THE_QGL_VERSION_OF_glDepthFunc -#define glDepthMask CALL_THE_QGL_VERSION_OF_glDepthMask -#define glDepthRangex CALL_THE_QGL_VERSION_OF_glDepthRangex -#define glDisable CALL_THE_QGL_VERSION_OF_glDisable -#define glDisableClientState CALL_THE_QGL_VERSION_OF_glDisableClientState -#define glDrawArrays CALL_THE_QGL_VERSION_OF_glDrawArrays -#define glDrawElements CALL_THE_QGL_VERSION_OF_glDrawElements -#define glEnable CALL_THE_QGL_VERSION_OF_glEnable -#define glEnableClientState CALL_THE_QGL_VERSION_OF_glEnableClientState -#define glFinish CALL_THE_QGL_VERSION_OF_glFinish -#define glFlush CALL_THE_QGL_VERSION_OF_glFlush -#define glFogx CALL_THE_QGL_VERSION_OF_glFogx -#define glFogxv CALL_THE_QGL_VERSION_OF_glFogxv -#define glFrontFace CALL_THE_QGL_VERSION_OF_glFrontFace -#define glFrustumx CALL_THE_QGL_VERSION_OF_glFrustumx -#define glGetBooleanv CALL_THE_QGL_VERSION_OF_glGetBooleanv -#define glGetBufferParameteriv CALL_THE_QGL_VERSION_OF_glGetBufferParameteriv -#define glGetClipPlanex CALL_THE_QGL_VERSION_OF_glGetClipPlanex -#define glGenBuffers CALL_THE_QGL_VERSION_OF_glGenBuffers -#define glGenTextures CALL_THE_QGL_VERSION_OF_glGenTextures -#define glGetError CALL_THE_QGL_VERSION_OF_glGetError -#define glGetFixedv CALL_THE_QGL_VERSION_OF_glGetFixedv -#define glGetIntegerv CALL_THE_QGL_VERSION_OF_glGetIntegerv -#define glGetLightxv CALL_THE_QGL_VERSION_OF_glGetLightxv -#define glGetMaterialxv CALL_THE_QGL_VERSION_OF_glGetMaterialxv -#define glGetPointerv CALL_THE_QGL_VERSION_OF_glGetPointerv -#define glGetString CALL_THE_QGL_VERSION_OF_glGetString -#define glGetTexEnviv CALL_THE_QGL_VERSION_OF_glGetTexEnviv -#define glGetTexEnvxv CALL_THE_QGL_VERSION_OF_glGetTexEnvxv -#define glGetTexParameteriv CALL_THE_QGL_VERSION_OF_glGetTexParameteriv -#define glGetTexParameterxv CALL_THE_QGL_VERSION_OF_glGetTexParameterxv -#define glHint CALL_THE_QGL_VERSION_OF_glHint -#define glIsBuffer CALL_THE_QGL_VERSION_OF_glIsBuffer -#define glIsEnabled CALL_THE_QGL_VERSION_OF_glIsEnabled -#define glIsTexture CALL_THE_QGL_VERSION_OF_glIsTexture -#define glLightModelx CALL_THE_QGL_VERSION_OF_glLightModelx -#define glLightModelxv CALL_THE_QGL_VERSION_OF_glLightModelxv -#define glLightx CALL_THE_QGL_VERSION_OF_glLightx -#define glLightxv CALL_THE_QGL_VERSION_OF_glLightxv -#define glLineWidthx CALL_THE_QGL_VERSION_OF_glLineWidthx -#define glLoadIdentity CALL_THE_QGL_VERSION_OF_glLoadIdentity -#define glLoadMatrixx CALL_THE_QGL_VERSION_OF_glLoadMatrixx -#define glLogicOp CALL_THE_QGL_VERSION_OF_glLogicOp -#define glMaterialx CALL_THE_QGL_VERSION_OF_glMaterialx -#define glMaterialxv CALL_THE_QGL_VERSION_OF_glMaterialxv -#define glMatrixMode CALL_THE_QGL_VERSION_OF_glMatrixMode -#define glMultMatrixx CALL_THE_QGL_VERSION_OF_glMultMatrixx -#define glMultiTexCoord4x CALL_THE_QGL_VERSION_OF_glMultiTexCoord4x -#define glNormal3x CALL_THE_QGL_VERSION_OF_glNormal3x -#define glNormalPointer CALL_THE_QGL_VERSION_OF_glNormalPointer -#define glOrthox CALL_THE_QGL_VERSION_OF_glOrthox -#define glPixelStorei CALL_THE_QGL_VERSION_OF_glPixelStorei -#define glPointParameterx CALL_THE_QGL_VERSION_OF_glPointParameterx -#define glPointParameterxv CALL_THE_QGL_VERSION_OF_glPointParameterxv -#define glPointSizex CALL_THE_QGL_VERSION_OF_glPointSizex -#define glPolygonOffsetx CALL_THE_QGL_VERSION_OF_glPolygonOffsetx -#define glPopMatrix CALL_THE_QGL_VERSION_OF_glPopMatrix -#define glPushMatrix CALL_THE_QGL_VERSION_OF_glPushMatrix -#define glReadPixels CALL_THE_QGL_VERSION_OF_glReadPixels -#define glRotatex CALL_THE_QGL_VERSION_OF_glRotatex -#define glSampleCoverage CALL_THE_QGL_VERSION_OF_glSampleCoverage -#define glSampleCoveragex CALL_THE_QGL_VERSION_OF_glSampleCoveragex -#define glScalex CALL_THE_QGL_VERSION_OF_glScalex -#define glScissor CALL_THE_QGL_VERSION_OF_glScissor -#define glShadeModel CALL_THE_QGL_VERSION_OF_glShadeModel -#define glStencilFunc CALL_THE_QGL_VERSION_OF_glStencilFunc -#define glStencilMask CALL_THE_QGL_VERSION_OF_glStencilMask -#define glStencilOp CALL_THE_QGL_VERSION_OF_glStencilOp -#define glTexCoordPointer CALL_THE_QGL_VERSION_OF_glTexCoordPointer -#define glTexEnvi CALL_THE_QGL_VERSION_OF_glTexEnvi -#define glTexEnvx CALL_THE_QGL_VERSION_OF_glTexEnvx -#define glTexEnviv CALL_THE_QGL_VERSION_OF_glTexEnviv -#define glTexEnvxv CALL_THE_QGL_VERSION_OF_glTexEnvxv -#define glTexImage2D CALL_THE_QGL_VERSION_OF_glTexImage2D -#define glTexParameteri CALL_THE_QGL_VERSION_OF_glTexParameteri -#define glTexParameterx CALL_THE_QGL_VERSION_OF_glTexParameterx -#define glTexParameteriv CALL_THE_QGL_VERSION_OF_glTexParameteriv -#define glTexParameterxv CALL_THE_QGL_VERSION_OF_glTexParameterxv -#define glTexSubImage2D CALL_THE_QGL_VERSION_OF_glTexSubImage2D -#define glTranslatex CALL_THE_QGL_VERSION_OF_glTranslatex -#define glVertexPointer CALL_THE_QGL_VERSION_OF_glVertexPointer -#define glViewport CALL_THE_QGL_VERSION_OF_glViewport -#define glCurrentPaletteMatrixOES CALL_THE_QGL_VERSION_OF_glCurrentPaletteMatrixOES -#define glLoadPaletteFromModelViewMatrixOES CALL_THE_QGL_VERSION_OF_glLoadPaletteFromModelViewMatrixOES -#define glMatrixIndexPointerOES CALL_THE_QGL_VERSION_OF_glMatrixIndexPointerOES -#define glWeightPointerOES CALL_THE_QGL_VERSION_OF_glWeightPointerOES -#define glPointSizePointerOES CALL_THE_QGL_VERSION_OF_glPointSizePointerOES -#define glDrawTexsOES CALL_THE_QGL_VERSION_OF_glDrawTexsOES -#define glDrawTexiOES CALL_THE_QGL_VERSION_OF_glDrawTexiOES -#define glDrawTexxOES CALL_THE_QGL_VERSION_OF_glDrawTexxOES -#define glDrawTexsvOES CALL_THE_QGL_VERSION_OF_glDrawTexsvOES -#define glDrawTexivOES CALL_THE_QGL_VERSION_OF_glDrawTexivOES -#define glDrawTexxvOES CALL_THE_QGL_VERSION_OF_glDrawTexxvOES -#define glDrawTexfOES CALL_THE_QGL_VERSION_OF_glDrawTexfOES -#define glDrawTexfvOES CALL_THE_QGL_VERSION_OF_glDrawTexfvOES - -#endif // _IPHONE_QGL_H_ diff --git a/wolf3d/newCode/iphone/iphone_qgl_enumerants.h b/wolf3d/newCode/iphone/iphone_qgl_enumerants.h deleted file mode 100644 index 01892dd..0000000 --- a/wolf3d/newCode/iphone/iphone_qgl_enumerants.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - - Copyright (C) 2009 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 IPHONE_QGL_ENUMERANTS_H -#define IPHONE_QGL_ENUMERANTS_H - -#ifdef QGL_LOG_GL_CALLS - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - const char *StringFromGLEnumerant( GLenum enumerant ); - -#ifdef __cplusplus -} -#endif - -#endif // QGL_LOG_GL_CALLS - -#endif // IPHONE_QGL_ENUMERANTS_H \ No newline at end of file diff --git a/wolf3d/newCode/iphone/iphone_wolf.h b/wolf3d/newCode/iphone/iphone_wolf.h deleted file mode 100644 index 5314edf..0000000 --- a/wolf3d/newCode/iphone/iphone_wolf.h +++ /dev/null @@ -1,151 +0,0 @@ -/* - - Copyright (C) 2009 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. - - */ - -// define this to get only the first episode on selections, and the -// automatic sell screen at the end of episode 1 -//#define EPISODE_ONE_ONLY - -extern viddef_t viddef; - -typedef enum menuState { - IPM_GAME, - IPM_MAIN, - IPM_SKILL, - IPM_EPISODE, - IPM_MAPS, - IPM_CONTROLS, - IPM_INTERMISSION, - IPM_VICTORY, - IPM_AUTOMAP -} menuState_t; - -extern menuState_t menuState; - -void iphoneDrawMenus(); - -#define SAVEGAME_VERSION 106 - -#define MAX_SKILLS 4 -#define MAX_MAPS 60 - -#define MF_TRIED 1 -#define MF_COMPLETED 2 -#define MF_KILLS 4 -#define MF_SECRETS 8 -#define MF_TREASURE 16 -#define MF_TIME 32 - -typedef struct { - int episode; - int map; - int skill; - int levelCompleted; // already at intermission when saved - int version; - int mapFlags[MAX_SKILLS][MAX_MAPS]; -} currentMap_t; - -extern currentMap_t currentMap; - -void iphoneStartMap( int episodeNum, int mapNum, int skillLevel ); - -extern char iphoneDocDirectory[1024]; -extern char iphoneAppDirectory[1024]; - -extern texture_t *numberPics[10]; - -extern vec3_t vnull; - -void Client_PrepRefresh( const char *r_mapname ); - -extern int iphoneFrameNum; -extern int intermissionTriggerFrame; -extern int consoleActive; - -extern cvar_t *controlScheme; -extern cvar_t *sensitivity; -extern cvar_t *stickSize; -extern cvar_t *stickTurnBase; -extern cvar_t *stickTurnScale; -extern cvar_t *stickMoveBase; -extern cvar_t *stickMoveScale; -extern cvar_t *stickDeadBand; -extern cvar_t *tiltTurn; -extern cvar_t *tiltMove; -extern cvar_t *tiltDeadBand; -extern cvar_t *tiltAverages; -extern cvar_t *tiltFire; -extern cvar_t *music; -extern cvar_t *showTilt; -extern cvar_t *cropSprites; -extern cvar_t *blends; -extern cvar_t *gunFrame; -extern cvar_t *slowAI; - -// the native iPhone code should set the following each frame: -extern int numTouches; -extern int touches[5][2]; // [0] = x, [1] = y in landscape mode, raster order with y = 0 at top -extern float tilt; // -1.0 to 1.0 -extern float tiltPitch; - -// so we can detect button releases -extern int numPrevTouches; -extern int prevTouches[5][2]; - - -// the layout drawing code sets these, which are then used -// by the touch processing -extern int menuButtonX, menuButtonY, menuButtonSize; -extern int fireButtonX, fireButtonY, fireButtonSize; -extern int moveAxisX, moveAxisY, moveAxisSize; -extern int turnAxisX, turnAxisY, turnAxisSize; - -// incremented once each frame, regardless of framerate -extern int frameNum; - -int TouchDown( int x, int y, int w, int h ); -int TouchReleased( int x, int y, int w, int h ); -int iphoneCenterText( int x, int y, const char *str ); -void iphoneDrawNumber( int x, int y, int number, int charWidth, int charHeight ); -void iphoneDrawPic( int x, int y, int w, int h, const char *pic ); -void R_Draw_Blend( int x, int y, int w, int h, colour4_t c ); -void SaveTheGame(); -int LoadTheGame(); -void StartGame( void ); -void iphoneShutdown(); -void iphoneOpenAutomap(); - -void InitImmediateModeGL(); - -extern colour4_t colorPressed; - -extern int damageflash; -extern int bonusFrameNum; -extern int attackDirTime[2]; - -// interfaces from the game code -void iphoneStartBonusFlash(); -void iphoneStartDamageFlash( int points ); -void iphoneSetAttackDirection( int dir ); -void iphoneStartIntermission( int framesFromNow ); -void iphoneSetNotifyText( const char *str, ... ); - -// interfaces to hadware / system -void OpenURL( const char *url ); - diff --git a/wolf3d/newCode/iphone/main.m b/wolf3d/newCode/iphone/main.m deleted file mode 100644 index 189bf40..0000000 --- a/wolf3d/newCode/iphone/main.m +++ /dev/null @@ -1,45 +0,0 @@ -/* - - Copyright (C) 2009 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. - - */ - -#import -#include -#include - -int main(int argc, char *argv[]) { - - { - char cwd[256]; - strcpy( cwd, argv[0] ); - int len = strlen( cwd ); - for( int i = len-1; i >= 0; i-- ) { - if ( cwd[i] == '/' ) { - cwd[i] = 0; - break; - } - cwd[i] = 0; - } - setenv( "CWD", cwd, 1 ); - } - - NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; - int retVal = UIApplicationMain(argc, argv, nil, nil); - [pool release]; - return retVal; -} diff --git a/wolf3d/newCode/iphone/wolf3d.xcodeproj/project.pbxproj b/wolf3d/newCode/iphone/wolf3d.xcodeproj/project.pbxproj deleted file mode 100644 index be678b7..0000000 --- a/wolf3d/newCode/iphone/wolf3d.xcodeproj/project.pbxproj +++ /dev/null @@ -1,847 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 45; - objects = { - -/* Begin PBXBuildFile section */ - 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; - 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; }; - 28FD15000DC6FC520079059D /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28FD14FF0DC6FC520079059D /* OpenGLES.framework */; }; - 28FD15080DC6FC5B0079059D /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28FD15070DC6FC5B0079059D /* QuartzCore.framework */; }; - 4333CCE80F5CC23E00AE2B6F /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4333CCE70F5CC23E00AE2B6F /* AudioToolbox.framework */; }; - 4364BF3F0F5CB25900F29317 /* dist.plist in Resources */ = {isa = PBXBuildFile; fileRef = 4364BF3E0F5CB25900F29317 /* dist.plist */; }; - 43AE7CAB0F61FB0E00B2F562 /* wolf3dEpisode1_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 43AE7CAA0F61FB0E00B2F562 /* wolf3dEpisode1_icon.png */; }; - 43AE7E9F0F67387500B2F562 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43AE7E9E0F67387500B2F562 /* CoreGraphics.framework */; }; - 43CF02ED0F56955F00E4A23D /* wolf3d_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 43CF02EC0F56955F00E4A23D /* wolf3d_icon.png */; }; - 43CF02FF0F56974E00E4A23D /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 43CF02FE0F56974E00E4A23D /* Default.png */; }; - 43CF030A0F56D5C200E4A23D /* iphone_loop.c in Sources */ = {isa = PBXBuildFile; fileRef = 43CF03090F56D5C200E4A23D /* iphone_loop.c */; }; - 43E8D2E10F4FC61E003F09B2 /* iphone_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 43E8D2DF0F4FC61E003F09B2 /* iphone_main.c */; }; - 43E8D4E00F51B48B003F09B2 /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43E8D4DF0F51B48B003F09B2 /* OpenAL.framework */; }; - 7229CC460F6B3222004123C5 /* wolf_actor_ai.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC250F6B3222004123C5 /* wolf_actor_ai.c */; }; - 7229CC470F6B3222004123C5 /* wolf_actors.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC270F6B3222004123C5 /* wolf_actors.c */; }; - 7229CC480F6B3222004123C5 /* wolf_ai_com.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC290F6B3222004123C5 /* wolf_ai_com.c */; }; - 7229CC490F6B3222004123C5 /* wolf_areas.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC2B0F6B3222004123C5 /* wolf_areas.c */; }; - 7229CC4A0F6B3222004123C5 /* wolf_bj.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC2C0F6B3222004123C5 /* wolf_bj.c */; }; - 7229CC4B0F6B3222004123C5 /* wolf_client_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC2E0F6B3222004123C5 /* wolf_client_main.c */; }; - 7229CC4D0F6B3222004123C5 /* wolf_doors.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC300F6B3222004123C5 /* wolf_doors.c */; }; - 7229CC4E0F6B3222004123C5 /* wolf_level.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC310F6B3222004123C5 /* wolf_level.c */; }; - 7229CC4F0F6B3222004123C5 /* wolf_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC340F6B3222004123C5 /* wolf_main.c */; }; - 7229CC500F6B3222004123C5 /* wolf_math.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC350F6B3222004123C5 /* wolf_math.c */; }; - 7229CC510F6B3222004123C5 /* wolf_opengl.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC370F6B3222004123C5 /* wolf_opengl.c */; }; - 7229CC520F6B3222004123C5 /* wolf_player.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC380F6B3222004123C5 /* wolf_player.c */; }; - 7229CC530F6B3222004123C5 /* wolf_powerups.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC3A0F6B3222004123C5 /* wolf_powerups.c */; }; - 7229CC540F6B3222004123C5 /* wolf_pushwalls.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC3C0F6B3222004123C5 /* wolf_pushwalls.c */; }; - 7229CC550F6B3222004123C5 /* wolf_raycast.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC3D0F6B3222004123C5 /* wolf_raycast.c */; }; - 7229CC560F6B3222004123C5 /* wolf_renderer.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC3F0F6B3222004123C5 /* wolf_renderer.c */; }; - 7229CC570F6B3222004123C5 /* wolf_sprites.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC410F6B3222004123C5 /* wolf_sprites.c */; }; - 7229CC580F6B3222004123C5 /* wolf_sv_ccmds.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC430F6B3222004123C5 /* wolf_sv_ccmds.c */; }; - 7229CC590F6B3222004123C5 /* wolf_weapon.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC440F6B3222004123C5 /* wolf_weapon.c */; }; - 7229CC7D0F6B3295004123C5 /* bitwise.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC5D0F6B3295004123C5 /* bitwise.c */; }; - 7229CC7E0F6B3295004123C5 /* block.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC5E0F6B3295004123C5 /* block.c */; }; - 7229CC7F0F6B3295004123C5 /* codebook.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC600F6B3295004123C5 /* codebook.c */; }; - 7229CC800F6B3295004123C5 /* floor0.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC640F6B3295004123C5 /* floor0.c */; }; - 7229CC810F6B3295004123C5 /* floor1.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC650F6B3295004123C5 /* floor1.c */; }; - 7229CC820F6B3295004123C5 /* framing.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC660F6B3295004123C5 /* framing.c */; }; - 7229CC830F6B3295004123C5 /* info.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC670F6B3295004123C5 /* info.c */; }; - 7229CC850F6B3295004123C5 /* mapping0.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC6C0F6B3295004123C5 /* mapping0.c */; }; - 7229CC860F6B3295004123C5 /* mdct.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC6D0F6B3295004123C5 /* mdct.c */; }; - 7229CC870F6B3295004123C5 /* registry.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC740F6B3295004123C5 /* registry.c */; }; - 7229CC880F6B3295004123C5 /* res012.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC760F6B3295004123C5 /* res012.c */; }; - 7229CC890F6B3295004123C5 /* sharedbook.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC770F6B3295004123C5 /* sharedbook.c */; }; - 7229CC8A0F6B3295004123C5 /* synthesis.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC780F6B3295004123C5 /* synthesis.c */; }; - 7229CC8B0F6B3295004123C5 /* vorbisfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC790F6B3295004123C5 /* vorbisfile.c */; }; - 7229CC8C0F6B3295004123C5 /* window.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CC7A0F6B3295004123C5 /* window.c */; }; - 7229CE4A0F6C89F8004123C5 /* EAGLView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7229CE460F6C89F8004123C5 /* EAGLView.m */; }; - 7229CE4C0F6C89F8004123C5 /* wolf3dAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7229CE490F6C89F8004123C5 /* wolf3dAppDelegate.m */; }; - 7229CE550F6C8CDE004123C5 /* gles_glue.c in Sources */ = {isa = PBXBuildFile; fileRef = 7229CE540F6C8CDE004123C5 /* gles_glue.c */; }; - 72935B740F6B2D9D0085DD28 /* angle.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B1A0F6B2D9D0085DD28 /* angle.c */; }; - 72935B750F6B2D9D0085DD28 /* arch.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B1D0F6B2D9D0085DD28 /* arch.c */; }; - 72935B790F6B2D9D0085DD28 /* cmd.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B230F6B2D9D0085DD28 /* cmd.c */; }; - 72935B7A0F6B2D9D0085DD28 /* com_string.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B250F6B2D9D0085DD28 /* com_string.c */; }; - 72935B7B0F6B2D9D0085DD28 /* common.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B270F6B2D9D0085DD28 /* common.c */; }; - 72935B7C0F6B2D9D0085DD28 /* console.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B2A0F6B2D9D0085DD28 /* console.c */; }; - 72935B7E0F6B2D9D0085DD28 /* cvar.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B2D0F6B2D9D0085DD28 /* cvar.c */; }; - 72935B7F0F6B2D9D0085DD28 /* fileio.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B2F0F6B2D9D0085DD28 /* fileio.c */; }; - 72935B800F6B2D9D0085DD28 /* files.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B310F6B2D9D0085DD28 /* files.c */; }; - 72935B810F6B2D9D0085DD28 /* filestring.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B320F6B2D9D0085DD28 /* filestring.c */; }; - 72935B820F6B2D9D0085DD28 /* font_manager.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B350F6B2D9D0085DD28 /* font_manager.c */; }; - 72935B830F6B2D9D0085DD28 /* glob.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B370F6B2D9D0085DD28 /* glob.c */; }; - 72935B870F6B2D9D0085DD28 /* math.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B3E0F6B2D9D0085DD28 /* math.c */; }; - 72935B880F6B2D9D0085DD28 /* matrix.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B3F0F6B2D9D0085DD28 /* matrix.c */; }; - 72935B890F6B2D9D0085DD28 /* memory.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B410F6B2D9D0085DD28 /* memory.c */; }; - 72935B8B0F6B2D9D0085DD28 /* oggfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B490F6B2D9D0085DD28 /* oggfile.c */; }; - 72935B8C0F6B2D9D0085DD28 /* openal_binding.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B4B0F6B2D9D0085DD28 /* openal_binding.c */; }; - 72935B8D0F6B2D9D0085DD28 /* openal_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B4D0F6B2D9D0085DD28 /* openal_main.c */; }; - 72935B8F0F6B2D9D0085DD28 /* opengl_draw.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B500F6B2D9D0085DD28 /* opengl_draw.c */; }; - 72935B910F6B2D9D0085DD28 /* opengl_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B530F6B2D9D0085DD28 /* opengl_main.c */; }; - 72935B920F6B2D9D0085DD28 /* opengl_texture.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B540F6B2D9D0085DD28 /* opengl_texture.c */; }; - 72935B930F6B2D9D0085DD28 /* random_number.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B560F6B2D9D0085DD28 /* random_number.c */; }; - 72935B940F6B2D9D0085DD28 /* share.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B590F6B2D9D0085DD28 /* share.c */; }; - 72935B950F6B2D9D0085DD28 /* sound.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B5A0F6B2D9D0085DD28 /* sound.c */; }; - 72935B960F6B2D9D0085DD28 /* sound_sfx_id.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B5D0F6B2D9D0085DD28 /* sound_sfx_id.c */; }; - 72935B970F6B2D9D0085DD28 /* sound_stream.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B5E0F6B2D9D0085DD28 /* sound_stream.c */; }; - 72935B990F6B2D9D0085DD28 /* texture_manager.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B610F6B2D9D0085DD28 /* texture_manager.c */; }; - 72935B9A0F6B2D9D0085DD28 /* tga.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B630F6B2D9D0085DD28 /* tga.c */; }; - 72935B9C0F6B2D9D0085DD28 /* unix_file.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B680F6B2D9D0085DD28 /* unix_file.c */; }; - 72935B9E0F6B2D9D0085DD28 /* unix_timer.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B6A0F6B2D9D0085DD28 /* unix_timer.c */; }; - 72935B9F0F6B2D9D0085DD28 /* vector.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B6B0F6B2D9D0085DD28 /* vector.c */; }; - 72935BA00F6B2D9D0085DD28 /* wavfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B6E0F6B2D9D0085DD28 /* wavfile.c */; }; - 72935BA20F6B2D9D0085DD28 /* zmem.c in Sources */ = {isa = PBXBuildFile; fileRef = 72935B720F6B2D9D0085DD28 /* zmem.c */; }; - 72A7E8F70F5F2063005B83C0 /* iphone_menus.c in Sources */ = {isa = PBXBuildFile; fileRef = 72A7E8F60F5F2063005B83C0 /* iphone_menus.c */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 1D6058910D05DD3D006BFB54 /* wolf3d.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = wolf3d.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; - 28FD14FF0DC6FC520079059D /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; - 28FD15070DC6FC5B0079059D /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 32CA4F630368D1EE00C91783 /* wolf3d_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wolf3d_Prefix.pch; sourceTree = ""; }; - 4333CCE70F5CC23E00AE2B6F /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = /System/Library/Frameworks/AudioToolbox.framework; sourceTree = ""; }; - 4364BF3E0F5CB25900F29317 /* dist.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = dist.plist; sourceTree = ""; }; - 43AE7CAA0F61FB0E00B2F562 /* wolf3dEpisode1_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = wolf3dEpisode1_icon.png; sourceTree = ""; }; - 43AE7E9E0F67387500B2F562 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 43CF02EC0F56955F00E4A23D /* wolf3d_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = wolf3d_icon.png; sourceTree = ""; }; - 43CF02FE0F56974E00E4A23D /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; - 43CF03090F56D5C200E4A23D /* iphone_loop.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = iphone_loop.c; sourceTree = ""; }; - 43E8D2DF0F4FC61E003F09B2 /* iphone_main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = iphone_main.c; sourceTree = ""; }; - 43E8D4DF0F51B48B003F09B2 /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = /System/Library/Frameworks/OpenAL.framework; sourceTree = ""; }; - 7229CC240F6B3222004123C5 /* wolf_act_stat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wolf_act_stat.h; path = ../wolf/wolf_act_stat.h; sourceTree = SOURCE_ROOT; }; - 7229CC250F6B3222004123C5 /* wolf_actor_ai.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wolf_actor_ai.c; path = ../wolf/wolf_actor_ai.c; sourceTree = SOURCE_ROOT; }; - 7229CC260F6B3222004123C5 /* wolf_actor_ai.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wolf_actor_ai.h; path = ../wolf/wolf_actor_ai.h; sourceTree = SOURCE_ROOT; }; - 7229CC270F6B3222004123C5 /* wolf_actors.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wolf_actors.c; path = ../wolf/wolf_actors.c; sourceTree = SOURCE_ROOT; }; - 7229CC280F6B3222004123C5 /* wolf_actors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wolf_actors.h; path = ../wolf/wolf_actors.h; sourceTree = SOURCE_ROOT; }; - 7229CC290F6B3222004123C5 /* wolf_ai_com.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wolf_ai_com.c; path = ../wolf/wolf_ai_com.c; sourceTree = SOURCE_ROOT; }; - 7229CC2A0F6B3222004123C5 /* wolf_ai_com.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wolf_ai_com.h; path = ../wolf/wolf_ai_com.h; sourceTree = SOURCE_ROOT; }; - 7229CC2B0F6B3222004123C5 /* wolf_areas.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wolf_areas.c; path = ../wolf/wolf_areas.c; sourceTree = SOURCE_ROOT; }; - 7229CC2C0F6B3222004123C5 /* wolf_bj.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wolf_bj.c; path = ../wolf/wolf_bj.c; sourceTree = SOURCE_ROOT; }; - 7229CC2D0F6B3222004123C5 /* wolf_bj.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wolf_bj.h; path = ../wolf/wolf_bj.h; sourceTree = SOURCE_ROOT; }; - 7229CC2E0F6B3222004123C5 /* wolf_client_main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wolf_client_main.c; path = ../wolf/wolf_client_main.c; sourceTree = SOURCE_ROOT; }; - 7229CC300F6B3222004123C5 /* wolf_doors.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wolf_doors.c; path = ../wolf/wolf_doors.c; sourceTree = SOURCE_ROOT; }; - 7229CC310F6B3222004123C5 /* wolf_level.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wolf_level.c; path = ../wolf/wolf_level.c; sourceTree = SOURCE_ROOT; }; - 7229CC320F6B3222004123C5 /* wolf_level.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wolf_level.h; path = ../wolf/wolf_level.h; sourceTree = SOURCE_ROOT; }; - 7229CC330F6B3222004123C5 /* wolf_local.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wolf_local.h; path = ../wolf/wolf_local.h; sourceTree = SOURCE_ROOT; }; - 7229CC340F6B3222004123C5 /* wolf_main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wolf_main.c; path = ../wolf/wolf_main.c; sourceTree = SOURCE_ROOT; }; - 7229CC350F6B3222004123C5 /* wolf_math.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wolf_math.c; path = ../wolf/wolf_math.c; sourceTree = SOURCE_ROOT; }; - 7229CC360F6B3222004123C5 /* wolf_math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wolf_math.h; path = ../wolf/wolf_math.h; sourceTree = SOURCE_ROOT; }; - 7229CC370F6B3222004123C5 /* wolf_opengl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wolf_opengl.c; path = ../wolf/wolf_opengl.c; sourceTree = SOURCE_ROOT; }; - 7229CC380F6B3222004123C5 /* wolf_player.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wolf_player.c; path = ../wolf/wolf_player.c; sourceTree = SOURCE_ROOT; }; - 7229CC390F6B3222004123C5 /* wolf_player.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wolf_player.h; path = ../wolf/wolf_player.h; sourceTree = SOURCE_ROOT; }; - 7229CC3A0F6B3222004123C5 /* wolf_powerups.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wolf_powerups.c; path = ../wolf/wolf_powerups.c; sourceTree = SOURCE_ROOT; }; - 7229CC3B0F6B3222004123C5 /* wolf_powerups.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wolf_powerups.h; path = ../wolf/wolf_powerups.h; sourceTree = SOURCE_ROOT; }; - 7229CC3C0F6B3222004123C5 /* wolf_pushwalls.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wolf_pushwalls.c; path = ../wolf/wolf_pushwalls.c; sourceTree = SOURCE_ROOT; }; - 7229CC3D0F6B3222004123C5 /* wolf_raycast.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wolf_raycast.c; path = ../wolf/wolf_raycast.c; sourceTree = SOURCE_ROOT; }; - 7229CC3E0F6B3222004123C5 /* wolf_raycast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wolf_raycast.h; path = ../wolf/wolf_raycast.h; sourceTree = SOURCE_ROOT; }; - 7229CC3F0F6B3222004123C5 /* wolf_renderer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wolf_renderer.c; path = ../wolf/wolf_renderer.c; sourceTree = SOURCE_ROOT; }; - 7229CC400F6B3222004123C5 /* wolf_renderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wolf_renderer.h; path = ../wolf/wolf_renderer.h; sourceTree = SOURCE_ROOT; }; - 7229CC410F6B3222004123C5 /* wolf_sprites.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wolf_sprites.c; path = ../wolf/wolf_sprites.c; sourceTree = SOURCE_ROOT; }; - 7229CC420F6B3222004123C5 /* wolf_sprites.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wolf_sprites.h; path = ../wolf/wolf_sprites.h; sourceTree = SOURCE_ROOT; }; - 7229CC430F6B3222004123C5 /* wolf_sv_ccmds.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wolf_sv_ccmds.c; path = ../wolf/wolf_sv_ccmds.c; sourceTree = SOURCE_ROOT; }; - 7229CC440F6B3222004123C5 /* wolf_weapon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wolf_weapon.c; path = ../wolf/wolf_weapon.c; sourceTree = SOURCE_ROOT; }; - 7229CC5B0F6B3295004123C5 /* asm_arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = asm_arm.h; path = ../Tremor/asm_arm.h; sourceTree = SOURCE_ROOT; }; - 7229CC5C0F6B3295004123C5 /* backends.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = backends.h; path = ../Tremor/backends.h; sourceTree = SOURCE_ROOT; }; - 7229CC5D0F6B3295004123C5 /* bitwise.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = bitwise.c; path = ../Tremor/bitwise.c; sourceTree = SOURCE_ROOT; }; - 7229CC5E0F6B3295004123C5 /* block.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = block.c; path = ../Tremor/block.c; sourceTree = SOURCE_ROOT; }; - 7229CC5F0F6B3295004123C5 /* block.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = block.h; path = ../Tremor/block.h; sourceTree = SOURCE_ROOT; }; - 7229CC600F6B3295004123C5 /* codebook.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = codebook.c; path = ../Tremor/codebook.c; sourceTree = SOURCE_ROOT; }; - 7229CC610F6B3295004123C5 /* codebook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = codebook.h; path = ../Tremor/codebook.h; sourceTree = SOURCE_ROOT; }; - 7229CC620F6B3295004123C5 /* codec_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = codec_internal.h; path = ../Tremor/codec_internal.h; sourceTree = SOURCE_ROOT; }; - 7229CC630F6B3295004123C5 /* config_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = config_types.h; path = ../Tremor/config_types.h; sourceTree = SOURCE_ROOT; }; - 7229CC640F6B3295004123C5 /* floor0.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = floor0.c; path = ../Tremor/floor0.c; sourceTree = SOURCE_ROOT; }; - 7229CC650F6B3295004123C5 /* floor1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = floor1.c; path = ../Tremor/floor1.c; sourceTree = SOURCE_ROOT; }; - 7229CC660F6B3295004123C5 /* framing.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = framing.c; path = ../Tremor/framing.c; sourceTree = SOURCE_ROOT; }; - 7229CC670F6B3295004123C5 /* info.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = info.c; path = ../Tremor/info.c; sourceTree = SOURCE_ROOT; }; - 7229CC680F6B3295004123C5 /* ivorbiscodec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ivorbiscodec.h; path = ../Tremor/ivorbiscodec.h; sourceTree = SOURCE_ROOT; }; - 7229CC690F6B3295004123C5 /* ivorbisfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ivorbisfile.h; path = ../Tremor/ivorbisfile.h; sourceTree = SOURCE_ROOT; }; - 7229CC6B0F6B3295004123C5 /* lsp_lookup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lsp_lookup.h; path = ../Tremor/lsp_lookup.h; sourceTree = SOURCE_ROOT; }; - 7229CC6C0F6B3295004123C5 /* mapping0.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mapping0.c; path = ../Tremor/mapping0.c; sourceTree = SOURCE_ROOT; }; - 7229CC6D0F6B3295004123C5 /* mdct.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mdct.c; path = ../Tremor/mdct.c; sourceTree = SOURCE_ROOT; }; - 7229CC6E0F6B3295004123C5 /* mdct.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mdct.h; path = ../Tremor/mdct.h; sourceTree = SOURCE_ROOT; }; - 7229CC6F0F6B3295004123C5 /* mdct_lookup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mdct_lookup.h; path = ../Tremor/mdct_lookup.h; sourceTree = SOURCE_ROOT; }; - 7229CC700F6B3295004123C5 /* misc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = misc.h; path = ../Tremor/misc.h; sourceTree = SOURCE_ROOT; }; - 7229CC710F6B3295004123C5 /* ogg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ogg.h; path = ../Tremor/ogg.h; sourceTree = SOURCE_ROOT; }; - 7229CC720F6B3295004123C5 /* os.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = os.h; path = ../Tremor/os.h; sourceTree = SOURCE_ROOT; }; - 7229CC730F6B3295004123C5 /* os_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = os_types.h; path = ../Tremor/os_types.h; sourceTree = SOURCE_ROOT; }; - 7229CC740F6B3295004123C5 /* registry.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = registry.c; path = ../Tremor/registry.c; sourceTree = SOURCE_ROOT; }; - 7229CC750F6B3295004123C5 /* registry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = registry.h; path = ../Tremor/registry.h; sourceTree = SOURCE_ROOT; }; - 7229CC760F6B3295004123C5 /* res012.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = res012.c; path = ../Tremor/res012.c; sourceTree = SOURCE_ROOT; }; - 7229CC770F6B3295004123C5 /* sharedbook.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sharedbook.c; path = ../Tremor/sharedbook.c; sourceTree = SOURCE_ROOT; }; - 7229CC780F6B3295004123C5 /* synthesis.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = synthesis.c; path = ../Tremor/synthesis.c; sourceTree = SOURCE_ROOT; }; - 7229CC790F6B3295004123C5 /* vorbisfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vorbisfile.c; path = ../Tremor/vorbisfile.c; sourceTree = SOURCE_ROOT; }; - 7229CC7A0F6B3295004123C5 /* window.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = window.c; path = ../Tremor/window.c; sourceTree = SOURCE_ROOT; }; - 7229CC7B0F6B3295004123C5 /* window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = window.h; path = ../Tremor/window.h; sourceTree = SOURCE_ROOT; }; - 7229CC7C0F6B3295004123C5 /* window_lookup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = window_lookup.h; path = ../Tremor/window_lookup.h; sourceTree = SOURCE_ROOT; }; - 7229CC8E0F6B3363004123C5 /* wolfiphone.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wolfiphone.h; path = ../wolfiphone.h; sourceTree = SOURCE_ROOT; }; - 7229CE450F6C89F8004123C5 /* EAGLView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EAGLView.h; sourceTree = ""; }; - 7229CE460F6C89F8004123C5 /* EAGLView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EAGLView.m; sourceTree = ""; }; - 7229CE480F6C89F8004123C5 /* wolf3dAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wolf3dAppDelegate.h; sourceTree = ""; }; - 7229CE490F6C89F8004123C5 /* wolf3dAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = wolf3dAppDelegate.m; sourceTree = ""; }; - 7229CE540F6C8CDE004123C5 /* gles_glue.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = gles_glue.c; sourceTree = ""; }; - 72935B1A0F6B2D9D0085DD28 /* angle.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = angle.c; path = ../env/angle.c; sourceTree = SOURCE_ROOT; }; - 72935B1B0F6B2D9D0085DD28 /* angle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = angle.h; path = ../env/angle.h; sourceTree = SOURCE_ROOT; }; - 72935B1C0F6B2D9D0085DD28 /* app_def.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = app_def.h; path = ../env/app_def.h; sourceTree = SOURCE_ROOT; }; - 72935B1D0F6B2D9D0085DD28 /* arch.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = arch.c; path = ../env/arch.c; sourceTree = SOURCE_ROOT; }; - 72935B1E0F6B2D9D0085DD28 /* arch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = arch.h; path = ../env/arch.h; sourceTree = SOURCE_ROOT; }; - 72935B230F6B2D9D0085DD28 /* cmd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmd.c; path = ../env/cmd.c; sourceTree = SOURCE_ROOT; }; - 72935B240F6B2D9D0085DD28 /* cmd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cmd.h; path = ../env/cmd.h; sourceTree = SOURCE_ROOT; }; - 72935B250F6B2D9D0085DD28 /* com_string.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = com_string.c; path = ../env/com_string.c; sourceTree = SOURCE_ROOT; }; - 72935B260F6B2D9D0085DD28 /* com_string.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = com_string.h; path = ../env/com_string.h; sourceTree = SOURCE_ROOT; }; - 72935B270F6B2D9D0085DD28 /* common.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = common.c; path = ../env/common.c; sourceTree = SOURCE_ROOT; }; - 72935B280F6B2D9D0085DD28 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = common.h; path = ../env/common.h; sourceTree = SOURCE_ROOT; }; - 72935B290F6B2D9D0085DD28 /* common_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = common_utils.h; path = ../env/common_utils.h; sourceTree = SOURCE_ROOT; }; - 72935B2A0F6B2D9D0085DD28 /* console.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = console.c; path = ../env/console.c; sourceTree = SOURCE_ROOT; }; - 72935B2B0F6B2D9D0085DD28 /* console.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = console.h; path = ../env/console.h; sourceTree = SOURCE_ROOT; }; - 72935B2D0F6B2D9D0085DD28 /* cvar.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cvar.c; path = ../env/cvar.c; sourceTree = SOURCE_ROOT; }; - 72935B2E0F6B2D9D0085DD28 /* cvar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cvar.h; path = ../env/cvar.h; sourceTree = SOURCE_ROOT; }; - 72935B2F0F6B2D9D0085DD28 /* fileio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = fileio.c; path = ../env/fileio.c; sourceTree = SOURCE_ROOT; }; - 72935B310F6B2D9D0085DD28 /* files.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = files.c; path = ../env/files.c; sourceTree = SOURCE_ROOT; }; - 72935B320F6B2D9D0085DD28 /* filestring.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = filestring.c; path = ../env/filestring.c; sourceTree = SOURCE_ROOT; }; - 72935B330F6B2D9D0085DD28 /* filestring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = filestring.h; path = ../env/filestring.h; sourceTree = SOURCE_ROOT; }; - 72935B340F6B2D9D0085DD28 /* filesystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = filesystem.h; path = ../env/filesystem.h; sourceTree = SOURCE_ROOT; }; - 72935B350F6B2D9D0085DD28 /* font_manager.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = font_manager.c; path = ../env/font_manager.c; sourceTree = SOURCE_ROOT; }; - 72935B360F6B2D9D0085DD28 /* font_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = font_manager.h; path = ../env/font_manager.h; sourceTree = SOURCE_ROOT; }; - 72935B370F6B2D9D0085DD28 /* glob.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = glob.c; path = ../env/glob.c; sourceTree = SOURCE_ROOT; }; - 72935B380F6B2D9D0085DD28 /* glob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = glob.h; path = ../env/glob.h; sourceTree = SOURCE_ROOT; }; - 72935B3E0F6B2D9D0085DD28 /* math.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = math.c; path = ../env/math.c; sourceTree = SOURCE_ROOT; }; - 72935B3F0F6B2D9D0085DD28 /* matrix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = matrix.c; path = ../env/matrix.c; sourceTree = SOURCE_ROOT; }; - 72935B400F6B2D9D0085DD28 /* matrix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = matrix.h; path = ../env/matrix.h; sourceTree = SOURCE_ROOT; }; - 72935B410F6B2D9D0085DD28 /* memory.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = memory.c; path = ../env/memory.c; sourceTree = SOURCE_ROOT; }; - 72935B420F6B2D9D0085DD28 /* memory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = memory.h; path = ../env/memory.h; sourceTree = SOURCE_ROOT; }; - 72935B450F6B2D9D0085DD28 /* mymath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mymath.h; path = ../env/mymath.h; sourceTree = SOURCE_ROOT; }; - 72935B460F6B2D9D0085DD28 /* myopengl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = myopengl.h; path = ../env/myopengl.h; sourceTree = SOURCE_ROOT; }; - 72935B470F6B2D9D0085DD28 /* myopengl_extension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = myopengl_extension.h; path = ../env/myopengl_extension.h; sourceTree = SOURCE_ROOT; }; - 72935B480F6B2D9D0085DD28 /* num_type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = num_type.h; path = ../env/num_type.h; sourceTree = SOURCE_ROOT; }; - 72935B490F6B2D9D0085DD28 /* oggfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = oggfile.c; path = ../env/oggfile.c; sourceTree = SOURCE_ROOT; }; - 72935B4A0F6B2D9D0085DD28 /* oggfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = oggfile.h; path = ../env/oggfile.h; sourceTree = SOURCE_ROOT; }; - 72935B4B0F6B2D9D0085DD28 /* openal_binding.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = openal_binding.c; path = ../env/openal_binding.c; sourceTree = SOURCE_ROOT; }; - 72935B4C0F6B2D9D0085DD28 /* openal_binding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = openal_binding.h; path = ../env/openal_binding.h; sourceTree = SOURCE_ROOT; }; - 72935B4D0F6B2D9D0085DD28 /* openal_main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = openal_main.c; path = ../env/openal_main.c; sourceTree = SOURCE_ROOT; }; - 72935B500F6B2D9D0085DD28 /* opengl_draw.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = opengl_draw.c; path = ../env/opengl_draw.c; sourceTree = SOURCE_ROOT; }; - 72935B520F6B2D9D0085DD28 /* opengl_local.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = opengl_local.h; path = ../env/opengl_local.h; sourceTree = SOURCE_ROOT; }; - 72935B530F6B2D9D0085DD28 /* opengl_main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = opengl_main.c; path = ../env/opengl_main.c; sourceTree = SOURCE_ROOT; }; - 72935B540F6B2D9D0085DD28 /* opengl_texture.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = opengl_texture.c; path = ../env/opengl_texture.c; sourceTree = SOURCE_ROOT; }; - 72935B560F6B2D9D0085DD28 /* random_number.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = random_number.c; path = ../env/random_number.c; sourceTree = SOURCE_ROOT; }; - 72935B570F6B2D9D0085DD28 /* random_number.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = random_number.h; path = ../env/random_number.h; sourceTree = SOURCE_ROOT; }; - 72935B580F6B2D9D0085DD28 /* renderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = renderer.h; path = ../env/renderer.h; sourceTree = SOURCE_ROOT; }; - 72935B590F6B2D9D0085DD28 /* share.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = share.c; path = ../env/share.c; sourceTree = SOURCE_ROOT; }; - 72935B5A0F6B2D9D0085DD28 /* sound.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sound.c; path = ../env/sound.c; sourceTree = SOURCE_ROOT; }; - 72935B5B0F6B2D9D0085DD28 /* sound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sound.h; path = ../env/sound.h; sourceTree = SOURCE_ROOT; }; - 72935B5C0F6B2D9D0085DD28 /* sound_local.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sound_local.h; path = ../env/sound_local.h; sourceTree = SOURCE_ROOT; }; - 72935B5D0F6B2D9D0085DD28 /* sound_sfx_id.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sound_sfx_id.c; path = ../env/sound_sfx_id.c; sourceTree = SOURCE_ROOT; }; - 72935B5E0F6B2D9D0085DD28 /* sound_stream.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sound_stream.c; path = ../env/sound_stream.c; sourceTree = SOURCE_ROOT; }; - 72935B610F6B2D9D0085DD28 /* texture_manager.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = texture_manager.c; path = ../env/texture_manager.c; sourceTree = SOURCE_ROOT; }; - 72935B620F6B2D9D0085DD28 /* texture_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = texture_manager.h; path = ../env/texture_manager.h; sourceTree = SOURCE_ROOT; }; - 72935B630F6B2D9D0085DD28 /* tga.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tga.c; path = ../env/tga.c; sourceTree = SOURCE_ROOT; }; - 72935B640F6B2D9D0085DD28 /* tga.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tga.h; path = ../env/tga.h; sourceTree = SOURCE_ROOT; }; - 72935B650F6B2D9D0085DD28 /* timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = timer.h; path = ../env/timer.h; sourceTree = SOURCE_ROOT; }; - 72935B680F6B2D9D0085DD28 /* unix_file.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = unix_file.c; path = ../env/unix_file.c; sourceTree = SOURCE_ROOT; }; - 72935B6A0F6B2D9D0085DD28 /* unix_timer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = unix_timer.c; path = ../env/unix_timer.c; sourceTree = SOURCE_ROOT; }; - 72935B6B0F6B2D9D0085DD28 /* vector.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vector.c; path = ../env/vector.c; sourceTree = SOURCE_ROOT; }; - 72935B6C0F6B2D9D0085DD28 /* vector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = vector.h; path = ../env/vector.h; sourceTree = SOURCE_ROOT; }; - 72935B6D0F6B2D9D0085DD28 /* video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = video.h; path = ../env/video.h; sourceTree = SOURCE_ROOT; }; - 72935B6E0F6B2D9D0085DD28 /* wavfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wavfile.c; path = ../env/wavfile.c; sourceTree = SOURCE_ROOT; }; - 72935B6F0F6B2D9D0085DD28 /* wavfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wavfile.h; path = ../env/wavfile.h; sourceTree = SOURCE_ROOT; }; - 72935B720F6B2D9D0085DD28 /* zmem.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zmem.c; path = ../env/zmem.c; sourceTree = SOURCE_ROOT; }; - 72935B730F6B2D9D0085DD28 /* zmem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = zmem.h; path = ../env/zmem.h; sourceTree = SOURCE_ROOT; }; - 72A7E8F30F5F2001005B83C0 /* iphone_wolf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iphone_wolf.h; sourceTree = ""; }; - 72A7E8F60F5F2063005B83C0 /* iphone_menus.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = iphone_menus.c; sourceTree = ""; }; - 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, - 28FD15000DC6FC520079059D /* OpenGLES.framework in Frameworks */, - 28FD15080DC6FC5B0079059D /* QuartzCore.framework in Frameworks */, - 43E8D4E00F51B48B003F09B2 /* OpenAL.framework in Frameworks */, - 4333CCE80F5CC23E00AE2B6F /* AudioToolbox.framework in Frameworks */, - 43AE7E9F0F67387500B2F562 /* CoreGraphics.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 19C28FACFE9D520D11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - 1D6058910D05DD3D006BFB54 /* wolf3d.app */, - 4364BF3E0F5CB25900F29317 /* dist.plist */, - ); - name = Products; - sourceTree = ""; - }; - 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { - isa = PBXGroup; - children = ( - 29B97315FDCFA39411CA2CEA /* Other Sources */, - 29B97317FDCFA39411CA2CEA /* Resources */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - 19C28FACFE9D520D11CA2CBB /* Products */, - 43AE7E9E0F67387500B2F562 /* CoreGraphics.framework */, - ); - name = CustomTemplate; - sourceTree = ""; - }; - 29B97315FDCFA39411CA2CEA /* Other Sources */ = { - isa = PBXGroup; - children = ( - 72935B180F6B2D630085DD28 /* env */, - 7229CC5A0F6B324A004123C5 /* tremor */, - 72935B190F6B2D720085DD28 /* wolf */, - 32CA4F630368D1EE00C91783 /* wolf3d_Prefix.pch */, - 29B97316FDCFA39411CA2CEA /* main.m */, - 7229CE540F6C8CDE004123C5 /* gles_glue.c */, - 7229CE450F6C89F8004123C5 /* EAGLView.h */, - 7229CE460F6C89F8004123C5 /* EAGLView.m */, - 7229CE480F6C89F8004123C5 /* wolf3dAppDelegate.h */, - 7229CE490F6C89F8004123C5 /* wolf3dAppDelegate.m */, - 7229CC8E0F6B3363004123C5 /* wolfiphone.h */, - 72A7E8F30F5F2001005B83C0 /* iphone_wolf.h */, - 72A7E8F60F5F2063005B83C0 /* iphone_menus.c */, - 43CF03090F56D5C200E4A23D /* iphone_loop.c */, - 43E8D2DF0F4FC61E003F09B2 /* iphone_main.c */, - ); - name = "Other Sources"; - sourceTree = ""; - }; - 29B97317FDCFA39411CA2CEA /* Resources */ = { - isa = PBXGroup; - children = ( - 43AE7CAA0F61FB0E00B2F562 /* wolf3dEpisode1_icon.png */, - 43CF02FE0F56974E00E4A23D /* Default.png */, - 43CF02EC0F56955F00E4A23D /* wolf3d_icon.png */, - 28AD733E0D9D9553002E5188 /* MainWindow.xib */, - 8D1107310486CEB800E47090 /* Info.plist */, - ); - name = Resources; - sourceTree = ""; - }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { - isa = PBXGroup; - children = ( - 4333CCE70F5CC23E00AE2B6F /* AudioToolbox.framework */, - 43E8D4DF0F51B48B003F09B2 /* OpenAL.framework */, - 28FD15070DC6FC5B0079059D /* QuartzCore.framework */, - 28FD14FF0DC6FC520079059D /* OpenGLES.framework */, - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, - 1D30AB110D05D00D00671497 /* Foundation.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 7229CC5A0F6B324A004123C5 /* tremor */ = { - isa = PBXGroup; - children = ( - 7229CC5B0F6B3295004123C5 /* asm_arm.h */, - 7229CC5C0F6B3295004123C5 /* backends.h */, - 7229CC5D0F6B3295004123C5 /* bitwise.c */, - 7229CC5E0F6B3295004123C5 /* block.c */, - 7229CC5F0F6B3295004123C5 /* block.h */, - 7229CC600F6B3295004123C5 /* codebook.c */, - 7229CC610F6B3295004123C5 /* codebook.h */, - 7229CC620F6B3295004123C5 /* codec_internal.h */, - 7229CC630F6B3295004123C5 /* config_types.h */, - 7229CC640F6B3295004123C5 /* floor0.c */, - 7229CC650F6B3295004123C5 /* floor1.c */, - 7229CC660F6B3295004123C5 /* framing.c */, - 7229CC670F6B3295004123C5 /* info.c */, - 7229CC680F6B3295004123C5 /* ivorbiscodec.h */, - 7229CC690F6B3295004123C5 /* ivorbisfile.h */, - 7229CC6B0F6B3295004123C5 /* lsp_lookup.h */, - 7229CC6C0F6B3295004123C5 /* mapping0.c */, - 7229CC6D0F6B3295004123C5 /* mdct.c */, - 7229CC6E0F6B3295004123C5 /* mdct.h */, - 7229CC6F0F6B3295004123C5 /* mdct_lookup.h */, - 7229CC700F6B3295004123C5 /* misc.h */, - 7229CC710F6B3295004123C5 /* ogg.h */, - 7229CC720F6B3295004123C5 /* os.h */, - 7229CC730F6B3295004123C5 /* os_types.h */, - 7229CC740F6B3295004123C5 /* registry.c */, - 7229CC750F6B3295004123C5 /* registry.h */, - 7229CC760F6B3295004123C5 /* res012.c */, - 7229CC770F6B3295004123C5 /* sharedbook.c */, - 7229CC780F6B3295004123C5 /* synthesis.c */, - 7229CC790F6B3295004123C5 /* vorbisfile.c */, - 7229CC7A0F6B3295004123C5 /* window.c */, - 7229CC7B0F6B3295004123C5 /* window.h */, - 7229CC7C0F6B3295004123C5 /* window_lookup.h */, - ); - name = tremor; - sourceTree = ""; - }; - 72935B180F6B2D630085DD28 /* env */ = { - isa = PBXGroup; - children = ( - 72935B1A0F6B2D9D0085DD28 /* angle.c */, - 72935B1B0F6B2D9D0085DD28 /* angle.h */, - 72935B1C0F6B2D9D0085DD28 /* app_def.h */, - 72935B1D0F6B2D9D0085DD28 /* arch.c */, - 72935B1E0F6B2D9D0085DD28 /* arch.h */, - 72935B230F6B2D9D0085DD28 /* cmd.c */, - 72935B240F6B2D9D0085DD28 /* cmd.h */, - 72935B250F6B2D9D0085DD28 /* com_string.c */, - 72935B260F6B2D9D0085DD28 /* com_string.h */, - 72935B270F6B2D9D0085DD28 /* common.c */, - 72935B280F6B2D9D0085DD28 /* common.h */, - 72935B290F6B2D9D0085DD28 /* common_utils.h */, - 72935B2A0F6B2D9D0085DD28 /* console.c */, - 72935B2B0F6B2D9D0085DD28 /* console.h */, - 72935B2D0F6B2D9D0085DD28 /* cvar.c */, - 72935B2E0F6B2D9D0085DD28 /* cvar.h */, - 72935B2F0F6B2D9D0085DD28 /* fileio.c */, - 72935B310F6B2D9D0085DD28 /* files.c */, - 72935B320F6B2D9D0085DD28 /* filestring.c */, - 72935B330F6B2D9D0085DD28 /* filestring.h */, - 72935B340F6B2D9D0085DD28 /* filesystem.h */, - 72935B350F6B2D9D0085DD28 /* font_manager.c */, - 72935B360F6B2D9D0085DD28 /* font_manager.h */, - 72935B370F6B2D9D0085DD28 /* glob.c */, - 72935B380F6B2D9D0085DD28 /* glob.h */, - 72935B3E0F6B2D9D0085DD28 /* math.c */, - 72935B3F0F6B2D9D0085DD28 /* matrix.c */, - 72935B400F6B2D9D0085DD28 /* matrix.h */, - 72935B410F6B2D9D0085DD28 /* memory.c */, - 72935B420F6B2D9D0085DD28 /* memory.h */, - 72935B450F6B2D9D0085DD28 /* mymath.h */, - 72935B460F6B2D9D0085DD28 /* myopengl.h */, - 72935B470F6B2D9D0085DD28 /* myopengl_extension.h */, - 72935B480F6B2D9D0085DD28 /* num_type.h */, - 72935B490F6B2D9D0085DD28 /* oggfile.c */, - 72935B4A0F6B2D9D0085DD28 /* oggfile.h */, - 72935B4B0F6B2D9D0085DD28 /* openal_binding.c */, - 72935B4C0F6B2D9D0085DD28 /* openal_binding.h */, - 72935B4D0F6B2D9D0085DD28 /* openal_main.c */, - 72935B500F6B2D9D0085DD28 /* opengl_draw.c */, - 72935B520F6B2D9D0085DD28 /* opengl_local.h */, - 72935B530F6B2D9D0085DD28 /* opengl_main.c */, - 72935B540F6B2D9D0085DD28 /* opengl_texture.c */, - 72935B560F6B2D9D0085DD28 /* random_number.c */, - 72935B570F6B2D9D0085DD28 /* random_number.h */, - 72935B580F6B2D9D0085DD28 /* renderer.h */, - 72935B590F6B2D9D0085DD28 /* share.c */, - 72935B5A0F6B2D9D0085DD28 /* sound.c */, - 72935B5B0F6B2D9D0085DD28 /* sound.h */, - 72935B5C0F6B2D9D0085DD28 /* sound_local.h */, - 72935B5D0F6B2D9D0085DD28 /* sound_sfx_id.c */, - 72935B5E0F6B2D9D0085DD28 /* sound_stream.c */, - 72935B610F6B2D9D0085DD28 /* texture_manager.c */, - 72935B620F6B2D9D0085DD28 /* texture_manager.h */, - 72935B630F6B2D9D0085DD28 /* tga.c */, - 72935B640F6B2D9D0085DD28 /* tga.h */, - 72935B650F6B2D9D0085DD28 /* timer.h */, - 72935B680F6B2D9D0085DD28 /* unix_file.c */, - 72935B6A0F6B2D9D0085DD28 /* unix_timer.c */, - 72935B6B0F6B2D9D0085DD28 /* vector.c */, - 72935B6C0F6B2D9D0085DD28 /* vector.h */, - 72935B6D0F6B2D9D0085DD28 /* video.h */, - 72935B6E0F6B2D9D0085DD28 /* wavfile.c */, - 72935B6F0F6B2D9D0085DD28 /* wavfile.h */, - 72935B720F6B2D9D0085DD28 /* zmem.c */, - 72935B730F6B2D9D0085DD28 /* zmem.h */, - ); - name = env; - sourceTree = ""; - }; - 72935B190F6B2D720085DD28 /* wolf */ = { - isa = PBXGroup; - children = ( - 7229CC240F6B3222004123C5 /* wolf_act_stat.h */, - 7229CC250F6B3222004123C5 /* wolf_actor_ai.c */, - 7229CC260F6B3222004123C5 /* wolf_actor_ai.h */, - 7229CC270F6B3222004123C5 /* wolf_actors.c */, - 7229CC280F6B3222004123C5 /* wolf_actors.h */, - 7229CC290F6B3222004123C5 /* wolf_ai_com.c */, - 7229CC2A0F6B3222004123C5 /* wolf_ai_com.h */, - 7229CC2B0F6B3222004123C5 /* wolf_areas.c */, - 7229CC2C0F6B3222004123C5 /* wolf_bj.c */, - 7229CC2D0F6B3222004123C5 /* wolf_bj.h */, - 7229CC2E0F6B3222004123C5 /* wolf_client_main.c */, - 7229CC300F6B3222004123C5 /* wolf_doors.c */, - 7229CC310F6B3222004123C5 /* wolf_level.c */, - 7229CC320F6B3222004123C5 /* wolf_level.h */, - 7229CC330F6B3222004123C5 /* wolf_local.h */, - 7229CC340F6B3222004123C5 /* wolf_main.c */, - 7229CC350F6B3222004123C5 /* wolf_math.c */, - 7229CC360F6B3222004123C5 /* wolf_math.h */, - 7229CC370F6B3222004123C5 /* wolf_opengl.c */, - 7229CC380F6B3222004123C5 /* wolf_player.c */, - 7229CC390F6B3222004123C5 /* wolf_player.h */, - 7229CC3A0F6B3222004123C5 /* wolf_powerups.c */, - 7229CC3B0F6B3222004123C5 /* wolf_powerups.h */, - 7229CC3C0F6B3222004123C5 /* wolf_pushwalls.c */, - 7229CC3D0F6B3222004123C5 /* wolf_raycast.c */, - 7229CC3E0F6B3222004123C5 /* wolf_raycast.h */, - 7229CC3F0F6B3222004123C5 /* wolf_renderer.c */, - 7229CC400F6B3222004123C5 /* wolf_renderer.h */, - 7229CC410F6B3222004123C5 /* wolf_sprites.c */, - 7229CC420F6B3222004123C5 /* wolf_sprites.h */, - 7229CC430F6B3222004123C5 /* wolf_sv_ccmds.c */, - 7229CC440F6B3222004123C5 /* wolf_weapon.c */, - ); - name = wolf; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 1D6058900D05DD3D006BFB54 /* wolf3d */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "wolf3d" */; - buildPhases = ( - 1D60588D0D05DD3D006BFB54 /* Resources */, - 1D60588E0D05DD3D006BFB54 /* Sources */, - 1D60588F0D05DD3D006BFB54 /* Frameworks */, - 435F41A90F532CA300887552 /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = wolf3d; - productName = wolf3d; - productReference = 1D6058910D05DD3D006BFB54 /* wolf3d.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { - isa = PBXProject; - buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "wolf3d" */; - compatibilityVersion = "Xcode 3.1"; - hasScannedForEncodings = 1; - mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 1D6058900D05DD3D006BFB54 /* wolf3d */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1D60588D0D05DD3D006BFB54 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */, - 43CF02ED0F56955F00E4A23D /* wolf3d_icon.png in Resources */, - 43CF02FF0F56974E00E4A23D /* Default.png in Resources */, - 4364BF3F0F5CB25900F29317 /* dist.plist in Resources */, - 43AE7CAB0F61FB0E00B2F562 /* wolf3dEpisode1_icon.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 435F41A90F532CA300887552 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = "/bin/sh -x"; - shellScript = "PBXCP=${DEVELOPER_DIR}/Library/PrivateFrameworks/DevToolsCore.framework/Resources/pbxcp\n${PBXCP} -exclude .svn \"${PROJECT_DIR}/../../base\" \"${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/\"\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1D60588E0D05DD3D006BFB54 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1D60589B0D05DD56006BFB54 /* main.m in Sources */, - 43E8D2E10F4FC61E003F09B2 /* iphone_main.c in Sources */, - 43CF030A0F56D5C200E4A23D /* iphone_loop.c in Sources */, - 72A7E8F70F5F2063005B83C0 /* iphone_menus.c in Sources */, - 72935B740F6B2D9D0085DD28 /* angle.c in Sources */, - 72935B750F6B2D9D0085DD28 /* arch.c in Sources */, - 72935B790F6B2D9D0085DD28 /* cmd.c in Sources */, - 72935B7A0F6B2D9D0085DD28 /* com_string.c in Sources */, - 72935B7B0F6B2D9D0085DD28 /* common.c in Sources */, - 72935B7C0F6B2D9D0085DD28 /* console.c in Sources */, - 72935B7E0F6B2D9D0085DD28 /* cvar.c in Sources */, - 72935B7F0F6B2D9D0085DD28 /* fileio.c in Sources */, - 72935B800F6B2D9D0085DD28 /* files.c in Sources */, - 72935B810F6B2D9D0085DD28 /* filestring.c in Sources */, - 72935B820F6B2D9D0085DD28 /* font_manager.c in Sources */, - 72935B830F6B2D9D0085DD28 /* glob.c in Sources */, - 72935B870F6B2D9D0085DD28 /* math.c in Sources */, - 72935B880F6B2D9D0085DD28 /* matrix.c in Sources */, - 72935B890F6B2D9D0085DD28 /* memory.c in Sources */, - 72935B8B0F6B2D9D0085DD28 /* oggfile.c in Sources */, - 72935B8C0F6B2D9D0085DD28 /* openal_binding.c in Sources */, - 72935B8D0F6B2D9D0085DD28 /* openal_main.c in Sources */, - 72935B8F0F6B2D9D0085DD28 /* opengl_draw.c in Sources */, - 72935B910F6B2D9D0085DD28 /* opengl_main.c in Sources */, - 72935B920F6B2D9D0085DD28 /* opengl_texture.c in Sources */, - 72935B930F6B2D9D0085DD28 /* random_number.c in Sources */, - 72935B940F6B2D9D0085DD28 /* share.c in Sources */, - 72935B950F6B2D9D0085DD28 /* sound.c in Sources */, - 72935B960F6B2D9D0085DD28 /* sound_sfx_id.c in Sources */, - 72935B970F6B2D9D0085DD28 /* sound_stream.c in Sources */, - 72935B990F6B2D9D0085DD28 /* texture_manager.c in Sources */, - 72935B9A0F6B2D9D0085DD28 /* tga.c in Sources */, - 72935B9C0F6B2D9D0085DD28 /* unix_file.c in Sources */, - 72935B9E0F6B2D9D0085DD28 /* unix_timer.c in Sources */, - 72935B9F0F6B2D9D0085DD28 /* vector.c in Sources */, - 72935BA00F6B2D9D0085DD28 /* wavfile.c in Sources */, - 72935BA20F6B2D9D0085DD28 /* zmem.c in Sources */, - 7229CC460F6B3222004123C5 /* wolf_actor_ai.c in Sources */, - 7229CC470F6B3222004123C5 /* wolf_actors.c in Sources */, - 7229CC480F6B3222004123C5 /* wolf_ai_com.c in Sources */, - 7229CC490F6B3222004123C5 /* wolf_areas.c in Sources */, - 7229CC4A0F6B3222004123C5 /* wolf_bj.c in Sources */, - 7229CC4B0F6B3222004123C5 /* wolf_client_main.c in Sources */, - 7229CC4D0F6B3222004123C5 /* wolf_doors.c in Sources */, - 7229CC4E0F6B3222004123C5 /* wolf_level.c in Sources */, - 7229CC4F0F6B3222004123C5 /* wolf_main.c in Sources */, - 7229CC500F6B3222004123C5 /* wolf_math.c in Sources */, - 7229CC510F6B3222004123C5 /* wolf_opengl.c in Sources */, - 7229CC520F6B3222004123C5 /* wolf_player.c in Sources */, - 7229CC530F6B3222004123C5 /* wolf_powerups.c in Sources */, - 7229CC540F6B3222004123C5 /* wolf_pushwalls.c in Sources */, - 7229CC550F6B3222004123C5 /* wolf_raycast.c in Sources */, - 7229CC560F6B3222004123C5 /* wolf_renderer.c in Sources */, - 7229CC570F6B3222004123C5 /* wolf_sprites.c in Sources */, - 7229CC580F6B3222004123C5 /* wolf_sv_ccmds.c in Sources */, - 7229CC590F6B3222004123C5 /* wolf_weapon.c in Sources */, - 7229CC7D0F6B3295004123C5 /* bitwise.c in Sources */, - 7229CC7E0F6B3295004123C5 /* block.c in Sources */, - 7229CC7F0F6B3295004123C5 /* codebook.c in Sources */, - 7229CC800F6B3295004123C5 /* floor0.c in Sources */, - 7229CC810F6B3295004123C5 /* floor1.c in Sources */, - 7229CC820F6B3295004123C5 /* framing.c in Sources */, - 7229CC830F6B3295004123C5 /* info.c in Sources */, - 7229CC850F6B3295004123C5 /* mapping0.c in Sources */, - 7229CC860F6B3295004123C5 /* mdct.c in Sources */, - 7229CC870F6B3295004123C5 /* registry.c in Sources */, - 7229CC880F6B3295004123C5 /* res012.c in Sources */, - 7229CC890F6B3295004123C5 /* sharedbook.c in Sources */, - 7229CC8A0F6B3295004123C5 /* synthesis.c in Sources */, - 7229CC8B0F6B3295004123C5 /* vorbisfile.c in Sources */, - 7229CC8C0F6B3295004123C5 /* window.c in Sources */, - 7229CE4A0F6C89F8004123C5 /* EAGLView.m in Sources */, - 7229CE4C0F6C89F8004123C5 /* wolf3dAppDelegate.m in Sources */, - 7229CE550F6C8CDE004123C5 /* gles_glue.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 1D6058940D05DD3E006BFB54 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Cass Everitt"; - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = wolf3d_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = IPHONE; - HEADER_SEARCH_PATHS = ""; - INFOPLIST_FILE = Info.plist; - PRODUCT_NAME = wolf3d; - PROFILE_PREFIX = com.idsoftware; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = "242E7162-329E-4733-B361-E893AB528543"; - }; - name = Debug; - }; - 1D6058950D05DD3E006BFB54 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: John Carmack"; - COPY_PHASE_STRIP = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = wolf3d_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = IPHONE; - HEADER_SEARCH_PATHS = ""; - INFOPLIST_FILE = Info.plist; - PRODUCT_NAME = wolf3d; - PROFILE_PREFIX = com.idsoftware; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = "329BF7D2-0B30-4F7B-9204-EB2CBD012BA8"; - }; - name = Release; - }; - 4364BF480F5CB27300F29317 /* AdHocDist */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CODE_SIGN_ENTITLEMENTS = dist.plist; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Cass Everitt"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_THUMB_SUPPORT = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - PREBINDING = NO; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = "E2E91433-8CD1-46DB-9DC5-B7E4C84FD1C2"; - SDKROOT = iphoneos2.0; - }; - name = AdHocDist; - }; - 4364BF490F5CB27300F29317 /* AdHocDist */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: id Software"; - COPY_PHASE_STRIP = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = wolf3d_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = IPHONE; - HEADER_SEARCH_PATHS = ""; - INFOPLIST_FILE = Info.plist; - PRODUCT_NAME = wolf3d; - PROFILE_PREFIX = nu.r3; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = "31C73095-0DD9-4ABA-BB25-8D23F661F10F"; - }; - name = AdHocDist; - }; - 43AE7CA40F61EC4E00B2F562 /* ReleaseEpisode1 */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_THUMB_SUPPORT = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - PREBINDING = NO; - SDKROOT = iphoneos2.0; - }; - name = ReleaseEpisode1; - }; - 43AE7CA50F61EC4E00B2F562 /* ReleaseEpisode1 */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: John Carmack"; - COPY_PHASE_STRIP = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = wolf3d_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = ( - EPISODE1, - IPHONE, - ); - HEADER_SEARCH_PATHS = ""; - INFOPLIST_FILE = Info.plist; - PRODUCT_NAME = wolf3dEpisode1; - PROFILE_PREFIX = com.idsoftware; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = "329BF7D2-0B30-4F7B-9204-EB2CBD012BA8"; - }; - name = ReleaseEpisode1; - }; - 43AE7CAE0F61FC9200B2F562 /* DebugEpisode1 */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - ONLY_ACTIVE_ARCH = YES; - PREBINDING = NO; - SDKROOT = iphoneos2.0; - }; - name = DebugEpisode1; - }; - 43AE7CAF0F61FC9200B2F562 /* DebugEpisode1 */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: John Carmack"; - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = wolf3d_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = ( - EPISODE1, - IPHONE, - ); - HEADER_SEARCH_PATHS = ""; - INFOPLIST_FILE = Info.plist; - PRODUCT_NAME = wolf3dEpisode1; - PROFILE_PREFIX = com.idsoftware; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = "329BF7D2-0B30-4F7B-9204-EB2CBD012BA8"; - }; - name = DebugEpisode1; - }; - C01FCF4F08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - ONLY_ACTIVE_ARCH = YES; - PREBINDING = NO; - SDKROOT = iphoneos2.0; - }; - name = Debug; - }; - C01FCF5008A954540054247B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_THUMB_SUPPORT = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - PREBINDING = NO; - SDKROOT = iphoneos2.0; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "wolf3d" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1D6058940D05DD3E006BFB54 /* Debug */, - 43AE7CAF0F61FC9200B2F562 /* DebugEpisode1 */, - 1D6058950D05DD3E006BFB54 /* Release */, - 43AE7CA50F61EC4E00B2F562 /* ReleaseEpisode1 */, - 4364BF490F5CB27300F29317 /* AdHocDist */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C01FCF4E08A954540054247B /* Build configuration list for PBXProject "wolf3d" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF4F08A954540054247B /* Debug */, - 43AE7CAE0F61FC9200B2F562 /* DebugEpisode1 */, - C01FCF5008A954540054247B /* Release */, - 43AE7CA40F61EC4E00B2F562 /* ReleaseEpisode1 */, - 4364BF480F5CB27300F29317 /* AdHocDist */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; -} diff --git a/wolf3d/newCode/iphone/wolf3dAppDelegate.h b/wolf3d/newCode/iphone/wolf3dAppDelegate.h deleted file mode 100644 index 6875a75..0000000 --- a/wolf3d/newCode/iphone/wolf3dAppDelegate.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - - Copyright (C) 2009 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. - - */ - -#import -#import - -#ifdef _cplusplus -extern "C" { -#endif -void vibrateDevice(); -#ifdef _cplusplus -} -#endif - -@class EAGLView; - -@interface wolf3dAppDelegate : NSObject { - UIWindow *window; - EAGLView *glView; - int lastAccelUpdateMsec; -} - -@property (nonatomic, retain) IBOutlet UIWindow *window; -@property (nonatomic, retain) IBOutlet EAGLView *glView; - -- (void)restartAccelerometerIfNeeded; - -@end - diff --git a/wolf3d/newCode/iphone/wolf3dAppDelegate.m b/wolf3d/newCode/iphone/wolf3dAppDelegate.m deleted file mode 100644 index 9c0e6f6..0000000 --- a/wolf3d/newCode/iphone/wolf3dAppDelegate.m +++ /dev/null @@ -1,120 +0,0 @@ -/* - - Copyright (C) 2009 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. - - */ - -#import "wolf3dAppDelegate.h" -#import "EAGLView.h" -#import - -extern int iphoneStartup(); -extern int iphoneShutdown(); - -char iphoneDocDirectory[1024]; -char iphoneAppDirectory[1024]; - - -void vibrateDevice() { - printf( "vibrate\n" ); - AudioServicesPlaySystemSound( kSystemSoundID_Vibrate ); -} - -@implementation wolf3dAppDelegate - -@synthesize window; -@synthesize glView; - -- (void)applicationDidFinishLaunching:(UIApplication *)application { - application.statusBarHidden = YES; - application.statusBarOrientation = UIInterfaceOrientationLandscapeLeft; - - // get the documents directory, where we will write configs and save games - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); - NSString *documentsDirectory = [paths objectAtIndex:0]; - [documentsDirectory getCString: iphoneDocDirectory - maxLength: sizeof( iphoneDocDirectory ) - 1 - encoding: NSASCIIStringEncoding ]; - - // get the app directory, where our data files live - paths = NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSUserDomainMask, YES); - NSString *appDirectory = documentsDirectory = [paths objectAtIndex:0]; - [appDirectory getCString: iphoneAppDirectory - maxLength: sizeof( iphoneAppDirectory ) - 1 - encoding: NSASCIIStringEncoding ]; - - // start the flow of accelerometer events - UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer]; - accelerometer.delegate = self; - accelerometer.updateInterval = 0.01; - - // do all the game startup work - iphoneStartup(); -} - - -- (void)applicationWillResignActive:(UIApplication *)application { -} - - -- (void)applicationDidBecomeActive:(UIApplication *)application { -} - -- (void)applicationWillTerminate:(UIApplication *)application { - iphoneShutdown(); -} - - - -- (void)dealloc { - [window release]; - [glView release]; - [super dealloc]; -} - -- (void)restartAccelerometerIfNeeded { - int Sys_Milliseconds(); - - // I have no idea why this seems to happen sometimes... - if ( Sys_Milliseconds() - lastAccelUpdateMsec > 1000 ) { - static int count; - if ( ++count < 100 ) { - printf( "Restarting accelerometer updates.\n" ); - } - UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer]; - accelerometer.delegate = self; - accelerometer.updateInterval = 0.01; - } -} - -- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration -{ - int Sys_Milliseconds(); - void WolfensteinTilts( float *tilts ); - float acc[4]; - acc[0] = acceleration.x; - acc[1] = acceleration.y; - acc[2] = acceleration.z; - acc[3] = acceleration.timestamp; - WolfensteinTilts( acc ); - lastAccelUpdateMsec = Sys_Milliseconds(); -} - -@end - - - diff --git a/wolf3d/newCode/iphone/wolf3dEpisode1_icon.png b/wolf3d/newCode/iphone/wolf3dEpisode1_icon.png deleted file mode 100644 index 2e2d98681975537276fe34be2f0df1ea27033063..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8077 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 -#import -#endif diff --git a/wolf3d/newCode/iphone/wolf3d_icon.png b/wolf3d/newCode/iphone/wolf3d_icon.png deleted file mode 100644 index 956a45a58e792de4b7948965e365d8d0726bf473..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5935 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 REd>Ao002ovPDHLkV1hlXfaw4L diff --git a/wolf3d/newCode/wolf/wolf_act_stat.h b/wolf3d/newCode/wolf/wolf_act_stat.h deleted file mode 100644 index a3b6022..0000000 --- a/wolf3d/newCode/wolf/wolf_act_stat.h +++ /dev/null @@ -1,1619 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000-2002 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_act_stat.h: Wolfenstein3-D entity management. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - * Portion of this code was derived from Wolfenstein3-D, and was originally - * written by Id Software, Inc. - * - */ - -/* - Notes: - - -*/ - -#ifndef __WOLF_ACT_STAT_H__ -#define __WOLF_ACT_STAT_H__ - -#include "wolf_bj.h" -#include "wolf_actor_ai.h" -#include "wolf_ai_com.h" -#include "wolf_sprites.h" - -#define ST_INFO_NULL { 0, SPR_DEMO, 0, NULL, NULL, st_dead } - -/* - 1-if object can be rotated, 0 if one sprite for every direction - base object's state texture if rotation is on facing player - after how man frames change state to .next_state - what to do every frame - what to do once per state - next state -*/ - -stateinfo objstate[ NUMENEMIES ][ NUMSTATES ] = -{ - // en_guard, - { - { 1, SPR_GRD_S_1, 0, T_Stand, NULL, st_stand }, // st_stand, - - { 1, SPR_GRD_W1_1, 20, T_Path, NULL, st_path1s }, // st_path1, - { 1, SPR_GRD_W1_1, 5, NULL, NULL, st_path2 }, // st_path1s, - { 1, SPR_GRD_W2_1, 15, T_Path, NULL, st_path3 }, // st_path2, - { 1, SPR_GRD_W3_1, 20, T_Path, NULL, st_path3s }, // st_path3, - { 1, SPR_GRD_W3_1, 5, NULL, NULL, st_path4 }, // st_path3s, - { 1, SPR_GRD_W4_1, 15, T_Path, NULL, st_path1 }, // st_path4, - - { 0, SPR_GRD_PAIN_1, 10, NULL, NULL, st_chase1},// st_pain, - { 0, SPR_GRD_PAIN_2, 10, NULL, NULL, st_chase1},// st_pain1, - - { 0, SPR_GRD_SHOOT1, 20, NULL, NULL, st_shoot2},// st_shoot1, - { 0, SPR_GRD_SHOOT2, 20, NULL, T_Shoot,st_shoot3},// st_shoot2, - { 0, SPR_GRD_SHOOT3, 20, NULL, NULL, st_chase1},// st_shoot3, - - { 0, SPR_DEMO, 0, NULL, NULL, st_chase1 }, // st_shoot4, - { 0, SPR_DEMO, 0, NULL, NULL, st_chase1 }, // st_shoot5, - { 0, SPR_DEMO, 0, NULL, NULL, st_chase1 }, // st_shoot6, - { 0, SPR_DEMO, 0, NULL, NULL, st_chase1 }, // st_shoot7, - { 0, SPR_DEMO, 0, NULL, NULL, st_chase1 }, // st_shoot8, - { 0, SPR_DEMO, 0, NULL, NULL, st_chase1 }, // st_shoot9, - - { 1, SPR_GRD_W1_1, 10, T_Chase, NULL, st_chase1s }, // st_chase1, - { 1, SPR_GRD_W1_1, 3, NULL, NULL, st_chase2 }, // st_chase1s, - { 1, SPR_GRD_W2_1, 8, T_Chase, NULL, st_chase3 }, // st_chase2, - { 1, SPR_GRD_W3_1, 10, T_Chase, NULL, st_chase3s }, // st_chase3, - { 1, SPR_GRD_W3_1, 3, NULL, NULL, st_chase4 }, // st_chase3s, - { 1, SPR_GRD_W4_1, 8, T_Chase, NULL, st_chase1 }, // st_chase4, - - { 0, SPR_GRD_DIE_1, 15, NULL, A_DeathScream,st_die2 }, // st_die1, - { 0, SPR_GRD_DIE_2, 15, NULL, NULL, st_die3 }, // st_die2, - { 0, SPR_GRD_DIE_3, 15, NULL, NULL, st_dead }, // st_die3, - - { 0, SPR_DEMO, 0, NULL, NULL, st_dead }, // st_die4, - { 0, SPR_DEMO, 0, NULL, NULL, st_dead }, // st_die5, - { 0, SPR_DEMO, 0, NULL, NULL, st_dead }, // st_die6, - { 0, SPR_DEMO, 0, NULL, NULL, st_dead }, // st_die7, - { 0, SPR_DEMO, 0, NULL, NULL, st_dead }, // st_die8, - { 0, SPR_DEMO, 0, NULL, NULL, st_dead }, // st_die9, - - { 0, SPR_GRD_DEAD, 0, NULL, NULL, st_dead } // st_dead - }, - // en_officer, - { - {1, SPR_OFC_S_1, 0, T_Stand, NULL, st_stand}, // st_stand, - - {1, SPR_OFC_W1_1, 20, T_Path, NULL, st_path1s},// st_path1, - {1, SPR_OFC_W1_1, 5, NULL , NULL, st_path2}, // st_path1s, - {1, SPR_OFC_W2_1, 15, T_Path, NULL, st_path3}, // st_path2, - {1, SPR_OFC_W3_1, 20, T_Path, NULL, st_path3s},// st_path3, - {1, SPR_OFC_W3_1, 5, NULL , NULL, st_path4}, // st_path3s, - {1, SPR_OFC_W4_1, 15, T_Path, NULL, st_path1}, // st_path4, - - {0, SPR_OFC_PAIN_1, 10, NULL, NULL, st_chase1},// st_pain, - {0, SPR_OFC_PAIN_2, 10, NULL, NULL, st_chase1},// st_pain1, - - {0, SPR_OFC_SHOOT1, 6, NULL, NULL, st_shoot2},// st_shoot1, - {0, SPR_OFC_SHOOT2, 20, NULL, T_Shoot, st_shoot3},// st_shoot2, - {0, SPR_OFC_SHOOT3, 10, NULL, NULL, st_chase1},// st_shoot3, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot4, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot5, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot6, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot7, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot8, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot9, - - {1, SPR_OFC_W1_1, 10, T_Chase, NULL, st_chase1s},// st_chase1, - {1, SPR_OFC_W1_1, 3, NULL , NULL, st_chase2}, // st_chase1s, - {1, SPR_OFC_W2_1, 8, T_Chase, NULL, st_chase3}, // st_chase2, - {1, SPR_OFC_W3_1, 10, T_Chase, NULL, st_chase3s},// st_chase3, - {1, SPR_OFC_W3_1, 3, NULL , NULL, st_chase4}, // st_chase3s, - {1, SPR_OFC_W4_1, 8, T_Chase, NULL, st_chase1}, // st_chase4, - - {0, SPR_OFC_DIE_1, 11, NULL, A_DeathScream, st_die2},// st_die1, - {0, SPR_OFC_DIE_2, 11, NULL, NULL, st_die3},// st_die2, - {0, SPR_OFC_DIE_3, 11, NULL, NULL, st_dead},// st_die3, - - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die4, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die5, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die6, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die7, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die8, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die9, - - {0, SPR_OFC_DEAD, 0, NULL, NULL, st_dead} // st_dead - }, - // en_ss, - { - {1, SPR_SS_S_1, 0, T_Stand, NULL, st_stand}, // st_stand, - - {1, SPR_SS_W1_1, 20, T_Path, NULL, st_path1s},// st_path1, - {1, SPR_SS_W1_1, 5, NULL , NULL, st_path2}, // st_path1s, - {1, SPR_SS_W2_1, 15, T_Path, NULL, st_path3}, // st_path2, - {1, SPR_SS_W3_1, 20, T_Path, NULL, st_path3s},// st_path3, - {1, SPR_SS_W3_1, 5, NULL , NULL, st_path4}, // st_path3s, - {1, SPR_SS_W4_1, 15, T_Path, NULL, st_path1}, // st_path4, - - {0, SPR_SS_PAIN_1, 10, NULL, NULL, st_chase1},// st_pain, - {0, SPR_SS_PAIN_2, 10, NULL, NULL, st_chase1},// st_pain1, - - {0, SPR_SS_SHOOT1, 20, NULL, NULL, st_shoot2},// st_shoot1, - {0, SPR_SS_SHOOT2, 20, NULL, T_Shoot, st_shoot3},// st_shoot2, - {0, SPR_SS_SHOOT3, 10, NULL, NULL, st_shoot4},// st_shoot3, - {0, SPR_SS_SHOOT2, 10, NULL, T_Shoot, st_shoot5},// st_shoot4, - {0, SPR_SS_SHOOT3, 10, NULL, NULL, st_shoot6},// st_shoot5, - {0, SPR_SS_SHOOT2, 10, NULL, T_Shoot, st_shoot7},// st_shoot6, - {0, SPR_SS_SHOOT3, 10, NULL, NULL, st_shoot8},// st_shoot7, - {0, SPR_SS_SHOOT2, 10, NULL, T_Shoot, st_shoot9},// st_shoot8, - {0, SPR_SS_SHOOT3, 10, NULL, NULL, st_chase1},// st_shoot9, - - {1, SPR_SS_W1_1, 10, T_Chase, NULL, st_chase1s},// st_chase1, - {1, SPR_SS_W1_1, 3, NULL , NULL, st_chase2}, // st_chase1s, - {1, SPR_SS_W2_1, 8, T_Chase, NULL, st_chase3}, // st_chase2, - {1, SPR_SS_W3_1, 10, T_Chase, NULL, st_chase3s},// st_chase3, - {1, SPR_SS_W3_1, 3, NULL , NULL, st_chase4}, // st_chase3s, - {1, SPR_SS_W4_1, 8, T_Chase, NULL, st_chase1}, // st_chase4, - - {0, SPR_SS_DIE_1, 15, NULL, A_DeathScream, st_die2},// st_die1, - {0, SPR_SS_DIE_2, 15, NULL, NULL, st_die3},// st_die2, - {0, SPR_SS_DIE_3, 15, NULL, NULL, st_dead},// st_die3, - - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die4, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die5, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die6, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die7, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die8, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die9, - - {0, SPR_SS_DEAD, 0, NULL, NULL, st_dead} // st_dead - }, - // en_dog, - { - {0, SPR_DEMO, 0, NULL, NULL, st_stand}, // st_stand, - - {1, SPR_DOG_W1_1, 20, T_Path, NULL, st_path1s},// st_path1, - {1, SPR_DOG_W1_1, 5, NULL , NULL, st_path2}, // st_path1s, - {1, SPR_DOG_W2_1, 15, T_Path, NULL, st_path3}, // st_path2, - {1, SPR_DOG_W3_1, 20, T_Path, NULL, st_path3s},// st_path3, - {1, SPR_DOG_W3_1, 5, NULL , NULL, st_path4}, // st_path3s, - {1, SPR_DOG_W4_1, 15, T_Path, NULL, st_path1}, // st_path4, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain1, - - {0, SPR_DOG_JUMP1, 10, NULL, NULL, st_shoot2},// st_shoot1, - {0, SPR_DOG_JUMP2, 10, NULL, T_Bite, st_shoot3},// st_shoot2, - {0, SPR_DOG_JUMP3, 10, NULL, NULL, st_shoot4},// st_shoot3, - {0, SPR_DOG_JUMP1, 10, NULL, NULL, st_shoot5},// st_shoot4, - {0, SPR_DOG_W1_1, 10, NULL, NULL, st_chase1},// st_shoot5, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot6, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot7, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot8, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot9, - - {1, SPR_DOG_W1_1, 10, T_DogChase, NULL, st_chase1s},// st_chase1, - {1, SPR_DOG_W1_1, 3, NULL , NULL, st_chase2}, // st_chase1s, - {1, SPR_DOG_W2_1, 8, T_DogChase, NULL, st_chase3}, // st_chase2, - {1, SPR_DOG_W3_1, 10, T_DogChase, NULL, st_chase3s},// st_chase3, - {1, SPR_DOG_W3_1, 3, NULL , NULL, st_chase4}, // st_chase3s, - {1, SPR_DOG_W4_1, 8, T_DogChase, NULL, st_chase1}, // st_chase4, - - {0, SPR_DOG_DIE_1, 15, NULL, A_DeathScream, st_die2},// st_die1, - {0, SPR_DOG_DIE_2, 15, NULL, NULL, st_die3},// st_die2, - {0, SPR_DOG_DIE_3, 15, NULL, NULL, st_dead},// st_die3, - - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die4, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die5, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die6, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die7, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die8, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die9, - - {0, SPR_DOG_DEAD, 0, NULL, NULL, st_dead} // st_dead - }, - // en_boss, - { - {0, SPR_BOSS_W1, 0, T_Stand, NULL, st_stand}, // st_stand, - - {0, SPR_DEMO, 0, NULL, NULL, st_path1s},// st_path1, - {0, SPR_DEMO, 0, NULL, NULL, st_path2}, // st_path1s, - {0, SPR_DEMO, 0, NULL, NULL, st_path3}, // st_path2, - {0, SPR_DEMO, 0, NULL, NULL, st_path3s},// st_path3, - {0, SPR_DEMO, 0, NULL, NULL, st_path4}, // st_path3s, - {0, SPR_DEMO, 0, NULL, NULL, st_path1}, // st_path4, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain1, - - {0, SPR_BOSS_SHOOT1, 30, NULL, NULL, st_shoot2},// st_shoot1, - {0, SPR_BOSS_SHOOT2, 10, NULL, T_Shoot, st_shoot3},// st_shoot2, - {0, SPR_BOSS_SHOOT3, 10, NULL, T_Shoot, st_shoot4},// st_shoot3, - {0, SPR_BOSS_SHOOT2, 10, NULL, T_Shoot, st_shoot5},// st_shoot4, - {0, SPR_BOSS_SHOOT3, 10, NULL, T_Shoot, st_shoot6},// st_shoot5, - {0, SPR_BOSS_SHOOT2, 10, NULL, T_Shoot, st_shoot7},// st_shoot6, - {0, SPR_BOSS_SHOOT3, 10, NULL, T_Shoot, st_shoot8},// st_shoot7, - {0, SPR_BOSS_SHOOT1, 10, NULL, NULL, st_chase1},// st_shoot8, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot9, - - {0, SPR_BOSS_W1, 10, T_Chase, NULL, st_chase1s},// st_chase1, - {0, SPR_BOSS_W1, 3, NULL , NULL, st_chase2}, // st_chase1s, - {0, SPR_BOSS_W2, 8, T_Chase, NULL, st_chase3}, // st_chase2, - {0, SPR_BOSS_W3, 10, T_Chase, NULL, st_chase3s},// st_chase3, - {0, SPR_BOSS_W3, 3, NULL , NULL, st_chase4}, // st_chase3s, - {0, SPR_BOSS_W4, 8, T_Chase, NULL, st_chase1}, // st_chase4, - - {0, SPR_BOSS_DIE1, 15, NULL, A_DeathScream, st_die2},// st_die1, - {0, SPR_BOSS_DIE2, 15, NULL, NULL, st_die3},// st_die2, - {0, SPR_BOSS_DIE3, 15, NULL, NULL, st_dead},// st_die3, - - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die4, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die5, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die6, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die7, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die8, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die9, - - {0, SPR_BOSS_DEAD, 0, NULL, NULL, st_dead} // st_dead - }, - // en_schabbs, - { - {0, SPR_SCHABB_W1, 0, T_Stand, NULL, st_stand}, // st_stand, - - {0, SPR_DEMO, 0, NULL, NULL, st_path1s},// st_path1, - {0, SPR_DEMO, 0, NULL, NULL, st_path2}, // st_path1s, - {0, SPR_DEMO, 0, NULL, NULL, st_path3}, // st_path2, - {0, SPR_DEMO, 0, NULL, NULL, st_path3s},// st_path3, - {0, SPR_DEMO, 0, NULL, NULL, st_path4}, // st_path3s, - {0, SPR_DEMO, 0, NULL, NULL, st_path1}, // st_path4, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain1, - - {0, SPR_SCHABB_SHOOT1, 30, NULL, NULL, st_shoot2},// st_shoot1, - {0, SPR_SCHABB_SHOOT2, 10, NULL, T_Launch, st_chase1},// st_shoot2, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot3, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot4, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot5, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot6, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot7, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot8, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot9, - - {0, SPR_SCHABB_W1, 10, T_BossChase, NULL, st_chase1s},// st_chase1, - {0, SPR_SCHABB_W1, 3, NULL , NULL, st_chase2}, // st_chase1s, - {0, SPR_SCHABB_W2, 8, T_BossChase, NULL, st_chase3}, // st_chase2, - {0, SPR_SCHABB_W3, 10, T_BossChase, NULL, st_chase3s},// st_chase3, - {0, SPR_SCHABB_W3, 3, NULL , NULL, st_chase4}, // st_chase3s, - {0, SPR_SCHABB_W4, 8, T_BossChase, NULL, st_chase1}, // st_chase4, - - {0, SPR_SCHABB_W1, 10, NULL, A_DeathScream, st_die2},// st_die1, - {0, SPR_SCHABB_W1, 10, NULL, NULL, st_die3},// st_die2, - {0, SPR_SCHABB_DIE1, 10, NULL, NULL, st_die4},// st_die3, - {0, SPR_SCHABB_DIE2, 10, NULL, NULL, st_die5},// st_die4, - {0, SPR_SCHABB_DIE3, 10, NULL, NULL, st_dead},// st_die5, - - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die6, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die7, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die8, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die9, - - {0, SPR_SCHABB_DEAD, 0, NULL, A_StartDeathCam, st_dead} // st_dead - }, - // en_fake, - { - {0, SPR_FAKE_W1, 0, T_Stand, NULL, st_stand}, // st_stand, - - {0, SPR_DEMO, 0, NULL, NULL, st_path1s},// st_path1, - {0, SPR_DEMO, 0, NULL, NULL, st_path2}, // st_path1s, - {0, SPR_DEMO, 0, NULL, NULL, st_path3}, // st_path2, - {0, SPR_DEMO, 0, NULL, NULL, st_path3s},// st_path3, - {0, SPR_DEMO, 0, NULL, NULL, st_path4}, // st_path3s, - {0, SPR_DEMO, 0, NULL, NULL, st_path1}, // st_path4, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain1, - - {0, SPR_FAKE_SHOOT, 8, NULL, T_Launch, st_shoot2},// st_shoot1, - {0, SPR_FAKE_SHOOT, 8, NULL, T_Launch, st_shoot3},// st_shoot2, - {0, SPR_FAKE_SHOOT, 8, NULL, T_Launch, st_shoot4},// st_shoot3, - {0, SPR_FAKE_SHOOT, 8, NULL, T_Launch, st_shoot5},// st_shoot4, - {0, SPR_FAKE_SHOOT, 8, NULL, T_Launch, st_shoot6},// st_shoot4, - {0, SPR_FAKE_SHOOT, 8, NULL, T_Launch, st_shoot7},// st_shoot4, - {0, SPR_FAKE_SHOOT, 8, NULL, T_Launch, st_shoot8},// st_shoot4, - {0, SPR_FAKE_SHOOT, 8, NULL, T_Launch, st_shoot9},// st_shoot4, - {0, SPR_FAKE_SHOOT, 8, NULL, NULL, st_chase1},// st_shoot4, - - {0, SPR_FAKE_W1, 10, T_Fake, NULL, st_chase1s},// st_chase1, - {0, SPR_FAKE_W1, 3, NULL , NULL, st_chase2}, // st_chase1s, - {0, SPR_FAKE_W2, 8, T_Fake, NULL, st_chase3}, // st_chase2, - {0, SPR_FAKE_W3, 10, T_Fake, NULL, st_chase3s},// st_chase3, - {0, SPR_FAKE_W3, 3, NULL , NULL, st_chase4}, // st_chase3s, - {0, SPR_FAKE_W4, 8, T_Fake, NULL, st_chase1}, // st_chase4, - - {0, SPR_FAKE_DIE1, 10, NULL, A_DeathScream, st_die2},// st_die1, - {0, SPR_FAKE_DIE2, 10, NULL, NULL, st_die3},// st_die2, - {0, SPR_FAKE_DIE3, 10, NULL, NULL, st_die4},// st_die3, - {0, SPR_FAKE_DIE4, 10, NULL, NULL, st_die5},// st_die4, - {0, SPR_FAKE_DIE5, 10, NULL, NULL, st_dead},// st_die5, - - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die6, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die7, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die8, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die9, - - {0, SPR_FAKE_DEAD, 0, NULL, NULL, st_dead} // st_dead - }, - // en_hitler, (mecha) - { - {0, SPR_MECHA_W1, 0, T_Stand, NULL, st_stand}, // st_stand, - - {0, SPR_DEMO, 0, NULL, NULL, st_path1s},// st_path1, - {0, SPR_DEMO, 0, NULL, NULL, st_path2}, // st_path1s, - {0, SPR_DEMO, 0, NULL, NULL, st_path3}, // st_path2, - {0, SPR_DEMO, 0, NULL, NULL, st_path3s},// st_path3, - {0, SPR_DEMO, 0, NULL, NULL, st_path4}, // st_path3s, - {0, SPR_DEMO, 0, NULL, NULL, st_path1}, // st_path4, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain1, - - {0, SPR_MECHA_SHOOT1, 30, NULL, NULL, st_shoot2},// st_shoot1, - {0, SPR_MECHA_SHOOT2, 10, NULL, T_Shoot, st_shoot3},// st_shoot2, - {0, SPR_MECHA_SHOOT3, 10, NULL, T_Shoot, st_shoot4},// st_shoot3, - {0, SPR_MECHA_SHOOT2, 10, NULL, T_Shoot, st_shoot5},// st_shoot4, - {0, SPR_MECHA_SHOOT3, 10, NULL, T_Shoot, st_shoot6},// st_shoot5, - {0, SPR_MECHA_SHOOT2, 10, NULL, T_Shoot, st_chase1},// st_shoot6, - - {0, SPR_DEMO, 0, NULL, NULL, st_shoot8},// st_shoot7, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot9},// st_shoot8, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot9, - - {0, SPR_MECHA_W1, 10, T_Chase, A_MechaSound, st_chase1s},// st_chase1, - {0, SPR_MECHA_W1, 6, NULL , NULL, st_chase2}, // st_chase1s, - {0, SPR_MECHA_W2, 8, T_Chase, NULL, st_chase3}, // st_chase2, - {0, SPR_MECHA_W3, 10, T_Chase, A_MechaSound, st_chase3s},// st_chase3, - {0, SPR_MECHA_W3, 6, NULL , NULL, st_chase4}, // st_chase3s, - {0, SPR_MECHA_W4, 8, T_Chase, NULL, st_chase1}, // st_chase4, - - {0, SPR_MECHA_DIE1, 10, NULL, A_DeathScream, st_die2},// st_die1, - {0, SPR_MECHA_DIE2, 10, NULL, NULL, st_die3},// st_die2, - {0, SPR_MECHA_DIE3, 10, NULL, A_HitlerMorph, st_dead},// st_die3, - - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die4, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die5, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die6, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die7, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die8, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die9, - - {0, SPR_MECHA_DEAD, 0, NULL, NULL, st_dead} // st_dead - }, - // en_hitler, - { - {0, SPR_DEMO, 0, NULL, NULL, st_stand}, // st_stand, - - {0, SPR_DEMO, 0, NULL, NULL, st_path1s},// st_path1, - {0, SPR_DEMO, 0, NULL, NULL, st_path2}, // st_path1s, - {0, SPR_DEMO, 0, NULL, NULL, st_path3}, // st_path2, - {0, SPR_DEMO, 0, NULL, NULL, st_path3s},// st_path3, - {0, SPR_DEMO, 0, NULL, NULL, st_path4}, // st_path3s, - {0, SPR_DEMO, 0, NULL, NULL, st_path1}, // st_path4, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain1, - - {0, SPR_HITLER_SHOOT1, 30, NULL, NULL, st_shoot2},// st_shoot1, - {0, SPR_HITLER_SHOOT2, 10, NULL, T_Shoot, st_shoot3},// st_shoot2, - {0, SPR_HITLER_SHOOT3, 10, NULL, T_Shoot, st_shoot4},// st_shoot3, - {0, SPR_HITLER_SHOOT2, 10, NULL, T_Shoot, st_shoot5},// st_shoot4, - {0, SPR_HITLER_SHOOT3, 10, NULL, T_Shoot, st_shoot6},// st_shoot5, - {0, SPR_HITLER_SHOOT2, 10, NULL, T_Shoot, st_chase1},// st_shoot6, - - {0, SPR_DEMO, 0, NULL, NULL, st_shoot8},// st_shoot7, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot9},// st_shoot8, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot9, - - {0, SPR_HITLER_W1, 6, T_Chase, NULL, st_chase1s}, // st_chase1, - {0, SPR_HITLER_W1, 4, NULL , NULL, st_chase2}, // st_chase1s, - {0, SPR_HITLER_W2, 2, T_Chase, NULL, st_chase3}, // st_chase2, - {0, SPR_HITLER_W3, 6, T_Chase, NULL, st_chase3s}, // st_chase3, - {0, SPR_HITLER_W3, 4, NULL , NULL, st_chase4}, // st_chase3s, - {0, SPR_HITLER_W4, 2, T_Chase, NULL, st_chase1}, // st_chase4, - - {0, SPR_HITLER_W1, 1, NULL, A_DeathScream, st_die2},// st_die1, - {0, SPR_HITLER_W1, 10, NULL, NULL, st_die3},// st_die2, - {0, SPR_HITLER_DIE1, 10, NULL, NULL, st_dead},// st_die3, - {0, SPR_HITLER_DIE2, 10, NULL, NULL, st_dead},// st_die4, - {0, SPR_HITLER_DIE3, 10, NULL, NULL, st_dead},// st_die5, - {0, SPR_HITLER_DIE4, 10, NULL, NULL, st_dead},// st_die6, - {0, SPR_HITLER_DIE5, 10, NULL, NULL, st_dead},// st_die7, - {0, SPR_HITLER_DIE6, 10, NULL, NULL, st_dead},// st_die8, - {0, SPR_HITLER_DIE7, 10, NULL, NULL, st_dead},// st_die9, - - {0, SPR_HITLER_DEAD, 0, NULL, A_StartDeathCam, st_dead} // st_dead - }, - // en_mutant, - { - {1, SPR_MUT_S_1, 0, T_Stand, NULL, st_stand}, // st_stand, - - {1, SPR_MUT_W1_1, 20, T_Path, NULL, st_path1s},// st_path1, - {1, SPR_MUT_W1_1, 5, NULL , NULL, st_path2}, // st_path1s, - {1, SPR_MUT_W2_1, 15, T_Path, NULL, st_path3}, // st_path2, - {1, SPR_MUT_W3_1, 20, T_Path, NULL, st_path3s},// st_path3, - {1, SPR_MUT_W3_1, 5, NULL , NULL, st_path4}, // st_path3s, - {1, SPR_MUT_W4_1, 15, T_Path, NULL, st_path1}, // st_path4, - - {0, SPR_MUT_PAIN_1, 10, NULL, NULL, st_chase1},// st_pain, - {0, SPR_MUT_PAIN_2, 10, NULL, NULL, st_chase1},// st_pain1, - - {0, SPR_MUT_SHOOT1, 6, NULL, T_Shoot, st_shoot2}, // st_shoot1, - {0, SPR_MUT_SHOOT2, 20, NULL, NULL, st_shoot3}, // st_shoot2, - {0, SPR_MUT_SHOOT3, 10, NULL, T_Shoot, st_shoot4}, // st_shoot3, - {0, SPR_MUT_SHOOT4, 20, NULL, NULL, st_chase1}, // st_shoot4, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot5, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot6, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot7, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot8, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot9, - - {1, SPR_MUT_W1_1, 10, T_Chase, NULL, st_chase1s},// st_chase1, - {1, SPR_MUT_W1_1, 3, NULL , NULL, st_chase2}, // st_chase1s, - {1, SPR_MUT_W2_1, 8, T_Chase, NULL, st_chase3}, // st_chase2, - {1, SPR_MUT_W3_1, 10, T_Chase, NULL, st_chase3s},// st_chase3, - {1, SPR_MUT_W3_1, 3, NULL , NULL, st_chase4}, // st_chase3s, - {1, SPR_MUT_W4_1, 8, T_Chase, NULL, st_chase1}, // st_chase4, - - {0, SPR_MUT_DIE_1, 7, NULL, A_DeathScream, st_die2},// st_die1, - {0, SPR_MUT_DIE_2, 7, NULL, NULL, st_die3},// st_die2, - {0, SPR_MUT_DIE_3, 7, NULL, NULL, st_die4},// st_die3, - {0, SPR_MUT_DIE_4, 7, NULL, NULL, st_dead},// st_die4, - - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die5, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die6, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die7, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die8, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die9, - - {0, SPR_MUT_DEAD, 0, NULL, NULL, st_dead} // st_dead - }, - // en_blinky, - { - {0, SPR_DEMO, 0, NULL, NULL, st_stand}, // st_stand, - - {0, SPR_DEMO, 0, NULL, NULL, st_path1s},// st_path1, - {0, SPR_DEMO, 0, NULL, NULL, st_path2}, // st_path1s, - {0, SPR_DEMO, 0, NULL, NULL, st_path3}, // st_path2, - {0, SPR_DEMO, 0, NULL, NULL, st_path3s},// st_path3, - {0, SPR_DEMO, 0, NULL, NULL, st_path4}, // st_path3s, - {0, SPR_DEMO, 0, NULL, NULL, st_path1}, // st_path4, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain1, - - {0, SPR_DEMO, 0, NULL, NULL, st_shoot2},// st_shoot1, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot3},// st_shoot2, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot4},// st_shoot3, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot5},// st_shoot4, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot6},// st_shoot5, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot6, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot8},// st_shoot7, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot9},// st_shoot8, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot9, - - {0, SPR_BLINKY_W1, 10, T_Ghosts, NULL, st_chase2},// st_chase1, - {0, SPR_DEMO, 0, NULL, NULL, st_chase2}, // st_chase1s, - {0, SPR_BLINKY_W2, 10, T_Ghosts, NULL, st_chase1},// st_chase2, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase3s},// st_chase3, - {0, SPR_DEMO, 0, NULL, NULL, st_chase4}, // st_chase3s, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1}, // st_chase4, - - {0, SPR_DEMO, 10, NULL, NULL, st_die2},// st_die1, - {0, SPR_DEMO, 10, NULL, NULL, st_die3},// st_die2, - {0, SPR_DEMO, 10, NULL, NULL, st_dead},// st_die3, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die4, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die5, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die6, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die7, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die8, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die9, - - {0, SPR_DEMO, 0, NULL, NULL, st_dead} // st_dead - }, - // en_clyde, - { - {0, SPR_DEMO, 0, NULL, NULL, st_stand}, // st_stand, - - {0, SPR_DEMO, 0, NULL, NULL, st_path1s},// st_path1, - {0, SPR_DEMO, 0, NULL, NULL, st_path2}, // st_path1s, - {0, SPR_DEMO, 0, NULL, NULL, st_path3}, // st_path2, - {0, SPR_DEMO, 0, NULL, NULL, st_path3s},// st_path3, - {0, SPR_DEMO, 0, NULL, NULL, st_path4}, // st_path3s, - {0, SPR_DEMO, 0, NULL, NULL, st_path1}, // st_path4, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain1, - - {0, SPR_DEMO, 0, NULL, NULL, st_shoot2},// st_shoot1, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot3},// st_shoot2, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot4},// st_shoot3, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot5},// st_shoot4, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot6},// st_shoot5, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot6, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot8},// st_shoot7, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot9},// st_shoot8, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot9, - - {0, SPR_CLYDE_W1, 10, T_Ghosts, NULL, st_chase2},// st_chase1, - {0, SPR_DEMO, 0, NULL, NULL, st_chase2}, // st_chase1s, - {0, SPR_CLYDE_W2, 10, T_Ghosts, NULL, st_chase1},// st_chase2, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase3s},// st_chase3, - {0, SPR_DEMO, 0, NULL, NULL, st_chase4}, // st_chase3s, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1}, // st_chase4, - - {0, SPR_DEMO, 10, NULL, NULL, st_die2},// st_die1, - {0, SPR_DEMO, 10, NULL, NULL, st_die3},// st_die2, - {0, SPR_DEMO, 10, NULL, NULL, st_dead},// st_die3, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die4, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die5, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die6, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die7, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die8, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die9, - - {0, SPR_DEMO, 0, NULL, NULL, st_dead} // st_dead - }, - // en_pinky, - { - {0, SPR_DEMO, 0, NULL, NULL, st_stand}, // st_stand, - - {0, SPR_DEMO, 0, NULL, NULL, st_path1s},// st_path1, - {0, SPR_DEMO, 0, NULL, NULL, st_path2}, // st_path1s, - {0, SPR_DEMO, 0, NULL, NULL, st_path3}, // st_path2, - {0, SPR_DEMO, 0, NULL, NULL, st_path3s},// st_path3, - {0, SPR_DEMO, 0, NULL, NULL, st_path4}, // st_path3s, - {0, SPR_DEMO, 0, NULL, NULL, st_path1}, // st_path4, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain1, - - {0, SPR_DEMO, 0, NULL, NULL, st_shoot2},// st_shoot1, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot3},// st_shoot2, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot4},// st_shoot3, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot5},// st_shoot4, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot6},// st_shoot5, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot6, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot8},// st_shoot7, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot9},// st_shoot8, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot9, - - {0, SPR_PINKY_W1, 10, T_Ghosts, NULL, st_chase2},// st_chase1, - {0, SPR_DEMO, 0, NULL, NULL, st_chase2}, // st_chase1s, - {0, SPR_PINKY_W2, 10, T_Ghosts, NULL, st_chase1},// st_chase2, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase3s},// st_chase3, - {0, SPR_DEMO, 0, NULL, NULL, st_chase4}, // st_chase3s, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1}, // st_chase4, - - {0, SPR_DEMO, 10, NULL, NULL, st_die2},// st_die1, - {0, SPR_DEMO, 10, NULL, NULL, st_die3},// st_die2, - {0, SPR_DEMO, 10, NULL, NULL, st_dead},// st_die3, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die4, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die5, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die6, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die7, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die8, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die9, - - {0, SPR_DEMO, 0, NULL, NULL, st_dead} // st_dead - }, - // en_inky, - { - {0, SPR_DEMO, 0, NULL, NULL, st_stand}, // st_stand, - - {0, SPR_DEMO, 0, NULL, NULL, st_path1s},// st_path1, - {0, SPR_DEMO, 0, NULL, NULL, st_path2}, // st_path1s, - {0, SPR_DEMO, 0, NULL, NULL, st_path3}, // st_path2, - {0, SPR_DEMO, 0, NULL, NULL, st_path3s},// st_path3, - {0, SPR_DEMO, 0, NULL, NULL, st_path4}, // st_path3s, - {0, SPR_DEMO, 0, NULL, NULL, st_path1}, // st_path4, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain1, - - {0, SPR_DEMO, 0, NULL, NULL, st_shoot2},// st_shoot1, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot3},// st_shoot2, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot4},// st_shoot3, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot5},// st_shoot4, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot6},// st_shoot5, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot6, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot8},// st_shoot7, - {0, SPR_DEMO, 0, NULL, NULL, st_shoot9},// st_shoot8, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot9, - - {0, SPR_INKY_W1, 10, T_Ghosts, NULL, st_chase2},// st_chase1, - {0, SPR_DEMO, 0, NULL, NULL, st_chase2}, // st_chase1s, - {0, SPR_INKY_W2, 10, T_Ghosts, NULL, st_chase1},// st_chase2, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase3s},// st_chase3, - {0, SPR_DEMO, 0, NULL, NULL, st_chase4}, // st_chase3s, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1}, // st_chase4, - - {0, SPR_DEMO, 10, NULL, NULL, st_die2},// st_die1, - {0, SPR_DEMO, 10, NULL, NULL, st_die3},// st_die2, - {0, SPR_DEMO, 10, NULL, NULL, st_dead},// st_die3, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die4, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die5, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die6, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die7, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die8, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die9, - - {0, SPR_DEMO, 0, NULL, NULL, st_dead} // st_dead - }, - // en_gretel, - { - {0, SPR_GRETEL_W1, 0, T_Stand, NULL, st_stand}, // st_stand, - - {0, SPR_DEMO, 0, NULL, NULL, st_path1s},// st_path1, - {0, SPR_DEMO, 0, NULL, NULL, st_path2}, // st_path1s, - {0, SPR_DEMO, 0, NULL, NULL, st_path3}, // st_path2, - {0, SPR_DEMO, 0, NULL, NULL, st_path3s},// st_path3, - {0, SPR_DEMO, 0, NULL, NULL, st_path4}, // st_path3s, - {0, SPR_DEMO, 0, NULL, NULL, st_path1}, // st_path4, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain1, - - {0, SPR_GRETEL_SHOOT1, 30, NULL, NULL, st_shoot2},// st_shoot1, - {0, SPR_GRETEL_SHOOT2, 10, NULL, T_Shoot, st_shoot3},// st_shoot2, - {0, SPR_GRETEL_SHOOT3, 10, NULL, T_Shoot, st_shoot4},// st_shoot3, - {0, SPR_GRETEL_SHOOT2, 10, NULL, T_Shoot, st_shoot5},// st_shoot4, - {0, SPR_GRETEL_SHOOT3, 10, NULL, T_Shoot, st_shoot6},// st_shoot5, - {0, SPR_GRETEL_SHOOT2, 10, NULL, T_Shoot, st_shoot7},// st_shoot6, - {0, SPR_GRETEL_SHOOT3, 10, NULL, T_Shoot, st_shoot8},// st_shoot7, - {0, SPR_GRETEL_SHOOT1, 10, NULL, NULL, st_chase1},// st_shoot8, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot9, - - {0, SPR_GRETEL_W1, 10, T_Chase, NULL, st_chase1s},// st_chase1, - {0, SPR_GRETEL_W1, 3, NULL , NULL, st_chase2}, // st_chase1s, - {0, SPR_GRETEL_W2, 8, T_Chase, NULL, st_chase3}, // st_chase2, - {0, SPR_GRETEL_W3, 10, T_Chase, NULL, st_chase3s},// st_chase3, - {0, SPR_GRETEL_W3, 3, NULL , NULL, st_chase4}, // st_chase3s, - {0, SPR_GRETEL_W4, 8, T_Chase, NULL, st_chase1}, // st_chase4, - - {0, SPR_GRETEL_DIE1, 15, NULL, A_DeathScream, st_die2},// st_die1, - {0, SPR_GRETEL_DIE2, 15, NULL, NULL, st_die3},// st_die2, - {0, SPR_GRETEL_DIE3, 15, NULL, NULL, st_dead},// st_die3, - - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die4, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die5, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die6, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die7, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die8, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die9, - - {0, SPR_GRETEL_DEAD, 0, NULL, NULL, st_dead} // st_dead - }, - // en_gift, - { - {0, SPR_GIFT_W1, 0, T_Stand, NULL, st_stand}, // st_stand, - - {0, SPR_DEMO, 0, NULL, NULL, st_path1s},// st_path1, - {0, SPR_DEMO, 0, NULL, NULL, st_path2}, // st_path1s, - {0, SPR_DEMO, 0, NULL, NULL, st_path3}, // st_path2, - {0, SPR_DEMO, 0, NULL, NULL, st_path3s},// st_path3, - {0, SPR_DEMO, 0, NULL, NULL, st_path4}, // st_path3s, - {0, SPR_DEMO, 0, NULL, NULL, st_path1}, // st_path4, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain1, - - {0, SPR_GIFT_SHOOT1, 30, NULL, NULL, st_shoot2},// st_shoot1, - {0, SPR_GIFT_SHOOT2, 10, NULL, T_Launch, st_chase1},// st_shoot2, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot3, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot4, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot5, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot6, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot7, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot8, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot9, - - {0, SPR_GIFT_W1, 10, T_BossChase, NULL, st_chase1s},// st_chase1, - {0, SPR_GIFT_W1, 3, NULL , NULL, st_chase2}, // st_chase1s, - {0, SPR_GIFT_W2, 8, T_BossChase, NULL, st_chase3}, // st_chase2, - {0, SPR_GIFT_W3, 10, T_BossChase, NULL, st_chase3s},// st_chase3, - {0, SPR_GIFT_W3, 3, NULL , NULL, st_chase4}, // st_chase3s, - {0, SPR_GIFT_W4, 8, T_BossChase, NULL, st_chase1}, // st_chase4, - - {0, SPR_GIFT_W1, 10, NULL, A_DeathScream, st_die2},// st_die1, - {0, SPR_GIFT_W1, 10, NULL, NULL, st_die3},// st_die2, - {0, SPR_GIFT_DIE1, 10, NULL, NULL, st_die4},// st_die3, - {0, SPR_GIFT_DIE2, 10, NULL, NULL, st_die5},// st_die4, - {0, SPR_GIFT_DIE3, 10, NULL, NULL, st_dead},// st_die5, - - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die6, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die7, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die8, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die9, - - {0, SPR_GIFT_DEAD, 0, NULL, A_StartDeathCam, st_dead} // st_dead - }, - // en_fat, - { - {0, SPR_FAT_W1, 0, T_Stand, NULL, st_stand}, // st_stand, - - {0, SPR_DEMO, 0, NULL, NULL, st_path1s},// st_path1, - {0, SPR_DEMO, 0, NULL, NULL, st_path2}, // st_path1s, - {0, SPR_DEMO, 0, NULL, NULL, st_path3}, // st_path2, - {0, SPR_DEMO, 0, NULL, NULL, st_path3s},// st_path3, - {0, SPR_DEMO, 0, NULL, NULL, st_path4}, // st_path3s, - {0, SPR_DEMO, 0, NULL, NULL, st_path1}, // st_path4, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_pain1, - - {0, SPR_FAT_SHOOT1, 30, NULL, NULL, st_shoot2},// st_shoot1, - {0, SPR_FAT_SHOOT2, 10, NULL, T_Launch, st_shoot3},// st_shoot2, - {0, SPR_FAT_SHOOT3, 10, NULL, T_Shoot, st_shoot4},// st_shoot3, - {0, SPR_FAT_SHOOT4, 10, NULL, T_Shoot, st_shoot5},// st_shoot4, - {0, SPR_FAT_SHOOT3, 10, NULL, T_Shoot, st_shoot6},// st_shoot5, - {0, SPR_FAT_SHOOT4, 10, NULL, T_Shoot, st_chase1},// st_shoot6, - - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot7, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot8, - {0, SPR_DEMO, 0, NULL, NULL, st_chase1},// st_shoot9, - - {0, SPR_FAT_W1, 10, T_BossChase, NULL, st_chase1s},// st_chase1, - {0, SPR_FAT_W1, 3, NULL , NULL, st_chase2}, // st_chase1s, - {0, SPR_FAT_W2, 8, T_BossChase, NULL, st_chase3}, // st_chase2, - {0, SPR_FAT_W3, 10, T_BossChase, NULL, st_chase3s},// st_chase3, - {0, SPR_FAT_W3, 3, NULL , NULL, st_chase4}, // st_chase3s, - {0, SPR_FAT_W4, 8, T_BossChase, NULL, st_chase1}, // st_chase4, - - {0, SPR_FAT_W1, 10, NULL, A_DeathScream, st_die2},// st_die1, - {0, SPR_FAT_W1, 10, NULL, NULL, st_die3},// st_die2, - {0, SPR_FAT_DIE1, 10, NULL, NULL, st_die4},// st_die3, - {0, SPR_FAT_DIE2, 10, NULL, NULL, st_die5},// st_die4, - {0, SPR_FAT_DIE3, 10, NULL, NULL, st_dead},// st_die5, - - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die6, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die7, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die8, - {0, SPR_DEMO, 0, NULL, NULL, st_dead},// st_die9, - - {0, SPR_FAT_DEAD, 0, NULL, A_StartDeathCam, st_dead} // st_dead - }, -// --- Projectiles - // en_needle, - { - ST_INFO_NULL, // st_stand, - - {0, SPR_HYPO1, 6, T_Projectile, NULL, st_path2}, // st_path1, - ST_INFO_NULL, // st_path1s, - {0, SPR_HYPO2, 6, T_Projectile, NULL, st_path3}, // st_path2, - {0, SPR_HYPO3, 6, T_Projectile, NULL, st_path4}, // st_path3, - ST_INFO_NULL, // st_path3s, - {0, SPR_HYPO4, 6, T_Projectile, NULL, st_path1}, // st_path4, - - ST_INFO_NULL,// st_pain, - ST_INFO_NULL,// st_pain1, - - ST_INFO_NULL,// st_shoot1, - ST_INFO_NULL,// st_shoot2, - ST_INFO_NULL,// st_shoot3, - ST_INFO_NULL,// st_shoot4, - ST_INFO_NULL,// st_shoot5, - ST_INFO_NULL,// st_shoot6, - - ST_INFO_NULL,// st_shoot7, - ST_INFO_NULL,// st_shoot8, - ST_INFO_NULL,// st_shoot9, - - ST_INFO_NULL,// st_chase1, - ST_INFO_NULL, // st_chase1s, - ST_INFO_NULL, // st_chase2, - ST_INFO_NULL,// st_chase3, - ST_INFO_NULL, // st_chase3s, - ST_INFO_NULL, // st_chase4, - - ST_INFO_NULL, // st_die1, - ST_INFO_NULL, // st_die2, - ST_INFO_NULL, // st_die3, - ST_INFO_NULL,// st_die4, - ST_INFO_NULL,// st_die5, - - ST_INFO_NULL,// st_die6, - ST_INFO_NULL,// st_die7, - ST_INFO_NULL,// st_die8, - ST_INFO_NULL,// st_die9, - - ST_INFO_NULL // st_dead - }, - // en_fire, - { - ST_INFO_NULL, // st_stand, - - {0, SPR_FIRE1, 6, NULL, T_Projectile, st_path2}, // st_path1, - ST_INFO_NULL, // st_path1s, - {0, SPR_FIRE2, 6, NULL, T_Projectile, st_path1}, // st_path2, - ST_INFO_NULL, // st_path3, - ST_INFO_NULL, // st_path3s, - ST_INFO_NULL, // st_path4, - - ST_INFO_NULL,// st_pain, - ST_INFO_NULL,// st_pain1, - - ST_INFO_NULL,// st_shoot1, - ST_INFO_NULL,// st_shoot2, - ST_INFO_NULL,// st_shoot3, - ST_INFO_NULL,// st_shoot4, - ST_INFO_NULL,// st_shoot5, - ST_INFO_NULL,// st_shoot6, - - ST_INFO_NULL,// st_shoot7, - ST_INFO_NULL,// st_shoot8, - ST_INFO_NULL,// st_shoot9, - - ST_INFO_NULL,// st_chase1, - ST_INFO_NULL, // st_chase1s, - ST_INFO_NULL, // st_chase2, - ST_INFO_NULL,// st_chase3, - ST_INFO_NULL, // st_chase3s, - ST_INFO_NULL, // st_chase4, - - ST_INFO_NULL, // st_die1, - ST_INFO_NULL, // st_die2, - ST_INFO_NULL, // st_die3, - ST_INFO_NULL,// st_die4, - ST_INFO_NULL,// st_die5, - - ST_INFO_NULL,// st_die6, - ST_INFO_NULL,// st_die7, - ST_INFO_NULL,// st_die8, - ST_INFO_NULL,// st_die9, - - ST_INFO_NULL // st_dead - }, - // en_rocket, - { - {1, SPR_ROCKET_1, 3, T_Projectile, A_Smoke, st_stand}, // st_stand, - - ST_INFO_NULL,// st_path1, - ST_INFO_NULL, // st_path1s, - ST_INFO_NULL, // st_path2, - ST_INFO_NULL,// st_path3, - ST_INFO_NULL, // st_path3s, - ST_INFO_NULL, // st_path4, - - ST_INFO_NULL,// st_pain, - ST_INFO_NULL,// st_pain1, - - ST_INFO_NULL,// st_shoot1, - ST_INFO_NULL,// st_shoot2, - ST_INFO_NULL,// st_shoot3, - ST_INFO_NULL,// st_shoot4, - ST_INFO_NULL,// st_shoot5, - ST_INFO_NULL,// st_shoot6, - - ST_INFO_NULL,// st_shoot7, - ST_INFO_NULL,// st_shoot8, - ST_INFO_NULL,// st_shoot9, - - ST_INFO_NULL,// st_chase1, - ST_INFO_NULL, // st_chase1s, - ST_INFO_NULL, // st_chase2, - ST_INFO_NULL,// st_chase3, - ST_INFO_NULL, // st_chase3s, - ST_INFO_NULL, // st_chase4, - - {0, SPR_BOOM_1, 6, NULL, NULL, st_die2}, // st_die1, - {0, SPR_BOOM_2, 6, NULL, NULL, st_die3}, // st_die2, - {0, SPR_BOOM_3, 6, NULL, NULL, st_remove}, // st_die3, - ST_INFO_NULL,// st_die4, - ST_INFO_NULL,// st_die5, - - ST_INFO_NULL,// st_die6, - ST_INFO_NULL,// st_die7, - ST_INFO_NULL,// st_die8, - ST_INFO_NULL,// st_die9, - - ST_INFO_NULL // st_dead - }, - // en_smoke, - { - ST_INFO_NULL, // st_stand, - - ST_INFO_NULL, // st_path1, - ST_INFO_NULL, // st_path1s, - ST_INFO_NULL, // st_path2, - ST_INFO_NULL, // st_path3, - ST_INFO_NULL, // st_path3s, - ST_INFO_NULL, // st_path4, - - ST_INFO_NULL, // st_pain, - ST_INFO_NULL, // st_pain1, - - ST_INFO_NULL, // st_shoot1, - ST_INFO_NULL, // st_shoot2, - ST_INFO_NULL, // st_shoot3, - ST_INFO_NULL, // st_shoot4, - ST_INFO_NULL, // st_shoot5, - ST_INFO_NULL, // st_shoot6, - - ST_INFO_NULL, // st_shoot7, - ST_INFO_NULL, // st_shoot8, - ST_INFO_NULL, // st_shoot9, - - ST_INFO_NULL, // st_chase1, - ST_INFO_NULL, // st_chase1s, - ST_INFO_NULL, // st_chase2, - ST_INFO_NULL, // st_chase3, - ST_INFO_NULL, // st_chase3s, - ST_INFO_NULL, // st_chase4, - - {0, SPR_SMOKE_1, 3, NULL, NULL, st_die2}, // st_die1, - {0, SPR_SMOKE_2, 3, NULL, NULL, st_die3}, // st_die2, - {0, SPR_SMOKE_3, 3, NULL, NULL, st_die4}, // st_die3, - {0, SPR_SMOKE_4, 3, NULL, NULL, st_remove}, // st_die4, - ST_INFO_NULL, // st_die5, - - ST_INFO_NULL, // st_die6, - ST_INFO_NULL, // st_die7, - ST_INFO_NULL, // st_die8, - ST_INFO_NULL, // st_die9, - - ST_INFO_NULL // st_dead - }, - // en_bj, - { - ST_INFO_NULL, // st_stand, - - {0, SPR_BJ_W1, 12, T_BJRun, NULL, st_path1s}, // st_path1, - {0, SPR_BJ_W1, 3, NULL, NULL, st_path2}, // st_path1s, - {0, SPR_BJ_W2, 8, T_BJRun, NULL, st_path3}, // st_path2, - {0, SPR_BJ_W3, 12, T_BJRun, NULL, st_path3s}, // st_path3, - {0, SPR_BJ_W3, 3, NULL, NULL, st_path4}, // st_path3s, - {0, SPR_BJ_W4, 8, T_BJRun, NULL, st_path1}, // st_path4, - - ST_INFO_NULL, // st_pain, - ST_INFO_NULL, // st_pain1, - - {0, SPR_BJ_JUMP1, 14, T_BJJump, NULL, st_shoot2}, // st_shoot1, - {0, SPR_BJ_JUMP2, 14, T_BJJump, T_BJYell, st_shoot3}, // st_shoot2, - {0, SPR_BJ_JUMP3, 14, T_BJJump, NULL, st_shoot4}, // st_shoot3, - {0, SPR_BJ_JUMP4,300, NULL, T_BJDone, st_shoot4}, // st_shoot4, - ST_INFO_NULL, // st_shoot5, - ST_INFO_NULL, // st_shoot6, - - ST_INFO_NULL, // st_shoot7, - ST_INFO_NULL, // st_shoot8, - ST_INFO_NULL, // st_shoot9, - - ST_INFO_NULL, // st_chase1, - ST_INFO_NULL, // st_chase1s, - ST_INFO_NULL, // st_chase2, - ST_INFO_NULL, // st_chase3, - ST_INFO_NULL, // st_chase3s, - ST_INFO_NULL, // st_chase4, - - ST_INFO_NULL, // st_die1, - ST_INFO_NULL, // st_die2, - ST_INFO_NULL, // st_die3, - ST_INFO_NULL, // st_die4, - ST_INFO_NULL, // st_die5, - - ST_INFO_NULL, // st_die6, - ST_INFO_NULL, // st_die7, - ST_INFO_NULL, // st_die8, - ST_INFO_NULL, // st_die9, - - ST_INFO_NULL // st_dead - }, - -// --- Spear of destiny! - // en_spark, - { - ST_INFO_NULL, // st_stand, - - {0, SPR_SPARK1, 6, T_Projectile, NULL, st_path2}, // st_path1, - ST_INFO_NULL, // st_path1s, - {0, SPR_SPARK2, 6, T_Projectile, NULL, st_path3}, // st_path2, - {0, SPR_SPARK3, 6, T_Projectile, NULL, st_path4}, // st_path3, - ST_INFO_NULL, // st_path3s, - {0, SPR_SPARK4, 6, T_Projectile, NULL, st_path1}, // st_path4, - - ST_INFO_NULL,// st_pain, - ST_INFO_NULL,// st_pain1, - - ST_INFO_NULL,// st_shoot1, - ST_INFO_NULL,// st_shoot2, - ST_INFO_NULL,// st_shoot3, - ST_INFO_NULL,// st_shoot4, - ST_INFO_NULL,// st_shoot5, - ST_INFO_NULL,// st_shoot6, - - ST_INFO_NULL,// st_shoot7, - ST_INFO_NULL,// st_shoot8, - ST_INFO_NULL,// st_shoot9, - - ST_INFO_NULL,// st_chase1, - ST_INFO_NULL, // st_chase1s, - ST_INFO_NULL, // st_chase2, - ST_INFO_NULL,// st_chase3, - ST_INFO_NULL, // st_chase3s, - ST_INFO_NULL, // st_chase4, - - ST_INFO_NULL, // st_die1, - ST_INFO_NULL, // st_die2, - ST_INFO_NULL, // st_die3, - ST_INFO_NULL,// st_die4, - ST_INFO_NULL,// st_die5, - - ST_INFO_NULL,// st_die6, - ST_INFO_NULL,// st_die7, - ST_INFO_NULL,// st_die8, - ST_INFO_NULL,// st_die9, - - ST_INFO_NULL // st_dead - }, - // en_hrocket, - { - {1, SPR_HROCKET_1, 3, T_Projectile, A_Smoke, st_stand}, // st_stand, - - ST_INFO_NULL,// st_path1, - ST_INFO_NULL, // st_path1s, - ST_INFO_NULL, // st_path2, - ST_INFO_NULL,// st_path3, - ST_INFO_NULL, // st_path3s, - ST_INFO_NULL, // st_path4, - - ST_INFO_NULL,// st_pain, - ST_INFO_NULL,// st_pain1, - - ST_INFO_NULL,// st_shoot1, - ST_INFO_NULL,// st_shoot2, - ST_INFO_NULL,// st_shoot3, - ST_INFO_NULL,// st_shoot4, - ST_INFO_NULL,// st_shoot5, - ST_INFO_NULL,// st_shoot6, - - ST_INFO_NULL,// st_shoot7, - ST_INFO_NULL,// st_shoot8, - ST_INFO_NULL,// st_shoot9, - - ST_INFO_NULL,// st_chase1, - ST_INFO_NULL, // st_chase1s, - ST_INFO_NULL, // st_chase2, - ST_INFO_NULL,// st_chase3, - ST_INFO_NULL, // st_chase3s, - ST_INFO_NULL, // st_chase4, - - {0, SPR_HBOOM_1, 6, NULL, NULL, st_die2}, // st_die1, - {0, SPR_HBOOM_2, 6, NULL, NULL, st_die3}, // st_die2, - {0, SPR_HBOOM_3, 6, NULL, NULL, st_remove}, // st_die3, - ST_INFO_NULL,// st_die4, - ST_INFO_NULL,// st_die5, - - ST_INFO_NULL,// st_die6, - ST_INFO_NULL,// st_die7, - ST_INFO_NULL,// st_die8, - ST_INFO_NULL,// st_die9, - - ST_INFO_NULL // st_dead - }, - // en_hsmoke, - { - ST_INFO_NULL, // st_stand, - - ST_INFO_NULL, // st_path1, - ST_INFO_NULL, // st_path1s, - ST_INFO_NULL, // st_path2, - ST_INFO_NULL, // st_path3, - ST_INFO_NULL, // st_path3s, - ST_INFO_NULL, // st_path4, - - ST_INFO_NULL, // st_pain, - ST_INFO_NULL, // st_pain1, - - ST_INFO_NULL, // st_shoot1, - ST_INFO_NULL, // st_shoot2, - ST_INFO_NULL, // st_shoot3, - ST_INFO_NULL, // st_shoot4, - ST_INFO_NULL, // st_shoot5, - ST_INFO_NULL, // st_shoot6, - - ST_INFO_NULL, // st_shoot7, - ST_INFO_NULL, // st_shoot8, - ST_INFO_NULL, // st_shoot9, - - ST_INFO_NULL, // st_chase1, - ST_INFO_NULL, // st_chase1s, - ST_INFO_NULL, // st_chase2, - ST_INFO_NULL, // st_chase3, - ST_INFO_NULL, // st_chase3s, - ST_INFO_NULL, // st_chase4, - - {0, SPR_HSMOKE_1, 3, NULL, NULL, st_die2}, // st_die1, - {0, SPR_HSMOKE_2, 3, NULL, NULL, st_die3}, // st_die2, - {0, SPR_HSMOKE_3, 3, NULL, NULL, st_die4}, // st_die3, - {0, SPR_HSMOKE_4, 3, NULL, NULL, st_remove}, // st_die4, - ST_INFO_NULL, // st_die5, - - ST_INFO_NULL, // st_die6, - ST_INFO_NULL, // st_die7, - ST_INFO_NULL, // st_die8, - ST_INFO_NULL, // st_die9, - - ST_INFO_NULL // st_dead - }, - // en_spectre, - { - ST_INFO_NULL, // st_stand, - - {0, SPR_SPECTRE_W1, 10, T_Stand, NULL, st_path2}, // st_path1, - ST_INFO_NULL, // st_path1s, - {0, SPR_SPECTRE_W2, 10, T_Stand, NULL, st_path3}, // st_path2, - {0, SPR_SPECTRE_W3, 10, T_Stand, NULL, st_path4}, // st_path3, - ST_INFO_NULL, // st_path3s, - {0, SPR_SPECTRE_W4, 10, T_Stand, NULL, st_path1}, // st_path4, - - ST_INFO_NULL, // st_pain, - ST_INFO_NULL, // st_pain1, - - ST_INFO_NULL, // st_shoot1, - ST_INFO_NULL, // st_shoot2, - ST_INFO_NULL, // st_shoot3, - ST_INFO_NULL, // st_shoot4, - ST_INFO_NULL, // st_shoot5, - ST_INFO_NULL, // st_shoot6, - - ST_INFO_NULL, // st_shoot7, - ST_INFO_NULL, // st_shoot8, - ST_INFO_NULL, // st_shoot9, - - {0, SPR_SPECTRE_W1, 10, T_Ghosts, NULL, st_chase2}, // st_chase1, - ST_INFO_NULL, // st_chase1s, - {0, SPR_SPECTRE_W2, 10, T_Ghosts, NULL, st_chase3}, // st_chase2, - {0, SPR_SPECTRE_W3, 10, T_Ghosts, NULL, st_chase4}, // st_chase3, - ST_INFO_NULL, // st_chase3s, - {0, SPR_SPECTRE_W4, 10, T_Ghosts, NULL, st_chase1}, // st_chase4, - - {0, SPR_SPECTRE_F1, 10, NULL, NULL, st_die2}, // st_die1, - {0, SPR_SPECTRE_F2, 10, NULL, NULL, st_die3}, // st_die2, - {0, SPR_SPECTRE_F3, 10, NULL, NULL, st_die4}, // st_die3, - {0, SPR_SPECTRE_F4, 300, NULL, NULL, st_die5}, // st_die4, - {0, SPR_SPECTRE_F4, 10, NULL, A_Dormant, st_die5}, // st_die5, - - ST_INFO_NULL, // st_die6, - ST_INFO_NULL, // st_die7, - ST_INFO_NULL, // st_die8, - ST_INFO_NULL, // st_die9, - - ST_INFO_NULL // st_dead - }, - // en_angel, - { - {0, SPR_ANGEL_W1, 0, T_Stand, NULL, st_stand}, // st_stand, - - ST_INFO_NULL, // st_path1, - ST_INFO_NULL, // st_path1s, - ST_INFO_NULL, // st_path2, - ST_INFO_NULL, // st_path3, - ST_INFO_NULL, // st_path3s, - ST_INFO_NULL, // st_path4, - - {0, SPR_ANGEL_TIRED1, 40, NULL, A_Breathing, st_pain1}, // st_pain, - {0, SPR_ANGEL_TIRED2, 40, NULL, NULL, st_shoot4}, // st_pain1, - - {0, SPR_ANGEL_SHOOT1, 10, NULL, A_StartAttack, st_shoot2}, // st_shoot1, - {0, SPR_ANGEL_SHOOT2, 20, NULL, T_Launch, st_shoot3}, // st_shoot2, - {0, SPR_ANGEL_SHOOT1, 10, NULL, A_Relaunch, st_shoot2}, // st_shoot3, - - {0, SPR_ANGEL_TIRED1, 40, NULL, A_Breathing, st_shoot5}, // st_shoot4, - {0, SPR_ANGEL_TIRED2, 40, NULL, NULL, st_shoot6}, // st_shoot5, - {0, SPR_ANGEL_TIRED1, 40, NULL, A_Breathing, st_shoot7}, // st_shoot6, - {0, SPR_ANGEL_TIRED2, 40, NULL, NULL, st_shoot8}, // st_shoot7, - {0, SPR_ANGEL_TIRED1, 40, NULL, A_Breathing, st_chase1}, // st_shoot8, - ST_INFO_NULL, // st_shoot9, - - {0, SPR_ANGEL_W1, 10, T_BossChase, NULL, st_chase1s}, // st_chase1, - {0, SPR_ANGEL_W1, 3, NULL, NULL, st_chase2}, // st_chase1s, - {0, SPR_ANGEL_W2, 8, T_BossChase, NULL, st_chase3}, // st_chase2, - {0, SPR_ANGEL_W3, 10, T_BossChase, NULL, st_chase3s}, // st_chase3, - {0, SPR_ANGEL_W3, 3, NULL, NULL, st_chase4}, // st_chase3s, - {0, SPR_ANGEL_W4, 8, T_BossChase, NULL, st_chase1}, // st_chase4, - - {0, SPR_ANGEL_W1, 1, NULL, A_DeathScream, st_die2}, // st_die1, - {0, SPR_ANGEL_W1, 1, NULL, NULL, st_die3}, // st_die2, - {0, SPR_ANGEL_DIE1, 10, NULL, A_Slurpie, st_die4}, // st_die3, - {0, SPR_ANGEL_DIE2, 10, NULL, NULL, st_die5}, // st_die4, - {0, SPR_ANGEL_DIE3, 10, NULL, NULL, st_die6}, // st_die5, - {0, SPR_ANGEL_DIE4, 10, NULL, NULL, st_die7}, // st_die6, - {0, SPR_ANGEL_DIE5, 10, NULL, NULL, st_die8}, // st_die7, - {0, SPR_ANGEL_DIE6, 10, NULL, NULL, st_die9}, // st_die8, - {0, SPR_ANGEL_DIE7, 10, NULL, NULL, st_dead}, // st_die9, - - {0, SPR_ANGEL_DEAD, 130, NULL, A_Victory, st_dead} // st_dead - }, - // en_trans, - { - {0, SPR_TRANS_W1, 0, T_Stand, NULL, st_stand}, // st_stand, - - ST_INFO_NULL, // st_path1, - ST_INFO_NULL, // st_path1s, - ST_INFO_NULL, // st_path2, - ST_INFO_NULL, // st_path3, - ST_INFO_NULL, // st_path3s, - ST_INFO_NULL, // st_path4, - - ST_INFO_NULL, // st_pain, - ST_INFO_NULL, // st_pain1, - - {0, SPR_TRANS_SHOOT1, 30, NULL, NULL, st_shoot2}, // st_shoot1, - {0, SPR_TRANS_SHOOT2, 10, NULL, T_Shoot, st_shoot3}, // st_shoot2, - {0, SPR_TRANS_SHOOT3, 10, NULL, T_Shoot, st_shoot4}, // st_shoot3, - {0, SPR_TRANS_SHOOT2, 10, NULL, T_Shoot, st_shoot5}, // st_shoot4, - {0, SPR_TRANS_SHOOT3, 10, NULL, T_Shoot, st_shoot6}, // st_shoot5, - {0, SPR_TRANS_SHOOT2, 10, NULL, T_Shoot, st_shoot7}, // st_shoot6, - {0, SPR_TRANS_SHOOT3, 10, NULL, T_Shoot, st_shoot8}, // st_shoot7, - {0, SPR_TRANS_SHOOT1, 10, NULL, NULL, st_chase1}, // st_shoot8, - ST_INFO_NULL, // st_shoot9, - - {0, SPR_TRANS_W1, 10, T_Chase, NULL, st_chase1s}, // st_chase1, - {0, SPR_TRANS_W1, 3, NULL, NULL, st_chase2}, // st_chase1s, - {0, SPR_TRANS_W2, 8, T_Chase, NULL, st_chase3}, // st_chase2, - {0, SPR_TRANS_W3, 10, T_Chase, NULL, st_chase3s}, // st_chase3, - {0, SPR_TRANS_W3, 3, NULL, NULL, st_chase4}, // st_chase3s, - {0, SPR_TRANS_W4, 8, T_Chase, NULL, st_chase1}, // st_chase4, - - {0, SPR_TRANS_W1, 1, NULL, A_DeathScream, st_die2}, // st_die1, - {0, SPR_TRANS_W1, 1, NULL, NULL, st_die3}, // st_die2, - {0, SPR_TRANS_DIE1, 15, NULL, NULL, st_die4}, // st_die3, - {0, SPR_TRANS_DIE2, 15, NULL, NULL, st_die5}, // st_die4, - {0, SPR_TRANS_DIE3, 15, NULL, NULL, st_dead}, // st_die5, - ST_INFO_NULL, // st_die6, - ST_INFO_NULL, // st_die7, - ST_INFO_NULL, // st_die8, - ST_INFO_NULL, // st_die9, - - {0, SPR_TRANS_DEAD, 0, NULL, NULL, st_dead} // st_dead - }, - // en_uber, - { - {0, SPR_UBER_W1, 0, T_Stand, NULL, st_stand}, // st_stand, - - ST_INFO_NULL, // st_path1, - ST_INFO_NULL, // st_path1s, - ST_INFO_NULL, // st_path2, - ST_INFO_NULL, // st_path3, - ST_INFO_NULL, // st_path3s, - ST_INFO_NULL, // st_path4, - - ST_INFO_NULL, // st_pain, - ST_INFO_NULL, // st_pain1, - - {0, SPR_UBER_SHOOT1, 30, NULL, NULL, st_shoot2}, // st_shoot1, - {0, SPR_UBER_SHOOT2, 12, NULL, T_UShoot, st_shoot3}, // st_shoot2, - {0, SPR_UBER_SHOOT3, 12, NULL, T_UShoot, st_shoot4}, // st_shoot3, - {0, SPR_UBER_SHOOT4, 12, NULL, T_UShoot, st_shoot5}, // st_shoot4, - {0, SPR_UBER_SHOOT3, 12, NULL, T_UShoot, st_shoot6}, // st_shoot5, - {0, SPR_UBER_SHOOT2, 12, NULL, T_UShoot, st_shoot7}, // st_shoot6, - {0, SPR_UBER_SHOOT1, 12, NULL, NULL, st_chase1}, // st_shoot7, - ST_INFO_NULL, // st_shoot8, - ST_INFO_NULL, // st_shoot9, - - {0, SPR_UBER_W1, 10, T_Chase, NULL, st_chase1s}, // st_chase1, - {0, SPR_UBER_W1, 3, NULL, NULL, st_chase2}, // st_chase1s, - {0, SPR_UBER_W2, 8, T_Chase, NULL, st_chase3}, // st_chase2, - {0, SPR_UBER_W3, 10, T_Chase, NULL, st_chase3s}, // st_chase3, - {0, SPR_UBER_W3, 3, NULL, NULL, st_chase4}, // st_chase3s, - {0, SPR_UBER_W4, 8, T_Chase, NULL, st_chase1}, // st_chase4, - - {0, SPR_UBER_W1, 1, NULL, A_DeathScream, st_die2}, // st_die1, - {0, SPR_UBER_W1, 1, NULL, NULL, st_die3}, // st_die2, - {0, SPR_UBER_DIE1, 15, NULL, NULL, st_die4}, // st_die3, - {0, SPR_UBER_DIE2, 15, NULL, NULL, st_die5}, // st_die4, - {0, SPR_UBER_DIE3, 15, NULL, NULL, st_die6}, // st_die5, - {0, SPR_UBER_DIE4, 15, NULL, NULL, st_dead}, // st_die6, - ST_INFO_NULL, // st_die7, - ST_INFO_NULL, // st_die8, - ST_INFO_NULL, // st_die9, - - {0, SPR_UBER_DEAD, 0, NULL, NULL, st_dead} // st_dead - }, - // en_will, - { - {0, SPR_WILL_W1, 0, T_Stand, NULL, st_stand}, // st_stand, - - ST_INFO_NULL, // st_path1, - ST_INFO_NULL, // st_path1s, - ST_INFO_NULL, // st_path2, - ST_INFO_NULL, // st_path3, - ST_INFO_NULL, // st_path3s, - ST_INFO_NULL, // st_path4, - - ST_INFO_NULL, // st_pain, - ST_INFO_NULL, // st_pain1, - - {0, SPR_WILL_SHOOT1, 30, NULL, NULL, st_shoot2}, // st_shoot1, - {0, SPR_WILL_SHOOT2, 10, NULL, T_Launch, st_shoot3}, // st_shoot2, - {0, SPR_WILL_SHOOT3, 10, NULL, T_Shoot, st_shoot4}, // st_shoot3, - {0, SPR_WILL_SHOOT4, 10, NULL, T_Shoot, st_shoot5}, // st_shoot4, - {0, SPR_WILL_SHOOT3, 10, NULL, T_Shoot, st_shoot6}, // st_shoot5, - {0, SPR_WILL_SHOOT4, 10, NULL, T_Shoot, st_chase1}, // st_shoot6, - ST_INFO_NULL, // st_shoot7, - ST_INFO_NULL, // st_shoot8, - ST_INFO_NULL, // st_shoot9, - - {0, SPR_WILL_W1, 10, T_BossChase, NULL, st_chase1s}, // st_chase1, - {0, SPR_WILL_W1, 3, NULL, NULL, st_chase2}, // st_chase1s, - {0, SPR_WILL_W2, 8, T_BossChase, NULL, st_chase3}, // st_chase2, - {0, SPR_WILL_W3, 10, T_BossChase, NULL, st_chase3s}, // st_chase3, - {0, SPR_WILL_W3, 3, NULL, NULL, st_chase4}, // st_chase3s, - {0, SPR_WILL_W4, 8, T_BossChase, NULL, st_chase1}, // st_chase4, - - {0, SPR_WILL_W1, 1, NULL, A_DeathScream, st_die2}, // st_die1, - {0, SPR_WILL_W1, 10, NULL, NULL, st_die3}, // st_die2, - {0, SPR_WILL_DIE1, 10, NULL, NULL, st_die4}, // st_die3, - {0, SPR_WILL_DIE2, 10, NULL, NULL, st_die5}, // st_die4, - {0, SPR_WILL_DIE3, 10, NULL, NULL, st_dead}, // st_die5, - ST_INFO_NULL, // st_die6, - ST_INFO_NULL, // st_die7, - ST_INFO_NULL, // st_die8, - ST_INFO_NULL, // st_die9, - - {0, SPR_WILL_DEAD, 20, NULL, NULL, st_dead} // st_dead - }, - // en_death - { - {0, SPR_DEATH_W1, 0, T_Stand, NULL, st_stand}, // st_stand, - - ST_INFO_NULL, // st_path1, - ST_INFO_NULL, // st_path1s, - ST_INFO_NULL, // st_path2, - ST_INFO_NULL, // st_path3, - ST_INFO_NULL, // st_path3s, - ST_INFO_NULL, // st_path4, - - ST_INFO_NULL, // st_pain, - ST_INFO_NULL, // st_pain1, - - {0, SPR_DEATH_SHOOT1, 30, NULL, NULL, st_shoot2}, // st_shoot1, - {0, SPR_DEATH_SHOOT2, 10, NULL, T_Launch, st_shoot3}, // st_shoot2, - {0, SPR_DEATH_SHOOT4, 10, NULL, T_Shoot, st_shoot4}, // st_shoot3, - {0, SPR_DEATH_SHOOT3, 10, NULL, T_Launch, st_shoot5}, // st_shoot4, - {0, SPR_DEATH_SHOOT4, 10, NULL, T_Shoot, st_chase1}, // st_shoot5, - ST_INFO_NULL, // st_shoot6, - ST_INFO_NULL, // st_shoot7, - ST_INFO_NULL, // st_shoot8, - ST_INFO_NULL, // st_shoot9, - - {0, SPR_DEATH_W1, 10, T_BossChase, NULL, st_chase1s}, // st_chase1, - {0, SPR_DEATH_W1, 3, NULL, NULL, st_chase2}, // st_chase1s, - {0, SPR_DEATH_W2, 8, T_BossChase, NULL, st_chase3}, // st_chase2, - {0, SPR_DEATH_W3, 10, T_BossChase, NULL, st_chase3s}, // st_chase3, - {0, SPR_DEATH_W3, 3, NULL, NULL, st_chase4}, // st_chase3s, - {0, SPR_DEATH_W4, 8, T_BossChase, NULL, st_chase1}, // st_chase4, - - {0, SPR_DEATH_W1, 1, NULL, A_DeathScream, st_die2}, // st_die1, - {0, SPR_DEATH_W1, 10, NULL, NULL, st_die3}, // st_die2, - {0, SPR_DEATH_DIE1, 10, NULL, NULL, st_die4}, // st_die3, - {0, SPR_DEATH_DIE2, 10, NULL, NULL, st_die5}, // st_die4, - {0, SPR_DEATH_DIE3, 10, NULL, NULL, st_die6}, // st_die5, - {0, SPR_DEATH_DIE4, 10, NULL, NULL, st_die7}, // st_die6, - {0, SPR_DEATH_DIE5, 10, NULL, NULL, st_die7}, // st_die7, - {0, SPR_DEATH_DIE6, 10, NULL, NULL, st_die7}, // st_die8, - ST_INFO_NULL, // st_die9, - - {0, SPR_DEATH_DEAD, 0, NULL, NULL, st_dead} // st_dead - } - -}; - -int starthitpoints[ 4 ][ NUMENEMIES ] = -// -// BABY MODE -// -{ - {25, // guards - 50, // officer - 100, // SS - 1, // dogs - 850, // Hans - 850, // Schabbs - 200, // fake hitler - 800, // mecha hitler - 500, // hitler - 45, // mutants - 25, // ghosts - 25, // ghosts - 25, // ghosts - 25, // ghosts - - 850, // Gretel - 850, // Gift - 850, // Fat - -// --- Projectiles - 0, // en_needle, - 0, // en_fire, - 0, // en_rocket, - 0, // en_smoke, - 100, // en_bj, -// --- Spear of destiny! - 0, // en_spark, - 0, // en_hrocket, - 0, // en_hsmoke, - - 5, // en_spectre, - 1450, // en_angel, - 850, // en_trans, - 1050, // en_uber, - 950, // en_will, - 1250 // en_death - }, - // - // DON'T HURT ME MODE - // - {25, // guards - 50, // officer - 100, // SS - 1, // dogs - 950, // Hans - 950, // Schabbs - 300, // fake hitler - 950, // mecha hitler - 700, // hitler - 55, // mutants - 25, // ghosts - 25, // ghosts - 25, // ghosts - 25, // ghosts - - 950, // Gretel - 950, // Gift - 950, // Fat - -// --- Projectiles - 0, // en_needle, - 0, // en_fire, - 0, // en_rocket, - 0, // en_smoke, - 100, // en_bj, -// --- Spear of destiny! - 0, // en_spark, - 0, // en_hrocket, - 0, // en_hsmoke, - - 10, // en_spectre, - 1550, // en_angel, - 950, // en_trans, - 1150, // en_uber, - 1050, // en_will, - 1350 // en_death - }, - // - // BRING 'EM ON MODE - // - {25, // guards - 50, // officer - 100, // SS - 1, // dogs - - 1050, // Hans - 1550, // Schabbs - 400, // fake hitler - 1050, // mecha hitler - 800, // hitler - - 55, // mutants - 25, // ghosts - 25, // ghosts - 25, // ghosts - 25, // ghosts - - 1050, // Gretel - 1050, // Gift - 1050, // Fat - -// --- Projectiles - 0, // en_needle, - 0, // en_fire, - 0, // en_rocket, - 0, // en_smoke, - 100, // en_bj, -// --- Spear of destiny! - 0, // en_spark, - 0, // en_hrocket, - 0, // en_hsmoke, - - 15, // en_spectre, - 1650, // en_angel, - 1050, // en_trans, - 1250, // en_uber, - 1150, // en_will, - 1450 // en_death - }, - // - // DEATH INCARNATE MODE - // - {25, // guards - 50, // officer - 100, // SS - 1, // dogs - - 1200, // Hans - 2400, // Schabbs - 500, // fake hitler - 1200, // mecha hitler - 900, // hitler - - 65, // mutants - 25, // ghosts - 25, // ghosts - 25, // ghosts - 25, // ghosts - - 1200, // Gretel - 1200, // Gift - 1200, // Fat - -// --- Projectiles - 0, // en_needle, - 0, // en_fire, - 0, // en_rocket, - 0, // en_smoke, - 100, // en_bj, -// --- Spear of destiny! - 0, // en_spark, - 0, // en_hrocket, - 0, // en_hsmoke, - - 25, // en_spectre, - 2000, // en_angel, - 1200, // en_trans, - 1400, // en_uber, - 1300, // en_will, - 1600 // en_death - } -}; - - -#endif /* __WOLF_ACT_STAT_H__ */ - diff --git a/wolf3d/newCode/wolf/wolf_actor_ai.c b/wolf3d/newCode/wolf/wolf_actor_ai.c deleted file mode 100644 index 05718df..0000000 --- a/wolf3d/newCode/wolf/wolf_actor_ai.c +++ /dev/null @@ -1,968 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2001 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_actor_ai.c: Wolfenstein3-D artificial intelligence. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - */ - -#include "../wolfiphone.h" - -const char dsounds[ 7 ][ 32 ] = -{ - "sfx/025.wav", - "sfx/026.wav", - "sfx/086.wav", - "sfx/088.wav", - "sfx/105.wav", - "sfx/107.wav", - "sfx/109.wav" -}; - -const char dsodsounds[ 7 ][ 32 ] = -{ - "sfx/021.wav", - "sfx/022.wav", - "sfx/052.wav", - "sfx/054.wav", - "sfx/057.wav", - "sfx/059.wav", - "sfx/061.wav" -}; - -/* ------------------------------------------------------------------------------ - Function: A_DeathScream() -Do a death scream sound depending on actor type. - - Parameters: self -[in] Valid Pointer to an entity_t structure. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void A_DeathScream( entity_t *self ) -{ - switch( self->type ) - { - case en_mutant: - if( g_version->value == SPEAROFDESTINY ) - { - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/033.wav" ), 1, ATTN_NORM, 0 ); - } - else - { - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/037.wav" ), 1, ATTN_NORM, 0 ); - } - break; - - case en_guard: - if( g_version->value == SPEAROFDESTINY ) - { - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( dsodsounds[ US_RndT() % 6 ] ), 1, ATTN_NORM, 0 ); - } - else - { - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( dsounds[ US_RndT() % 6 ] ), 1, ATTN_NORM, 0 ); - } - break; - - case en_officer: - if( g_version->value == SPEAROFDESTINY ) - { - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/046.wav" ), 1, ATTN_NORM, 0 ); - } - else - { - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/074.wav" ), 1, ATTN_NORM, 0 ); - } - break; - - case en_ss: - if( g_version->value == SPEAROFDESTINY ) - { - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/035.wav" ), 1, ATTN_NORM, 0 ); - } - else - { - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/046.wav" ), 1, ATTN_NORM, 0 ); - } - break; - - case en_dog: - if( g_version->value == SPEAROFDESTINY ) - { - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/031.wav" ), 1, ATTN_NORM, 0 ); - } - else - { - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/035.wav" ), 1, ATTN_NORM, 0 ); - } - break; - - case en_boss: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/019.wav" ), 1, ATTN_NORM, 0 ); - break; - - case en_schabbs: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/061.wav" ), 1, ATTN_NORM, 0 ); - break; - - case en_fake: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/069.wav" ), 1, ATTN_NORM, 0 ); - break; - - case en_mecha: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/084.wav" ), 1, ATTN_NORM, 0 ); - break; - - case en_hitler: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/044.wav" ), 1, ATTN_NORM, 0 ); - break; - - case en_gretel: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/115.wav" ), 1, ATTN_NORM, 0 ); - break; - - case en_gift: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/091.wav" ), 1, ATTN_NORM, 0 ); - break; - - case en_fat: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/119.wav" ), 1, ATTN_NORM, 0 ); - break; - - case en_spectre: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "lsfx/062.wav" ), 1, ATTN_NORM, 0 ); - break; - - case en_angel: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/098.wav" ), 1, ATTN_NORM, 0 ); - break; - - case en_trans: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/070.wav" ), 1, ATTN_NORM, 0 ); - break; - - case en_uber: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/082.wav" ), 1, ATTN_NORM, 0 ); - break; - - case en_will: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/072.wav" ), 1, ATTN_NORM, 0 ); - break; - - case en_death: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/090.wav" ), 1, ATTN_NORM, 0 ); - break; - } -} - -/* ------------------------------------------------------------------------------ - Function: A_FirstSighting() -Puts an actor into attack mode and possibly - reverses the direction if the player is - behind it. - - Parameters: self -[in] Valid Pointer to an entity_t structure. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void A_FirstSighting( entity_t *self ) -{ - switch( self->type ) - { - case en_guard: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/001.wav" ), 1, ATTN_NORM, 0 ); - self->speed *= 3; // go faster when chasing player - break; - - case en_officer: - if( g_version->value == SPEAROFDESTINY ) - { - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/043.wav" ), 1, ATTN_NORM, 0 ); - } - else - { - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/071.wav" ), 1, ATTN_NORM, 0 ); - } - self->speed *= 5; // go faster when chasing player - break; - - case en_mutant: - self->speed *= 3; // go faster when chasing player - break; - - case en_ss: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/015.wav" ), 1, ATTN_NORM, 0 ); - self->speed *= 4; // go faster when chasing player - break; - - case en_dog: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/002.wav" ), 1, ATTN_NORM, 0 ); - self->speed *= 2; // go faster when chasing player - break; - - case en_boss: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/017.wav" ), 1, ATTN_NORM, 0 ); - self->speed = SPDPATROL * 3; // go faster when chasing player - break; - - case en_gretel: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/112.wav" ), 1, ATTN_NORM, 0 ); - self->speed *= 3; // go faster when chasing player - break; - - case en_gift: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/096.wav" ), 1, ATTN_NORM, 0 ); - self->speed *= 3; // go faster when chasing player - break; - - case en_fat: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/102.wav" ), 1, ATTN_NORM, 0 ); - self->speed *= 3; // go faster when chasing player - break; - - case en_schabbs: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/065.wav" ), 1, ATTN_NORM, 0 ); - self->speed *= 3; // go faster when chasing player - break; - - case en_fake: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/054.wav" ), 1, ATTN_NORM, 0 ); - self->speed *= 3; // go faster when chasing player - break; - - case en_mecha: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/040.wav" ), 1, ATTN_NORM, 0 ); - self->speed *= 3; // go faster when chasing player - break; - - case en_hitler: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/040.wav" ), 1, ATTN_NORM, 0 ); - self->speed *= 5; // go faster when chasing player - break; - - case en_blinky: - case en_clyde: - case en_pinky: - case en_inky: - self->speed *= 2; // go faster when chasing player - break; - -// -// Spear of Destiny -// - case en_spectre: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "lsfx/003.wav" ), 1, ATTN_NORM, 0 ); - self->speed = 800; // go faster when chasing player - break; - - case en_angel: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/095.wav" ), 1, ATTN_NORM, 0 ); - self->speed = 1536; // go faster when chasing player - break; - - case en_trans: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/066.wav" ), 1, ATTN_NORM, 0 ); - self->speed = 1536; // go faster when chasing player - break; - - case en_uber: - self->speed = 3000; // go faster when chasing player - break; - - case en_will: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/073.wav" ), 1, ATTN_NORM, 0 ); - self->speed = 2048; // go faster when chasing player - break; - - case en_death: - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/085.wav" ), 1, ATTN_NORM, 0 ); - self->speed = 2048; // go faster when chasing player - break; - - default: - return; - } - - A_StateChange( self, st_chase1 ); - if( self->waitfordoorx ) - { - self->waitfordoorx = self->waitfordoory = 0; // ignore the door opening command - } - - self->dir = dir8_nodir; - self->flags |= FL_ATTACKMODE | FL_FIRSTATTACK; -} - - -/* ------------------------------------------------------------------------------ - Function: A_KillActor() -Actor has been killed, so give points and spawn - powerups. - - Parameters: self -[in] Valid Pointer to an entity_t structure. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void A_KillActor( entity_t *self ) -{ - int tilex, tiley; - - tilex = self->tilex = self->x >> TILESHIFT; // drop item on center - tiley = self->tiley = self->y >> TILESHIFT; - - switch( self->type ) - { - case en_guard: - PL_GivePoints( &Player, 100 ); - Powerup_Spawn( tilex, tiley, pow_clip2, r_world ); - break; - - case en_officer: - PL_GivePoints( &Player, 400 ); - Powerup_Spawn( tilex, tiley, pow_clip2, r_world ); - break; - - case en_mutant: - PL_GivePoints( &Player, 700 ); - Powerup_Spawn( tilex, tiley, pow_clip2, r_world ); - break; - - case en_ss: - PL_GivePoints( &Player, 500 ); - if( Player.items & ITEM_WEAPON_3 ) // have a schmeiser? - { - Powerup_Spawn( tilex, tiley, pow_clip2, r_world ); - } - else - { - Powerup_Spawn( tilex, tiley, pow_machinegun, r_world ); - } - break; - - case en_dog: - PL_GivePoints( &Player, 200 ); - break; - - case en_boss: - PL_GivePoints( &Player, 5000 ); - Powerup_Spawn( tilex, tiley, pow_key1, r_world ); - break; - - case en_gretel: - PL_GivePoints( &Player, 5000 ); - Powerup_Spawn( tilex, tiley, pow_key1, r_world ); - break; - - case en_gift: - PL_GivePoints( &Player, 5000 ); - A_StartDeathCam( self ); - break; - - case en_fat: - PL_GivePoints( &Player, 5000 ); - A_StartDeathCam( self ); - break; - - case en_schabbs: - PL_GivePoints( &Player, 5000 ); - A_DeathScream( self ); - A_StartDeathCam( self ); - break; - - case en_fake: - PL_GivePoints( &Player, 2000 ); - break; - - case en_mecha: - PL_GivePoints( &Player, 5000 ); - break; - - case en_hitler: - PL_GivePoints( &Player, 5000 ); - A_DeathScream( self ); - A_StartDeathCam( self ); - break; - - case en_spectre: - PL_GivePoints( &Player, 200 ); - break; - - case en_angel: - PL_GivePoints( &Player, 5000 ); - break; - - case en_trans: - PL_GivePoints( &Player, 5000 ); - Powerup_Spawn( tilex, tiley, pow_key1, r_world ); - break; - - case en_uber: - PL_GivePoints( &Player, 5000 ); - Powerup_Spawn( tilex, tiley, pow_key1, r_world ); - break; - - case en_will: - PL_GivePoints( &Player, 5000 ); - Powerup_Spawn( tilex, tiley, pow_key1, r_world ); - break; - - case en_death: - PL_GivePoints( &Player, 5000 ); - Powerup_Spawn( tilex, tiley, pow_key1, r_world ); - break; - } - - A_StateChange( self, st_die1 ); - - if ( ++levelstate.killed_monsters == levelstate.total_monsters ) { - iphoneSetNotifyText( "You killed the last enemy!" ); - } - - self->flags &= ~FL_SHOOTABLE; - self->flags |= FL_NONMARK; - -} - -/* ------------------------------------------------------------------------------ - Function: A_DamageActor() -Called when the player succesfully hits an enemy. - - Parameters: self -[in] Valid Pointer to an entity_t structure. - - Returns: Nothing. - - Notes: - Does damage points to enemy ob, either putting it into a stun frame or - killing it. ------------------------------------------------------------------------------ -*/ -PUBLIC void A_DamageActor( entity_t *self, int damage ) -{ - Player.madenoise = 1; - -// do double damage if shooting a non attack mode actor - if( ! (self->flags & FL_ATTACKMODE) ) - { - damage <<= 1; - } - - self->health -= damage; - - if( self->health <= 0 ) - { - A_KillActor( self ); - } - else - { - if( ! (self->flags & FL_ATTACKMODE) ) - { - A_FirstSighting( self ); // put into combat mode - } - - switch( self->type ) // dogs only have one hit point - { - case en_guard: - case en_officer: - case en_mutant: - case en_ss: - if( self->health & 1 ) - { - A_StateChange( self, st_pain ); - } - else - { - A_StateChange( self, st_pain1 ); - } - break; - } - } -} - -/////////////////////////// -// -// Hitler -// -/////////////////////////// - - -/* ------------------------------------------------------------------------------ - Function: A_MechaSound -Play Mecha sound. - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void A_MechaSound( entity_t *self ) -{ - if( areabyplayer[ self->areanumber ] ) - { - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/080.wav" ), 1, ATTN_NORM, 0 ); - } -} - -/* ------------------------------------------------------------------------------ - Function: A_Slurpie -Play Slurpie sound. - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void A_Slurpie( entity_t *self ) -{ - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "lsfx/061.wav" ), 1, ATTN_NORM, 0 ); -} - - -/* ------------------------------------------------------------------------------ - Function: A_HitlerMorph() -Spawn new actor, when Mecha Hitler is dead. - - Parameters: self -[in] Valid Pointer to an entity_t structure. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void A_HitlerMorph( entity_t *self ) -{ - int hitpoints[ 4 ] = { 500, 700, 800, 900 }; - entity_t *hitler; - - hitler = GetNewActor(); - if( ! hitler ) - { - return; - } - - hitler->x = self->x;// - hitler->y = self->y;// - hitler->distance = self->distance; - hitler->tilex = self->tilex;// - hitler->tiley = self->tiley;// - hitler->angle = self->angle;// - hitler->dir = self->dir;// - hitler->health = hitpoints[ (int)skill->value ]; - hitler->areanumber = self->areanumber; - hitler->state = st_chase1;// - hitler->type = en_hitler; // - hitler->speed = SPDPATROL * 5;// - hitler->ticcount = 0;// - hitler->flags=self->flags | FL_SHOOTABLE; // - hitler->sprite = Sprite_GetNewSprite(); - - if ( ++levelstate.killed_monsters == levelstate.total_monsters ) { - iphoneSetNotifyText( "You killed the last enemy!" ); - } -} - -/////////////////////////// -// -// Angel of Death -// -/////////////////////////// - -/* - Angel can't shoot more then 3 sparks in a row. - It will get tired! -*/ - -PRIVATE int angel_temp = 0; - -// - -/* ------------------------------------------------------------------------------ - Function: A_Breathing -Play Angel of Death Breathing sound. - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void A_Breathing( entity_t *self ) -{ - Sound_StartSound( NULL, 0, CHAN_VOICE, Sound_RegisterSound( "lsfx/080.wav" ), 1, ATTN_NORM, 0 ); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void A_StartAttack( entity_t *self ) -{ - angel_temp = 0; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void A_Relaunch( entity_t *self ) -{ - if( ++angel_temp == 3 ) - { - A_StateChange( self, st_pain ); - return; - } - - if( US_RndT() & 1 ) - { - A_StateChange( self, st_chase1 ); - return; - } -} - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void A_Victory( entity_t *self ) -{ - iphoneStartIntermission( 0 ); -} - - -/* ------------------------------------------------------------------------------ - Function: A_Dormant() -Entity is dormant state. - - Parameters: self -[in] Valid Pointer to an entity_t structure. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void A_Dormant( entity_t *self ) -{ - int deltax, deltay; - int xl, xh, yl, yh, x, y, n; - - deltax = self->x - Player.position.origin[ 0 ]; - - if( deltax < -MINACTORDIST || deltax > MINACTORDIST ) - { - goto moveok; - } - - deltay = self->y - Player.position.origin[ 1 ]; - if( deltay < -MINACTORDIST || deltay > MINACTORDIST ) - { - goto moveok; - } - - return; - -moveok: - xl = (self->x - MINDIST) >> TILESHIFT; - xh = (self->x + MINDIST) >> TILESHIFT; - yl = (self->y - MINDIST) >> TILESHIFT; - yh = (self->y + MINDIST) >> TILESHIFT; - - for( y = yl ; y <= yh ; ++y ) - for( x = xl ; x <= xh ; ++x ) - { - if( r_world->tilemap[ x ][ y ] & SOLID_TILE ) - { - return; - } - - for( n = 0 ; n < NumGuards ; ++n ) - { - if( Guards[ n ].state >= st_die1 ) - { - continue; - } - - if( Guards[ n ].tilex == x && Guards[ n ].tiley == y ) - { - return; // another guard in path - } - } - } - - self->flags |= FL_AMBUSH | FL_SHOOTABLE; - self->flags &= ~FL_ATTACKMODE; - self->dir = dir8_nodir; - A_StateChange( self, st_path1 ); -} - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void A_StartDeathCam( entity_t *self ) -{ - // the DeathCam feature isn't implimented, but we want to give the animation time - // to play before declaring victory. - iphoneStartIntermission( 50 ); -} - - -/* ------------------------------------------------------------------------------ - Function: A_Smoke() -Rockets emmit smoke. - - Parameters: self -[in] Valid Pointer to an entity_t structure. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void A_Smoke( entity_t *self ) -{ - entity_t *smoke; - - smoke = GetNewActor(); - if( ! smoke ) - { - return; - } - - smoke->x = self->x; - smoke->y = self->y; - smoke->tilex = self->tilex; - smoke->tiley = self->tiley; - smoke->state = st_die1; - smoke->type = (self->type==en_hrocket) ? en_hsmoke : en_smoke; - smoke->ticcount = 6; - smoke->flags = FL_NEVERMARK; - smoke->sprite = Sprite_GetNewSprite(); -} - - -/* ------------------------------------------------------------------------------ - Function: ProjectileTryMove() -Called when projectile is airborne. - - Parameters: self -[in] Valid Pointer to an entity_t structure. - lvl -[in] Valid Pointer to LevelData_t structure. - - Returns: true if move ok, otherwise false. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE _boolean ProjectileTryMove( entity_t *self, LevelData_t *lvl ) -{ - #define PROJSIZE 0x2000 - - - int xl, yl, xh, yh, x, y; - - xl = (self->x - PROJSIZE) >> TILESHIFT; - yl = (self->y - PROJSIZE) >> TILESHIFT; - - xh = (self->x + PROJSIZE) >> TILESHIFT; - yh = (self->y + PROJSIZE) >> TILESHIFT; - - // Checking for solid walls: - for( y = yl ; y <= yh ; ++y ) - { - for( x = xl ; x <= xh ; ++x ) - { -// FIXME: decide what to do with statics & Doors! - if( lvl->tilemap[ x ][ y ] & (WALL_TILE | BLOCK_TILE) ) - { - return false; - } - - if( lvl->tilemap[ x ][ y ] & DOOR_TILE ) - { - if( Door_Opened( &lvl->Doors, x, y ) != DOOR_FULLOPEN ) - { - return false; - } - } - } - } -// FIXME: Projectile will fly through objects (even guards & columns) - must fix to create rocket launcher! - return true; -} - - -/* ------------------------------------------------------------------------------ - Function: T_Projectile() -Called when projectile is airborne. - - Parameters: self -[in] Valid Pointer to an entity_t structure. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void T_Projectile( entity_t *self ) -{ - #define PROJECTILESIZE 0xC000 - - - int deltax, deltay, speed, damage; - - speed = self->speed * tics; - - deltax = (int)(speed * CosTable[ self->angle ]); - deltay = (int)(speed * SinTable[ self->angle ]); - - if( deltax > TILEGLOBAL ) - { - deltax = TILEGLOBAL; - } - - if( deltax < -TILEGLOBAL ) - { - deltax = -TILEGLOBAL; // my - } - - if( deltay > TILEGLOBAL) - { - deltay = TILEGLOBAL; - } - - if( deltay < -TILEGLOBAL) - { - deltay = -TILEGLOBAL; // my - } - - self->x += deltax; - self->y += deltay; - - deltax = ABS( self->x-Player.position.origin[ 0 ] ); - deltay = ABS( self->y-Player.position.origin[ 1 ] ); - - if( ! ProjectileTryMove( self, r_world ) ) - { - if( self->type == en_rocket || self->type == en_hrocket ) - { // rocket ran into obstacle, draw explosion! - if( g_version->value == SPEAROFDESTINY ) - { - Sound_StartSound( NULL, 1, CHAN_WEAPON, Sound_RegisterSound( "lsfx/001.wav" ), 1, ATTN_NORM, 0 ); - } - else - { - Sound_StartSound( NULL, 1, CHAN_WEAPON, Sound_RegisterSound( "lsfx/086.wav" ), 1, ATTN_NORM, 0 ); - } - A_StateChange( self, st_die1 ); - } - else - { - A_StateChange( self, st_remove ); // mark for removal - } - return; - } - - if( deltax < PROJECTILESIZE && deltay < PROJECTILESIZE ) - { // hit the player - switch( self->type ) - { - case en_needle: - damage = (US_RndT() >> 3) + 20; - break; - - case en_rocket: - case en_hrocket: - case en_spark: - damage = (US_RndT()>>3) + 30; - break; - - case en_fire: - damage = (US_RndT() >> 3); - break; - - default: - damage = 0; - break; - } - - PL_Damage( &Player, self, damage ); - A_StateChange( self, st_remove ); // mark for removal - return; - } - - self->tilex = self->x >> TILESHIFT; - self->tiley = self->y >> TILESHIFT; -} diff --git a/wolf3d/newCode/wolf/wolf_actor_ai.h b/wolf3d/newCode/wolf/wolf_actor_ai.h deleted file mode 100644 index f428cb6..0000000 --- a/wolf3d/newCode/wolf/wolf_actor_ai.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000-2002 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_actor_ai.h: Wolfenstein3-D entity management. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - * Portion of this code was derived from Wolfenstein3-D, and was originally - * written by Id Software, Inc. - * - */ - -/* - Notes: - This module is implemented by wolf_actor_ai.c. - -*/ - -#ifndef __WOLF_ACTOR_AI_H__ -#define __WOLF_ACTOR_AI_H__ - -#include "wolf_actors.h" - -extern void A_DeathScream( entity_t *self ); -extern void A_FirstSighting( entity_t *self ); -extern void A_DamageActor( entity_t *self, int damage ); - -// hitler -extern void A_MechaSound( entity_t *self ); -extern void A_Slurpie( entity_t *self ); -extern void A_HitlerMorph( entity_t *self ); - -// angel -extern void A_Breathing( entity_t *self ); -extern void A_StartAttack( entity_t *self ); -extern void A_Relaunch( entity_t *self ); -extern void A_Victory( entity_t *self ); - -// ghost -extern void A_Dormant( entity_t *self ); - -extern void A_StartDeathCam( entity_t *self ); - -// missiles -extern void T_Projectile( entity_t *self ); -extern void A_Smoke( entity_t *self ); - - -#endif /* __WOLF_ACTOR_AI_H__ */ diff --git a/wolf3d/newCode/wolf/wolf_actors.c b/wolf3d/newCode/wolf/wolf_actors.c deleted file mode 100644 index 51f97e0..0000000 --- a/wolf3d/newCode/wolf/wolf_actors.c +++ /dev/null @@ -1,471 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2001 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_actors.c: Wolfenstein3-D actor manager. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - */ - -#include "../wolfiphone.h" - -#include "wolf_act_stat.h" - -entity_t Guards[ MAX_GUARDS + 1 ], *New; -W16 NumGuards = 0; -W8 add8dir[ 9 ] = { 4, 5, 6, 7, 0, 1, 2, 3, 0 }; -W8 r_add8dir[ 9 ]= { 4, 7, 6, 5, 0, 1, 2, 3, 0 }; - - - -/* ------------------------------------------------------------------------------ - Function: A_StateChange -Changes guard's state to that defined in NewState. - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void A_StateChange( entity_t *ent, en_state NewState ) -{ - ent->state = NewState; - assert( ent->type >= 0 && ent->type < NUMENEMIES ); - if ( NewState == st_remove ) { - ent->ticcount = 0; - } else { - assert( ent->state >= 0 && ent->state < NUMSTATES ); - ent->ticcount = objstate[ ent->type ][ ent->state ].timeout; //0; - } -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PRIVATE int DoGuard( entity_t *ent ) // FIXME: revise! -{ // returns 0 if we must remove this Guard from Guards list, otherwise 1; - think_t think; - - assert( ent->tilex >= 0 && ent->tilex < 64 ); - assert( ent->tiley >= 0 && ent->tiley < 64 ); - assert( ent->dir >= 0 && ent->dir <= 8 ); - - // ticcounts fire discrete actions separate from think functions - if ( ent->ticcount ) { - ent->ticcount -= tics; - while( ent->ticcount <= 0 ) - { - assert( ent->type >= 0 && ent->type < NUMENEMIES ); - assert( ent->state >= 0 && ent->state < NUMSTATES ); - think = objstate[ ent->type ][ ent->state ].action; // end of state action - if( think ) - { - think( ent ); - if( ent->state == st_remove ) - { - return 0; - } - } - - ent->state = objstate[ ent->type ][ ent->state ].next_state; - if( ent->state == st_remove ) - { - return 0; - } - - if( ! objstate[ ent->type ][ ent->state ].timeout ) - { - ent->ticcount = 0; - break; - } - - ent->ticcount += objstate[ ent->type ][ ent->state ].timeout; - } - } - -// -// think -// - assert( ent->type >= 0 && ent->type < NUMENEMIES ); - assert( ent->state >= 0 && ent->state < NUMSTATES ); - think = objstate[ ent->type ][ ent->state ].think; - if( think ) - { - think( ent ); - if( ent->state == st_remove ) - { - return 0; - } - } - - return 1; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PRIVATE void RemoveActor( entity_t *actor ) -{ - Sprite_RemoveSprite( actor->sprite ); - memmove( actor, actor+1, (int)(&Guards[ NumGuards ]) - (int)(actor+1) ); - NumGuards--; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void ProcessGuards( void ) -{ - int n, tex; - assert( NumGuards < MAX_GUARDS ); - for( n = 0 ; n < NumGuards ; ++n ) - { - if( ! DoGuard( &Guards[ n ] ) ) - { // remove guard from the game forever! - RemoveActor( &Guards[ n-- ] ); - continue; - } - - Sprite_SetPos( Guards[ n ].sprite, Guards[ n ].x, Guards[ n ].y, Guards[ n ].angle ); - tex = objstate[ Guards[ n ].type ][ Guards[ n ].state ].texture; - - if( objstate[ Guards[ n ].type ][ Guards[ n ].state ].rotate ) - { - if( Guards[ n ].type == en_rocket || Guards[ n ].type == en_hrocket ) - { - tex += r_add8dir[ Get8dir( angle_wise( FINE2RAD(Player.position.angle), FINE2RAD(Guards[ n ].angle) ) ) ]; - } - else - { - tex += add8dir[ Get8dir( angle_wise( FINE2RAD(Player.position.angle), FINE2RAD(Guards[ n ].angle) ) ) ]; - } - } - - Sprite_SetTex( Guards[ n ].sprite, 0, tex ); - } -} - - -/* ------------------------------------------------------------------------------ - Function: ResetGuards -Reset actors status - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void ResetGuards( void ) -{ - memset( Guards, 0, sizeof( Guards ) ); - NumGuards = 0; - New = NULL; -} - - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC entity_t *GetNewActor( void ) -{ - if( NumGuards > MAX_GUARDS ) - { - return NULL; - } - - memset( &Guards[ NumGuards ], 0, sizeof( Guards[ 0 ] ) ); - - return &Guards[ NumGuards++ ]; -} - - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC entity_t *SpawnActor( enemy_t which, int x, int y, dir4type dir, LevelData_t *lvl ) -{ - entity_t *new_actor; - - new_actor = GetNewActor(); - if( ! new_actor ) - { - return NULL; - } - - new_actor->x = TILE2POS( x ); - new_actor->y = TILE2POS( y ); - - new_actor->tilex = x; - new_actor->tiley = y; - - assert( dir >= 0 && dir <= 4 ); - new_actor->angle = dir4angle[ dir ]; - new_actor->dir = dir4to8[ dir ]; - - new_actor->areanumber = lvl->areas[ x ][ y ]; -// Com_Printf( "Actor at %i,%i had areaNum: %i\n", x, y, new_actor->areanumber ); - if ( new_actor->areanumber < 0 ) { - // ambush marker tiles are listed as -3 area - new_actor->areanumber = 0; - } - - assert( new_actor->areanumber >= 0 && new_actor->areanumber < NUMAREAS ); - new_actor->type = which; - - new_actor->health = starthitpoints[ (int)skill->value ][ which ]; - new_actor->sprite = Sprite_GetNewSprite(); - - return new_actor; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void SpawnStand( enemy_t which, int x, int y, int dir, LevelData_t *lvl ) -{ - entity_t *self; - - self = SpawnActor( which, x, y, dir, r_world ); - if( ! self ) - { - return; - } - - self->state = st_stand; - self->speed = SPDPATROL; - self->ticcount = objstate[ which ][ st_stand ].timeout ? US_RndT() % objstate[ which ][ st_stand ].timeout + 1 : 0; - self->flags |= FL_SHOOTABLE; - if( lvl->tilemap[ x ][ y ] & AMBUSH_TILE ) - { - self->flags |= FL_AMBUSH; - } - - levelstate.total_monsters++; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void SpawnPatrol( enemy_t which, int x, int y, int dir ) -{ - entity_t *self; - - self = SpawnActor( which, x, y, dir, r_world ); - if( ! self ) - { - return; - } - - self->state = st_path1; - self->speed = (which == en_dog) ? SPDDOG : SPDPATROL; - self->distance = TILEGLOBAL; - self->ticcount = objstate[ which ][ st_path1 ].timeout ? US_RndT() % objstate[ which ][ st_path1 ].timeout + 1 : 0; - self->flags |= FL_SHOOTABLE; - - levelstate.total_monsters++; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void SpawnDeadGuard( enemy_t which, int x, int y ) -{ - entity_t *self; - - self = SpawnActor( which, x, y, dir4_nodir, r_world ); - if( ! self ) - { - return; - } - - self->state = st_dead; - self->speed = 0; - self->health = 0; - self->ticcount = objstate[ which ][ st_dead ].timeout ? US_RndT() % objstate[ which ][ st_dead ].timeout + 1 : 0; - -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void SpawnBoss( enemy_t which, int x, int y ) -{ - entity_t *self; - dir4type face; - - switch( which ) - { - case en_boss: - case en_schabbs: - case en_fat: - case en_hitler: - face = dir4_south; - break; - - case en_fake: - case en_gretel: - case en_gift: - face = dir4_north; - break; - - case en_trans: - case en_uber: - case en_will: - case en_death: - case en_angel: - case en_spectre: - face = dir4_nodir; - break; - - default: - face = dir4_nodir; - break; - } - - self = SpawnActor( which, x, y, face, r_world ); - if( ! self ) - { - return; - } - - self->state = which == en_spectre ? st_path1 : st_stand; - self->speed = SPDPATROL; - self->health = starthitpoints[ (int)skill->value ][ which ]; - self->ticcount = objstate[ which ][ st_stand ].timeout ? US_RndT() % objstate[ which ][ st_stand ].timeout + 1 : 0; - self->flags |= FL_SHOOTABLE | FL_AMBUSH; - - levelstate.total_monsters++; - -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void SpawnGhosts( enemy_t which, int x, int y ) -{ - entity_t *self; - - self = SpawnActor( which, x, y, dir4_nodir, r_world ); - if( ! self ) - { - return; - } - - self->state = st_chase1; - self->speed = SPDPATROL * 3; - self->health = starthitpoints[ (int)skill->value ][ which ]; - self->ticcount = objstate[ which ][ st_chase1 ].timeout ? US_RndT() % objstate[ which ][ st_chase1 ].timeout + 1: 0; - self->flags |= FL_AMBUSH; - - levelstate.total_monsters++; -} diff --git a/wolf3d/newCode/wolf/wolf_actors.h b/wolf3d/newCode/wolf/wolf_actors.h deleted file mode 100644 index d7439b8..0000000 --- a/wolf3d/newCode/wolf/wolf_actors.h +++ /dev/null @@ -1,172 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000-2002 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_actors.h: Wolfenstein3-D entity management. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - * Portion of this code was derived from Wolfenstein3-D, and was originally - * written by Id Software, Inc. - * - */ - -/* - Notes: - This module is implemented by wolf_actors.c - -*/ - -#ifndef __WOLF_ACTORS_H__ -#define __WOLF_ACTORS_H__ - -#define SPDPATROL 512 -#define SPDDOG 1500 - -#define FL_SHOOTABLE 1 -#define FL_BONUS 2 -#define FL_NEVERMARK 4 -#define FL_VISABLE 8 -#define FL_ATTACKMODE 16 -#define FL_FIRSTATTACK 32 -#define FL_AMBUSH 64 -#define FL_NONMARK 128 - -#define MAX_GUARDS 255 -#define NUMENEMIES 31 -#define NUMSTATES 34 - -#define MINACTORDIST 0x10000 // minimum dist from player center to any actor center - -typedef enum -{ - en_guard, - en_officer, - en_ss, - en_dog, - en_boss, - en_schabbs, - en_fake, - en_mecha, - en_hitler, - en_mutant, - en_blinky, - en_clyde, - en_pinky, - en_inky, - en_gretel, - en_gift, - en_fat, -// --- Projectiles - en_needle, - en_fire, - en_rocket, - en_smoke, - en_bj, -// --- Spear of destiny! - en_spark, - en_hrocket, - en_hsmoke, - - en_spectre, - en_angel, - en_trans, - en_uber, - en_will, - en_death - -} enemy_t; - -typedef enum -{ - st_stand, - st_path1, st_path1s, st_path2, st_path3, st_path3s, st_path4, - st_pain, st_pain1, - st_shoot1, st_shoot2, st_shoot3, st_shoot4, st_shoot5, st_shoot6, st_shoot7, st_shoot8, st_shoot9, - st_chase1, st_chase1s, st_chase2, st_chase3, st_chase3s, st_chase4, - st_die1, st_die2, st_die3, st_die4, st_die5, st_die6, st_die7, st_die8, st_die9, - st_dead, - st_remove - -} en_state; - -typedef struct entity_s -{ - int x, y, angle; - int type; - int health; - int max_health; - int speed; - int ticcount; - int temp2; - int distance; - char tilex, tiley; - char areanumber; - int waitfordoorx, waitfordoory; // waiting on this door if non 0 - W8 flags; // FL_SHOOTABLE, etc - en_state state; - dir8type dir; - int sprite; - -} entity_t; - -typedef void (*think_t)( entity_t *self ); - -typedef struct -{ - char rotate; // 1-if object can be rotated, 0 if one sprite for every direction - int texture; // base object's state texture if rotation is on facing player - int timeout; // after how man ticks change state to .next_state - think_t think; // what to do every frame - think_t action; // what to do once per state - en_state next_state; // next state - -} stateinfo; - - - -extern entity_t Guards[ MAX_GUARDS + 1 ]; -extern entity_t *New; -extern W16 NumGuards; -extern stateinfo objstate[ NUMENEMIES ][ NUMSTATES ]; - -extern void ResetGuards(void); - - -extern entity_t *GetNewActor( void ); -extern entity_t *SpawnActor( enemy_t which, int x, int y, dir4type dir, LevelData_t *lvl ); -extern void A_StateChange( entity_t *Guard, en_state NewState ); - - -extern void SpawnStand( enemy_t which, int tilex, int tiley, int dir, LevelData_t *lvl ); -extern void SpawnPatrol( enemy_t which, int tilex, int tiley, int dir ); -extern void SpawnDeadGuard( enemy_t which, int x, int y ); -extern void SpawnBoss( enemy_t which, int x, int y ); -extern void SpawnGhosts( enemy_t which, int x, int y ); - - -#endif /* __WOLF_ACTORS_H__ */ - diff --git a/wolf3d/newCode/wolf/wolf_ai_com.c b/wolf3d/newCode/wolf/wolf_ai_com.c deleted file mode 100644 index dcdc6a4..0000000 --- a/wolf3d/newCode/wolf/wolf_ai_com.c +++ /dev/null @@ -1,1315 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000-2002 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_ai_com.c: Wolfenstein3-D actor manager. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - */ - -#include "../wolfiphone.h" - - - -#define RUNSPEED 6000 - - -/* ------------------------------------------------------------------------------ - Function: AI_ChangeDir() -Entity is going to move in a new direction. - - Parameters: - - Returns: 1 if direction is OK, otherwise 0. - - Notes: - Called, when actor finished previous moving & located in the 'center' of - the tile. Entity will try walking in direction. - ------------------------------------------------------------------------------ -*/ -PRIVATE int AI_ChangeDir( entity_t *self, dir8type new_dir, LevelData_t *lvl ) -{ - int oldx, oldy, newx, newy; // all it tiles - int n; - - oldx = POS2TILE( self->x ); - oldy = POS2TILE( self->y ); - assert( new_dir >= 0 && new_dir <= 8 ); - newx = oldx + dx8dir[ new_dir ]; - newy = oldy + dy8dir[ new_dir ]; - - if( new_dir & 0x01 ) // same as %2 (diagonal dir) - { - if( lvl->tilemap[ newx ][ oldy ] & SOLID_TILE || - lvl->tilemap[ oldx ][ newy ] & SOLID_TILE || - lvl->tilemap[ newx ][ newy ] & SOLID_TILE ) - { - return 0; - } - - for( n = 0 ; n < NumGuards ; ++n ) - { - if( Guards[ n ].state >= st_die1 ) - continue; - - if( Guards[ n ].tilex == newx && Guards[ n ].tiley == newy ) - return 0; // another guard in path - - if( Guards[ n ].tilex == oldx && Guards[ n ].tiley == newy ) - return 0; // another guard in path - - if( Guards[ n ].tilex == newx && Guards[ n ].tiley == oldy ) - return 0; // another guard in path - } - } - else // linear dir (E, N, W, S) - { - if( lvl->tilemap[ newx ][ newy ] & SOLID_TILE ) - { - return 0; - } - - if( lvl->tilemap[ newx ][ newy ] & DOOR_TILE ) - { - if( self->type == en_fake || self->type == en_dog) // they can't open doors - { - if( lvl->Doors.DoorMap[ newx ][ newy ].action != dr_open ) // path is blocked by a closed opened door - { - return 0; - } - } - else - { - self->waitfordoorx = newx; - self->waitfordoory = newy; - goto moveok; - } - } - for( n = 0 ; n < NumGuards ; ++n ) - { - if( Guards[ n ].state >= st_die1 ) - { - continue; - } - - if( Guards[ n ].tilex == newx && Guards[ n ].tiley == newy ) - { - return 0; // another guard in path - } - } - } - -moveok: - self->tilex = newx; - self->tiley = newy; - - lvl->tilemap[ oldx ][ oldy ] &= ~ACTOR_TILE; // update map status - lvl->tilemap[ newx ][ newy ] |= ACTOR_TILE; - - if( lvl->areas[ newx ][ newy ] > 0 ) - { // ambush tiles don't have valid area numbers (-3), so don't change the area if walking over them - self->areanumber = lvl->areas[ newx ][ newy ]; - assert( self->areanumber >= 0 && self->areanumber < NUMAREAS ); - } - - self->distance = TILEGLOBAL; - self->dir = new_dir; - - return 1; -} - -/* ------------------------------------------------------------------------------ - Function: AI_Path() -Entity is going to turn on a way point. - - Parameters: - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void AI_Path( entity_t *self ) -{ - if( r_world->tilemap[ self->x >> TILESHIFT ][ self->y >> TILESHIFT ] & WAYPOINT_TILE ) - { - long tileinfo = r_world->tilemap[self->x>>TILESHIFT][self->y>>TILESHIFT]; - if(tileinfo&TILE_IS_E_TURN) - self->dir=dir8_east; - else if(tileinfo&TILE_IS_NE_TURN) - self->dir=dir8_northeast; - else if(tileinfo&TILE_IS_N_TURN) - self->dir=dir8_north; - else if(tileinfo&TILE_IS_NW_TURN) - self->dir=dir8_northwest; - else if(tileinfo&TILE_IS_W_TURN) - self->dir=dir8_west; - else if(tileinfo&TILE_IS_SW_TURN) - self->dir=dir8_southwest; - else if(tileinfo&TILE_IS_S_TURN) - self->dir=dir8_south; - else if(tileinfo&TILE_IS_SE_TURN) - self->dir=dir8_southeast; - } - - if( ! AI_ChangeDir( self, self->dir, r_world )) - { - self->dir=dir8_nodir; - } -} - -/* ------------------------------------------------------------------------------ - Function: AI_Dodge() -Attempts to choose and initiate a movement for entity - that sends it towards the player while dodging. - - Parameters: - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void AI_Dodge( entity_t *self ) -{ - int deltax, deltay, i; - dir8type dirtry[ 5 ], turnaround, tdir; - - if( self->flags & FL_FIRSTATTACK ) - { -// turning around is only ok the very first time after noticing the player - turnaround = dir8_nodir; - self->flags &= ~FL_FIRSTATTACK; - } - else - { - turnaround = opposite8[ self->dir ]; - } - - deltax = POS2TILE( Player.position.origin[ 0 ] ) - POS2TILE( self->x ); - deltay = POS2TILE( Player.position.origin[ 1 ] ) - POS2TILE( self->y ); - -// -// arange 5 direction choices in order of preference -// the four cardinal directions plus the diagonal straight towards -// the player -// - - if( deltax > 0 ) - { - dirtry[ 1 ] = dir8_east; - dirtry[ 3 ] = dir8_west; - } - else - { - dirtry[ 1 ] = dir8_west; - dirtry[ 3 ] = dir8_east; - } - - if( deltay > 0 ) - { - dirtry[ 2 ] = dir8_north; - dirtry[ 4 ] = dir8_south; - } - else - { - dirtry[ 2 ] = dir8_south; - dirtry[ 4 ] = dir8_north; - } - -// randomize a bit for dodging - if( ABS( deltax ) > ABS( deltay ) ) - { - tdir = dirtry[1]; dirtry[1]=dirtry[2]; dirtry[2]=tdir; // => swap dirtry[1] & dirtry[2] - tdir = dirtry[3]; dirtry[3]=dirtry[4]; dirtry[4]=tdir; // => swap dirtry[3] & dirtry[4] - } - - if( US_RndT() < 128 ) - { - tdir=dirtry[1]; dirtry[1]=dirtry[2]; dirtry[2]=tdir; - tdir=dirtry[3]; dirtry[3]=dirtry[4]; dirtry[4]=tdir; - } - - dirtry[ 0 ] = diagonal[ dirtry[ 1 ] ][ dirtry[ 2 ] ]; - -// try the directions util one works - for( i = 0 ; i < 5 ; ++i ) - { - if( dirtry[ i ] == dir8_nodir || dirtry[ i ] == turnaround ) - { - continue; - } - - if( AI_ChangeDir( self, dirtry[ i ], r_world ) ) - { - return; - } - } - -// turn around only as a last resort - if( turnaround != dir8_nodir ) - { - if( AI_ChangeDir( self, turnaround, r_world ) ) - { - return; - } - } - - self->dir = dir8_nodir; -} - -/* ------------------------------------------------------------------------------ - Function: AI_Chase() -As AI_Dodge, but doesn't try to dodge. - - Parameters: - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void AI_Chase( entity_t *self ) -{ - int deltax, deltay; - dir8type d[2]; - dir8type tdir, olddir, turnaround; - - olddir = self->dir; - turnaround = opposite8[ olddir ]; - d[ 0 ] = d[ 1 ] = dir8_nodir; - - deltax = POS2TILE( Player.position.origin[ 0 ] ) - POS2TILE( self->x ); - deltay = POS2TILE( Player.position.origin[ 1 ] ) - POS2TILE( self->y ); - - if( deltax > 0 ) - { - d[ 0 ] = dir8_east; - } - else if( deltax < 0 ) - { - d[ 0 ] = dir8_west; - } - - if( deltay > 0 ) - { - d[ 1 ] = dir8_north; - } - else if( deltay < 0 ) - { - d[ 1 ] = dir8_south; - } - - if( ABS( deltay ) > ABS( deltax ) ) - { - tdir = d[ 0 ]; - d[ 0 ] = d[ 1 ]; - d[ 1 ] = tdir; - } // swap d[0] & d[1] - - if( d[ 0 ] == turnaround ) - { - d[ 0 ] = dir8_nodir; - } - - if( d[ 1 ] == turnaround ) - { - d[ 1 ] = dir8_nodir; - } - - if( d[ 0 ] != dir8_nodir ) - { - if( AI_ChangeDir( self, d[ 0 ], r_world ) ) - { - return; - } - } - - if( d[ 1 ] != dir8_nodir ) - { - if( AI_ChangeDir( self, d[ 1 ], r_world ) ) - { - return; - } - } - - // there is no direct path to the player, so pick another direction - if( olddir != dir8_nodir ) - { - if( AI_ChangeDir( self, olddir, r_world ) ) - { - return; - } - } - - if(US_RndT()>128) // randomly determine direction of search - { - for( tdir = dir8_east; tdir <= dir8_south; tdir += 2 ) // * Revision - { - if( tdir != turnaround ) - { - if( AI_ChangeDir(self, tdir, r_world) ) - { - return; - } - } - } - } - else - { - for( tdir = dir8_south; (int)tdir >= dir8_east; tdir -= 2 ) // * Revision (JDC fix for unsigned enums) - { - if( tdir != turnaround ) - { - if( AI_ChangeDir( self, tdir, r_world ) ) - { - return; - } - } - - } - } - - if( turnaround != dir8_nodir ) - { - if( AI_ChangeDir( self, turnaround, r_world ) ) - { - return; - } - } - - self->dir = dir8_nodir; // can't move -} - - -/* ------------------------------------------------------------------------------ - Function: AI_Retreat() -Run Away from player. - - Parameters: - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void AI_Retreat( entity_t *self ) -{ - int deltax, deltay; - dir8type d[2], tdir; - - deltax = POS2TILE( Player.position.origin[ 0 ] ) - POS2TILE( self->x ); - deltay = POS2TILE( Player.position.origin[ 1 ] ) - POS2TILE( self->y ); - - d[ 0 ] = deltax < 0 ? dir8_east : dir8_west; - d[ 1 ] = deltay < 0 ? dir8_north : dir8_south; - - if( ABS( deltay ) > ABS( deltax ) ) - { - tdir = d[ 0 ]; - d[ 0 ] = d[ 1 ]; - d[ 1 ] = tdir; - } // swap d[0] & d[1] - - if( AI_ChangeDir( self, d[ 0 ], r_world) ) - { - return; - } - - if( AI_ChangeDir( self, d[ 1 ], r_world) ) - { - return; - } - -// there is no direct path to the player, so pick another direction - - if( US_RndT() > 128 ) // randomly determine direction of search - { - for(tdir = dir8_east; tdir <= dir8_south; tdir += 2 ) // * Revision - { - if( AI_ChangeDir(self, tdir, r_world) ) - { - return; - } - } - } - else - { - for( tdir = dir8_south; (int)tdir >= dir8_east; tdir -= 2 ) // * Revision (JDC fix for unsigned enums) - { - if( AI_ChangeDir(self, tdir, r_world) ) - { - return; - } - } - } - - self->dir=dir8_nodir; // can't move -} - - -/* ------------------------------------------------------------------------------ - Function: AI_CheckSight() -Checks a straight line between player and - current object. - - Parameters: buf -[out] Storage location for data. - offset -[in] Number of bytes from beginning of file. - length -[in] Maximum number of items to be read. - - Returns: true if the player has been spoted, otherwise false. - - Notes: - If the sight is ok, check alertness and angle to see if they notice. ------------------------------------------------------------------------------ -*/ -PRIVATE _boolean AI_CheckSight( entity_t *self ) -{ - #define MINSIGHT 0x18000 - - - int deltax, deltay; - - -// don't bother tracing a line if the area isn't connected to the player's - if( ! (self->flags & FL_AMBUSH) ) - { - if( ! areabyplayer[ self->areanumber ] ) - { - return false; - } - } - -// if the player is real close, sight is automatic - deltax = Player.position.origin[ 0 ] - self->x; - deltay = Player.position.origin[ 1 ] - self->y; - - if( ABS( deltax ) < MINSIGHT && ABS( deltay ) < MINSIGHT ) - { - return true; - } - -// see if they are looking in the right direction - switch( self->dir ) - { - case dir8_north: - if( deltay < 0 ) - return false; - break; - - case dir8_east: - if( deltax < 0 ) - return false; - break; - - case dir8_south: - if( deltay > 0 ) - return false; - break; - - case dir8_west: - if( deltax > 0 ) - return false; - break; - } - -// trace a line to check for blocking tiles (corners) - return Level_CheckLine( self->x, self->y, Player.position.origin[0], Player.position.origin[1], r_world ); -} - - -/* ------------------------------------------------------------------------------ - Function: AI_FindTarget() -Called by entities that ARE NOT chasing the player. - - Parameters: - - Returns: - If the player is detected (by sight, noise, or proximity), the entity - is put into its combat frame and true is returned. - - Notes: - Incorporates a random reaction delay. ------------------------------------------------------------------------------ -*/ -PRIVATE _boolean AI_FindTarget( entity_t *self ) -{ - if( self->temp2 ) // count down reaction time - { - self->temp2 -= tics; - if( self->temp2 > 0 ) - { - return false; - } - self->temp2 = 0; // time to react - } - else - { - // check if we can/want to see/hear player - if( Player.flags & FL_NOTARGET ) - { - return false; // notarget cheat - } - assert( self->areanumber >= 0 && self->areanumber < NUMAREAS ); - if( ! (self->flags & FL_AMBUSH) && ! areabyplayer[ self->areanumber ] ) - { - return false; - } - - - if( ! AI_CheckSight( self ) ) // Player is visible - normal behavior - { - if( self->flags & FL_AMBUSH || ! Player.madenoise ) - { - return false; - } - } - self->flags &= ~FL_AMBUSH; - -// if we are here we see/hear player!!! - switch( self->type ) - { - case en_guard: - self->temp2 = 1 + US_RndT() / 4; - break; - - case en_officer: - self->temp2 = 2; - break; - - case en_mutant: - self->temp2 = 1 + US_RndT() / 6; - break; - - case en_ss: - self->temp2 = 1 + US_RndT() / 6; - break; - - case en_dog: - self->temp2 = 1 + US_RndT() / 8; - break; - - case en_boss: - case en_schabbs: - case en_fake: - case en_mecha: - case en_hitler: - case en_gretel: - case en_gift: - case en_fat: - case en_spectre: - case en_angel: - case en_trans: - case en_uber: - case en_will: - case en_death: - self->temp2 = 1; - break; - } - - return false; // we are amazed & waiting to understand what to do! - } - - A_FirstSighting( self ); - - return true; -} - - -/* ------------------------------------------------------------------------------ - Function: T_Move() -Moves object for distance in global units, - in ob->dir direction. - - Parameters: - - Returns: - If the player is detected (by sight, noise, or proximity), the entity - is put into its combat frame and true is returned. - - Notes: - ob->x = adjusted for new position - ob->y - - Actors are not allowed to move inside the player. - Does NOT check to see if the move is tile map valid. ------------------------------------------------------------------------------ -*/ -PRIVATE void T_Move( entity_t *self, long dist ) -{ - - if( self->dir == dir8_nodir || ! dist ) - { - return; - } - - self->x += dist * dx8dir[ self->dir ]; - self->y += dist * dy8dir[ self->dir ]; - -// check to make sure it's not on top of player - if( ABS( self->x - Player.position.origin[ 0 ] ) <= MINACTORDIST ) - if( ABS( self->y - Player.position.origin[ 1 ] ) <= MINACTORDIST ) - { - if(self->type==en_blinky|| - self->type==en_clyde || - self->type==en_pinky || - self->type==en_inky || - self->type==en_spectre) PL_Damage(&Player, self, 2); // ghosts hurt player! -// -// back up -// - self->x -= dist * dx8dir[ self->dir ]; - self->y -= dist * dy8dir[ self->dir ]; - return; - } - - self->distance -= dist; - if( self->distance < 0 ) - { - self->distance = 0; - } -} - - -/* ------------------------------------------------------------------------------ - Function: T_Advance() -Move object forward. - - Parameters: - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void T_Advance( entity_t *self, think_t think ) -{ - long move; - - if( ! think ) - { - Com_DPrintf( "Warning: Advance without proc\n" ); - return; - } - - move = self->speed * tics; - while( move > 0) - { - -// waiting for a door to open - if( self->waitfordoorx ) - { - doors_t *door = &r_world->Doors.DoorMap[ self->waitfordoorx ][ self->waitfordoory ]; - - Door_OpenDoor( door ); - if( door->action != dr_open ) - { - return; // not opened yet... - } - self->waitfordoorx = self->waitfordoory = 0; // go ahead, the door is now open - } - - if( move < self->distance ) - { - T_Move( self, move ); - break; - } - -// fix position to account for round off during moving - self->x = TILE2POS( self->tilex ); - self->y = TILE2POS( self->tiley ); - - move -= self->distance; - -// think: Where to go now? - think( self ); - self->angle = dir8angle[ self->dir ]; - if( self->dir == dir8_nodir ) - { - return; // all movement is blocked - } - } -} - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void T_Stand( entity_t *self ) -{ - AI_FindTarget( self ); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void T_Path( entity_t *self ) -{ - - if( AI_FindTarget( self ) ) - { - return; - } - - if( ! self->speed ) - { - return; // if patroling with a speed of 0 - } - - if( self->dir == dir8_nodir ) - { - AI_Path( self ); - if( self->dir == dir8_nodir ) - { - return; // all movement is blocked - } - } - - T_Advance(self, AI_Path); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void T_Ghosts( entity_t *self ) -{ - if( self->dir == dir8_nodir ) - { - AI_Chase( self ); - if( self->dir == dir8_nodir ) - { - return; // object is blocked in - } - - self->angle = dir8angle[ self->dir ]; - } - - T_Advance( self, AI_Chase ); -} - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void T_Chase( entity_t *self ) -{ - int dx,dy,dist,chance; - char dodge; - - // if (gamestate.victoryflag) return; - - dodge = 0; - if( Level_CheckLine( self->x, self->y, Player.position.origin[0], Player.position.origin[1], r_world ) ) // got a shot at player? - { - dx = ABS( POS2TILE( self->x ) - POS2TILE( Player.position.origin[ 0 ] ) ); - dy = ABS( POS2TILE( self->y ) - POS2TILE( Player.position.origin[ 1 ] ) ); - dist = max_of_2(dx, dy); - if( ! dist || (dist == 1 && self->distance < 16) ) - { - chance = 300; - } - else - { - chance = (tics << 4) / dist;//100/dist; - } - - if( US_RndT() < chance ) - { // go into attack frame - A_StateChange(self, st_shoot1); - return; - } - dodge = 1; - } - - if( self->dir == dir8_nodir ) - { - if( dodge ) - { - AI_Dodge( self ); - } - else - { - AI_Chase( self ); - } - - if( self->dir == dir8_nodir ) - { - return; // object is blocked in - } - self->angle = dir8angle[ self->dir ]; - } - - T_Advance( self, dodge ? AI_Dodge : AI_Chase ); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void T_Bite( entity_t *self ) -{ - long dx, dy; - - Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "lsfx/076.wav" ), 1, ATTN_NORM, 0 ); - - dx = ABS( Player.position.origin[ 0 ] - self->x ) - TILEGLOBAL; - if( dx <= MINACTORDIST ) - { - dy = ABS( Player.position.origin[ 1 ] - self->y ) - TILEGLOBAL; - if( dy <= MINACTORDIST ) - { - if(US_RndT()<180) - { - PL_Damage(&Player, self, US_RndT()>>4); - return; - } - } - } -} - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void T_DogChase( entity_t *self ) -{ - long dx, dy; - - if( self->dir == dir8_nodir ) - { - AI_Dodge( self ); - self->angle = dir8angle[ self->dir ]; - if( self->dir == dir8_nodir ) - { - return; // object is blocked in - } - } - -// -// check for bite range -// - dx = ABS( Player.position.origin[ 0 ] - self->x ) - TILEGLOBAL / 2; - if(dx <= MINACTORDIST) - { - dy = ABS( Player.position.origin[ 1 ] - self->y ) - TILEGLOBAL / 2; - if( dy <= MINACTORDIST ) - { - A_StateChange( self, st_shoot1 ); - return; // bite player! - } - } - - T_Advance( self, AI_Dodge ); -} - - -/* ------------------------------------------------------------------------------ - Function: T_BossChase - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - They retreat if too close to player. ------------------------------------------------------------------------------ -*/ -PUBLIC void T_BossChase( entity_t *self ) -{ - int dx, dy, dist; - W8 dodge; - - dodge = 0; - dx = ABS( self->tilex - POS2TILE( Player.position.origin[ 0 ] ) ); - dy = ABS( self->tiley - POS2TILE( Player.position.origin[ 1 ] ) ); - dist = max_of_2( dx, dy ); - - if( Level_CheckLine( self->x, self->y, Player.position.origin[0], Player.position.origin[1], r_world ) ) // got a shot at player? - { - if( US_RndT() < tics << 3 ) - { // go into attack frame - A_StateChange( self, st_shoot1 ); - return; - } - dodge = 1; - } - - if( self->dir == dir8_nodir ) - { - if(dodge) - { - AI_Dodge(self); - } - else - { - AI_Chase(self); - } - - if( self->dir == dir8_nodir ) - { - return; // object is blocked in - } - } - - T_Advance( self, dist < 4 ? AI_Retreat : (dodge ? AI_Dodge : AI_Chase)); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void T_Fake( entity_t *self ) -{ - - if( Level_CheckLine( self->x, self->y, Player.position.origin[0], Player.position.origin[1], r_world ) ) // got a shot at player? - { - if( US_RndT() < tics << 1 ) - { // go into attack frame - A_StateChange( self, st_shoot1 ); - return; - } - } - - if( self->dir == dir8_nodir ) - { - AI_Dodge( self ); - if( self->dir == dir8_nodir ) - { - return; // object is blocked in - } - } - - T_Advance( self, AI_Dodge ); -} - - - -/* ------------------------------------------------------------------------------ - Function: T_Shoot -Try to damage the player. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void T_Shoot( entity_t *self ) -{ - int dx, dy, dist; - int hitchance, damage; - - if( ! areabyplayer[ self->areanumber ] ) - { - return; - } - - if( ! Level_CheckLine( self->x, self->y, Player.position.origin[0], Player.position.origin[1], r_world ) ) - { - return; // player is behind a wall - } - - dx = ABS( POS2TILE( self->x ) - POS2TILE( Player.position.origin[ 0 ] ) ); - dy = ABS( POS2TILE( self->y ) - POS2TILE( Player.position.origin[ 1 ] ) ); - dist = max_of_2( dx, dy ); - - if( self->type == en_ss || self->type == en_boss ) - { - dist = dist * 2 / 3; // ss are better shots - } - - if( Player.speed >= RUNSPEED ) - { - hitchance = 160; - } - else - { - hitchance = 256; - } - -// if guard is visible by player -// player can see to dodge -// (if CheckLine both player & enemy see each other) -// So left only check if guard is in player's fov: FIXME: not fixed fov! - if( angle_diff( TransformPoint( self->x, self->y, Player.position.origin[0], Player.position.origin[1] ), FINE2DEG( Player.position.angle ) ) < (M_PI/3) ) - { - hitchance -= dist * 16; - } - else - { - hitchance -= dist * 8; - } - -// see if the shot was a hit - if( US_RndT() < hitchance ) - { - if( dist < 2 ) - { - damage = US_RndT() >> 2; - } - else if( dist < 4 ) - { - damage = US_RndT() >> 3; - } - else - { - damage = US_RndT() >> 4; - } - - PL_Damage( &Player, self, damage ); - } - - switch( self->type ) - { - case en_ss: - if( g_version->value == SPEAROFDESTINY ) - { - Sound_StartSound( NULL, 1, CHAN_WEAPON, Sound_RegisterSound( "sfx/020.wav" ), 1, ATTN_NORM, 0 ); - } - else - { - Sound_StartSound( NULL, 1, CHAN_WEAPON, Sound_RegisterSound( "sfx/024.wav" ), 1, ATTN_NORM, 0 ); - } - break; - - case en_gift: - case en_fat: - case en_mecha: - case en_hitler: - case en_boss: - Sound_StartSound( NULL, 1, CHAN_WEAPON, Sound_RegisterSound( "sfx/022.wav" ), 1, ATTN_NORM, 0 ); - break; - - default: - if( g_version->value == SPEAROFDESTINY ) - { - Sound_StartSound( NULL, 1, CHAN_WEAPON, Sound_RegisterSound( "sfx/038.wav" ), 1, ATTN_NORM, 0 ); - } - else - { - Sound_StartSound( NULL, 1, CHAN_WEAPON, Sound_RegisterSound( "sfx/049.wav" ), 1, ATTN_NORM, 0 ); - } - break; - } -} - -/* ------------------------------------------------------------------------------ - Function: T_UShoot -[UberMutant] - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void T_UShoot( entity_t *self ) -{ - int dx, dy, dist; - - T_Shoot( self ); - - dx = ABS( self->tilex - POS2TILE( Player.position.origin[ 0 ] ) ); - dy = ABS( self->tiley - POS2TILE( Player.position.origin[ 1 ] ) ); - dist = max_of_2( dx, dy ); - - if( dist <= 1 ) - { - PL_Damage( &Player, self, 10 ); - } -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void T_Launch( entity_t *self ) -{ - entity_t *proj; - float iangle; - - iangle = TransformPoint( self->x, self->y, Player.position.origin[ 0 ], Player.position.origin[ 1 ] ) + M_PI; - if( iangle > 2 * M_PI ) - { - iangle -= 2 * M_PI; - } - - if( self->type == en_death ) - {// death knight launches 2 rockets with 4 degree shift each. - T_Shoot( self ); - if( self->state == st_shoot2 ) - { - iangle = normalize_angle( iangle - DEG2RAD( 4 ) ); - } - else - { - iangle = normalize_angle( iangle + DEG2RAD( 4 ) ); - } - } - - proj = GetNewActor(); - if( proj == NULL ) - { - return; - } - - proj->x = self->x; - proj->y = self->y; - - proj->tilex = self->tilex; - proj->tiley = self->tiley; - - proj->state = st_stand; - proj->ticcount = 1; - proj->dir = dir8_nodir; - - proj->angle = RAD2FINE( iangle ); - proj->speed = 0x2000; - proj->flags = FL_NONMARK; // FL_NEVERMARK; - proj->sprite = Sprite_GetNewSprite(); - - switch( self->type ) - { - case en_death: - proj->type = en_hrocket; - Sound_StartSound( NULL, 1, CHAN_WEAPON, Sound_RegisterSound( "lsfx/078.wav" ), 1, ATTN_NORM, 0 ); - break; - - case en_angel: - proj->type = en_spark; - proj->state = st_path1; - Sound_StartSound( NULL, 1, CHAN_WEAPON, Sound_RegisterSound( "lsfx/069.wav" ), 1, ATTN_NORM, 0 ); - break; - - case en_fake: - proj->type = en_fire; - proj->state = st_path1; - proj->flags = FL_NEVERMARK; - proj->speed = 0x1200; - Sound_StartSound( NULL, 1, CHAN_WEAPON, Sound_RegisterSound( "lsfx/069.wav" ), 1, ATTN_NORM, 0 ); - break; - - case en_schabbs: - proj->type = en_needle; - proj->state = st_path1; - Sound_StartSound( NULL, 1, CHAN_WEAPON, Sound_RegisterSound( "lsfx/008.wav" ), 1, ATTN_NORM, 0 ); - break; - - default: - proj->type = en_rocket; - - if( g_version->value == SPEAROFDESTINY ) - { - Sound_StartSound( NULL, 1, CHAN_WEAPON, Sound_RegisterSound( "lsfx/008.wav" ), 1, ATTN_NORM, 0 ); - } - else - { - Sound_StartSound( NULL, 1, CHAN_WEAPON, Sound_RegisterSound( "lsfx/085.wav" ), 1, ATTN_NORM, 0 ); - } - } - -} diff --git a/wolf3d/newCode/wolf/wolf_ai_com.h b/wolf3d/newCode/wolf/wolf_ai_com.h deleted file mode 100644 index 9fb8a1a..0000000 --- a/wolf3d/newCode/wolf/wolf_ai_com.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000-2002 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_ai_com.h: Wolfenstein3-D entity management. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - * Portion of this code was derived from Wolfenstein3-D, and was originally - * written by Id Software, Inc. - * - */ - -/* - Notes: - This module is implemented by wolf_ai_com.c - -*/ - -#ifndef __WOLF_AI_COM_H__ -#define __WOLF_AI_COM_H__ - -#include "wolf_actors.h" - -// common AI functions - -extern void T_Stand( entity_t *self ); -extern void T_Path( entity_t *self ); -extern void T_Ghosts( entity_t *self ); -extern void T_Chase( entity_t *self ); -extern void T_Bite( entity_t *self ); -extern void T_DogChase( entity_t *self ); -extern void T_BossChase( entity_t *self ); -extern void T_Fake( entity_t *self ); - -extern void T_Shoot( entity_t *self ); -extern void T_UShoot( entity_t *self ); -extern void T_Launch( entity_t *self ); - - -#endif /* __WOLF_AI_COM_H__ */ - diff --git a/wolf3d/newCode/wolf/wolf_areas.c b/wolf3d/newCode/wolf/wolf_areas.c deleted file mode 100644 index 960a502..0000000 --- a/wolf3d/newCode/wolf/wolf_areas.c +++ /dev/null @@ -1,170 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000-2002 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_areas.c: Wolfenstein3-D area management. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - * Acknowledgement: - * Portion of this code was derived from Wolfenstein3-D, and was originally - * written by Id Software, Inc. - * - */ - - -/* - Notes: - - Open doors connect two areas, so sounds will travel between them and sight - will be checked when the player is in a connected area. - - Areaconnect is incremented/decremented by each door. If >0 they connect. - - Every time a door opens or closes the areabyplayer matrix gets recalculated. - An area is true if it connects with the player's current spor. - -*/ - -#include "../wolfiphone.h" - - - - -W8 areaconnect[ NUMAREAS ][ NUMAREAS ]; -_boolean areabyplayer[ NUMAREAS ]; - - - -/* ------------------------------------------------------------------------------ - Function: Areas_RecursiveConnect() -Scans outward from playerarea, - marking all connected areas. - - Parameters: areanumber -[in] area. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void Areas_RecursiveConnect( int areanumber ) -{ - int i; - - for( i = 0 ; i < NUMAREAS ; ++i ) - { - if( areaconnect[ areanumber ][ i ] && ! areabyplayer[ i ] ) - { - areabyplayer[ i ] = true; - Areas_RecursiveConnect( i ); - } - } -} - -/* ------------------------------------------------------------------------------ - Function: Areas_ConnectAreas() -Connect area. - - Parameters: areanumber -[in] area. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Areas_ConnectAreas( int areanumber ) -{ - int c = 0; - int i; - - assert( areanumber < NUMAREAS ); - memset( areabyplayer, 0, sizeof( areabyplayer ) ); - areabyplayer[ areanumber ] = true; - Areas_RecursiveConnect( areanumber ); - for ( i = 0 ; i < NUMAREAS ; i++ ) { - if ( areabyplayer[i] ) { - c++; - } - } -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Areas_InitAreas( int areanumber ) -{ - memset( areaconnect, 0, sizeof( areaconnect ) ); - memset( areabyplayer, 0, sizeof( areabyplayer ) ); - areabyplayer[ areanumber ] = true; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Areas_JoinAreas( int area1, int area2 ) -{// FIXME: check for overflow! - areaconnect[ area1 ][ area2 ]++; - areaconnect[ area2 ][ area1 ]++; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Areas_DisconnectAreas( int area1, int area2 ) -{// FIXME: check for underflow! - areaconnect[ area1 ][ area2 ]--; - areaconnect[ area2 ][ area1 ]--; -} diff --git a/wolf3d/newCode/wolf/wolf_bj.c b/wolf3d/newCode/wolf/wolf_bj.c deleted file mode 100644 index 0f59ae2..0000000 --- a/wolf3d/newCode/wolf/wolf_bj.c +++ /dev/null @@ -1,136 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000-2002 by DarkOne the Hacker - - 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 "../wolfiphone.h" - - - -#define BJRUNSPEED 2048 -#define BJJUMPSPEED 680 - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -void SpawnBJVictory( void ) -{ - entity_t *bj; - - bj = SpawnActor( en_bj, POS2TILE(Player.position.origin[0]), POS2TILE(Player.position.origin[1]), dir4_north, r_world ); - if( ! bj ) - { - return; - } - - bj->x = Player.position.origin[ 0 ]; - bj->y = Player.position.origin[ 1 ]; - bj->state = st_path1; - bj->speed = BJRUNSPEED; - bj->flags = FL_NONMARK; // FL_NEVERMARK; - bj->temp2 = 6; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -void T_BJRun( entity_t *Guard ) -{ -// MoveObj(Guard, Guard->speed); - - if( ! Guard->distance ) - { - Guard->distance = TILEGLOBAL; - if ( !(--Guard->temp2) ) - { - A_StateChange( Guard, st_shoot1 ); - Guard->speed = BJJUMPSPEED; - return; - } - } -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -void T_BJJump( entity_t *Guard ) -{ -// MoveObj(Guard, Guard->speed); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -void T_BJYell( entity_t *Guard ) -{ - Sound_StartSound( NULL, 0, CHAN_VOICE, Sound_RegisterSound( "sfx/082.wav" ), 1, ATTN_NORM, 0 ); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -void T_BJDone( entity_t *Guard ) -{ - Player.playstate = ex_victory; // exit castle tile -} diff --git a/wolf3d/newCode/wolf/wolf_bj.h b/wolf3d/newCode/wolf/wolf_bj.h deleted file mode 100644 index d2adcef..0000000 --- a/wolf3d/newCode/wolf/wolf_bj.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000-2002 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_bj.h: Wolfenstein3-D bj code . - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - * Portion of this code was derived from Wolfenstein3-D, and was originally - * written by Id Software, Inc. - * - */ - -/* - Notes: - This module is implemented by wolf_bj.c - -*/ - -#ifndef __WOLF_BJ_H__ -#define __WOLF_BJ_H__ - - - -extern void SpawnBJVictory( void ); -extern void T_BJRun( entity_t *Guard ); -extern void T_BJJump( entity_t *Guard ); -extern void T_BJYell( entity_t *Guard ); -extern void T_BJDone( entity_t *Guard ); - - - - - -#endif /* __WOLF_BJ_H__ */ - diff --git a/wolf3d/newCode/wolf/wolf_client_main.c b/wolf3d/newCode/wolf/wolf_client_main.c deleted file mode 100644 index f5507f1..0000000 --- a/wolf3d/newCode/wolf/wolf_client_main.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - - 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 "../wolfiphone.h" - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Client_PrepRefresh( const char *r_mapname ) -{ - char mapname[ 32 ]; - - if( ! r_mapname || ! *r_mapname ) - { - return; - } - - if( g_version->value == SPEAROFDESTINY ) - { - spritelocation = SODSPRITESDIRNAME; - } - else - { - spritelocation = WL6SPRITESDIRNAME; - } - - my_strlcpy( mapname, r_mapname, sizeof( mapname ) ); // skip "maps/" - - // !@# fix crash bug if you type something short... - if ( strlen( mapname ) > 4 && !strcmp( mapname + strlen( mapname ) - 4, ".map" ) ) { - mapname[ strlen( mapname ) - 4 ] = '\0'; // cut off ".map" - } - - // register models, pics, and skins - R_BeginRegistration( mapname ); - - if( r_world == NULL ) - { - return; - } - - - Com_Printf( "Map: %s\n", r_world->mapName ); - - Level_ScanInfoPlane( r_world ); // Spawn items/guards - - Com_Printf( "Spawning Entities\n" ); - PL_Spawn( r_world->pSpawn, r_world ); // Spawn Player - - Com_Printf( "Caching Textures and Sounds\n" ); - Level_PrecacheTextures_Sound( r_world ); - - // clear any lines of console text - Con_ClearNotify(); - - if( r_world->musicName ) - { - Sound_StartBGTrack( r_world->musicName, r_world->musicName ); - } - - Player.playstate = ex_playing; -} - -int tics; - - - - diff --git a/wolf3d/newCode/wolf/wolf_doors.c b/wolf3d/newCode/wolf/wolf_doors.c deleted file mode 100644 index f1c4d55..0000000 --- a/wolf3d/newCode/wolf/wolf_doors.c +++ /dev/null @@ -1,506 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000-2002 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_doors.c: Wolfenstein 3-D door management. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - * Acknowledgement: - * Portion of this code was derived from Wolfenstein 3-D, and was originally - * written by Id Software, Inc. - * - */ - -#include "../wolfiphone.h" - -#define CLOSEWALL MINDIST // Space between wall & player -#define MAXDOORS 64 // max number of sliding doors - - - - -/* ------------------------------------------------------------------------------ - Function: Door_ResetDoors -Resets doors status - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Door_ResetDoors( LevelDoors_t *lvldoors ) -{ - lvldoors->doornum = 0; - - memset( lvldoors->Doors, 0, sizeof( lvldoors->Doors ) ); - memset( lvldoors->DoorMap, 0, sizeof( lvldoors->DoorMap ) ); -} - - - - -/* ------------------------------------------------------------------------------ - Function: Door_SpawnDoor -Spawns door at x, y, position. - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC int Door_SpawnDoor( LevelDoors_t *lvldoors, int x, int y, int type ) -{ - if( lvldoors->doornum >= MAXDOORS ) - { - Com_DPrintf( "[%s]: Too many Doors on level! (%d)\n", "wolf_doors.c", lvldoors->doornum ); - return 0; - } - - switch( type ) - { - case 0x5A: - lvldoors->DoorMap[ x ][ y ].type = DOOR_VERT; - lvldoors->DoorMap[ x ][ y ].vertical= true; - lvldoors->DoorMap[ x ][ y ].texture = TEX_DDOOR + 1; - break; - - case 0x5B: - lvldoors->DoorMap[ x ][ y ].type = DOOR_HORIZ; - lvldoors->DoorMap[ x ][ y ].vertical = false; - lvldoors->DoorMap[ x ][ y ].texture = TEX_DDOOR; - break; - - case 0x5C: - lvldoors->DoorMap[ x ][ y ].type = DOOR_G_VERT; - lvldoors->DoorMap[ x ][ y ].vertical = true; - lvldoors->DoorMap[ x ][ y ].texture = TEX_DLOCK + 1; - break; - - case 0x5D: - lvldoors->DoorMap[ x ][ y ].type = DOOR_G_HORIZ; - lvldoors->DoorMap[ x ][ y ].vertical = false; - lvldoors->DoorMap[ x ][ y ].texture = TEX_DLOCK; - break; - - case 0x5E: - lvldoors->DoorMap[ x ][ y ].type = DOOR_S_VERT; - lvldoors->DoorMap[ x ][ y ].vertical = true; - lvldoors->DoorMap[ x ][ y ].texture = TEX_DLOCK + 1; - break; - - case 0x5F: - lvldoors->DoorMap[ x ][ y ].type = DOOR_S_HORIZ; - lvldoors->DoorMap[ x ][ y ].vertical = false; - lvldoors->DoorMap[ x ][ y ].texture = TEX_DLOCK; - break; - - case 0x64: - lvldoors->DoorMap[ x ][ y ].type = DOOR_E_VERT; - lvldoors->DoorMap[ x ][ y ].vertical = true; - lvldoors->DoorMap[ x ][ y ].texture = TEX_DELEV + 1; - break; - - case 0x65: - lvldoors->DoorMap[ x ][ y ].type = DOOR_E_HORIZ; - lvldoors->DoorMap[ x ][ y ].vertical = false; - lvldoors->DoorMap[ x ][ y ].texture = TEX_DELEV; - break; - - default: - Com_DPrintf( "Door_SpawnDoor: Unknown door type: %d\n", type ); - return 0; - } - - lvldoors->DoorMap[ x ][ y ].tilex = x; - lvldoors->DoorMap[ x ][ y ].tiley = y; - lvldoors->DoorMap[ x ][ y ].action = dr_closed; - - lvldoors->Doors[ lvldoors->doornum ] = &lvldoors->DoorMap[ x ][ y ]; - lvldoors->doornum++; - - return lvldoors->doornum - 1; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Door_SetAreas( LevelDoors_t *lvldoors, int (*areas)[64] ) -{ - int n, x, y; - - for( n = 0 ; n < lvldoors->doornum ; ++n ) - { - x = lvldoors->Doors[ n ]->tilex; - y = lvldoors->Doors[ n ]->tiley; - - if( lvldoors->Doors[ n ]->vertical ) - { - lvldoors->Doors[ n ]->area1 = areas[ x + 1 ][ y ] >= 0 ? areas[ x + 1 ][ y ] : 0; - lvldoors->Doors[ n ]->area2 = areas[ x - 1 ][ y ] >= 0 ? areas[ x - 1 ][ y ] : 0; - } - else - { - lvldoors->Doors[ n ]->area1 = areas[ x ][ y + 1 ] >= 0 ? areas[ x ][ y + 1 ] : 0; - lvldoors->Doors[ n ]->area2 = areas[ x ][ y - 1 ] >= 0 ? areas[ x ][ y - 1 ] : 0; - } - } -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE W8 CanCloseDoor( int x, int y, char vert ) -{ - int n; - - if( POS2TILE( Player.position.origin[ 0 ] ) == x && - POS2TILE( Player.position.origin[ 1 ] ) == y ) - { - return 0; - } - - if( vert ) - { - if( POS2TILE( Player.position.origin[ 1 ] ) == y ) - { - if( POS2TILE( Player.position.origin[ 0 ] + CLOSEWALL ) == x ) - { - return 0; - } - - if( POS2TILE( Player.position.origin[ 0 ] - CLOSEWALL ) == x ) - { - return 0; - } - } - - for( n = 0 ; n < NumGuards ; ++n ) - { - if( Guards[ n ].tilex == x && Guards[ n ].tiley == y ) - { - return 0; // guard in door - } - - if( Guards[ n ].tilex == x - 1 && - Guards[ n ].tiley == y && - POS2TILE( Guards[ n ].x + CLOSEWALL ) == x ) - { - return 0; // guard in door - } - - if( Guards[ n ].tilex == x + 1 && - Guards[ n ].tiley == y && - POS2TILE( Guards[ n ].x - CLOSEWALL ) == x ) - { - return 0; // guard in door - } - } - } - else - { - if( POS2TILE( Player.position.origin[ 0 ] ) == x ) - { - if( POS2TILE( Player.position.origin[ 1 ] + CLOSEWALL ) == y ) - { - return 0; - } - - if( POS2TILE( Player.position.origin[ 1 ] - CLOSEWALL ) == y ) - { - return 0; - } - } - for( n = 0 ; n < NumGuards ; ++n ) - { - if( Guards[ n ].tilex == x && Guards[ n ].tiley == y ) - { - return 0; // guard in door - } - - if( Guards[ n ].tilex == x && - Guards[ n ].tiley == y - 1 && - POS2TILE( Guards[ n ].y + CLOSEWALL ) == y ) - { - return 0; // guard in door - } - - if( Guards[ n ].tilex == x && - Guards[ n ].tiley == y + 1 && - POS2TILE( Guards[ n ].y - CLOSEWALL ) == y ) - { - return 0; // guard in door - } - } - } - - return 1; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Door_OpenDoor( doors_t *Door ) -{ - if( Door->action == dr_open ) - { - Door->ticcount = 0; // reset opened time - } - else - { - Door->action = dr_opening; // start opening it - } -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void Door_ChangeDoorState( doors_t *Door ) -{ - if( Door->action < dr_opening ) - { - Door_OpenDoor( Door ); - } - else if( Door->action == dr_open && CanCloseDoor( Door->tilex, Door->tiley, Door->vertical ) ) - { - // !@# for the iphone with automatic using, don't allow any door close actions - // Door->action = dr_closing; - // Door->ticcount = DOOR_FULLOPEN; - } -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Door_ProcessDoors_e( LevelDoors_t *lvldoors, int t_tk, int t_ms ) -{ - int n; - - for( n = 0 ; n < lvldoors->doornum ; ++n ) - { - switch( lvldoors->Doors[ n ]->action ) - { - case dr_closed: // this door is closed! - continue; - - case dr_opening: - if( lvldoors->Doors[ n ]->ticcount >= DOOR_FULLOPEN ) // door fully opened! - { - lvldoors->Doors[ n ]->action = dr_open; - lvldoors->Doors[ n ]->ticcount = 0; - } - else // opening! - { - if( lvldoors->Doors[ n ]->ticcount == 0 ) - { // door is just starting to open, so connect the areas - Areas_JoinAreas( lvldoors->Doors[ n ]->area1, lvldoors->Doors[ n ]->area2 ); - Areas_ConnectAreas( Player.areanumber ); - if( areabyplayer[ lvldoors->Doors[ n ]->area1 ] ) // Door Opening sound! - { - Sound_StartSound( NULL, 1, CHAN_AUTO, Sound_RegisterSound( "sfx/010.wav" ), 1, ATTN_STATIC, 0 ); - } - } - - lvldoors->Doors[n]->ticcount += t_tk; - - if( lvldoors->Doors[ n ]->ticcount > DOOR_FULLOPEN ) - { - lvldoors->Doors[ n ]->ticcount = DOOR_FULLOPEN; - } - } - break; - - case dr_closing: - if( lvldoors->Doors[ n ]->ticcount <= 0 ) // door fully closed! disconnect areas! - { - Areas_DisconnectAreas( lvldoors->Doors[ n ]->area1, lvldoors->Doors[ n ]->area2 ); - Areas_ConnectAreas( Player.areanumber ); - lvldoors->Doors[ n ]->ticcount = 0; - lvldoors->Doors[ n ]->action = dr_closed; - } - else // closing! - { - if( lvldoors->Doors[ n ]->ticcount == DOOR_FULLOPEN ) - { - if( areabyplayer[ lvldoors->Doors[ n ]->area1 ] ) // Door Closing sound! - { - Sound_StartSound( NULL, 1, CHAN_AUTO, Sound_RegisterSound( "sfx/007.wav" ), 1, ATTN_STATIC, 0 ); - } - } - lvldoors->Doors[ n ]->ticcount -= t_tk; - if( lvldoors->Doors[ n ]->ticcount < 0 ) - { - lvldoors->Doors[ n ]->ticcount = 0; - } - } - break; - - case dr_open: - if( lvldoors->Doors[ n ]->ticcount > DOOR_MINOPEN ) - { // If player or something is in door do not close it! - if( ! CanCloseDoor( lvldoors->Doors[ n ]->tilex, lvldoors->Doors[ n ]->tiley, lvldoors->Doors[ n ]->vertical ) ) - { - lvldoors->Doors[ n ]->ticcount = DOOR_MINOPEN; // do not close door immediately! - } - } - if( lvldoors->Doors[ n ]->ticcount >= DOOR_TIMEOUT ) - { // Door timeout, time to close it! - lvldoors->Doors[ n ]->action = dr_closing; - lvldoors->Doors[ n ]->ticcount = DOOR_FULLOPEN; - } - else - { // Increase timeout! - lvldoors->Doors[ n ]->ticcount += t_tk; - } - break; - - } // End switch lvldoors->Doors[ n ].action - - } // End for n = 0 ; n < lvldoors->doornum ; ++n - -} - -/* ------------------------------------------------------------------------------ - Function: Door_Opened -Check to see if a door is open. - - Parameters: - - Returns: DOOR_FULLOPEN Door is opened - 0 Door is closed - >0 DoorMap[ x ][ y ].action == dr_open ? DOOR_FULLOPEN : lvldoors->DoorMap[ x ][ y ].ticcount; -} - -/* ------------------------------------------------------------------------------ - Function: Door_TryUse -Try to use a door with keys that the player has. - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC _boolean Door_TryUse( doors_t *Door, int keys ) -{ - switch( Door->type ) - { - case DOOR_VERT: - case DOOR_HORIZ: - case DOOR_E_VERT: - case DOOR_E_HORIZ: - Door_ChangeDoorState( Door ); // does not require key! - break; - - case DOOR_G_VERT: - case DOOR_G_HORIZ: - if( keys & ITEM_KEY_1 ) - { - Door_ChangeDoorState( Door ); - } - else - { - iphoneSetNotifyText( "You need a gold key" ); - } - break; - - case DOOR_S_VERT: - case DOOR_S_HORIZ: - if( keys & ITEM_KEY_2 ) - { - Door_ChangeDoorState( Door ); - } - else - { - iphoneSetNotifyText( "You need a silver key" ); - } - break; - } - - return true; // FIXME - -} diff --git a/wolf3d/newCode/wolf/wolf_level.c b/wolf3d/newCode/wolf/wolf_level.c deleted file mode 100644 index 15bbbca..0000000 --- a/wolf3d/newCode/wolf/wolf_level.c +++ /dev/null @@ -1,1389 +0,0 @@ -/* - - Copyright (C) 2004-2005 Michael Liebscher - Copyright (C) 2000-2002 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_level.c: Wolfenstein3-D Level management. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - * Acknowledgement: - * Portion of this code was derived from Wolfenstein 3-D, and was originally - * written by Id Software, Inc. - * - */ - -#include "../wolfiphone.h" - - -statinfo_t static_wl6[]= -{ - {false, -1}, // puddle spr1v - { true, -1}, // Green Barrel " - { true, -1}, // Table/chairs " - { true, -1}, // Floor lamp " - {false, -1}, // Chandelier " - { true, -1}, // Hanged man " - {false, pow_alpo}, // Bad food " - { true, -1}, // Red pillar " - { true, -1}, // Tree spr2v - {false, -1}, // Skeleton flat " - { true, -1}, // Sink " (SOD:gibs) - { true, -1}, // Potted plant " - { true, -1}, // Urn " - { true, -1}, // Bare table " - {false, -1}, // Ceiling light " - {false, -1}, // Kitchen stuff " - { true, -1}, // suit of armor spr3v - { true, -1}, // Hanging cage " - { true, -1}, // SkeletoninCage " - {false, -1}, // Skeleton relax " - {false, pow_key1}, // Key 1 " - {false, pow_key2}, // Key 2 " - { true, -1}, // stuff (SOD:gibs) - {false, -1}, // stuff - {false, pow_food}, // Good food spr4v - {false, pow_firstaid}, // First aid " - {false, pow_clip}, // Clip " - {false, pow_machinegun},// Machine gun " - {false, pow_chaingun}, // Gatling gun " - {false, pow_cross}, // Cross " - {false, pow_chalice}, // Chalice " - {false, pow_bible}, // Bible " - {false, pow_crown}, // crown spr5v - {false, pow_fullheal}, // one up " - {false, pow_gibs}, // gibs " - { true, -1}, // barrel " - { true, -1}, // well " - { true, -1}, // Empty well " - {false, pow_gibs}, // Gibs 2 " - { true, -1}, // flag " - { true, -1}, // Call Apogee spr7v - {false, -1}, // junk " - {false, -1}, // junk " - {false, -1}, // junk " - {false, -1}, // pots " - { true, -1}, // stove " (SOD:gibs) - { true, -1}, // spears " (SOD:gibs) - {false, -1}, // vines " -}; - - -statinfo_t static_sod[] = -{ - {false, -1}, // puddle spr1v - { true, -1}, // Green Barrel " - { true, -1}, // Table/chairs " - { true, -1}, // Floor lamp " - {false, -1}, // Chandelier " - { true, -1}, // Hanged man " - {false, pow_alpo}, // Bad food " - { true, -1}, // Red pillar " - { true, -1}, // Tree spr2v - {false, -1}, // Skeleton flat " - { true, -1}, // Sink " (SOD:gibs) - { true, -1}, // Potted plant " - { true, -1}, // Urn " - { true, -1}, // Bare table " - {false, -1}, // Ceiling light " - { true, -1}, // Gibs! - { true, -1}, // suit of armor spr3v - { true, -1}, // Hanging cage " - { true, -1}, // SkeletoninCage " - {false, -1}, // Skeleton relax " - {false, pow_key1}, // Key 1 " - {false, pow_key2}, // Key 2 " - { true, -1}, // stuff (SOD:gibs) - {false, -1}, // stuff - {false, pow_food}, // Good food spr4v - {false, pow_firstaid}, // First aid " - {false, pow_clip}, // Clip " - {false, pow_machinegun},// Machine gun " - {false, pow_chaingun}, // Gatling gun " - {false, pow_cross}, // Cross " - {false, pow_chalice}, // Chalice " - {false, pow_bible}, // Bible " - {false, pow_crown}, // crown spr5v - {false, pow_fullheal}, // one up " - {false, pow_gibs}, // gibs " - { true, -1}, // barrel " - { true, -1}, // well " - { true, -1}, // Empty well " - {false, pow_gibs}, // Gibs 2 " - { true, -1}, // flag " - {false, -1}, // Red light - {false, -1}, // junk " - {false, -1}, // junk " - {false, -1}, // junk " - { true, -1}, // Gibs! - { true, -1}, // stove " (SOD:gibs) - { true, -1}, // spears " (SOD:gibs) - {false, -1}, // vines " - { true, -1}, // marble pillar - {false, pow_25clip}, // bonus 25 clip - { true, -1}, // truck - {false, pow_spear}, // SPEAR OF DESTINY! -}; - -statinfo_t *statinfo = static_wl6; -int num_statics = sizeof( static_wl6 ) / sizeof( static_wl6[ 0 ] ); - -texture_t *wallTextures[1000]; -texture_t *spriteTextures[1000]; - -PRIVATE W16 cachedGuard = 0; -PRIVATE W16 cachedOfficer = 0; -PRIVATE W16 cachedSS = 0; -PRIVATE W16 cachedDog = 0; -PRIVATE W16 cachedMutant = 0; - -PRIVATE int progress_bar = 0; - -extern void R_EndFrame( void ); - -LevelData_t levelData; - - -PRIVATE void CacheTextures( W16 start, W16 end ) -{ - W16 i; - static char texname[ 64 ]; - - - if( end < start ) - { - return; - } - - for( i = start ; i <= end ; ++i ) - { - my_snprintf( texname, sizeof( texname ), "%s/%.3d.tga", spritelocation, i ); - spriteTextures[i] = TM_FindTexture( texname, TT_Wall ); - } - -// R_DrawPsyched( ++progress_bar + 30 ); -// R_EndFrame(); -} - -/* ------------------------------------------------------------------------------ - Function: Level_ScanInfoPlane -Spawn all actors and mark down special places. - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Level_ScanInfoPlane( LevelData_t *lvl ) -{ - int x, y; - W16 tile; - - cachedGuard = 0; - cachedOfficer = 0; - cachedSS = 0; - cachedDog = 0; - cachedMutant = 0; - progress_bar = 0; - - for( y = 0 ; y < 64; ++y ) - { - for( x = 0 ; x < 64 ; ++x ) - { - tile = lvl->Plane2[ (63 - y) * 64 + x ]; - if( ! tile ) - { - continue; - } - - switch( tile ) - { -// -// guard -// - case 180: - case 181: - case 182: - case 183: - if( skill->value < gd_hard ) - break; - tile -= 36; - case 144: - case 145: - case 146: - case 147: - if( skill->value < gd_medium ) - break; - tile -= 36; - case 108: - case 109: - case 110: - case 111: - if( ! cachedGuard ) - { - CacheTextures( SPR_GRD_S_1, SPR_GRD_SHOOT3 ); - cachedGuard = 1; - } - SpawnStand( en_guard, x, y, tile - 108, lvl ); - break; - - case 184: - case 185: - case 186: - case 187: - if( skill->value < gd_hard ) - break; - tile -= 36; - case 148: - case 149: - case 150: - case 151: - if( skill->value < gd_medium ) - break; - tile -= 36; - case 112: - case 113: - case 114: - case 115: - if( ! cachedGuard ) - { - CacheTextures( SPR_GRD_S_1, SPR_GRD_SHOOT3 ); - cachedGuard = 1; - } - SpawnPatrol( en_guard, x, y,tile - 112 ); - break; - - case 124: - SpawnDeadGuard( en_guard, x, y ); - break; -// -// officer -// - case 188: - case 189: - case 190: - case 191: - if( skill->value < gd_hard ) - break; - tile -= 36; - case 152: - case 153: - case 154: - case 155: - if( skill->value < gd_medium ) - break; - tile -= 36; - case 116: - case 117: - case 118: - case 119: - if( ! cachedOfficer ) - { - CacheTextures( SPR_OFC_S_1, SPR_OFC_SHOOT3 ); - cachedOfficer = 1; - } - SpawnStand( en_officer, x, y, tile - 116, lvl ); - break; - - - case 192: - case 193: - case 194: - case 195: - if( skill->value < gd_hard ) - break; - tile -= 36; - case 156: - case 157: - case 158: - case 159: - if( skill->value < gd_medium ) - break; - tile -= 36; - case 120: - case 121: - case 122: - case 123: - if( ! cachedOfficer ) - { - CacheTextures( SPR_OFC_S_1, SPR_OFC_SHOOT3 ); - cachedOfficer = 1; - } - SpawnPatrol( en_officer, x, y, tile - 120 ); - break; -// -// SS -// - case 198: - case 199: - case 200: - case 201: - if( skill->value < gd_hard ) - break; - tile -= 36; - case 162: - case 163: - case 164: - case 165: - if( skill->value < gd_medium ) - break; - tile -= 36; - case 126: - case 127: - case 128: - case 129: - if( ! cachedSS ) - { - CacheTextures( SPR_SS_S_1, SPR_SS_SHOOT3 ); - cachedSS = 1; - } - SpawnStand( en_ss, x, y, tile - 126, lvl ); - break; - - case 202: - case 203: - case 204: - case 205: - if( skill->value < gd_hard ) - break; - tile -= 36; - case 166: - case 167: - case 168: - case 169: - if( skill->value < gd_medium ) - break; - tile -= 36; - case 130: - case 131: - case 132: - case 133: - if( ! cachedSS ) - { - CacheTextures( SPR_SS_S_1, SPR_SS_SHOOT3 ); - cachedSS = 1; - } - SpawnPatrol( en_ss, x, y, tile - 130 ); - break; -// -// dogs -// - case 206: - case 207: - case 208: - case 209: - if( skill->value < gd_hard ) - break; - tile -= 36; - case 170: - case 171: - case 172: - case 173: - if( skill->value < gd_medium ) - break; - tile -= 36; - case 134: - case 135: - case 136: - case 137: - if( ! cachedDog ) - { - CacheTextures( SPR_DOG_W1_1, SPR_DOG_JUMP3 ); - cachedDog = 1; - } - SpawnStand( en_dog, x, y, tile - 134, lvl ); - break; - - case 210: - case 211: - case 212: - case 213: - if( skill->value < gd_hard ) - break; - tile -= 36; - case 174: - case 175: - case 176: - case 177: - if( skill->value < gd_medium ) - break; - tile -= 36; - case 138: - case 139: - case 140: - case 141: - if( ! cachedDog ) - { - CacheTextures( SPR_DOG_W1_1, SPR_DOG_JUMP3 ); - cachedDog = 1; - } - SpawnPatrol( en_dog, x, y, tile - 138 ); - break; -// bosses - case 214: - CacheTextures( SPR_BOSS_W1, SPR_BOSS_DIE3 ); - SpawnBoss( en_boss, x, y ); - break; - - case 197: - CacheTextures( SPR_GRETEL_W1, SPR_GRETEL_DIE3 ); - SpawnBoss( en_gretel, x, y ); - break; - - case 215: - CacheTextures( SPR_GIFT_W1, SPR_GIFT_DEAD ); - SpawnBoss( en_gift, x, y ); - break; - - case 179: - CacheTextures( SPR_FAT_W1, SPR_FAT_DEAD ); - SpawnBoss( en_fat, x, y ); - break; - - case 196: - CacheTextures( SPR_SCHABB_W1, SPR_HYPO4 ); - SpawnBoss( en_schabbs, x, y ); - break; - - case 160: - CacheTextures( SPR_FAKE_W1, SPR_FAKE_DEAD ); - SpawnBoss( en_fake, x, y ); - break; - - case 178: - CacheTextures( SPR_MECHA_W1, SPR_HITLER_DIE7 ); - SpawnBoss( en_mecha, x, y ); - break; -// -// Spear -// - case 106: - CacheTextures( SPR_SPECTRE_W1, SPR_SPECTRE_F4 ); - SpawnBoss( en_spectre, x, y ); - break; - - case 107: - CacheTextures( SPR_ANGEL_W1, SPR_ANGEL_DEAD ); - SpawnBoss( en_angel, x, y ); - break; - - case 125: - CacheTextures( SPR_TRANS_W1, SPR_TRANS_DIE3 ); - SpawnBoss( en_trans, x, y ); - break; - - case 142: - CacheTextures( SPR_UBER_W1, SPR_UBER_DEAD ); - SpawnBoss( en_uber, x, y ); - break; - - case 143: - CacheTextures( SPR_WILL_W1, SPR_WILL_DEAD ); - SpawnBoss( en_will, x, y ); - break; - - case 161: - CacheTextures( SPR_DEATH_W1, SPR_DEATH_DEAD ); - SpawnBoss( en_death, x, y ); - break; -// -// mutants -// - case 252: - case 253: - case 254: - case 255: - if( skill->value < gd_hard ) - break; - tile -= 18; - case 234: - case 235: - case 236: - case 237: - if( skill->value < gd_medium ) - break; - tile -= 18; - case 216: - case 217: - case 218: - case 219: - if( ! cachedMutant ) - { - CacheTextures( SPR_MUT_S_1, SPR_MUT_SHOOT4 ); - cachedMutant = 1; - } - SpawnStand( en_mutant, x, y, tile - 216, lvl ); - break; - - case 256: - case 257: - case 258: - case 259: - if (skill->valuevalue < gd_medium ) - break; - tile -= 18; - case 220: - case 221: - case 222: - case 223: - if( ! cachedMutant ) - { - CacheTextures( SPR_MUT_S_1, SPR_MUT_SHOOT4 ); - cachedMutant = 1; - } - SpawnPatrol( en_mutant, x, y, tile - 220 ); - break; - -// -// ghosts -// - case 224: - CacheTextures( SPR_BLINKY_W1, SPR_BLINKY_W2 ); - SpawnGhosts( en_blinky, x, y ); - break; - - case 225: - CacheTextures( SPR_PINKY_W1, SPR_PINKY_W2 ); - SpawnGhosts( en_clyde, x, y ); - break; - - case 226: - CacheTextures( SPR_CLYDE_W1, SPR_CLYDE_W2 ); - SpawnGhosts( en_pinky, x, y ); - break; - - case 227: - CacheTextures( SPR_INKY_W1, SPR_INKY_W2 ); - SpawnGhosts( en_inky, x, y ); - break; - } - } - } -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void Lvl_SpawnStatic( LevelData_t *lvl, int type, int x, int y ) -{ - int spr_id; - - if( statinfo[ type ].powerup == -1 ) - { - if( statinfo[ type ].block ) // blocking static - { - lvl->tilemap[ x ][ y ] |= BLOCK_TILE; - } - else // dressing static - { - lvl->tilemap[ x ][ y ] |= DRESS_TILE; - } - - spr_id = Sprite_GetNewSprite(); - if( spr_id == -1 ) - { - return; - } - - Sprite_SetPos( spr_id, TILE2POS( x ), TILE2POS( y ), 0 ); - Sprite_SetTex( spr_id, 0, SPR_STAT_0 + type ); - } - else - { - Powerup_Spawn( x, y, statinfo[ type ].powerup, lvl ); - if( statinfo[ type ].powerup == pow_cross || - statinfo[ type ].powerup == pow_chalice || - statinfo[ type ].powerup == pow_bible || - statinfo[ type ].powerup == pow_crown || - statinfo[ type ].powerup == pow_fullheal ) - { - levelstate.total_treasure++; // FIXME: move this to Powerup_Spawn Function! - } - } -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void Lvl_SpawnObj( LevelData_t *lvl, int type, int x, int y ) -{ - if( type >= 23 && type < 23 + num_statics ) - {// static object - Lvl_SpawnStatic( lvl, type - 23, x, y); - return; - } - - switch( type ) - { - case 0x13: // start N - lvl->pSpawn.origin[ 0 ] = TILE2POS( x ); - lvl->pSpawn.origin[ 1 ] = TILE2POS( y ); - lvl->pSpawn.angle = ANG_90; - break; - - case 0x14: // start E - lvl->pSpawn.origin[ 0 ] = TILE2POS( x ); - lvl->pSpawn.origin[ 1 ] = TILE2POS( y ); - lvl->pSpawn.angle = ANG_0; - break; - - case 0x15: // start S - lvl->pSpawn.origin[ 0 ] = TILE2POS( x ); - lvl->pSpawn.origin[ 1 ] = TILE2POS( y ); - lvl->pSpawn.angle = ANG_270; - break; - - case 0x16: // start W - lvl->pSpawn.origin[ 0 ] = TILE2POS( x ); - lvl->pSpawn.origin[ 1 ] = TILE2POS( y ); - lvl->pSpawn.angle = ANG_180; - break; - - case 0x5a: // turn E - lvl->tilemap[ x ][ y ] |= TILE_IS_E_TURN;//FIXME! - break; - - case 0x5b: // turn NE - lvl->tilemap[ x ][ y ] |= TILE_IS_NE_TURN;//FIXME! - break; - - case 0x5c: // turn N - lvl->tilemap[ x ][ y ] |= TILE_IS_N_TURN;//FIXME! - break; - - case 0x5d: // turn NW - lvl->tilemap[ x ][ y ] |= TILE_IS_NW_TURN;//FIXME! - break; - - case 0x5e: // turn W - lvl->tilemap[ x ][ y ] |= TILE_IS_W_TURN;//FIXME! - break; - - case 0x5f: // turn SW - lvl->tilemap[ x ][ y ] |= TILE_IS_SW_TURN;//FIXME! - break; - - case 0x60: // turn S - lvl->tilemap[ x ][ y ] |= TILE_IS_S_TURN;//FIXME! - break; - - case 0x61: // turn SE - lvl->tilemap[ x ][ y ] |= TILE_IS_SE_TURN;//FIXME! - break; - - case 0x62: // pushwall modifier - lvl->tilemap[ x ][ y ] |= SECRET_TILE; - levelstate.total_secrets++; - break; - - case 0x63: // Victory trigger - lvl->tilemap[ x ][ y ] |= EXIT_TILE; - break; - // spawn guards - - } // end of switch( type ) - -} - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - length -[in] The length of the EXPANDED data. - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void Lvl_CarmackExpand( W16 *source, W16 *dest, W16 length ) -{ - #define NEARTAG 0xA7 - #define FARTAG 0xA8 - - - W32 chhigh, offset; - W16 *copyptr, *outptr; - W8 *inptr; - W16 ch, count; - - length /= 2; - - inptr = (W8 *)source; - outptr = dest; - - while( length ) - { - ch = *(W16 *)inptr; - inptr += 2; - chhigh = ch >> 8; - if( chhigh == NEARTAG ) - { - count = ch & 0xff; - if( ! count ) - { // have to insert a word containing the tag byte - ch |= *inptr++; - *outptr++ = (W16)ch; - length--; - } - else - { - offset = *inptr++; - copyptr = outptr - offset; - length -= count; - while( count-- ) - { - *outptr++ = *copyptr++; - } - } - } - else if( chhigh == FARTAG ) - { - count = ch & 0xff; - if( ! count ) - { // have to insert a word containing the tag byte - ch |= *inptr++; - *outptr++ = ch; - length--; - } - else - { - offset = *(W16 *)inptr; - inptr += 2; - copyptr = dest + offset; - length -= count; - while( count-- ) - { - *outptr++ = *copyptr++; - } - } - } - else - { - *outptr++ = ch; - length--; - } - } -} - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - length -[in] Is EXPANDED length - - Returns: - - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void Lvl_RLEWexpand( W16 *source, W16 *dest, - long length, unsigned rlewtag ) -{ - unsigned value,count,i; - W16 *end; - - - -// -// expand it -// - end = dest + (length >> 1); - - do - { - value = *source++; - if( value != rlewtag ) - { - // - // uncompressed - // - *dest++ = value; - } - else - { - // - // compressed string - // - count = *source++; - value = *source++; - - for( i = 1 ; i <= count ; ++i ) - { - *dest++ = value; - } - } - - } while( dest < end ); - -} - - -#define MAPHEADER_SIZE 49 -#define MAP_SIGNATURE 0x21444921 - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC LevelData_t *Level_LoadMap( const char *levelname ) -{ - W16 rle; - W32 offset[ 3 ]; - W16 length[ 3 ]; - W16 w, h; - W32 signature; - W16 *buffer, expanded; - W8 *data; - W32 ceiling, floor; - LevelData_t *newMap; - filehandle_t *fhandle; - W16 mapNameLength; - char *mapName; - W16 musicNameLength; - char *musicName; - SW32 filesize; - - int x, y0, y, layer1, layer2, layer3; - - - - if( g_version->value == SPEAROFDESTINY ) - { - statinfo = static_sod; - num_statics = sizeof( static_sod ) / sizeof( static_sod[ 0 ] ); - } - else - { - statinfo = static_wl6; - num_statics = sizeof( static_wl6 ) / sizeof( static_wl6[ 0 ] ); - } - - - - newMap = &levelData; - memset( newMap, 0, sizeof( LevelData_t ) ); - - - fhandle = FS_OpenFile( levelname, 0 ); - if( ! fhandle ) - { - Com_Printf( "Could not load map (%s)\n", levelname ); - - return NULL; - } - - filesize = FS_GetFileSize( fhandle ); - if( filesize < MAPHEADER_SIZE ) - { - return NULL; - } - - -// -// Process map header -// - FS_ReadFile( &signature, 1, 4, fhandle ); - if( signature != MAP_SIGNATURE ) - { - return NULL; - } - - - - FS_ReadFile( &rle, 2, 1, fhandle ); - - FS_ReadFile( &w, 2, 1, fhandle ); - FS_ReadFile( &h, 2, 1, fhandle ); - - FS_ReadFile( &ceiling, 4, 1, fhandle ); - FS_ReadFile( &floor, 4, 1, fhandle ); - - - FS_ReadFile( &length, 2, 3, fhandle ); - FS_ReadFile( &offset, 4, 3, fhandle ); - - - FS_ReadFile( &mapNameLength, 1, 2, fhandle ); - FS_ReadFile( &musicNameLength, 1, 2, fhandle ); - - FS_ReadFile( &levelstate.fpartime, sizeof( float ), 1, fhandle ); - - FS_ReadFile( levelstate.spartime, sizeof( W8 ), 5, fhandle ); - levelstate.spartime[ 5 ] = '\0'; - - - if( filesize < (MAPHEADER_SIZE + mapNameLength + musicNameLength + - length[ 0 ] + length[ 1 ] + length[ 2 ]) ) - { - return NULL; - } - - mapName = Z_Malloc( mapNameLength + 1 ); - musicName = Z_Malloc( musicNameLength + 1 ); - - - FS_ReadFile( mapName, 1, mapNameLength, fhandle ); - mapName[ mapNameLength ] = '\0'; - - - FS_ReadFile( musicName, 1, musicNameLength, fhandle ); - musicName[ musicNameLength ] = '\0'; - - - if( filesize < (MAPHEADER_SIZE + mapNameLength + musicNameLength) ) - { - return NULL; - } - -// -// Plane1 -Walls -// - data = MM_MALLOC( length[ 0 ] ); - - FS_FileSeek( fhandle, offset[ 0 ], SEEK_SET ); - FS_ReadFile( data, 1, length[ 0 ], fhandle ); - - - expanded = *((unsigned short *)data); - buffer = MM_MALLOC( expanded ); - - Lvl_CarmackExpand( (unsigned short *)data+1, buffer, expanded ); - Lvl_RLEWexpand( buffer+1, newMap->Plane1, 64*64*2, rle ); - - MM_FREE( buffer ); - MM_FREE( data ); - -// -// Plane2 -Objects -// - data = MM_MALLOC( length[ 1 ] ); - - FS_FileSeek( fhandle, offset[ 1 ], SEEK_SET ); - FS_ReadFile( data, 1, length[ 1 ], fhandle ); - - - expanded = *((PW16)data); - buffer = MM_MALLOC( expanded ); - - Lvl_CarmackExpand( (PW16)data+1, buffer, expanded ); - Lvl_RLEWexpand( buffer+1, newMap->Plane2, 64*64*2, rle ); - - MM_FREE( buffer ); - MM_FREE( data ); - -// -// Plane3 -Other -// - data = MM_MALLOC( length[ 2 ] ); - - FS_FileSeek( fhandle, offset[ 2 ], SEEK_SET ); - FS_ReadFile( data, 1, length[ 2 ], fhandle ); - - - expanded = *((PW16)data); - buffer = MM_MALLOC( expanded ); - - Lvl_CarmackExpand( (PW16)data+1, buffer, expanded ); - Lvl_RLEWexpand( buffer+1, newMap->Plane3, 64*64*2, rle ); - - MM_FREE( buffer ); - MM_FREE( data ); - - - FS_CloseFile( fhandle ); - - - for( y0 = 0 ; y0 < 64 ; ++y0 ) - for( x = 0 ; x < 64 ; ++x ) - { - y = 63 - y0; - layer1 = newMap->Plane1[ y0 * 64 + x ]; - layer2 = newMap->Plane2[ y0 * 64 + x ]; - layer3 = newMap->Plane3[ y0 * 64 + x ]; - -// if server, process obj layer! - if( layer2 ) - { - Lvl_SpawnObj( newMap, layer2, x, y ); - } - -// Map data layer - if( layer1 == 0 ) - { - newMap->areas[ x ][ y ] = -3; // unknown area - } - else if( layer1 < 0x6a ) // solid map object - { - if( (layer1 >= 0x5A && layer1 <= 0x5F) || - layer1 == 0x64 || layer1 == 0x65 ) // door - { - newMap->tilemap[ x ][ y ] |= DOOR_TILE; - Door_SpawnDoor( &newMap->Doors, x, y, layer1 ); - newMap->areas[ x ][ y ] = -2; // door area - } - else - { - newMap->tilemap[ x ][ y ] |= WALL_TILE; - - newMap->wall_tex_x[ x ][ y ] = (layer1-1) * 2 + 1; - newMap->wall_tex_y[ x ][ y ] = (layer1-1) * 2; - newMap->areas[ x ][ y ] = -1; // wall area - - if( layer1 == 0x15 ) // elevator - { - newMap->tilemap[ x ][ y ] |= ELEVATOR_TILE; - } - } - } - else if( layer1 == 0x6a ) // Ambush floor tile - { - newMap->tilemap[ x ][ y ] |= AMBUSH_TILE; - newMap->areas[ x ][ y ] = -3; // unknown area - } - else if( layer1 >= FIRSTAREA && - layer1 < (FIRSTAREA + NUMAREAS) ) // area - { - if( layer1 == FIRSTAREA ) // secret level - { - newMap->tilemap[ x ][ y ] |= SECRETLEVEL_TILE; - } - - newMap->areas[ x ][ y ] = layer1 - FIRSTAREA;// spawn area - } - else - { - newMap->areas[ x ][ y ] = -3; // unknown area - } -// End of the map data layer - } - - // JDC: try to replace all the unknown areas with an adjacent area, to - // avoid the silent attack / no damage problem when you get an ambush - // guard stuck on their original tile - for ( x = 1 ; x < 63 ; x++ ) { - for ( y = 1 ; y < 63 ; y++ ) { - if ( newMap->areas[x][y] != -3 ) { - continue; - } - if ( newMap->areas[x-1][y] >= 0 ) { - newMap->areas[x][y] = newMap->areas[x-1][y]; - } else if ( newMap->areas[x+1][y] >= 0 ) { - newMap->areas[x][y] = newMap->areas[x+1][y]; - } else if ( newMap->areas[x][y-1] >= 0 ) { - newMap->areas[x][y] = newMap->areas[x][y-1]; - } else if ( newMap->areas[x+1][y+1] >= 0 ) { - newMap->areas[x][y] = newMap->areas[x][y+1]; - } - } - } - - Door_SetAreas( &newMap->Doors, newMap->areas ); - - my_strlcpy( levelstate.level_name, mapName, sizeof( levelstate.level_name ) ); - - strcpy( newMap->mapName, mapName ); - strcpy( newMap->musicName, musicName ); - - newMap->ceilingColour[ 0 ] = (W8)((ceiling >> 16) & 0xFF); - newMap->ceilingColour[ 1 ] = (W8)((ceiling >> 8) & 0xFF); - newMap->ceilingColour[ 2 ] = (W8)((ceiling ) & 0xFF); - newMap->floorColour[ 0 ] = (W8)((floor >> 16) & 0xFF); - newMap->floorColour[ 1 ] = (W8)((floor >> 8) & 0xFF); - newMap->floorColour[ 2 ] = (W8)((floor ) & 0xFF); - - return newMap; -} - - - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Level_PrecacheTextures_Sound( LevelData_t *lvl ) -{ - int x, y; - char texname[ 32 ]; - - - - for( x = 0 ; x < 64 ; ++x ) - for( y = 0 ; y < 64 ; ++y ) - { - if( lvl->tilemap[ x ][ y ] & WALL_TILE ) - { - my_snprintf( texname, sizeof( texname ), "walls/%.3d.tga", lvl->wall_tex_x[ x ][ y ] ); - wallTextures[lvl->wall_tex_x[ x ][ y ] ] = TM_FindTexture( texname, TT_Wall ); - - my_snprintf( texname, sizeof( texname ), "walls/%.3d.tga", lvl->wall_tex_y[ x ][ y ] ); - wallTextures[lvl->wall_tex_y[ x ][ y ]] = TM_FindTexture( texname, TT_Wall ); - } - - if( lvl->tilemap[ x ][ y ] & POWERUP_TILE ) - { - int tex = lvl->tilemap[ x ][ y ] & POWERUP_TILE; - my_snprintf( texname, sizeof( texname ), "%s/%.3d.tga", spritelocation, tex ); - spriteTextures[tex] = TM_FindTexture( texname, TT_Wall ); - } - } - - // Doors - for( x = TEX_DOOR; x < TEX_DLOCK+1 ; ++x ) - { - my_snprintf( texname, sizeof( texname ), "walls/%.3d.tga", x ); - wallTextures[x] = TM_FindTexture( texname, TT_Wall ); - } - - - // Items - CacheTextures( 26, 36 ); - - // Weapon frames - CacheTextures( SPR_KNIFEREADY, SPR_CHAINATK4 ); -#if 0 - for( x = 1; x < 8 ; ++x ) - { - my_snprintf( texname, sizeof( texname ), "pics/FACE%dAPIC.tga", x ); - (void)TM_FindTexture( texname, TT_Pic ); - - my_snprintf( texname, sizeof( texname ), "pics/FACE%dBPIC.tga", x ); - (void)TM_FindTexture( texname, TT_Pic ); - - my_snprintf( texname, sizeof( texname ), "pics/FACE%dCPIC.tga", x ); - (void)TM_FindTexture( texname, TT_Pic ); - } - - my_snprintf( texname, sizeof( texname ), "pics/FACE8APIC.tga" ); - (void)TM_FindTexture( texname, TT_Pic ); -#endif -} - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: true if a straight line between 2 points is unobstructed, - otherwise false. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC _boolean Level_CheckLine( SW32 x1, SW32 y1, SW32 x2, SW32 y2, LevelData_t *lvl ) -{ - SW32 xt1, yt1, xt2, yt2; /* tile positions */ - SW32 x, y; /* current point in !tiles! */ - SW32 xdist, ydist; - SW32 xstep, ystep; /* Step value for each whole xy */ - - SW32 deltafrac; /* current point in !1/256 of tile! */ - - SW32 Frac; /* Fractional xy stepper */ - - SW32 partial; /* how much to move in our direction to border */ - SW32 intercept; /* Temp for door code */ - - - - #define FRACBITS 8 /* Number of bits of fraction */ - - -// get start & end tiles - xt1 = x1 >> TILESHIFT; - yt1 = y1 >> TILESHIFT; - - xt2 = x2 >> TILESHIFT; - yt2 = y2 >> TILESHIFT; - - xdist = ABS( xt2 - xt1 ); // X distance in tiles - ydist = ABS( yt2 - yt1 ); // Y distance in tiles - -// 1/256 tile precision (TILESHIFT is 16) - x1 >>= FRACBITS; y1 >>= FRACBITS; - x2 >>= FRACBITS; y2 >>= FRACBITS; - - - if( xdist ) // always positive check only for 0 - { - if( xt2 > xt1 ) - { - partial = 256 - (x1 & 0xff); - xstep = 1; - } - else - { - partial = x1 & 0xff; - xstep = -1; - } - - deltafrac = ABS( x2 - x1 ); - ystep = ((y2 - y1) << FRACBITS) / deltafrac; - Frac = y1 + ((ystep * partial) >> FRACBITS); - - x = xt1 + xstep; - xt2 += xstep; - do - { - y = Frac >> FRACBITS; - Frac += ystep; - - - assert( x >= 0 && x < 64 && y >= 0 && y < 64 ); - if( lvl->tilemap[ x ][ y ] & WALL_TILE ) - { - return false; // Wall is in path quitting! - } - - if( lvl->tilemap[ x ][ y ] & DOOR_TILE ) - {// door, see if the door is open enough - if( lvl->Doors.DoorMap[ x ][ y ].action != dr_open ) - { - if( lvl->Doors.DoorMap[ x ][ y ].action == dr_closed ) - { - return false; - } - // checking vertical doors in action: ->_I_ - intercept = ((Frac - ystep / 2) & 0xFF) >> 4; // 1/64 of tile - if( intercept < (63 - lvl->Doors.DoorMap[ x ][ y ].ticcount) ) - { - return false; - } - } - } - x += xstep; - - } while( x != xt2 ); - } - - if( ydist ) // always positive check only for 0 - { - if( yt2 > yt1 ) - { - partial = 256 - (y1 & 0xff); - ystep = 1; - } - else - { - partial = y1 & 0xff; - ystep = -1; - } - - deltafrac = ABS( y2 - y1 ); - xstep = ((x2 - x1) << FRACBITS) / deltafrac; - Frac = x1 + ((xstep * partial) >> FRACBITS); - - y = yt1 + ystep; - yt2 += ystep; - do - { - x = Frac >> FRACBITS; - Frac += xstep; - - assert( x >= 0 && x < 64 && y >= 0 && y < 64 ); - if( lvl->tilemap[ x ][ y ] & WALL_TILE ) - { - return false; // Wall is in path quitting! - } - - if( lvl->tilemap[ x ][ y ] & DOOR_TILE ) - {// door, see if the door is open enough - if( lvl->Doors.DoorMap[ x ][ y ].action != dr_open ) - { - if( lvl->Doors.DoorMap[ x ][ y ].action == dr_closed ) - { - return false; - } - // checking vertical doors in action: ->_I_ - intercept = ((Frac - xstep / 2) & 0xFF) >> 4; // 1/64 of tile - if( intercept < lvl->Doors.DoorMap[ x ][ y ].ticcount ) - { - return false; - } - } - } - y += ystep; - - } while( y != yt2 ); - } - - return true; -} diff --git a/wolf3d/newCode/wolf/wolf_level.h b/wolf3d/newCode/wolf/wolf_level.h deleted file mode 100644 index 52d8386..0000000 --- a/wolf3d/newCode/wolf/wolf_level.h +++ /dev/null @@ -1,285 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000-2002 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_level.h: Wolfenstein3-D level management. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - * Acknowledgement: - * Portion of this code was derived from Wolfenstein3-D, and was originally - * written by Id Software, Inc. - * - */ - -/* - Notes: - This module is implemented by wolf_areas.c, wolf_doors.c, wolf_level.c and - wolf_pushwalls.c - - -*/ - -#ifndef __WOLF_LEVEL_H__ -#define __WOLF_LEVEL_H__ - - -/////////////////// -// -// Areas -// -/////////////////// - -#define NUMAREAS 37 // number of areas -#define FIRSTAREA 0x6B // first area in map data (it is by the way a way to the secret floor!) -#define AMBUSHTILE 0x6A // def guard -#define AMBUSH -2 - -/////////////////// -// -// Doors -// -/////////////////// -#define MAX_DOORS 256 -#define DOOR_TIMEOUT 300 -#define DOOR_MINOPEN 50 - -#define DOOR_FULLOPEN 63 - - -#define DOOR_VERT 255 -#define DOOR_HORIZ 254 -#define DOOR_E_VERT 253 -#define DOOR_E_HORIZ 252 - -#define DOOR_G_VERT 251 -#define DOOR_G_HORIZ 250 -#define DOOR_S_VERT 249 -#define DOOR_S_HORIZ 248 - -#define FIRST_DOOR 248 -#define LAST_LOCK 251 - - - - -#define TEX_DOOR 126 - -// texture IDs used by cache routines -#define TEX_DDOOR (0 + TEX_DOOR) // Simple Door -#define TEX_PLATE (2 + TEX_DOOR) // Door Plate -#define TEX_DELEV (4 + TEX_DOOR) // Elevator Door -#define TEX_DLOCK (6 + TEX_DOOR) // Locked Door - - - -/////////////////// -// -// Level -// -/////////////////// -#define WALL_TILE 1 -#define PUSHWALL_TILE (1 << 20) -#define DOOR_TILE 2 -#define SECRET_TILE 4 -#define DRESS_TILE 8 -#define BLOCK_TILE 16 -#define ACTOR_TILE 32 -#define DEADACTOR_TILE 64 -#define POWERUP_TILE 128 -#define AMBUSH_TILE 256 -#define EXIT_TILE 512 -#define SECRETLEVEL_TILE 1024 -#define ELEVATOR_TILE (1 << 11) -#define TILE_IS_E_TURN (1 << 12) -#define TILE_IS_NE_TURN (1 << 13) -#define TILE_IS_N_TURN (1 << 14) -#define TILE_IS_NW_TURN (1 << 15) -#define TILE_IS_W_TURN (1 << 16) -#define TILE_IS_SW_TURN (1 << 17) -#define TILE_IS_S_TURN (1 << 18) -#define TILE_IS_SE_TURN (1 << 19) - -#define SOLID_TILE (WALL_TILE | BLOCK_TILE | PUSHWALL_TILE) -#define BLOCKS_MOVE_TILE (WALL_TILE | BLOCK_TILE | PUSHWALL_TILE | ACTOR_TILE) -#define WAYPOINT_TILE (TILE_IS_E_TURN | TILE_IS_NE_TURN | TILE_IS_N_TURN | TILE_IS_NW_TURN | TILE_IS_W_TURN | TILE_IS_SW_TURN | TILE_IS_S_TURN | TILE_IS_SE_TURN ) - -/////////////////// -// -// Doors -// -/////////////////// -typedef enum -{ - dr_closing = -1, - dr_closed, - dr_opening, - dr_open - -} dr_state; - -typedef struct -{ - int tilex, tiley; - _boolean vertical; - int ticcount; - - dr_state action; - - int area1, area2; -/*DOOR_VERT 255 - DOOR_HORIZ 254 - DOOR_E_VERT 253 - DOOR_E_HORIZ 252 - DOOR_G_VERT 251 - DOOR_G_HORIZ 250 - DOOR_S_VERT 249 - DOOR_S_HORIZ 248*/ - int type; - - int texture; - -} doors_t; - -typedef struct -{ - int doornum; - doors_t *Doors[ 256 ]; - doors_t DoorMap[ 64 ][ 64 ]; - -} LevelDoors_t; - -/////////////////// -// -// Level -// -/////////////////// -typedef struct -{ - char fname[ 32 ]; /* Map filename */ - - W16 Plane1[ 64 * 64 ]; /* walls */ - W16 Plane2[ 64 * 64 ]; /* objects */ - W16 Plane3[ 64 * 64 ]; /* other */ - - - long tilemap[ 64 ][ 64 ]; // wall values only - W8 spotvis[ 64 ][ 64 ]; -// objtype *actorat[ 64 ][ 64 ]; - - // this is an array of references to texture descriptions -// the renderer must know what to draw by this number - int wall_tex_x[ 64 ][ 64 ]; // x_wall - int wall_tex_y[ 64 ][ 64 ]; // y_wall - -// this is a (0-based) array of area numbers! -// must be all filled by level loading sub -// if -1 it is a wall, if -2 it is a door, if -3 it is unknown - int areas[ 64 ][ 64 ]; - - LevelDoors_t Doors; - - placeonplane_t pSpawn; // player spawn place - - - char mapName[128]; /* Map name */ - char musicName[128]; /* Music file name */ - - colour3_t ceilingColour, floorColour; - - W8 tileEverVisible[ 64 ][ 64 ]; // for automap -} LevelData_t; - - -typedef struct statinfo_t -{ - _boolean block; - int powerup; - -} statinfo_t; - - -extern LevelData_t *r_world; - - -extern LevelData_t *Level_LoadMap( const char *levelname ); -extern void Level_PrecacheTextures_Sound( LevelData_t *lvl ); -extern _boolean Level_CheckLine( SW32 x1, SW32 y1, SW32 x2, SW32 y2, LevelData_t *lvl ); -extern void Level_ScanInfoPlane( LevelData_t *lvl ); - -/////////////////// -// -// Doors -// -/////////////////// -extern void Door_ResetDoors( LevelDoors_t *lvl ); -extern int Door_SpawnDoor( LevelDoors_t *lvl, int x, int y, int type ); -extern void Door_SetAreas( LevelDoors_t *lvl, int (*areas)[64] ); -extern void Door_OpenDoor( doors_t *Door ); -extern void Door_ProcessDoors_e( LevelDoors_t *lvl, int t_tk, int t_ms ); -extern int Door_Opened( LevelDoors_t *lvl, int x, int y ); -extern _boolean Door_TryUse( doors_t *Door, int keys ); - -/////////////////// -// -// Areas -// -/////////////////// -extern _boolean areabyplayer[ NUMAREAS ]; - -extern void Areas_ConnectAreas( int areanumber ); -extern void Areas_InitAreas( int areanumber ); -extern void Areas_JoinAreas( int area1, int area2 ); -extern void Areas_DisconnectAreas( int area1, int area2 ); - - -/////////////////// -// -// Push Walls -// -/////////////////// -typedef struct -{ - _boolean active; - int PWtilesmoved; - int PWpointsmoved; - dir4type dir; - int x, y; - int dx, dy; - int tex_x, tex_y; - -} Pwall_t; - - -extern Pwall_t PWall; - - -extern void PushWall_Reset( void ); -extern _boolean PushWall_Push( int x, int y, dir4type dir ); -extern void PushWall_Process( void ); - - -#endif /* __WOLF_LEVEL_H__ */ diff --git a/wolf3d/newCode/wolf/wolf_local.h b/wolf3d/newCode/wolf/wolf_local.h deleted file mode 100644 index 0c84640..0000000 --- a/wolf3d/newCode/wolf/wolf_local.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - - 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. - -*/ - -/* - * wolf_local.h: Wolfenstein3-D init. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from Wolfenstein3-D, and was originally - * written by Id Software, Inc. - * - */ - -/* - Notes: - This module is implemented by wolf_main.c - -*/ - -#ifndef __WOLF_LOCAL_H__ -#define __WOLF_LOCAL_H__ - - -// Game Version -#define WOLFENSTEINWL6 0x00 -#define SPEAROFDESTINY 0x01 - - - -#define TILEGLOBAL 0x10000 -#define HALFTILE 0x8000 -#define TILESHIFT 16 - -#define MINDIST (0x5800) - - - - - -typedef enum difficulty_e -{ - gd_baby, - gd_easy, - gd_medium, - gd_hard - -} difficulty_t; - -// -// this structure is cleared as each map is entered -// -typedef struct -{ - int framenum; - float time; - - char level_name[ MAX_OSPATH ]; // the descriptive name (Outer Base, etc) - char mapname[ MAX_OSPATH ]; // the server name (base1, etc) - char nextmap[ MAX_OSPATH ]; // go here when fraglimit is hit - - // intermission state - W32 levelCompleted; // in case the game was saved at the intermission - - W32 floornum; - float fpartime; - char spartime[6]; - - W32 total_secrets; - W32 found_secrets; - - W32 total_treasure; - W32 found_treasure; - - W32 total_monsters; - W32 killed_monsters; - - -} level_locals_t; - - - -extern level_locals_t levelstate; - - - -typedef struct -{ - W32 total_secrets; - W32 found_secrets; - - W32 total_treasure; - W32 found_treasure; - - W32 total_monsters; - W32 killed_monsters; - W32 time; - -} LRstruct; - - -extern LRstruct LevelRatios; - - - -extern cvar_t *g_version; -extern cvar_t *episode; -extern cvar_t *skill; - -extern int tics; - - -W32 floornumber; - - -extern void Game_Init( void ); -extern void Game_Reset( void ); - - - -extern void ProcessGuards( void ); - - -#define WL6SPRITESDIRNAME "sprites" -#define SODSPRITESDIRNAME "sodsprites" - - -extern char *spritelocation; - - - -#endif /* __WOLF_LOCAL_H__ */ diff --git a/wolf3d/newCode/wolf/wolf_main.c b/wolf3d/newCode/wolf/wolf_main.c deleted file mode 100644 index eea88ca..0000000 --- a/wolf3d/newCode/wolf/wolf_main.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - - Copyright (C) 2004-2005 Michael Liebscher - - 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 "../wolfiphone.h" - -level_locals_t levelstate; - -LRstruct LevelRatios; - -cvar_t *g_version; // Wolfenstein or Spear of Destiny -cvar_t *episode; -cvar_t *skill; - - -char *spritelocation = WL6SPRITESDIRNAME; - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Game_Reset( void ) -{ - memset( &levelstate, 0, sizeof( levelstate ) ); -} - -extern void Map_f( void ); - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Game_Init( void ) -{ - Com_Printf( "\n------ Game Init ------\n" ); - - episode = Cvar_Get( "episode", "0", CVAR_ARCHIVE ); - skill = Cvar_Get( "skill", "1", CVAR_ARCHIVE ); - g_version = Cvar_Get( "g_version", "0", CVAR_ARCHIVE ); - -#ifndef EPISODE1 - Cmd_AddCommand( "map", Map_f ); -#endif - - G_Build_Tables(); - Powerup_Reset(); - Sprite_Reset(); - Game_Reset(); - PL_Init(); - - Com_Printf( "\n-----------------------\n" ); - -} diff --git a/wolf3d/newCode/wolf/wolf_math.c b/wolf3d/newCode/wolf/wolf_math.c deleted file mode 100644 index ef14f07..0000000 --- a/wolf3d/newCode/wolf/wolf_math.c +++ /dev/null @@ -1,341 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_math.c: Wolfenstein 3-D math routines. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - * - */ - -#include "../wolfiphone.h" - -#define XRES 640 -#define YRES 480 - -// ------------------------- * LUTs * ------------------------- -double SinTable[ ANG_360 + ANG_90 + 1 ], - *CosTable = SinTable + ANG_90, - TanTable[ ANG_360 + 1 ]; - -int XnextTable[ ANG_360 + 1 ], - YnextTable[ ANG_360 + 1 ]; - -int ColumnAngle[ 640 ]; // ViewAngle=PlayerAngle+ColumnAngle[curcolumn]; /in fines/ - -char dx4dir[5]={1, 0, -1, 0, 0}; // dx & dy based on direction -char dy4dir[5]={0, 1, 0, -1, 0}; -char dx8dir[9]={1, 1, 0, -1, -1, -1, 0, 1, 0}; // dx & dy based on direction -char dy8dir[9]={0, 1, 1, 1, 0, -1, -1, -1, 0}; -dir4type opposite4[5]={2, 3, 0, 1, 4}; -dir8type opposite8[9]={4, 5, 6, 7, 0, 1, 2, 3, 8}; -dir8type dir4to8[5]={0, 2, 4, 6, 8}; -dir8type diagonal[9][9]= -{ -/* east */ {dir8_nodir, dir8_nodir, dir8_northeast, dir8_nodir, dir8_nodir, dir8_nodir, dir8_southeast, dir8_nodir, dir8_nodir}, - {dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir}, -/* north */ {dir8_northeast, dir8_nodir, dir8_nodir, dir8_nodir, dir8_northwest, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir}, - {dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir}, -/* west */ {dir8_nodir, dir8_nodir, dir8_northwest, dir8_nodir, dir8_nodir, dir8_nodir, dir8_southwest, dir8_nodir, dir8_nodir}, - {dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir}, -/* south */ {dir8_southeast, dir8_nodir, dir8_nodir, dir8_nodir, dir8_southwest, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir}, - {dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir}, - {dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir, dir8_nodir} -}; -// dir of delta tooks dx{-1|0|1}+1 & dy{-1|0|1}+1 and give direction -dir4type dir4d[3][3]={{dir4_nodir, dir4_west , dir4_nodir}, - {dir4_south, dir4_nodir, dir4_north}, - {dir4_nodir, dir4_east , dir4_nodir}}; -int dir8angle[9]={ANG_0, ANG_45, ANG_90, ANG_135, ANG_180, ANG_225, ANG_270, ANG_315, ANG_0}; -int dir4angle[5]={ANG_0, ANG_90, ANG_180, ANG_270, ANG_0}; - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC int G_Build_Tables( void ) -{ - double angle, tanfov2, tanval, value; - int n; - - for( n = 0 ; n <= ANG_90 ; ++n ) - { - angle = FINE2RAD( n ); - - value = sin( angle ); - SinTable[ n ] = SinTable[ ANG_180 - n ] = SinTable[ n + ANG_360 ] = value; - SinTable[ ANG_180 + n ] = SinTable[ ANG_360 - n ] = -value; - } - - for( n = 0 ; n <= ANG_360 ; ++n ) - { - angle = FINE2RAD( n ); //angle is in radians, n is in FINEs - - if( n == ANG_90 || n == ANG_270 ) - { - TanTable[ n ] = tan( FINE2RAD( n - 0.5 ) ); // infinity - YnextTable[ n ] = (int)(FLOATTILE * tan( FINE2RAD( n - 0.5 ) )); // infinity - } - else - { - TanTable[ n ] = tan( angle ); - YnextTable[ n ] = (int)(FLOATTILE * tan( angle )); - } - - if( n == ANG_0 || n == ANG_360 ) - XnextTable[ n ] = (int)(FLOATTILE / tan( FINE2RAD( n + 0.5 ) )); // infinity - else if( n == ANG_180 ) - XnextTable[ n ] = (int)(FLOATTILE / tan(FINE2RAD( n - 0.5 ) )); // -infinity - else if( n == ANG_90 || n == ANG_270 ) - XnextTable[ n ] = 0; - else - XnextTable[ n ] = (int)(FLOATTILE / tan( angle )); - } - - tanfov2 = TanDgr( CalcFov( 75, XRES, YRES) / 2.0 ) * ((float)XRES / (float)YRES ); - for( n = 0 ; n < XRES ; ++n ) - { - tanval = tanfov2 * (-1.0 + 2.0 * (double)n / (double)(XRES-1) ); - ColumnAngle[ n ] = (int)RAD2FINE( atan( tanval ) ); - } - - US_InitRndT( 1 ); // random number generators - - - return 1; -} - - - -/* ------------------------------------------------------------------------------ - Function: NormalizeAngle -clips angle to [0..360] bounds. - - Parameters: - - Returns: - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC int NormalizeAngle( int alpha ) -{ - if( alpha > ANG_360 ) - alpha %= ANG_360; - - if(alpha x - point1 = {x, y} ------------------------------------------------------------------------------ -*/ -PUBLIC float TransformPoint( double Point1X, double Point1Y, double Point2X, double Point2Y ) -{ - float angle; - - angle = atan2( Point1Y - Point2Y, Point1X - Point2X ); - - return normalize_angle( angle ); -} - diff --git a/wolf3d/newCode/wolf/wolf_math.h b/wolf3d/newCode/wolf/wolf_math.h deleted file mode 100644 index 39f6925..0000000 --- a/wolf3d/newCode/wolf/wolf_math.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_math.h: Wolfenstein 3-D math routines. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * This code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - * - */ - -/* - Notes: - This module is implemented by wolf_math.c - -*/ -#ifndef __WOLF_MATH_H__ -#define __WOLF_MATH_H__ - - -#define FLOATTILE 65536.0f - - -// Angle Direction Types & LUTs (Hard Coded! Please do not mess them) -typedef enum {q_first, q_second, q_third, q_fourth} quadrant; -typedef enum {dir4_east, dir4_north, dir4_west, dir4_south, dir4_nodir} dir4type; -typedef enum { dir8_east, dir8_northeast, dir8_north, dir8_northwest, dir8_west, - dir8_southwest, dir8_south, dir8_southeast, dir8_nodir} dir8type; - -extern char dx4dir[5], dy4dir[5], dx8dir[9], dy8dir[9]; -extern dir4type opposite4[5], dir4d[3][3]; -extern dir8type opposite8[9], dir4to8[5], diagonal[9][9]; -extern int dir8angle[9], dir4angle[5]; -// ------------------------- * Vectors * ------------------------- -// Vectors & angles for 3D-Space - - - -typedef struct -{ - long origin[2]; - long angle; - -} placeonplane_t; - - -// ------------------------- * Some Macroses * ------------------------- - - -#define max_of_2(a, b) ((a)>(b)?(a):(b)) - - - -#define LABS(x) ((long)(x)>0?(x):-(x)) - - -#define TILE2POS(a) (((a)<>TILESHIFT) -#define POS2TILEf(a) ((a)/FLOATTILE) -// ------------------------- * vvv FINE angles vvv * ------------------------- -#define ASTEP 0.0078125f // 1 FINE=x DEGREES -#define ASTEPRAD 0.000136354f // 1 FINE=x RADIANS -#define ANG_1RAD 7333.8598 // 1 RADIAN=x FINES -#define ANG_0 0 //(int)((float)0/ASTEP) -#define ANG_1 128 //(int)((float)1/ASTEP) -#define ANG_6 768 //(int)((float)6/ASTEP) -#define ANG_15 1920 //(int)((float)15/ASTEP) -#define ANG_22_5 2880 //(int)((float)22.5/ASTEP) -#define ANG_30 3840 //(int)((float)30/ASTEP) -#define ANG_45 5760 //(int)((float)45/ASTEP) -#define ANG_67_5 8640 //(int)((float)67.5/ASTEP) -#define ANG_90 11520 //(int)((float)90/ASTEP) -#define ANG_112_5 14400 //(int)((float)112.5/ASTEP) -#define ANG_135 17280 //(int)((float)135/ASTEP) -#define ANG_157_5 20160 //(int)((float)157.5/ASTEP) -#define ANG_180 23040 //(int)((float)180/ASTEP) -#define ANG_202_5 25920 //(int)((float)202.5/ASTEP) -#define ANG_225 28800 //(int)((float)225/ASTEP) -#define ANG_247_5 31680 //(int)((float)247.5/ASTEP) -#define ANG_270 34560 //(int)((float)270/ASTEP) -#define ANG_292_5 37440 //(int)((float)292.5/ASTEP) -#define ANG_315 40320 //(int)((float)225/ASTEP) -#define ANG_337_5 43200 //(int)((float)337.5/ASTEP) -#define ANG_360 46080 //(int)((float)360/ASTEP) -// ------------------------- * ^^^ FINE angles ^^^ * ------------------------- - - - -#define FINE2RAD( a ) (((a) * M_PI ) / ANG_180) -#define RAD2FINE( a ) (((a) * ANG_180) / M_PI) -#define FINE2DEG( a ) ((float)(a) / ANG_1) // !@# don't lose precision bits -#define FINE2DEGf( a ) ((a) / (float)ANG_1) -#define DEG2FINE( a ) ((a) * ANG_1) - -extern double SinTable[], *CosTable, TanTable[ ANG_360 + 1 ]; -extern int XnextTable[ ANG_360 + 1], YnextTable[ ANG_360 + 1 ]; -extern int ColumnAngle[640]; // - -extern int G_Build_Tables(void); - -#define TanDgr( x ) (tan( DEG2RAD( x ) )) -#define SinDgr( x ) (sin( DEG2RAD( x ) )) -#define CosDgr( x ) (cos( DEG2RAD( x ) )) - -#define ArcTanDgr( x ) (RAD2DEG( atan( x ) )) -#define ArcSinDgr( x ) (RAD2DEG( asin( x ) )) -#define ArcCosDgr( x ) (RAD2DEG( acos( x ) )) - - - -extern int NormalizeAngle( int angle ); -extern int Point2LineDist( int x, int y, int a ); -extern int LineLen2Point( int x, int y, int a ); - -extern quadrant GetQuadrant( float angle ); -extern dir4type Get4dir( float angle ); -extern dir8type Get8dir( float angle ); - -extern float TransformPoint( double Point1X, double Point1Y, double Point2X, double Point2Y ); - - - - - -#endif /* __WOLF_MATH_H__ */ diff --git a/wolf3d/newCode/wolf/wolf_opengl.c b/wolf3d/newCode/wolf/wolf_opengl.c deleted file mode 100644 index 04dc67f..0000000 --- a/wolf3d/newCode/wolf/wolf_opengl.c +++ /dev/null @@ -1,629 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000-2002 by DarkOne the Hacker - Copyright (C) 1997-2001 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. - -*/ - -/* - * wolf_opengl.c: Wolfenstein3-D OpenGL renderer. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - * Portion of this code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -#include "../wolfiphone.h" - -// width and height in 2D -#define WIDTH_2D 640 -#define HEIGHT_2D 480 - - -float cur_x_fov, cur_y_fov; // x & y field of view (in degrees) -float ratio; // viewport width/height - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void GL_SetDefaultState( void ) -{ - - pfglClearColor( 1,0, 0.5 , 0.5 ); - pfglCullFace( GL_FRONT ); - pfglEnable( GL_TEXTURE_2D ); - - pfglEnable( GL_ALPHA_TEST ); - pfglAlphaFunc( GL_GREATER, 0.666f ); - - pfglDisable( GL_DEPTH_TEST ); - pfglDisable( GL_CULL_FACE ); - pfglDisable( GL_BLEND ); - - pfglColor4f( 1, 1, 1, 1 ); -#ifndef IPHONE - pfglPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); -#endif - pfglShadeModel( GL_FLAT ); - - - pfglBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); - - - - GL_UpdateSwapInterval(); - -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void R_CheckFOV( void ) -{ -/* - if(!vid_fov->modified) return; - vid_fov->modified=false; - - if( vid_fov->value<1 || vid_fov->value>179) - { - Com_Printf("Wrong FOV: %f\n", vid_fov->value); - Cvar_SetValue(vid_fov->name, (cur_x_fov>=1 && cur_x_fov<=179)?cur_x_fov:DEFAULT_FOV); - } -*/ - ratio = (float) viddef.width / (float)viddef.height; // FIXME: move somewhere - cur_x_fov = 75; - cur_y_fov = CalcFov( cur_x_fov, (float)viddef.width, (float)viddef.height ); - -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void R_SetGL3D( placeonplane_t viewport ) -{ - R_CheckFOV(); - - pfglMatrixMode( GL_PROJECTION ); - pfglLoadIdentity(); -#ifdef IPHONE - pfglRotatef( 90, 0, 0, 1 ); -#endif - MYgluPerspective( cur_y_fov - 2.0f, ratio, 0.2f, 64.0f ); // tweak fov in to avoid edge tile clips - pfglMatrixMode( GL_MODELVIEW ); - pfglLoadIdentity(); - - pfglRotatef( (float)(90 - FINE2DEG( viewport.angle )), 0, 1, 0 ); - pfglTranslatef( -viewport.origin[ 0 ] / FLOATTILE, 0, viewport.origin[ 1 ] / FLOATTILE ); - - pfglCullFace( GL_BACK ); - - pfglEnable( GL_DEPTH_TEST ); - pfglEnable( GL_CULL_FACE ); - pfglEnable( GL_BLEND ); - pfglDisable( GL_BLEND ); // !@# draw all the walls opaque without alpha test - pfglDisable( GL_ALPHA_TEST ); - qglDepthMask( GL_TRUE ); - - // clear depth buffer - pfglClear( GL_DEPTH_BUFFER_BIT ); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void R_DrawBox( int x, int y, int w, int h, W32 color ) -{ - pfglDisable( GL_TEXTURE_2D ); - -// pfglEnable( GL_BLEND ); -// pfglBlendFunc( GL_SRC_COLOR, GL_DST_COLOR ); - - pfglColor4ubv( (GLubyte *) & color ); - - pfglBegin( GL_QUADS ); - - pfglVertex2i( x, y ); - pfglVertex2i( x, y + h); - pfglVertex2i( x + w, y + h ); - pfglVertex2i( x + w, y ); - - pfglEnd(); - - pfglColor3f( 1, 1, 1 ); -// pfglBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); -// pfglDisable( GL_BLEND ); - pfglEnable( GL_TEXTURE_2D ); -} - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - - north (y) - __________ - | | - west (x) | | east (x) - |________| - south (y) - ------------------------------------------------------------------------------ -*/ -PUBLIC void R_Draw_Wall( float x, float y, float z1, float z2, int type, int tex ) -{ - float x1, x2, y1, y2; - texture_t *twall; - - switch( type ) - { - // X wall - case dir4_east: - x1 = x2 = x + 1; - y1 = -1 - y; - y2 = -y; - break; - - case dir4_west: - x1 = x2 = x; - y1 = -y; - y2 = -1 - y; - break; - - // Y wall - case dir4_north: - y1 = y2 = -y - 1; - x1 = x; - x2 = x + 1; - break; - - case dir4_south: - y1 = y2 = -y; - x1 = x + 1; - x2 = x; - break; - } - - assert( tex >= 0 && tex < 1000 ); - twall = wallTextures[tex]; - if ( !twall ) { - char name[1024]; - my_snprintf( name, sizeof( name ), "walls/%.3d.tga", tex ); - twall = wallTextures[tex] = TM_FindTexture( name, TT_Wall ); - } - R_Bind( twall->texnum ); - - - pfglBegin( GL_QUADS ); - - pfglTexCoord2f( 1.0, 0.0 ); pfglVertex3f( x1, z2, y1 ); - pfglTexCoord2f( 0.0, 0.0 ); pfglVertex3f( x2, z2, y2 ); - pfglTexCoord2f( 0.0, 1.0 ); pfglVertex3f( x2, z1, y2 ); - pfglTexCoord2f( 1.0, 1.0 ); pfglVertex3f( x1, z1, y1 ); - - pfglEnd(); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void R_Draw_Door( int x, int y, float z1, float z2, _boolean vertical, _boolean backside, int tex, int amount ) -{ - float x1, x2, y1, y2, amt; - texture_t *twall; - - if( amount == DOOR_FULLOPEN ) - { - return; - } - - amt = (float)amount / DOOR_FULLOPEN; - - - if( vertical ) - { - x1 = x2 = (float)x + 0.5f; - y1 = -((float)y - amt); - y2 = -((float)y - amt); // -1 - if( backside ) - { - y1 -= 1; - } - else - { - y2 -= 1; - } - } - else - { - y1 = y2 = -(float)y - 0.5f; - x1 = (float)x + amt; // +1 - x2 = (float)x + amt; - if( backside ) - { - x2 += 1; - } - else - { - x1 += 1; - } - } - - assert( tex >= 0 && tex < 1000 ); - twall = wallTextures[tex]; - if ( !twall ) { - char name[1024]; - my_snprintf( name, sizeof( name ), "walls/%.3d.tga", tex ); - twall = wallTextures[tex] = TM_FindTexture( name, TT_Wall ); - } - - R_Bind( twall->texnum ); - - - pfglBegin( GL_QUADS ); - - pfglTexCoord2f( backside ? 0.0f : 1.0f, 0.0 ); pfglVertex3f( x1, z2, y1 ); - pfglTexCoord2f( backside ? 1.0f : 0.0f, 0.0 ); pfglVertex3f( x2, z2, y2 ); - pfglTexCoord2f( backside ? 1.0f : 0.0f, 1.0 ); pfglVertex3f( x2, z1, y2 ); - pfglTexCoord2f( backside ? 0.0f : 1.0f, 1.0 ); pfglVertex3f( x1, z1, y1 ); - - pfglEnd(); -} - - -/* ------------------------------------------------------------------------------ - Function: R_DrawSprites -Draws all visible sprites. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void R_DrawSprites( void ) -{ - float sina, cosa; - float Ex, Ey, Dx, Dy; - int n_sprt, n, ang; - texture_t *twall; - extern cvar_t *cropSprites; - -// build visible sprites list - n_sprt = Sprite_CreateVisList(); - if( ! n_sprt ) - { - return; // nothing to draw - } - -// prepare values for billboarding - ang = NormalizeAngle( Player.position.angle + ANG_90 ); - sina = (float)(0.5 * SinTable[ ang ]); - cosa = (float)(0.5 * CosTable[ ang ]); - - //pfglEnable( GL_ALPHA_TEST ); - pfglEnable( GL_BLEND ); - qglDepthMask( GL_FALSE ); - for( n = 0; n < n_sprt; ++n ) - { - int texnum = vislist[ n ].tex; - if( vislist[ n ].dist < MINDIST / 2 ) - { - continue; // little hack to save speed & z-buffer - } - - - - assert( texnum >= 0 && texnum < 1000 ); - twall = spriteTextures[texnum]; - if ( !twall ) { - char name[1024]; - my_snprintf( name, sizeof( name ), "%s/%.3d.tga", spritelocation, (vislist[ n ].tex) ); - twall = spriteTextures[texnum] = TM_FindTexture( name, TT_Wall ); - } - R_Bind( twall->texnum ); - - pfglBegin( GL_QUADS ); - - if ( cropSprites->value && twall->header.numBounds > 0 ) { - // draw one or two subrects to avoid blending all the empty space - int b; - - for ( b = 0 ; b < twall->header.numBounds ; b++ ) { - // include a bit extra for filtering - float x1 = (float)(twall->header.bounds[b][0][0]-1) / (twall->header.uploadWidth-1); - float y1 = (float)(twall->header.bounds[b][0][1]-1) / (twall->header.uploadHeight-1); - float x2 = (float)(twall->header.bounds[b][1][0]+1) / (twall->header.uploadWidth-1); - float y2 = (float)(twall->header.bounds[b][1][1]+1) / (twall->header.uploadHeight-1); - if ( x1 < 0 ) { - x1 = 0; - } else if ( x2 > 1.0 ) { - x2 = 1.0; - } - if ( y1 < 0 ) { - y1 = 0; - } else if ( y2 > 1.0 ) { - y2 = 1.0; - } - Ex = vislist[ n ].x / FLOATTILE + cosa; - Ey = vislist[ n ].y / FLOATTILE + sina; - - pfglTexCoord2f( x1, y1 ); pfglVertex3f( Ex - x1 * 2*cosa, -(LOWERZCOORD + (UPPERZCOORD - LOWERZCOORD) * y1), -Ey + x1 * 2*sina ); - pfglTexCoord2f( x1, y2 ); pfglVertex3f( Ex - x1 * 2*cosa, -(LOWERZCOORD + (UPPERZCOORD - LOWERZCOORD) * y2), -Ey + x1 * 2*sina ); - pfglTexCoord2f( x2, y2 ); pfglVertex3f( Ex - x2 * 2*cosa, -(LOWERZCOORD + (UPPERZCOORD - LOWERZCOORD) * y2), -Ey + x2 * 2*sina ); - pfglTexCoord2f( x2, y1 ); pfglVertex3f( Ex - x2 * 2*cosa, -(LOWERZCOORD + (UPPERZCOORD - LOWERZCOORD) * y1), -Ey + x2 * 2*sina ); - } - } else { - Ex = Dx = vislist[ n ].x / FLOATTILE; - Ey = Dy = vislist[ n ].y / FLOATTILE; - Ex += cosa; Ey += sina; - Dx -= cosa; Dy -= sina; - - pfglTexCoord2f( 0.0, 0.0 ); pfglVertex3f( Ex, UPPERZCOORD, -Ey ); - pfglTexCoord2f( 0.0, 1.0 ); pfglVertex3f( Ex, LOWERZCOORD, -Ey ); - pfglTexCoord2f( 1.0, 1.0 ); pfglVertex3f( Dx, LOWERZCOORD, -Dy ); - pfglTexCoord2f( 1.0, 0.0 ); pfglVertex3f( Dx, UPPERZCOORD, -Dy ); - } - - pfglEnd(); - } - - //pfglDisable( GL_ALPHA_TEST ); // !@# reanable just for sprites -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void R_DrawWeapon( void ) -{ - char name[ 32 ]; - texture_t *tex; - static int w = 128; - static int h = 128; - static int scale = 2; - int x = (viddef.width - (128 * scale)) >> 1; - int y = viddef.height - (128 * scale) - 79; - - my_snprintf( name, sizeof( name ), "%s/%d.tga", spritelocation, Player.weapon * 5 + Player.weaponframe + SPR_KNIFEREADY ); - - tex = TM_FindTexture( name, TT_Pic ); - - - R_Bind( tex->texnum ); - - - - pfglAlphaFunc( GL_GREATER, 0.3f ); - - pfglEnable( GL_BLEND ); - - pfglBegin( GL_QUADS ); - - pfglTexCoord2f( 0.0f, 0.0f ); pfglVertex2i( x, y ); - pfglTexCoord2f( 1.0f, 0.0f ); pfglVertex2i( x + w * scale, y ); - pfglTexCoord2f( 1.0f, 1.0f ); pfglVertex2i( x + w * scale, y + h * scale ); - pfglTexCoord2f( 0.0f, 1.0f ); pfglVertex2i( x, y + h * scale ); - - pfglEnd(); - - pfglDisable( GL_BLEND ); - - pfglAlphaFunc( GL_GREATER, 0.666f ); - - -} - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void R_DrawNumber( int x, int y, int number ) -{ - texture_t *tex; - int col; - float fcol; - static float w = 0.1f; - int i; - char string[ 20 ]; - W32 length; - - - my_snprintf( string, sizeof( string ), "%d", number ); - length = strlen( string ); - - tex = TM_FindTexture( "pics/N_NUMPIC.tga", TT_Pic ); - - - pfglEnable( GL_TEXTURE_2D ); - - R_Bind( tex->texnum ); - - pfglBegin( GL_QUADS ); - - for( i = length-1 ; i >= 0 ; --i ) - { - col = string[ i ] - 48; - - fcol = col * w; - - pfglTexCoord2f( fcol, 0 ); pfglVertex2i( x, y ); - pfglTexCoord2f( fcol+w, 0 ); pfglVertex2i( x+18, y ); - pfglTexCoord2f( fcol+w, 1 ); pfglVertex2i( x+18, y+32 ); - pfglTexCoord2f( fcol, 1 ); pfglVertex2i( x, y+32 ); - - x -= 18; - } - - pfglEnd(); - -} - - -W8 wfont[ ] = { - 32, 15, 32, 32, 32, 32, 32, 12, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 16, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32 }; - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void R_put_line( int x, int y, const char *string ) -{ - texture_t *tex; - int mx = x; - int num; - float frow, fcol; - static float h = 0.25f; // (32 / 128.0f); - static float w = 0.0625f; // (32 / 512.0f); - - - tex = TM_FindTexture( "pics/L_FONTPIC.tga", TT_Pic ); - - - R_Bind( tex->texnum ); - - pfglBegin( GL_QUADS ); - - while( *string ) - { - if( *string == '\n' ) - { - mx = x; - y += 32; - ++string; - continue; - } - - num = *string; - - num &= 255; - - if( (num & 127) == 32 ) - { - mx += 32; - ++string; - continue; // space - } - - - frow = ((num >> 4) - 2) * h; - fcol = (num & 15) * w; - - - pfglTexCoord2f( fcol, frow ); pfglVertex2i( mx, y ); - pfglTexCoord2f( fcol+w, frow ); pfglVertex2i( mx+32, y ); - pfglTexCoord2f( fcol+w, frow+h ); pfglVertex2i( mx+32, y+32 ); - pfglTexCoord2f( fcol, frow+h ); pfglVertex2i( mx, y+32 ); - - - - mx += wfont[ (num & 127) - 32 ]; - ++string; - } - - pfglEnd(); -} - diff --git a/wolf3d/newCode/wolf/wolf_player.c b/wolf3d/newCode/wolf/wolf_player.c deleted file mode 100644 index 0ce012c..0000000 --- a/wolf3d/newCode/wolf/wolf_player.c +++ /dev/null @@ -1,1023 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000-2002 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_player.c: Wolfenstein3-D player management. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - */ - -#include "../wolfiphone.h" - -player_t Player; // player struct (pos, health etc...) - - -#define PLAYERSIZE MINDIST // player radius - - - -struct atkinf -{ - char tics, attack, frame; // attack is 1 for gun, 2 for knife - -} attackinfo[ 4 ][ 14 ] = // 4 guns, 14 frames max for every gun! -{ - { {6,0,1},{6,2,2},{6,0,3},{6,-1,4} }, - { {6,0,1},{6,1,2},{6,0,3},{6,-1,4} }, - { {6,0,1},{6,1,2},{6,3,3},{6,-1,4} }, - { {6,0,1},{6,1,2},{6,4,3},{6,-1,4} }, -}; - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: true if player can change weapons, otherwise false. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE _boolean PL_ChangeWeapon( player_t *self, int weapon ) -{ - unsigned itemflag; - - itemflag = ITEM_WEAPON_1 << weapon; - - if( self->ammo[ AMMO_BULLETS ] == 0 && weapon != WEAPON_KNIFE ) - { - Com_Printf("Not enough ammo.\n"); - return false; - } - - if( ! (self->items & itemflag) ) - { - Com_Printf( "No weapon.\n" ); - return false; - } - - self->weapon = - self->pendingweapon = weapon; - - self->attackframe = - self->attackcount = - self->weaponframe = 0; - - return true; -} - - -/* ------------------------------------------------------------------------------ - Function: Called if player pressed USE button - - Parameters: - - Returns: returns true if player used something - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE _boolean PL_Use( player_t *self, LevelData_t *lvl ) -{ - int x, y, dir; - - dir = Get4dir( FINE2RAD( self->position.angle ) ); - x = self->tilex + dx4dir[ dir ]; - y = self->tiley + dy4dir[ dir ]; - - if( lvl->tilemap[ x ][ y ] & DOOR_TILE ) - { - return Door_TryUse( &lvl->Doors.DoorMap[ x ][ y ], Player.items ); - } - - if( lvl->tilemap[ x ][ y ] & SECRET_TILE ) - { - return PushWall_Push( x, y, dir ); - } - - if( lvl->tilemap[ x ][ y ] & ELEVATOR_TILE ) - { - int newtex; - - switch( dir ) - { - case dir4_east: - case dir4_west: - newtex = lvl->wall_tex_x[ x ][ y ] += 2; - break; - - case dir4_north: - case dir4_south: - return false; // don't allow to press elevator rails - } - - if( lvl->tilemap[ self->tilex ][ self->tiley ] & SECRETLEVEL_TILE ) - { - self->playstate = ex_secretlevel; - } - else - { - self->playstate = ex_complete; - } - Sound_StartSound( NULL, 0, CHAN_BODY, Sound_RegisterSound( "lsfx/040.wav" ), 1, ATTN_NORM, 0 ); - - iphoneStartIntermission( 0 ); - - return true; - } - - //Sound_StartSound( NULL, 0, CHAN_BODY, Sound_RegisterSound( "lsfx/020.wav" ), 1, ATTN_NORM, 0 ); - return false; -} - - - -#define STOPSPEED 0x0D00 -#define FRICTION 0.25f -#define MAXMOVE (MINDIST*2-1) - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: returns true if move ok - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE _boolean PL_TryMove( player_t *self, LevelData_t *lvl ) -{ - int xl, yl, xh, yh, x, y; - int d, n; - - xl = POS2TILE( Player.position.origin[ 0 ] - PLAYERSIZE ); - yl = POS2TILE( Player.position.origin[ 1 ] - PLAYERSIZE ); - xh = POS2TILE( Player.position.origin[ 0 ] + PLAYERSIZE ); - yh = POS2TILE( Player.position.origin[ 1 ] + PLAYERSIZE ); - - // Cheching for solid walls: - for( y = yl ; y <= yh ; ++y ) - for( x = xl ; x <= xh ; ++x ) - { - if( lvl->tilemap[ x ][ y ] & SOLID_TILE ) - return 0; - - if( lvl->tilemap[ x ][ y ] & DOOR_TILE && - Door_Opened( &lvl->Doors, x, y) != DOOR_FULLOPEN ) { - // iphone hack to allow player to move halfway into door tiles - // if the player bounds doesn't cross the middle of the tile, let the move continue - if ( abs( Player.position.origin[0] - TILE2POS( x ) ) <= 0x9000 - && abs( Player.position.origin[1] - TILE2POS( y ) ) <= 0x9000 ) { - return 0; - } - } - } - -// check for actors - for( n = 0 ; n < NumGuards ; ++n ) - { - if( Guards[ n ].state >= st_die1 ) - continue; - - d = self->position.origin[ 0 ] - Guards[ n ].x; - - if( d < -MINACTORDIST || d > MINACTORDIST ) - continue; - - d = self->position.origin[ 1 ] - Guards[ n ].y; - - if( d < -MINACTORDIST || d > MINACTORDIST) - continue; - - return false; - } - - return true; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void PL_ClipMove( player_t *self, int xmove, int ymove ) -{ - int basex, basey; - - basex = self->position.origin[ 0 ]; - basey = self->position.origin[ 1 ]; - - self->position.origin[ 0 ] += xmove; - self->position.origin[ 1 ] += ymove; - if( PL_TryMove( self, r_world ) ) - { - return; // we moved as we wanted - } - - //Sound_StartSound( NULL, 0, CHAN_BODY, Sound_RegisterSound( "lsfx/000.wav" ), 1, ATTN_NORM, 0 ); - - if( xmove ) // don't bother if we don't move x! - { - self->position.origin[ 0 ] = basex + xmove; - self->position.origin[ 1 ] = basey; - if( PL_TryMove( self, r_world ) ) - { - return; // May be we'll move only X direction? - } - } - if( ymove ) // don't bother if we don't move y! - { - self->position.origin[ 0 ] = basex; - self->position.origin[ 1 ] = basey + ymove; - if( PL_TryMove( self, r_world ) ) - { - return; // May be we'll move only Y direction? - } - } - -// movement blocked; we must stay on one place... :( - self->position.origin[ 0 ] = basex; - self->position.origin[ 1 ] = basey; -} - - -/* ------------------------------------------------------------------------------ - Function: Changes player's angle and position - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void PL_ControlMovement( player_t *self, LevelData_t *lvl ) -{ - int angle, speed; - -// rotation - angle = self->position.angle; - -// if(cmd->forwardmove || cmd->sidemove) - self->movx = self->movy = 0; // clear accumulated movement - - if( Player.cmd.forwardmove ) - { - speed = tics * Player.cmd.forwardmove; - self->movx+=(int)(speed * CosTable[ angle ] ); - self->movy+=(int)(speed * SinTable[ angle ] ); - } - if( Player.cmd.sidemove ) - { - speed = tics * Player.cmd.sidemove; - self->movx += (int)( speed * SinTable[ angle ] ); - self->movy -= (int)( speed * CosTable[ angle ] ); - } - - if( ! self->movx && ! self->movy ) - return; - -#ifdef SPEAR - - funnyticount = 0; // ZERO FUNNY COUNTER IF MOVED! // FIXME! - -#endif - self->speed = self->movx + self->movy; - -// bound movement - if( self->movx > MAXMOVE ) - self->movx = MAXMOVE; - else if( self->movx < -MAXMOVE ) - self->movx = -MAXMOVE; - - if( self->movy > MAXMOVE ) - self->movy = MAXMOVE; - else if( self->movy < -MAXMOVE ) - self->movy = -MAXMOVE; - -// move player and clip movement to walls (check for no-clip mode here) - PL_ClipMove( self, self->movx, self->movy ); - self->tilex = POS2TILE( self->position.origin[ 0 ] ); - self->tiley = POS2TILE( self->position.origin[ 1 ] ); - - // pick up items easier -- any tile you touch, instead of - // just the midpoint tile - { - int x, y; - - for ( x = -1 ; x <= 1 ; x+= 2 ) { - int tilex = POS2TILE( self->position.origin[0] + x * PLAYERSIZE ); - for ( y = -1 ; y <= 1 ; y+= 2 ) { - int tiley = POS2TILE( self->position.origin[1] + y * PLAYERSIZE ); - Powerup_PickUp( tilex, tiley ); - } - } - } -// Powerup_PickUp( self->tilex, self->tiley ); - -// Checking for area change, ambush tiles and doors will have negative values - if( lvl->areas[ self->tilex ][ self->tiley ] >= 0 && - lvl->areas[ self->tilex ][ self->tiley ] != Player.areanumber ) - { - Player.areanumber = lvl->areas[ self->tilex ][ self->tiley ]; - assert( Player.areanumber >= 0 && Player.areanumber < NUMAREAS ); - Areas_ConnectAreas( Player.areanumber ); - } - - if( lvl->tilemap[ self->tilex ][ self->tiley ] & EXIT_TILE ) - { - iphoneStartIntermission( 0 ); - } - - -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void PL_PlayerAttack( player_t *self, _boolean re_attack ) -{ - struct atkinf *cur; - - self->attackcount -= tics; - while( self->attackcount <= 0 ) - { - cur = &attackinfo[ self->weapon ][ self->attackframe ]; - switch( cur->attack ) - { - case -1: - self->flags &= ~PL_FLAG_ATTCK; - if( ! self->ammo[ AMMO_BULLETS ] ) - { - self->weapon = WEAPON_KNIFE; - } - else if( self->weapon != self->pendingweapon ) - { - self->weapon = self->pendingweapon; - } - self->attackframe = self->weaponframe = 0; - return; - - case 4: - if( ! self->ammo[ AMMO_BULLETS ] ) - { - break; - } - - if( re_attack ) - { - self->attackframe -= 2; - } - - case 1: - if( ! self->ammo[ AMMO_BULLETS ] ) // can only happen with chain gun - { - self->attackframe++; - break; - } - fire_lead( self ); - self->ammo[ AMMO_BULLETS ]--; - break; - - case 2: - fire_hit( self ); - break; - - case 3: - if(self->ammo[AMMO_BULLETS] && re_attack) - self->attackframe-=2; - break; - } - - self->attackcount += cur->tics; - self->attackframe++; - self->weaponframe = attackinfo[ self->weapon ][ self->attackframe ].frame; - } - -} - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void PL_Process( player_t *self, LevelData_t *lvl ) -{ - int n; - - self->madenoise = false; - - PL_ControlMovement( self, lvl ); - - if( self->flags & PL_FLAG_ATTCK ) - { - PL_PlayerAttack( self, Player.cmd.buttons & BUTTON_ATTACK ); - } - else - { - if( Player.cmd.buttons & BUTTON_USE ) - { - if(!(self->flags & PL_FLAG_REUSE) && PL_Use( self, lvl ) ) - { - self->flags|=PL_FLAG_REUSE; - } - } - else - { - self->flags &= ~PL_FLAG_REUSE; - } - - if( Player.cmd.buttons & BUTTON_ATTACK ) - { - self->flags |= PL_FLAG_ATTCK; - - self->attackframe = 0; - self->attackcount = attackinfo[ self->weapon ][ 0 ].tics; - self->weaponframe = attackinfo[ self->weapon ][ 0 ].frame; - } - } - -// process impulses - switch( Player.cmd.impulse ) - { - case 0: - break; // no impulse - - case 1: - case 2: - case 3: - case 4: - PL_ChangeWeapon( self, Player.cmd.impulse - 1 ); - break; - - case 10: // next weapon /like in Quake/ FIXME: weapprev, weapnext - self->pendingweapon=self->weapon; - for( n = 0 ; n < 4; ++n ) - { - if( ++self->weapon > WEAPON_CHAIN ) - { - self->weapon = WEAPON_KNIFE; - } - - if( PL_ChangeWeapon( self, self->weapon ) ) - { - break; - } - } - self->weapon = self->pendingweapon; - break; - - default: - Com_Printf( "Unknown Impulse: %d\n", Player.cmd.impulse ); - break; - } - -} - - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void PL_Reset(void) -{ - memset( &Player, 0, sizeof( Player ) ); - Player.playstate = ex_notingame; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void PL_Spawn( placeonplane_t location, LevelData_t *lvl ) -{ - Player.position = location; - Player.tilex = POS2TILE( location.origin[ 0 ] ); - Player.tiley = POS2TILE( location.origin[ 1 ] ); - Player.areanumber = lvl->areas[ Player.tilex ][ Player.tiley ]; - assert( Player.areanumber >= 0 && Player.areanumber < NUMAREAS ); - if( Player.areanumber < 0 ) - { - Player.areanumber = 36; - } - - Areas_ConnectAreas( Player.areanumber ); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void Cmd_Give_f( void ) -{ - PL_GiveHealth( &Player, 999, 0 ); - PL_GiveAmmo( &Player, AMMO_BULLETS, 99 ); - PL_GiveWeapon( &Player, WEAPON_AUTO ); - PL_GiveWeapon( &Player, WEAPON_CHAIN ); - PL_GiveKey( &Player, KEY_GOLD ); - PL_GiveKey( &Player, KEY_SILVER ); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void Cmd_God_f( void ) -{ - Player.flags ^= FL_GODMODE; - - Com_Printf( "God mode %s\n", Player.flags & FL_GODMODE ? "ON":"OFF" ); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE void PL_notarget_f( void ) -{ - Player.flags ^= FL_NOTARGET; -} - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void PL_Init(void) -{ - PL_Reset(); - PL_NewGame( &Player ); - - Cmd_AddCommand( "god", Cmd_God_f ); - Cmd_AddCommand( "notarget", PL_notarget_f ); - - Cmd_AddCommand( "give", Cmd_Give_f ); -} - -// ------------------------- * environment interraction * ------------------------- -#define EXTRAPOINTS 40000 // points for an extra life - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -#ifdef IPHONE -void vibrateDevice(); -#else -void vibrateDevice() {} -#endif - -PUBLIC void PL_Damage( player_t *self, entity_t *attacker, int points ) -{ - - if( self->playstate == ex_dead ) - { - return; - } - - self->LastAttacker = attacker; - - if( skill->value == gd_baby ) - { - points >>= 2; - } - - // vibe the phone - vibrateDevice(); - - // note the direction of the last hit for the directional blends - { - int dx = attacker->x - self->position.origin[0]; - int dy = attacker->y - self->position.origin[1]; - - // probably won't ever have damage from self, but check anyway - if ( dx != 0 || dy != 0 ) { - float angle = atan2f( dy, dx ); - float playerAngle = self->position.angle * 360.0f / (float)ANG_360; - float deltaAngle; - angle = angle * 180.0f / M_PI; - if ( angle < 0 ) { - angle = 360 + angle; - } - deltaAngle = angle - playerAngle; - if ( deltaAngle > 180 ) { - deltaAngle = deltaAngle - 360; - } - if ( deltaAngle < -180 ) { - deltaAngle = 360 + deltaAngle; - } -// Com_Printf( "damage: player angle: %4.0f shotAngle: %4.0f deltaAngle:%4.0f\n", playerAngle, angle, deltaAngle ); - if ( deltaAngle > 40 ) { - iphoneSetAttackDirection( 1 ); - } else if ( deltaAngle < -40 ) { - iphoneSetAttackDirection( -1 ); - } - } - } - - // do everything else but subtract health in god mode, to ease - // testing of damage feedback - if( !(self->flags & FL_GODMODE) ) - { - self->health -= points; - } - - if( self->health <= 0 ) - { - // dead - self->health = 0; - self->playstate = ex_dead; - - Sound_StartSound( NULL, 0, CHAN_BODY, Sound_RegisterSound( "lsfx/009.wav" ), 1, ATTN_NORM, 0 ); - } - - // red screen flash - iphoneStartDamageFlash( points ); - - // stop the happy grin face if shot before it times out - Player.face_gotgun = false; - - // make BJ's eyes bulge on huge hits - if( points > 30 && Player.health != 0 ) - { - Player.face_ouch = true; - Player.facecount = 0; - } -} - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: returns true if player needs this health. - - Notes: - gives player some HP - max can be: - 0 - natural player's health limit (100 or 150 with augment) - >0 - indicates the limit ------------------------------------------------------------------------------ -*/ -PUBLIC _boolean PL_GiveHealth( player_t *self, int points, int max ) -{ - if( max == 0 ) - { - max = (self->items & ITEM_AUGMENT) ? 150 : 100; - } - - if( self->health >= max ) - { - return false; // doesn't need this health - } - - self->health += points; - - if( self->health > max ) - { - self->health = max; - } - - Player.face_gotgun = false; - - return true; // took it -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: returns true if player needs this ammo - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC _boolean PL_GiveAmmo( player_t *self, int type, int ammo ) -{ - int max_ammo[ AMMO_TYPES ] = { 99 }; - int max; - - max = max_ammo[ type ]; - if( self->items & ITEM_BACKPACK ) - { - max *= 2; - } - - if( self->ammo[ type ] >= max ) - { - return false; // don't need - } - - if( ! self->ammo[ type ] && ! self->attackframe ) // knife was out - { - self->weapon = self->pendingweapon; - } - - self->ammo[ type ] += ammo; - if( self->ammo[ type ] > max ) - { - self->ammo[ type ] = max; - } - - return true; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void PL_GiveWeapon( player_t *self, int weapon ) -{ - unsigned itemflag; - - PL_GiveAmmo( self, AMMO_BULLETS, 6 ); // give some ammo with a weapon - - itemflag = ITEM_WEAPON_1 << weapon; - if( self->items & itemflag ) - { - return; // player owns this weapon - } - else - { - self->items |= itemflag; - if ( self->weapon < weapon ) { // don't switch if already using better weapon - self->weapon = self->pendingweapon = weapon; - } - } -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void PL_GiveLife( player_t *self ) -{ - if( self->lives < 9 ) - { - self->lives++; - } - - Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/044.wav" ), 1, ATTN_NORM, 0 ); -} - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void PL_GivePoints( player_t *self, W32 points ) -{ - self->score += points; - while( self->score >= self->next_extra ) - { - self->next_extra += EXTRAPOINTS; - PL_GiveLife( self ); - } -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void PL_GiveKey( player_t *self, int key ) -{ - self->items |= ITEM_KEY_1 << key; -} - - -/* ------------------------------------------------------------------------------ - Function: Set up player for the new game - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void PL_NewGame( player_t *self ) -{ - memset( self, 0, sizeof( player_t ) ); - - self->health = 100; - self->ammo[ AMMO_BULLETS ] = 16; // JDC: changed for iphone 8; - self->lives = 3; - - self->weapon = self->pendingweapon = WEAPON_PISTOL; - self->items = ITEM_WEAPON_1 | ITEM_WEAPON_2; - self->next_extra = EXTRAPOINTS; -} - -/* ------------------------------------------------------------------------------ - Function: Set up player for level transition - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void PL_NextLevel( player_t *self ) -{ - self->old_score = self->score; - self->attackcount = self->attackframe = self->weaponframe = 0; - self->flags = 0; - - self->items &= ~(ITEM_KEY_1 | ITEM_KEY_2 | ITEM_KEY_3 | ITEM_KEY_4); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: self -[in] Player to respawn in game world. - - Returns: returns false if no lives left - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC _boolean PL_Reborn( player_t *self ) -{ -#if 0 // removed game over from iphone version - if( --self->lives < 1 ) - { - return false; - } -#endif - - self->health = 100; - self->ammo[ AMMO_BULLETS ] = 16; // JDC: changed for iphone 8; - self->score = self->old_score; - self->attackcount = 0; - self->attackframe = 0; - self->weaponframe = 0; - self->flags = 0; - - self->weapon = self->pendingweapon = WEAPON_PISTOL; - self->items = ITEM_WEAPON_1 | ITEM_WEAPON_2; - - self->playstate = ex_playing; - - return true; -} diff --git a/wolf3d/newCode/wolf/wolf_player.h b/wolf3d/newCode/wolf/wolf_player.h deleted file mode 100644 index d04d5d3..0000000 --- a/wolf3d/newCode/wolf/wolf_player.h +++ /dev/null @@ -1,180 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000-2002 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_player.h: Wolfenstein3-D player management. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - */ - -/* - Notes: - This module is implemented by wolf_player.c - -*/ - -#ifndef __WOLF_PLAYER_H__ -#define __WOLF_PLAYER_H__ - -#define ITEM_KEY_1 1 -#define ITEM_KEY_2 2 -#define ITEM_KEY_3 4 -#define ITEM_KEY_4 8 -#define ITEM_WEAPON_1 16 -#define ITEM_WEAPON_2 32 -#define ITEM_WEAPON_3 64 -#define ITEM_WEAPON_4 128 -#define ITEM_WEAPON_5 256 -#define ITEM_WEAPON_6 512 -#define ITEM_WEAPON_7 1024 -#define ITEM_WEAPON_8 2048 -#define ITEM_BACKPACK (1<<12) // doubles carrying capacity -#define ITEM_AUGMENT (1<<13) // adds 50 to maximum health -#define ITEM_UNIFORM (1<<14) // allows you to pass guards -#define ITEM_AUTOMAP (1<<15) // shows unknown map ares in other color (as in DooM) -#define ITEM_FREE (1<<16) // - unused - - - -enum weapon_e -{ - WEAPON_KNIFE, - WEAPON_PISTOL, - WEAPON_AUTO, - WEAPON_CHAIN, - - WEAPON_TYPES -}; - -enum key_e -{ - KEY_GOLD, - KEY_SILVER, - KEY_FREE1, - KEY_FREE2, - - KEY_TYPES -}; - -enum ammo_e -{ - AMMO_BULLETS, - - AMMO_TYPES -}; - - - -// flags -#define PL_FLAG_REUSE 1 // use button pressed -#define PL_FLAG_ATTCK 2 // attacking -// debug (cheat codes) flags -#define FL_GODMODE (1<<4) -#define FL_NOTARGET (1<<6) - - -typedef enum state_e -{ - ex_notingame, - ex_playing, - ex_dead, - ex_secretlevel, - ex_victory, - ex_complete -/* - ex_stillplaying, - ex_completed, - ex_died, - ex_warped, - ex_resetgame, - ex_loadedgame, - ex_victorious, - ex_abort, - ex_demodone, - ex_secretlevel -*/ -} state_t; - -// ------------------------- * types * ------------------------- -// Player structure: Holds all info about player -typedef struct player_s -{ - usercmd_t cmd; // movement / action command - - placeonplane_t position; // player position - int movx, movy, speed; - int tilex, tiley; - -// stats - int health, lives, frags; - int armor; // there are 2 types. The better one is indicated by high bit set - int ammo[AMMO_TYPES]; - int old_score, score, next_extra; - unsigned items; // (keys, weapon) - int weapon, pendingweapon; -// additional info - int attackframe, attackcount, weaponframe; // attack info - unsigned flags; - int areanumber; - - _boolean madenoise; // FIXME: move to flags? - entity_t *LastAttacker; - int faceframe, facecount; // bj's face in the HUD // FIXME decide something! - _boolean face_gotgun, face_ouch; - state_t playstate; // fixme: move to gamestate - -} player_t; - -extern player_t Player; - - - - -extern void PL_Spawn( placeonplane_t location, LevelData_t *lvl ); - -extern void PL_Process( player_t *self, LevelData_t *lvl ); - -extern void PL_Damage( player_t *self, entity_t *attacker, int points ); -extern _boolean PL_GiveHealth( player_t *self, int points, int max ); -extern _boolean PL_GiveAmmo( player_t *self, int type, int ammo ); -extern void PL_GiveWeapon( player_t *self, int weapon ); -extern void PL_GiveLife( player_t *self ); -extern void PL_GivePoints( player_t *self, W32 points ); -extern void PL_GiveKey( player_t *self, int key ); - -extern void PL_NewGame( player_t *self ); -extern void PL_NextLevel( player_t *self ); -extern _boolean PL_Reborn( player_t *self ); - -extern void PL_Init( void ); -extern void PL_Reset( void ); - - -extern void fire_hit( player_t *self ); -extern void fire_lead( player_t *self ); - - -#endif /* __WOLF_PLAYER_H__ */ diff --git a/wolf3d/newCode/wolf/wolf_powerups.c b/wolf3d/newCode/wolf/wolf_powerups.c deleted file mode 100644 index ebc9331..0000000 --- a/wolf3d/newCode/wolf/wolf_powerups.c +++ /dev/null @@ -1,427 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000-2001 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_pushwalls.c: Wolfenstein3-D power-up handler. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - */ - -#include "../wolfiphone.h" - -typedef struct powerup_s -{ - int x, y; - pow_t type; - int sprite; - struct powerup_s *prev, *next; - -} powerup_t; - -powerup_t *powerups = NULL; - - -int Pow_Texture[ pow_last ] = -{ - SPR_STAT_34, // pow_gibs - SPR_STAT_38, // pow_gibs2 - SPR_STAT_6, // pow_alpo - SPR_STAT_25, // pow_firstaid - SPR_STAT_20, // pow_key1 - SPR_STAT_21, // pow_key2 -// not used - SPR_STAT_20, // pow_key3 - SPR_STAT_20, // pow_key4 - - SPR_STAT_29, // pow_cross - SPR_STAT_30, // pow_chalice - SPR_STAT_31, // pow_bible - SPR_STAT_32, // pow_crown - SPR_STAT_26, // pow_clip - SPR_STAT_26, // pow_clip2 - SPR_STAT_27, // pow_machinegun - SPR_STAT_28, // pow_chaingun - SPR_STAT_24, // pow_food - SPR_STAT_33, // pow_fullheal -// spear - SPR_STAT_49, // pow_25clip - SPR_STAT_51, // pow_spear -}; - - - - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE powerup_t *Pow_Remove( powerup_t *powerup ) -{ - powerup_t *next; - - if( powerup == NULL ) - return NULL; - - if( powerup->prev ) - powerup->prev->next = powerup->next; - - if( powerup->next ) - powerup->next->prev = powerup->prev; - - next = powerup->next; - if( powerups == powerup ) - powerups = next; //fuck! - - MM_FREE( powerup ); - - return next; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE powerup_t *Pow_AddNew( void ) -{ - powerup_t *newp; - - newp = MM_MALLOC( sizeof( powerup_t ) ); - newp->prev = NULL; - newp->next = powerups; - - if( powerups ) - { - powerups->prev = newp; - } - - powerups = newp; - - return newp; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Powerup_Reset( void ) -{ - powerup_t *powerup = powerups; - - while( powerup ) - { - powerup = Pow_Remove( powerup ); - } - - powerups = NULL; -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: 1 if powerup is picked up, otherwise 0. - - Notes: - ------------------------------------------------------------------------------ -*/ -PRIVATE int Pow_Give( pow_t type ) -{ - static const char *keynames[] = { "Gold", "Silver", "?", "?" }; - - switch( type ) - { -// -// Keys -// - case pow_key1: - case pow_key2: - case pow_key3: - case pow_key4: - type -= pow_key1; - PL_GiveKey( &Player, type ); - Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/012.wav" ), 1, ATTN_NORM, 0 ); - iphoneSetNotifyText( "%s key\n", keynames[ type ] ); - break; -// -// Treasure -// - case pow_cross: - PL_GiveHealth( &Player, 1, 150 ); // iphone -- trasure acts as health crumbs - PL_GivePoints( &Player, 100 ); - Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/035.wav" ), 1, ATTN_NORM, 0 ); - if ( ++levelstate.found_treasure == levelstate.total_treasure ) { - iphoneSetNotifyText( "You found the last treasure!" ); - } - break; - - case pow_chalice: - PL_GiveHealth( &Player, 1, 150 ); // iphone -- trasure acts as health crumbs - PL_GivePoints( &Player, 500 ); - Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/036.wav" ), 1, ATTN_NORM, 0 ); - if ( ++levelstate.found_treasure == levelstate.total_treasure ) { - iphoneSetNotifyText( "You found the last treasure!" ); - } - break; - - case pow_bible: - PL_GiveHealth( &Player, 1, 150 ); // iphone -- trasure acts as health crumbs - PL_GivePoints( &Player, 1000 ); - Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/037.wav" ), 1, ATTN_NORM, 0 ); - if ( ++levelstate.found_treasure == levelstate.total_treasure ) { - iphoneSetNotifyText( "You found the last treasure!" ); - } - break; - - case pow_crown: - PL_GiveHealth( &Player, 1, 150 ); // iphone -- trasure acts as health crumbs - PL_GivePoints( &Player, 5000 ); - Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/045.wav" ), 1, ATTN_NORM, 0 ); - if ( ++levelstate.found_treasure == levelstate.total_treasure ) { - iphoneSetNotifyText( "You found the last treasure!" ); - } - break; - -// -// Health -// - case pow_gibs: - if( ! PL_GiveHealth( &Player, 1, 11 ) ) - { - return 0; - } - Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/061.wav" ), 1, ATTN_NORM, 0 ); - break; - - case pow_alpo: - if( ! PL_GiveHealth( &Player, 4, 0 ) ) - { - return 0; - } - Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/033.wav" ), 1, ATTN_NORM, 0 ); - break; - - case pow_food: - if( ! PL_GiveHealth( &Player, 10, 0 ) ) - { - return 0; - } - Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/033.wav" ), 1, ATTN_NORM, 0 ); - break; - - case pow_firstaid: - if( ! PL_GiveHealth( &Player, 25, 0 ) ) - { - return 0; - } - Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/034.wav" ), 1, ATTN_NORM, 0 ); - break; - -// -// Weapon & Ammo -// - case pow_clip: - if( ! PL_GiveAmmo( &Player, AMMO_BULLETS, 8 ) ) - { - return 0; - } - Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/031.wav" ), 1, ATTN_NORM, 0 ); - break; - - case pow_clip2: - if( ! PL_GiveAmmo( &Player, AMMO_BULLETS, 4 ) ) - { - return 0; - } - Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/031.wav" ), 1, ATTN_NORM, 0 ); - break; - - case pow_25clip: - if( ! PL_GiveAmmo( &Player, AMMO_BULLETS, 25 ) ) - { - return 0; - } - Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/064.wav" ), 1, ATTN_NORM, 0 ); - break; - - case pow_machinegun: - PL_GiveWeapon( &Player, WEAPON_AUTO ); - Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/030.wav" ), 1, ATTN_NORM, 0 ); - iphoneSetNotifyText( "Machinegun" ); - break; - - case pow_chaingun: - PL_GiveWeapon( &Player, WEAPON_CHAIN ); - Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/038.wav" ), 1, ATTN_NORM, 0 ); - iphoneSetNotifyText( "Chaingun" ); - - Player.facecount = -100; - Player.face_gotgun = true; - break; - -// -// Artifacts -// - case pow_fullheal: - PL_GiveHealth( &Player, 999, 0 ); - PL_GiveAmmo( &Player, AMMO_BULLETS, 25 ); - PL_GiveLife( &Player ); - if ( ++levelstate.found_treasure == levelstate.total_treasure ) { - iphoneSetNotifyText( "You found the last treasure!" ); - } else { - iphoneSetNotifyText( "Full Heal" ); - } - // no extra lives on iPhone Com_Printf( "Extra life!\n" ); - break; - - case pow_spear: - { - char szTextMsg[ 256 ]; - - Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "sodsfx/109.wav" ), 1, ATTN_NORM, 0 ); - iphoneSetNotifyText( "Spear of Destiny" ); - - my_snprintf( szTextMsg, sizeof( szTextMsg ), - "loading ; map s%.2d.map\n", 20 ); - Cbuf_AddText( szTextMsg ); - } - break; - - default: - Com_DPrintf( "Warning: Unknown item type: %d\n", type ); - break; - } - - iphoneStartBonusFlash(); - - return 1; -} - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: x, y -[in] In are in TILES. - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Powerup_Spawn( int x, int y, int type, LevelData_t *lvl ) -{ - powerup_t *newp; - - lvl->tilemap[ x ][ y ] |= POWERUP_TILE; - newp = Pow_AddNew(); - newp->sprite = Sprite_GetNewSprite(); - Sprite_SetPos( newp->sprite, TILE2POS( newp->x = x ), TILE2POS( newp->y = y ), 0 ); - newp->type = type; - Sprite_SetTex( newp->sprite, -1, Pow_Texture[ type ] ); - lvl->tilemap[ x ][ y ] |= POWERUP_TILE; -// good place to update total treasure count! -} - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: x, y -[in] In are in TILES. - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Powerup_PickUp( int x, int y ) -{ - powerup_t *pow; - _boolean p_left = false, p_pick = false; - - for( pow = powerups ; pow ; pow = pow->next ) - { -check_again: - if( pow->x == x && pow->y == y) - {// got a powerup here - if( Pow_Give( pow->type ) ) //FIXME script - {// picked up this stuff, remove it! - p_pick = true; - Sprite_RemoveSprite( pow->sprite ); - pow = Pow_Remove( pow ); - if( pow ) - goto check_again; - else - break; - } - else - {// player do not need it, so may be next time! - p_left = true; - } - } - } - - if( p_left ) - { - r_world->tilemap[ x ][ y ] |= POWERUP_TILE; - } - else - { - r_world->tilemap[ x ][ y ] &= ~POWERUP_TILE; - } -} - diff --git a/wolf3d/newCode/wolf/wolf_powerups.h b/wolf3d/newCode/wolf/wolf_powerups.h deleted file mode 100644 index aa87235..0000000 --- a/wolf3d/newCode/wolf/wolf_powerups.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000-2002 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_powerups.h: Wolfenstein3-D power-up handler. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - */ - -/* - Notes: - This module is implemented by wolf_powerups.c - -*/ - -#ifndef __WOLF_POWERUPS_H__ -#define __WOLF_POWERUPS_H__ - -typedef enum -{ -//please provide description - pow_gibs, // 1% if <=10%; SLURPIESND - pow_gibs2, // 1% if <=10%; SLURPIESND - pow_alpo, // 4% if <100%; HEALTH1SND - pow_firstaid, // 25% if <100%; HEALTH2SND - pow_key1, // gold key; GETKEYSND - pow_key2, // silver key; GETKEYSND - pow_key3, // not used - pow_key4, // not used - pow_cross, // 100pts; BONUS1SND - pow_chalice, // 500pts; BONUS2SND - pow_bible, // 1000pts; BONUS3SND - pow_crown, // 5000pts; BONUS4SND - pow_clip, // 8bul if <99bul; GETAMMOSND - pow_clip2, // 4bul if <99bul; GETAMMOSND - pow_machinegun, // machine gun; GETMACHINESND - pow_chaingun, // gatling gun; GETGATLINGSND - pow_food, // 10% if <100%; HEALTH1SND - pow_fullheal, // 99%, 25bul; BONUS1UPSND - pow_25clip, // 25bul if <99bul; GETAMMOBOXSND - pow_spear, // spear of destiny! - - pow_last -// add new types here (after last) - -} pow_t; - - -extern void Powerup_Reset( void ); -extern void Powerup_Spawn( int x, int y, int type, LevelData_t *lvl ); -extern void Powerup_PickUp( int x, int y ); - - -#endif /* __WOLF_POWERUPS_H__ */ - diff --git a/wolf3d/newCode/wolf/wolf_pushwalls.c b/wolf3d/newCode/wolf/wolf_pushwalls.c deleted file mode 100644 index b040d7d..0000000 --- a/wolf3d/newCode/wolf/wolf_pushwalls.c +++ /dev/null @@ -1,175 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000-2002 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_pushwalls.c: Wolfenstein3-D push-wall handler. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - */ - -#include "../wolfiphone.h" - -Pwall_t PWall; - - -/* ------------------------------------------------------------------------------ - Function: PushWall_Reset() -Reset pushwall status. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void PushWall_Reset(void) -{ - memset( &PWall, 0, sizeof( Pwall_t ) ); -} - - -/* ------------------------------------------------------------------------------ - Function: PushWall_Push() -Try to move push-wall. - - Parameters: x, y -[in] Coordinates in tilemap. - dir -[in] Direction in which push-wall is intended to move. - - Returns: true if push successful, otherwise false. - - Notes: Called whenever someone tries to push a secret wall. - ------------------------------------------------------------------------------ -*/ -PUBLIC _boolean PushWall_Push( int x, int y, dir4type dir ) -{ - int dx, dy; - - - if( PWall.active ) - { - return false; // another PWall is moving [only one at a time!] - } - - dx = dx4dir[ dir ]; - dy = dy4dir[ dir ]; - - if( r_world->tilemap[ x + dx ][ y + dy ] & (SOLID_TILE | DOOR_TILE) ) - { // noway (smth is blocking) - return true; - } - -// remove secret flag & make everything needed when pushwall used! - r_world->tilemap[ x ][ y ] &= (~SECRET_TILE); - r_world->tilemap[ x ][ y ] &= (~WALL_TILE); - r_world->tilemap[ x ][ y ] |= PUSHWALL_TILE; - - if ( ++levelstate.found_secrets == levelstate.total_secrets ) { - iphoneSetNotifyText( "You found the last secret!" ); - } else { - iphoneSetNotifyText( "You found a secret!" ); - } - - if( g_version->value == SPEAROFDESTINY ) - { - Sound_StartSound( NULL, 1, CHAN_AUTO, Sound_RegisterSound( "sfx/030.wav" ), 1, ATTN_STATIC, 0 ); - } - else - { - Sound_StartSound( NULL, 1, CHAN_AUTO, Sound_RegisterSound( "sfx/034.wav" ), 1, ATTN_STATIC, 0 ); - } - -// good way to avoid stuckness; [un]comment one more down! -// it makes a tile behind pushwall unpassable - r_world->tilemap[ x + dx ][ y + dy ] |= PUSHWALL_TILE; - r_world->wall_tex_x[ x + dx ][ y + dy ] = r_world->wall_tex_x[ x ][ y ]; - r_world->wall_tex_y[ x + dx ][ y + dy ] = r_world->wall_tex_y[ x ][ y ]; - -// write down PWall info - PWall.active = true; - PWall.PWtilesmoved = PWall.PWpointsmoved = 0; - PWall.dir = dir; - PWall.x = x; PWall.y = y; - PWall.dx = dx; PWall.dy = dy; - PWall.tex_x = r_world->wall_tex_x[ x ][ y ]; - PWall.tex_y = r_world->wall_tex_y[ x ][ y ]; - - return true; -} - -/* ------------------------------------------------------------------------------ - Function: PushWall_Process() -Process push-walls. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void PushWall_Process( void ) -{ - if( ! PWall.active ) - { - return; // no active PWall to work with - } - - PWall.PWpointsmoved += tics; - - if( PWall.PWpointsmoved < 128 ) - { - return; - } - - PWall.PWpointsmoved -= 128; - PWall.PWtilesmoved++; -// Free tile - r_world->tilemap[ PWall.x ][ PWall.y ] &= (~PUSHWALL_TILE); -// Occupy new tile - PWall.x += PWall.dx; - PWall.y += PWall.dy; - -// Shall we move further? - if( r_world->tilemap[ PWall.x + PWall.dx ][ PWall.y + PWall.dy ] & (SOLID_TILE | DOOR_TILE | ACTOR_TILE | POWERUP_TILE) || - PWall.PWtilesmoved == 3 ) - { - r_world->tilemap[ PWall.x ][ PWall.y ] &= (~PUSHWALL_TILE); // wall now - r_world->tilemap[ PWall.x ][ PWall.y ] |= WALL_TILE; // wall now - r_world->wall_tex_x[ PWall.x ][ PWall.y ] = PWall.tex_x; - r_world->wall_tex_y[ PWall.x ][ PWall.y ] = PWall.tex_y; - PWall.active = false; // Free Push Wall - } - else - { - r_world->tilemap[ PWall.x + PWall.dx ][ PWall.y + PWall.dy ] |= PUSHWALL_TILE; - } - -} diff --git a/wolf3d/newCode/wolf/wolf_raycast.c b/wolf3d/newCode/wolf/wolf_raycast.c deleted file mode 100644 index 9321558..0000000 --- a/wolf3d/newCode/wolf/wolf_raycast.c +++ /dev/null @@ -1,370 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000-2002 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_raycast.c: Wolfenstein3-D ray-casting. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - */ - -#include "../wolfiphone.h" - - -W8 tile_visible[ 64 ][ 64 ]; // can player see this tile? - - -/* ------------------------------------------------------------------------------ - Function: R_RayCast() -Ray cast viewport. - - Parameters: viewport -[in] Position of camera. - lvl -[in] Pointer to valid LevelData_t structure. - - Returns: Nothing. - - Notes: Marks all visible tiles in tile_visible[] array. - ------------------------------------------------------------------------------ -*/ -PUBLIC void R_RayCast( placeonplane_t viewport, LevelData_t *lvl ) -{ - int n, x, y, angle, vx, vy; - r_trace_t trace; - - memset( tile_visible, 0, sizeof( tile_visible ) ); // clear tile visible flags - -// viewport tile coordinates - x = viewport.origin[ 0 ]; - y = viewport.origin[ 1 ]; - angle = viewport.angle; - - vx = POS2TILE( viewport.origin[ 0 ] ); - vy = POS2TILE( viewport.origin[ 1 ] ); - - trace.tile_vis = tile_visible; - trace.flags = TRACE_SIGHT | TRACE_MARK_MAP; - -// -// Ray casting -// - - // FIXME: control ray count and make angle init - for( n = 0 ; n < 640 ; ++n ) - { - trace.x = x; - trace.y = y; - trace.a = NormalizeAngle( angle + ColumnAngle[ n ] ); - - R_Trace( &trace, lvl ); - } - -// -// Rendering -// - for( x = 0 ; x < 64; ++x ) - for( y = 0 ; y < 64; ++y ) - if( tile_visible[ x ][ y ] ) - { - lvl->tileEverVisible[x][y] = 1; // for automap - if( lvl->tilemap[ x ][ y ] & DOOR_TILE ) - { - /* door */ - if( lvl->Doors.DoorMap[ x ][ y ].action != dr_open ) - { - _boolean backside = false; - - if( lvl->Doors.DoorMap[ x ][ y ].vertical ) - { - if( x < vx ) - backside = true; - } - else - { - if( y < vy ) - backside = true; - } - - R_Draw_Door( x, y, LOWERZCOORD, UPPERZCOORD, - lvl->Doors.DoorMap[ x ][ y ].vertical, - backside, - lvl->Doors.DoorMap[ x ][ y ].texture, - Door_Opened( &lvl->Doors, x, y ) ); - } - /* door sides */ - if( lvl->Doors.DoorMap[ x ][ y ].vertical ) - { - if( y <= vy ) - R_Draw_Wall( (float)x, (float)(y-1), LOWERZCOORD, UPPERZCOORD, dir4_north, TEX_PLATE ); - - if( y >= vy ) - R_Draw_Wall( (float)x, (float)(y+1), LOWERZCOORD, UPPERZCOORD, dir4_south, TEX_PLATE ); - - if( x <= vx && lvl->tilemap[ x - 1 ][ y ] & WALL_TILE ) - R_Draw_Wall( (float)(x-1), (float)y, LOWERZCOORD, UPPERZCOORD, dir4_east, lvl->wall_tex_x[ x - 1 ][ y ] ); - - if( x >= vx && lvl->tilemap[ x + 1 ][ y ] & WALL_TILE ) - R_Draw_Wall( (float)(x+1), (float)y, LOWERZCOORD, UPPERZCOORD, dir4_west, lvl->wall_tex_x[ x + 1 ][ y ] ); - } - else - { - if( x <= vx ) - R_Draw_Wall((float)(x-1), (float)y, LOWERZCOORD, UPPERZCOORD, dir4_east, TEX_PLATE+1); - - if( x >= vx ) - R_Draw_Wall((float)(x+1), (float)y, LOWERZCOORD, UPPERZCOORD, dir4_west, TEX_PLATE+1); - - if( y <= vy && lvl->tilemap[ x ][ y - 1 ] & WALL_TILE ) - R_Draw_Wall( (float)x, (float)(y-1), LOWERZCOORD, UPPERZCOORD, dir4_north, lvl->wall_tex_y[x][y-1]); - - if( y >= vy && lvl->tilemap[ x ][ y + 1 ] & WALL_TILE ) - R_Draw_Wall( (float)x, (float)(y+1), LOWERZCOORD, UPPERZCOORD, dir4_south, lvl->wall_tex_y[x][y+1]); - } - } - else - { - /* Push-Wall */ - if( (r_world->tilemap[ x ][ y ] & PUSHWALL_TILE) ) - { - float dx, dy; - - dx = PWall.dx * PWall.PWpointsmoved / 128.0f; - dy = PWall.dy * PWall.PWpointsmoved / 128.0f; - - if( PWall.x <= vx ) - R_Draw_Wall( (float)PWall.x + dx, (float)PWall.y + dy, LOWERZCOORD, UPPERZCOORD, dir4_east, PWall.tex_x ); - - if( PWall.x >= vx ) - R_Draw_Wall( (float)PWall.x + dx, (float)PWall.y + dy, LOWERZCOORD, UPPERZCOORD, dir4_west, PWall.tex_x ); - - if( PWall.y <= vy ) - R_Draw_Wall( (float)PWall.x + dx, (float)PWall.y + dy, LOWERZCOORD, UPPERZCOORD, dir4_north, PWall.tex_y ); - - if( PWall.y >= vy ) - R_Draw_Wall( (float)PWall.x + dx, (float)PWall.y + dy, LOWERZCOORD, UPPERZCOORD, dir4_south, PWall.tex_y ); - - } - /* x-wall */ - if( x <= vx && r_world->tilemap[ x - 1 ][ y ] & WALL_TILE ) - R_Draw_Wall( (float)(x-1), (float)y, LOWERZCOORD, UPPERZCOORD, dir4_east, r_world->wall_tex_x[x-1][y]); - - if( x >= vx && r_world->tilemap[ x + 1 ][ y ] & WALL_TILE ) - R_Draw_Wall( (float)(x+1), (float)y, LOWERZCOORD, UPPERZCOORD, dir4_west, r_world->wall_tex_x[x+1][y]); - - /* y-wall */ - if( y <= vy && r_world->tilemap[ x ][ y - 1 ] & WALL_TILE ) - R_Draw_Wall( (float)x, (float)(y-1), LOWERZCOORD, UPPERZCOORD, dir4_north, r_world->wall_tex_y[x][y-1]); - - if( y >= vy && r_world->tilemap[ x ][ y + 1 ] & WALL_TILE ) - R_Draw_Wall( (float)x, (float)(y+1), LOWERZCOORD, UPPERZCOORD, dir4_south, r_world->wall_tex_y[x][y+1]); - } - - - } -} - - -int x_tile_step[ 4 ] = { 1, -1, -1, 1 }; -int y_tile_step[ 4 ] = { 1, 1, -1, -1 }; - - -/* ------------------------------------------------------------------------------ - Function: R_TraceCheck() -Trace ray check. - - Parameters: - lvl -[in] Pointer to valid LevelData_t structure. - x, y -[in] In tiles. - - Returns: true to stop tracing, false otherwise. - - Notes: Tells ray casting if we hit a wall or door and to stop tracing. - ------------------------------------------------------------------------------ -*/ -PRIVATE _boolean R_TraceCheck( LevelData_t *lvl, int x, int y, int frac, int dfrac, _boolean vert, _boolean flip, r_trace_t *trace ) -{ - if( lvl->tilemap[ x ][ y ] & WALL_TILE ) - { - if( vert ) - { - trace->x = (x << TILESHIFT) + (flip ? TILEGLOBAL : 0); - trace->y = (y << TILESHIFT) + frac; - trace->flags |= TRACE_HIT_VERT; - } - else - { - trace->x = (x << TILESHIFT) + frac; - trace->y = (y << TILESHIFT) + (flip ? TILEGLOBAL : 0); - trace->flags &= ~TRACE_HIT_VERT; - } - - return true; // wall, stop tracing - } - - if( trace->tile_vis ) - { - trace->tile_vis[ x ][ y ] = true; // this tile is visible - } - - - if( lvl->tilemap[ x ][ y ] & DOOR_TILE && - lvl->Doors.DoorMap[ x ][ y ].action != dr_open ) - { - frac += dfrac >> 1; - if( POS2TILE( frac ) ) - return false; - - if( vert ) - { - if( lvl->Doors.DoorMap[ x ][ y ].action != dr_closed && - (frac >> 10) > DOOR_FULLOPEN - Door_Opened( &lvl->Doors, x, y ) ) - { - return false; // opened enough - } - - trace->x = TILE2POS( x ); - trace->y = (y << TILESHIFT) + frac; - trace->flags |= TRACE_HIT_VERT; - } - else - { - if( lvl->Doors.DoorMap[ x ][ y ].action != dr_closed && - (frac >> 10) < Door_Opened( &lvl->Doors, x, y ) ) - { - return false; // opened enough - } - - trace->y = TILE2POS( y ); - trace->x = (x << TILESHIFT) + frac; - trace->flags &= ~TRACE_HIT_VERT; - } - trace->flags |= TRACE_HIT_DOOR; - - return true; // closed door, stop tracing - } - - return false; // no intersection, go on! -} - -/* ------------------------------------------------------------------------------ - Function: R_Trace() -Trace ray. - - Parameters: - trace -[in] Pointer to valid r_trace_t structure. - lvl -[in] Pointer to valid LevelData_t structure. - - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void R_Trace( r_trace_t *trace, LevelData_t *lvl ) -{ - int xtilestep, ytilestep; - int xstep, ystep; - int xtile, ytile; - int xintercept, yintercept; - int YmapPos, XmapPos; - quadrant q; - -// Setup for ray casting - q = GetQuadrant( FINE2RAD( trace->a ) ); - - xtilestep = x_tile_step[ q ]; - ytilestep = y_tile_step[ q ]; - - xtile = POS2TILE( trace->x ) + xtilestep; - ytile = POS2TILE( trace->y ) + ytilestep; - - xstep = ytilestep * XnextTable[ trace->a ]; - ystep = xtilestep * YnextTable[ trace->a ]; - - xintercept = (int)( ( ((ytilestep == -1 ? ytile+1 : ytile) << TILESHIFT) - trace->y ) / TanTable[ trace->a ]) + trace->x; - yintercept = (int)( ( ((xtilestep == -1 ? xtile+1 : xtile) << TILESHIFT) - trace->x ) * TanTable[ trace->a ]) + trace->y; - - YmapPos = yintercept >> TILESHIFT; // toXray - XmapPos = xintercept >> TILESHIFT; // toYray - - if( trace->tile_vis ) - { - // this tile is visible - trace->tile_vis[ POS2TILE( trace->x ) ][ POS2TILE( trace->y ) ] = true; - } - -// -// Start of ray-casting -// - while( 1 ) - { -// -// Vertical loop // an anologue for X-Ray -// - while( ! (ytilestep == -1 && YmapPos <= ytile) && ! (ytilestep == 1 && YmapPos >= ytile) ) - { - if( xtile < 0 || xtile >= 64 || YmapPos < 0 || YmapPos >= 64 ) - { - return; - } - - if( R_TraceCheck( lvl, xtile, YmapPos, yintercept % TILEGLOBAL, ystep, true, (_boolean)(xtilestep == -1), trace ) ) - { - return; - } - - // prepare for next step - xtile += xtilestep; - yintercept += ystep; - YmapPos = yintercept >> TILESHIFT; - } - -// -// Horizontal loop // an anologue for Y-Ray -// - while( ! (xtilestep == -1 && XmapPos <= xtile) && ! (xtilestep == 1 && XmapPos >= xtile) ) - { - if( ytile < 0 || ytile >= 64 || XmapPos < 0 || XmapPos >= 64 ) - { - return; - } - - if( R_TraceCheck( lvl, XmapPos, ytile, xintercept % TILEGLOBAL, xstep, false, (_boolean)(ytilestep == -1), trace ) ) - { - return; - } - - // prepare for next step - ytile += ytilestep; - xintercept += xstep; - XmapPos = xintercept >> TILESHIFT; - } - - } // end of while( 1 ) - -} diff --git a/wolf3d/newCode/wolf/wolf_raycast.h b/wolf3d/newCode/wolf/wolf_raycast.h deleted file mode 100644 index 8a74c7a..0000000 --- a/wolf3d/newCode/wolf/wolf_raycast.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000-2002 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_raycast.h: Wolfenstein3-D ray-casting. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - */ - -/* - Notes: - This module is implemented by wolf_raycast.c - -*/ - -#ifndef __WOLF_RAYCAST_H__ -#define __WOLF_RAYCAST_H__ - -// marks -#define TRACE_MARK_MAP 1 // marks traced area in 'AM_AutoMap.vis' array -// obstacle levels -#define TRACE_SIGHT 2 // player sight -#define TRACE_SIGHT_AI 4 // enemy sight -#define TRACE_BULLET 8 // bullet -#define TRACE_OBJECT 16 // object - -#define TRACE_HIT_VERT 32 // vertical wall was hit -#define TRACE_HIT_DOOR 64 // door was hit -#define TRACE_HIT_PWALL 128 // pushwall was hit - -typedef struct r_trace_s -{ - int x, y; // origin - int a; // trace angle - int flags; - W8 (*tile_vis)[ 64 ]; // should point to [ 64 ][ 64 ] array - -} r_trace_t; - -#define UPPERZCOORD 0.6f -#define LOWERZCOORD -0.6f - -extern W8 tile_visible[ 64 ][ 64 ]; // can player see this tile? - - -extern void R_RayCast( placeonplane_t viewport, LevelData_t *lvl ); -extern void R_Trace( r_trace_t *trace, LevelData_t *lvl ); - - -#endif /* __WOLF_RAYCAST_H__ */ diff --git a/wolf3d/newCode/wolf/wolf_renderer.c b/wolf3d/newCode/wolf/wolf_renderer.c deleted file mode 100644 index cf11bad..0000000 --- a/wolf3d/newCode/wolf/wolf_renderer.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - - Copyright (C) 2004-2005 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * wolf_renderer.c: Wolfenstein 3-D renderer. - * - * Author: Michael Liebscher - * - * Acknowledgement: - * Portion of this code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -#include "../wolfiphone.h" - -LevelData_t *r_world; - - -/* ------------------------------------------------------------------------------ - Function: R_BeginRegistration -Start the rendering registration sequence. - - Parameters: map -[in] The name of the map to load. - - Returns: Nothing. - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void R_BeginRegistration( const char *map ) -{ - char fullname[ MAX_GAMEPATH ]; - - if( ! map || ! *map ) - { - return; - } - - ++texture_registration_sequence; - - - my_snprintf( fullname, sizeof( fullname ), "maps/%s.map", map ); - -// Door_ResetDoors( &r_world->Doors ); - Powerup_Reset(); - Sprite_Reset(); - Areas_InitAreas( Player.areanumber ); - PushWall_Reset(); - - memset( &levelstate, 0, sizeof( levelstate ) ); // Reset gamestate - ResetGuards(); - - r_world = Level_LoadMap( fullname ); - - if( r_world == NULL ) - { - Com_Printf( "Could not load map (%s)\n", map ); - return; - } - - levelstate.floornum = floornumber; - - if( g_version->value == SPEAROFDESTINY ) - { - if( strlen( map ) >= 2 ) - { - levelstate.floornum = atoi( map+1 ); - - if( levelstate.floornum == 20 ) - { - levelstate.floornum = 17; - } - } - } - -} diff --git a/wolf3d/newCode/wolf/wolf_renderer.h b/wolf3d/newCode/wolf/wolf_renderer.h deleted file mode 100644 index 689145e..0000000 --- a/wolf3d/newCode/wolf/wolf_renderer.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 1997-2001 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. - -*/ - -/* - * wolf_renderer.h: Wolfenstein3-D renderer. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from Quake II, and was originally - * written by Id Software, Inc. - * - */ - -/* - Notes: - This module is implemented by wolf_renderer.c and wolf_opengl.c - -*/ - -#ifndef __WOLF_RENDERER_H__ -#define __WOLF_RENDERER_H__ - -extern void R_SetGL3D( placeonplane_t viewport ); - -extern void R_DrawBox( int x, int y, int w, int h, W32 color ); - -extern void R_Draw_Door( int x, int y, float z1, float z2, _boolean vertical, _boolean backside, int tex, int amount ); -extern void R_Draw_Wall( float x, float y, float z1, float z2, int type, int tex ); - - - -extern void R_DrawSprites( void ); - -extern void R_DrawPsyched( W32 percent ); - -extern void R_DrawHUD( void ); -extern void R_DrawNumber( int x, int y, int number ); -extern void R_DrawWeapon( void ); - - -extern void R_put_line( int x, int y, const char *string ); - - -#endif /* __WOLF_RENDERER_H__ */ diff --git a/wolf3d/newCode/wolf/wolf_sprites.c b/wolf3d/newCode/wolf/wolf_sprites.c deleted file mode 100644 index 4313f3e..0000000 --- a/wolf3d/newCode/wolf/wolf_sprites.c +++ /dev/null @@ -1,291 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000-2002 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_sprites.c: Wolfenstein3-D sprite handling. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * This code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - */ - -#include "../wolfiphone.h" - - -// nobody should see this array! -sprite_t Spr_Sprites[ MAX_SPRITES ]; -W32 n_of_sprt; - - - -/* ------------------------------------------------------------------------------ - Function: Sprite_Reset -Reset sprite status. - - Parameters: Nothing. - - Returns: Nothing. - - Notes: Called only when client must reconnect will not set remove flag! ------------------------------------------------------------------------------ -*/ -PUBLIC void Sprite_Reset( void ) -{ - n_of_sprt = 0; - memset( Spr_Sprites, 0, sizeof( Spr_Sprites ) ); -} - -/* ------------------------------------------------------------------------------ - Function: Sprite_RemoveSprite -Remove sprite. - - Parameters: sprite_id -[in] sprite id to remove. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void Sprite_RemoveSprite( int sprite_id ) -{ - if( sprite_id == -1 ) - { - return; - } - - Spr_Sprites[ sprite_id ].flags |= SPRT_REMOVE; -} - - -/* ------------------------------------------------------------------------------ - Function: Sprite_GetNewSprite -Get sprite index. - - Parameters: Nothing. - - Returns: "sprite id" index. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC int Sprite_GetNewSprite( void ) -{ - W32 n; - sprite_t* sprt; - - for( n = 0, sprt = Spr_Sprites ; n < n_of_sprt ; ++n, ++sprt ) - { - if( sprt->flags & SPRT_REMOVE ) - { // free spot: clear it first - memset( sprt, 0, sizeof( sprite_t ) ); - return n; - } - } - - if( n_of_sprt >= MAX_SPRITES ) - { - Com_Printf( "Warning n_of_sprt == MAX_SPRITES\n" ); - return -1; - } - - return n_of_sprt++; -} - - - -/* ------------------------------------------------------------------------------ - Function: Sprite_SetPos -Set sprite position. - - Parameters: sprite_id -[in] sprite id to change. - x, y -[in] new x, y. - angle -[in] new angle to set. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void Sprite_SetPos( int sprite_id, int x, int y, int angle ) -{ - if( sprite_id == -1 ) - { - return; - } - - Spr_Sprites[ sprite_id ].x = x; - Spr_Sprites[ sprite_id ].y = y; - Spr_Sprites[ sprite_id ].ang = angle; - Spr_Sprites[ sprite_id ].tilex = POS2TILE( x ); - Spr_Sprites[ sprite_id ].tiley = POS2TILE( y ); - Spr_Sprites[ sprite_id ].flags |= SPRT_CHG_POS; - - if( ! (x & HALFTILE) ) // (x%TILEGLOBAL>=HALFTILE) - { - Spr_Sprites[ sprite_id ].tilex--; - } - - if( ! (y & HALFTILE) ) - { - Spr_Sprites[ sprite_id ].tiley--; - } -} - -/* ------------------------------------------------------------------------------ - Function: Sprite_SetTex -Set sprite texture. - - Parameters: sprite_id -[in] sprite id to change. - index -[in] texture index. - tex -[in] texture to set as. - - Returns: Nothing. - - Notes: ------------------------------------------------------------------------------ -*/ -PUBLIC void Sprite_SetTex( int sprite_id, int index, int tex ) -{ - if( sprite_id == -1 ) - { - return; - } - - if( index == -1 ) // one texture for each phase - { - Spr_Sprites[ sprite_id ].tex[ 0 ] = tex; - Spr_Sprites[ sprite_id ].flags |= SPRT_ONE_TEX; - } - else - { - Spr_Sprites[ sprite_id ].tex[ index ] = tex; - } - - Spr_Sprites[ sprite_id ].flags |= SPRT_CHG_TEX; -} - - -#define MAXVISABLE 128 -visobj_t vislist[ MAXVISABLE ]; - - -/* ------------------------------------------------------------------------------ - Function: Sprite_CreateVisList -Compare function for vislist sorting. - - Parameters: vis1, vis2 -[in] Two values to compare. - - Returns: - <0 elem1 further than elem2 - 0 elem1 equal distance to elem2 - >0 elem1 closer than elem2 - - Notes: ------------------------------------------------------------------------------ -*/ -PRIVATE int Sprite_cmpVis( const void *elem1, const void *elem2 ) -{ - // macro to get distance from a void pointer to visobj_t - #define vis_dist( vis ) ( ((visobj_t *)vis)->dist ) - - if( vis_dist( elem1 ) == vis_dist( elem2 ) ) - { - return 0; // process equal distance - } - else - { - // if dist > sprite must be first - return vis_dist( elem1 ) < vis_dist( elem2 ) ? 1 : -1; - } -} - - -/* ------------------------------------------------------------------------------ - Function: Sprite_CreateVisList -Build and sort visibility list of sprites. - - Parameters: Nothing. - - Returns: Number of visible sprites. - - Notes: - List is sorted from far to near. - List is based on tile visibility array, made by raycaster. - Called only by client. ------------------------------------------------------------------------------ -*/ -PUBLIC int Sprite_CreateVisList( void ) -{ - W32 tx, ty, n, num_visible; - visobj_t *visptr; - sprite_t* sprt; - - visptr = vislist; - num_visible = 0; - - for( n = 0, sprt = Spr_Sprites; n < n_of_sprt; ++n, ++sprt ) - { - if( sprt->flags & SPRT_REMOVE ) - { - continue; - } - - tx = sprt->tilex; - ty = sprt->tiley; - - if( tx > 63 ) - tx = 63; - if( ty > 63 ) - ty = 63; - - // can be in any of 4 surrounding tiles; not 9 - see definition of tilex & tiley - if( tile_visible[ tx ][ ty ] || tile_visible[ tx + 1 ][ ty ] || - tile_visible[ tx ][ ty + 1 ] || tile_visible[ tx + 1 ][ ty + 1 ] ) - { // player spoted it - visptr->dist = LineLen2Point( sprt->x - Player.position.origin[ 0 ], - sprt->y-Player.position.origin[ 1 ], - Player.position.angle ); //FIXME viewport - visptr->x = sprt->x; - visptr->y = sprt->y; - visptr->ang = sprt->ang; - visptr->tex = sprt->tex[ 0 ]; //FIXME! - if( ++num_visible > MAXVISABLE ) - { - break; // vislist full - } - - visptr++; - } - } - -// sorting list - if( num_visible ) // do not sort if no entries - { - qsort( vislist, num_visible, sizeof( visobj_t ), Sprite_cmpVis ); - } - - return num_visible; -} - diff --git a/wolf3d/newCode/wolf/wolf_sprites.h b/wolf3d/newCode/wolf/wolf_sprites.h deleted file mode 100644 index 2e81a13..0000000 --- a/wolf3d/newCode/wolf/wolf_sprites.h +++ /dev/null @@ -1,430 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000-2002 by DarkOne the Hacker - - 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. - -*/ - -/* - * wolf_sprites.h: Wolfenstein3-D sprite handling. - * - * Author: Michael Liebscher - * Date: 2004 - * - * Acknowledgement: - * Portion of this code was derived from NewWolf, and was originally - * written by DarkOne the Hacker. - * - * Portion of this code was derived from Wolfenstein3-D, and was originally - * written by Id Software, Inc. - * - */ - -/* - Notes: - This module is implemented by wolf_sprites.c - -*/ - -#ifndef __WOLF_SPRITES_H__ -#define __WOLF_SPRITES_H__ - - -// -// sprite constants -// - -enum { - SPR_DEMO, - SPR_DEATHCAM, -// -// static sprites -// - SPR_STAT_0, SPR_STAT_1,SPR_STAT_2, SPR_STAT_3, - SPR_STAT_4, SPR_STAT_5,SPR_STAT_6, SPR_STAT_7, - - SPR_STAT_8, SPR_STAT_9,SPR_STAT_10,SPR_STAT_11, - SPR_STAT_12,SPR_STAT_13,SPR_STAT_14,SPR_STAT_15, - - SPR_STAT_16,SPR_STAT_17,SPR_STAT_18,SPR_STAT_19, - SPR_STAT_20,SPR_STAT_21,SPR_STAT_22,SPR_STAT_23, - - SPR_STAT_24,SPR_STAT_25,SPR_STAT_26,SPR_STAT_27, - SPR_STAT_28,SPR_STAT_29,SPR_STAT_30,SPR_STAT_31, - - SPR_STAT_32,SPR_STAT_33,SPR_STAT_34,SPR_STAT_35, - SPR_STAT_36,SPR_STAT_37,SPR_STAT_38,SPR_STAT_39, - - SPR_STAT_40,SPR_STAT_41,SPR_STAT_42,SPR_STAT_43, - SPR_STAT_44,SPR_STAT_45,SPR_STAT_46,SPR_STAT_47, - - - - - SPR_STAT_48,SPR_STAT_49,SPR_STAT_50,SPR_STAT_51, - - - - - -// -// Guard -// - SPR_GRD_S_1,SPR_GRD_S_2,SPR_GRD_S_3,SPR_GRD_S_4, - SPR_GRD_S_5,SPR_GRD_S_6,SPR_GRD_S_7,SPR_GRD_S_8, - - SPR_GRD_W1_1,SPR_GRD_W1_2,SPR_GRD_W1_3,SPR_GRD_W1_4, - SPR_GRD_W1_5,SPR_GRD_W1_6,SPR_GRD_W1_7,SPR_GRD_W1_8, - - SPR_GRD_W2_1,SPR_GRD_W2_2,SPR_GRD_W2_3,SPR_GRD_W2_4, - SPR_GRD_W2_5,SPR_GRD_W2_6,SPR_GRD_W2_7,SPR_GRD_W2_8, - - SPR_GRD_W3_1,SPR_GRD_W3_2,SPR_GRD_W3_3,SPR_GRD_W3_4, - SPR_GRD_W3_5,SPR_GRD_W3_6,SPR_GRD_W3_7,SPR_GRD_W3_8, - - SPR_GRD_W4_1,SPR_GRD_W4_2,SPR_GRD_W4_3,SPR_GRD_W4_4, - SPR_GRD_W4_5,SPR_GRD_W4_6,SPR_GRD_W4_7,SPR_GRD_W4_8, - - SPR_GRD_PAIN_1,SPR_GRD_DIE_1,SPR_GRD_DIE_2,SPR_GRD_DIE_3, - SPR_GRD_PAIN_2,SPR_GRD_DEAD, - - SPR_GRD_SHOOT1,SPR_GRD_SHOOT2,SPR_GRD_SHOOT3, - -// -// Dog -// - SPR_DOG_W1_1,SPR_DOG_W1_2,SPR_DOG_W1_3,SPR_DOG_W1_4, - SPR_DOG_W1_5,SPR_DOG_W1_6,SPR_DOG_W1_7,SPR_DOG_W1_8, - - SPR_DOG_W2_1,SPR_DOG_W2_2,SPR_DOG_W2_3,SPR_DOG_W2_4, - SPR_DOG_W2_5,SPR_DOG_W2_6,SPR_DOG_W2_7,SPR_DOG_W2_8, - - SPR_DOG_W3_1,SPR_DOG_W3_2,SPR_DOG_W3_3,SPR_DOG_W3_4, - SPR_DOG_W3_5,SPR_DOG_W3_6,SPR_DOG_W3_7,SPR_DOG_W3_8, - - SPR_DOG_W4_1,SPR_DOG_W4_2,SPR_DOG_W4_3,SPR_DOG_W4_4, - SPR_DOG_W4_5,SPR_DOG_W4_6,SPR_DOG_W4_7,SPR_DOG_W4_8, - - SPR_DOG_DIE_1,SPR_DOG_DIE_2,SPR_DOG_DIE_3,SPR_DOG_DEAD, - SPR_DOG_JUMP1,SPR_DOG_JUMP2,SPR_DOG_JUMP3, - - - -// -// SS -// - SPR_SS_S_1,SPR_SS_S_2,SPR_SS_S_3,SPR_SS_S_4, - SPR_SS_S_5,SPR_SS_S_6,SPR_SS_S_7,SPR_SS_S_8, - - SPR_SS_W1_1,SPR_SS_W1_2,SPR_SS_W1_3,SPR_SS_W1_4, - SPR_SS_W1_5,SPR_SS_W1_6,SPR_SS_W1_7,SPR_SS_W1_8, - - SPR_SS_W2_1,SPR_SS_W2_2,SPR_SS_W2_3,SPR_SS_W2_4, - SPR_SS_W2_5,SPR_SS_W2_6,SPR_SS_W2_7,SPR_SS_W2_8, - - SPR_SS_W3_1,SPR_SS_W3_2,SPR_SS_W3_3,SPR_SS_W3_4, - SPR_SS_W3_5,SPR_SS_W3_6,SPR_SS_W3_7,SPR_SS_W3_8, - - SPR_SS_W4_1,SPR_SS_W4_2,SPR_SS_W4_3,SPR_SS_W4_4, - SPR_SS_W4_5,SPR_SS_W4_6,SPR_SS_W4_7,SPR_SS_W4_8, - - SPR_SS_PAIN_1,SPR_SS_DIE_1,SPR_SS_DIE_2,SPR_SS_DIE_3, - SPR_SS_PAIN_2,SPR_SS_DEAD, - - SPR_SS_SHOOT1,SPR_SS_SHOOT2,SPR_SS_SHOOT3, - -// -// Mutant -// - SPR_MUT_S_1,SPR_MUT_S_2,SPR_MUT_S_3,SPR_MUT_S_4, - SPR_MUT_S_5,SPR_MUT_S_6,SPR_MUT_S_7,SPR_MUT_S_8, - - SPR_MUT_W1_1,SPR_MUT_W1_2,SPR_MUT_W1_3,SPR_MUT_W1_4, - SPR_MUT_W1_5,SPR_MUT_W1_6,SPR_MUT_W1_7,SPR_MUT_W1_8, - - SPR_MUT_W2_1,SPR_MUT_W2_2,SPR_MUT_W2_3,SPR_MUT_W2_4, - SPR_MUT_W2_5,SPR_MUT_W2_6,SPR_MUT_W2_7,SPR_MUT_W2_8, - - SPR_MUT_W3_1,SPR_MUT_W3_2,SPR_MUT_W3_3,SPR_MUT_W3_4, - SPR_MUT_W3_5,SPR_MUT_W3_6,SPR_MUT_W3_7,SPR_MUT_W3_8, - - SPR_MUT_W4_1,SPR_MUT_W4_2,SPR_MUT_W4_3,SPR_MUT_W4_4, - SPR_MUT_W4_5,SPR_MUT_W4_6,SPR_MUT_W4_7,SPR_MUT_W4_8, - - SPR_MUT_PAIN_1,SPR_MUT_DIE_1,SPR_MUT_DIE_2,SPR_MUT_DIE_3, - SPR_MUT_PAIN_2,SPR_MUT_DIE_4,SPR_MUT_DEAD, - - SPR_MUT_SHOOT1,SPR_MUT_SHOOT2,SPR_MUT_SHOOT3,SPR_MUT_SHOOT4, - -// -// Officer -// - SPR_OFC_S_1,SPR_OFC_S_2,SPR_OFC_S_3,SPR_OFC_S_4, - SPR_OFC_S_5,SPR_OFC_S_6,SPR_OFC_S_7,SPR_OFC_S_8, - - SPR_OFC_W1_1,SPR_OFC_W1_2,SPR_OFC_W1_3,SPR_OFC_W1_4, - SPR_OFC_W1_5,SPR_OFC_W1_6,SPR_OFC_W1_7,SPR_OFC_W1_8, - - SPR_OFC_W2_1,SPR_OFC_W2_2,SPR_OFC_W2_3,SPR_OFC_W2_4, - SPR_OFC_W2_5,SPR_OFC_W2_6,SPR_OFC_W2_7,SPR_OFC_W2_8, - - SPR_OFC_W3_1,SPR_OFC_W3_2,SPR_OFC_W3_3,SPR_OFC_W3_4, - SPR_OFC_W3_5,SPR_OFC_W3_6,SPR_OFC_W3_7,SPR_OFC_W3_8, - - SPR_OFC_W4_1,SPR_OFC_W4_2,SPR_OFC_W4_3,SPR_OFC_W4_4, - SPR_OFC_W4_5,SPR_OFC_W4_6,SPR_OFC_W4_7,SPR_OFC_W4_8, - - SPR_OFC_PAIN_1,SPR_OFC_DIE_1,SPR_OFC_DIE_2,SPR_OFC_DIE_3, - SPR_OFC_PAIN_2,SPR_OFC_DIE_4,SPR_OFC_DEAD, - - SPR_OFC_SHOOT1,SPR_OFC_SHOOT2,SPR_OFC_SHOOT3, - - - -// -// Ghosts -// - SPR_BLINKY_W1,SPR_BLINKY_W2,SPR_PINKY_W1,SPR_PINKY_W2, - SPR_CLYDE_W1,SPR_CLYDE_W2,SPR_INKY_W1,SPR_INKY_W2, - -// -// Hans -// - SPR_BOSS_W1,SPR_BOSS_W2,SPR_BOSS_W3,SPR_BOSS_W4, - SPR_BOSS_SHOOT1,SPR_BOSS_SHOOT2,SPR_BOSS_SHOOT3,SPR_BOSS_DEAD, - - SPR_BOSS_DIE1,SPR_BOSS_DIE2,SPR_BOSS_DIE3, - -// -// Schabbs -// - SPR_SCHABB_W1,SPR_SCHABB_W2,SPR_SCHABB_W3,SPR_SCHABB_W4, - SPR_SCHABB_SHOOT1,SPR_SCHABB_SHOOT2, - - SPR_SCHABB_DIE1,SPR_SCHABB_DIE2,SPR_SCHABB_DIE3,SPR_SCHABB_DEAD, - SPR_HYPO1,SPR_HYPO2,SPR_HYPO3,SPR_HYPO4, - -// -// Fake -// - SPR_FAKE_W1,SPR_FAKE_W2,SPR_FAKE_W3,SPR_FAKE_W4, - SPR_FAKE_SHOOT,SPR_FIRE1,SPR_FIRE2, - - SPR_FAKE_DIE1,SPR_FAKE_DIE2,SPR_FAKE_DIE3,SPR_FAKE_DIE4, - SPR_FAKE_DIE5,SPR_FAKE_DEAD, - -// -// Hitler -// - SPR_MECHA_W1,SPR_MECHA_W2,SPR_MECHA_W3,SPR_MECHA_W4, - SPR_MECHA_SHOOT1,SPR_MECHA_SHOOT2,SPR_MECHA_SHOOT3,SPR_MECHA_DEAD, - - SPR_MECHA_DIE1,SPR_MECHA_DIE2,SPR_MECHA_DIE3, - - SPR_HITLER_W1,SPR_HITLER_W2,SPR_HITLER_W3,SPR_HITLER_W4, - SPR_HITLER_SHOOT1,SPR_HITLER_SHOOT2,SPR_HITLER_SHOOT3,SPR_HITLER_DEAD, - - SPR_HITLER_DIE1,SPR_HITLER_DIE2,SPR_HITLER_DIE3,SPR_HITLER_DIE4, - SPR_HITLER_DIE5,SPR_HITLER_DIE6,SPR_HITLER_DIE7, - -// -// Giftmacher -// - SPR_GIFT_W1,SPR_GIFT_W2,SPR_GIFT_W3,SPR_GIFT_W4, - SPR_GIFT_SHOOT1,SPR_GIFT_SHOOT2, - - SPR_GIFT_DIE1,SPR_GIFT_DIE2,SPR_GIFT_DIE3,SPR_GIFT_DEAD, - - -// -// Rocket, smoke and small explosion -// - SPR_ROCKET_1,SPR_ROCKET_2,SPR_ROCKET_3,SPR_ROCKET_4, - SPR_ROCKET_5,SPR_ROCKET_6,SPR_ROCKET_7,SPR_ROCKET_8, - - SPR_SMOKE_1,SPR_SMOKE_2,SPR_SMOKE_3,SPR_SMOKE_4, - SPR_BOOM_1,SPR_BOOM_2,SPR_BOOM_3, - -// -// Angel of Death's DeathSparks(tm) -// - SPR_HROCKET_1,SPR_HROCKET_2,SPR_HROCKET_3,SPR_HROCKET_4, - SPR_HROCKET_5,SPR_HROCKET_6,SPR_HROCKET_7,SPR_HROCKET_8, - - SPR_HSMOKE_1,SPR_HSMOKE_2,SPR_HSMOKE_3,SPR_HSMOKE_4, - SPR_HBOOM_1,SPR_HBOOM_2,SPR_HBOOM_3, - - SPR_SPARK1,SPR_SPARK2,SPR_SPARK3,SPR_SPARK4, - - - -// -// Gretel -// - SPR_GRETEL_W1,SPR_GRETEL_W2,SPR_GRETEL_W3,SPR_GRETEL_W4, - SPR_GRETEL_SHOOT1,SPR_GRETEL_SHOOT2,SPR_GRETEL_SHOOT3,SPR_GRETEL_DEAD, - - SPR_GRETEL_DIE1,SPR_GRETEL_DIE2,SPR_GRETEL_DIE3, - -// -// Fat Face -// - SPR_FAT_W1,SPR_FAT_W2,SPR_FAT_W3,SPR_FAT_W4, - SPR_FAT_SHOOT1,SPR_FAT_SHOOT2,SPR_FAT_SHOOT3,SPR_FAT_SHOOT4, - - SPR_FAT_DIE1,SPR_FAT_DIE2,SPR_FAT_DIE3,SPR_FAT_DEAD, - -// -// bj -// - SPR_BJ_W1,SPR_BJ_W2,SPR_BJ_W3,SPR_BJ_W4, - SPR_BJ_JUMP1,SPR_BJ_JUMP2,SPR_BJ_JUMP3,SPR_BJ_JUMP4, - - -// -// SPEAR OF DESTINY -// - -// -// Trans Grosse -// - SPR_TRANS_W1,SPR_TRANS_W2,SPR_TRANS_W3,SPR_TRANS_W4, - SPR_TRANS_SHOOT1,SPR_TRANS_SHOOT2,SPR_TRANS_SHOOT3,SPR_TRANS_DEAD, - - SPR_TRANS_DIE1,SPR_TRANS_DIE2,SPR_TRANS_DIE3, - -// -// Wilhelm -// - SPR_WILL_W1,SPR_WILL_W2,SPR_WILL_W3,SPR_WILL_W4, - SPR_WILL_SHOOT1,SPR_WILL_SHOOT2,SPR_WILL_SHOOT3,SPR_WILL_SHOOT4, - - SPR_WILL_DIE1,SPR_WILL_DIE2,SPR_WILL_DIE3,SPR_WILL_DEAD, - -// -// UberMutant -// - SPR_UBER_W1,SPR_UBER_W2,SPR_UBER_W3,SPR_UBER_W4, - SPR_UBER_SHOOT1,SPR_UBER_SHOOT2,SPR_UBER_SHOOT3,SPR_UBER_SHOOT4, - - SPR_UBER_DIE1,SPR_UBER_DIE2,SPR_UBER_DIE3,SPR_UBER_DIE4, - SPR_UBER_DEAD, - -// -// Death Knight -// - SPR_DEATH_W1,SPR_DEATH_W2,SPR_DEATH_W3,SPR_DEATH_W4, - SPR_DEATH_SHOOT1,SPR_DEATH_SHOOT2,SPR_DEATH_SHOOT3,SPR_DEATH_SHOOT4, - - SPR_DEATH_DIE1,SPR_DEATH_DIE2,SPR_DEATH_DIE3,SPR_DEATH_DIE4, - SPR_DEATH_DIE5,SPR_DEATH_DIE6,SPR_DEATH_DEAD, - -// -// Ghost -// - SPR_SPECTRE_W1,SPR_SPECTRE_W2,SPR_SPECTRE_W3,SPR_SPECTRE_W4, - SPR_SPECTRE_F1,SPR_SPECTRE_F2,SPR_SPECTRE_F3,SPR_SPECTRE_F4, - -// -// Angel of Death -// - SPR_ANGEL_W1,SPR_ANGEL_W2,SPR_ANGEL_W3,SPR_ANGEL_W4, - SPR_ANGEL_SHOOT1,SPR_ANGEL_SHOOT2,SPR_ANGEL_TIRED1,SPR_ANGEL_TIRED2, - - SPR_ANGEL_DIE1,SPR_ANGEL_DIE2,SPR_ANGEL_DIE3,SPR_ANGEL_DIE4, - SPR_ANGEL_DIE5,SPR_ANGEL_DIE6,SPR_ANGEL_DIE7,SPR_ANGEL_DEAD, - - - -// -// player attack frames -// - SPR_KNIFEREADY,SPR_KNIFEATK1,SPR_KNIFEATK2,SPR_KNIFEATK3, - SPR_KNIFEATK4, - - SPR_PISTOLREADY,SPR_PISTOLATK1,SPR_PISTOLATK2,SPR_PISTOLATK3, - SPR_PISTOLATK4, - - SPR_MACHINEGUNREADY,SPR_MACHINEGUNATK1,SPR_MACHINEGUNATK2,MACHINEGUNATK3, - SPR_MACHINEGUNATK4, - - SPR_CHAINREADY,SPR_CHAINATK1,SPR_CHAINATK2,SPR_CHAINATK3, - SPR_CHAINATK4, - -}; - - - - -#define SPRT_ONE_TEX 1 -#define SPRT_NO_ROT 2 -#define SPRT_CHG_POS 4 -#define SPRT_CHG_TEX 8 -#define SPRT_REMOVE 16 - -typedef struct sprite_s -{ - vec3_t position; - int x, y, ang; -// very clever to make it not just (x>>TILESHIFT) -// but also (x>>TILESHIFT)-1 if (x%TILEWIDTH)\n" ); - return; - } - -// Com_DPrintf( "SV_GameMap( %s )\n", Cmd_Argv( 1 ) ); - - FS_CreatePath( va( "%s/save/current/", FS_Gamedir() ) ); - - // check for clearing the current savegame - map = Cmd_Argv( 1 ); - - // start up the next map - my_strlcpy( r_mapname, Cmd_Argv( 1 ), sizeof( r_mapname ) ); - - Client_PrepRefresh( r_mapname ); -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void Map_f( void ) -{ - char *map; - char expanded[ MAX_GAMEPATH ]; - - // Check to make sure the level exists. - map = Cmd_Argv( 1 ); - if( ! strstr( map, "." ) ) - { - my_snprintf( expanded, sizeof( expanded ), "maps/%s.map", map ); - } - else - { - my_snprintf( expanded, sizeof( expanded ), "maps/%s", map ); - } - - -//sv.state = ss_dead; // don't save current level when changing -// SV_WipeSavegame( "current" ); - SV_GameMap_f(); -} - diff --git a/wolf3d/newCode/wolf/wolf_weapon.c b/wolf3d/newCode/wolf/wolf_weapon.c deleted file mode 100644 index 4953dfa..0000000 --- a/wolf3d/newCode/wolf/wolf_weapon.c +++ /dev/null @@ -1,194 +0,0 @@ -/* - - Copyright (C) 2004 Michael Liebscher - Copyright (C) 2000-2002 by DarkOne the Hacker - - 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 "../wolfiphone.h" - - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void fire_hit( player_t *self ) -{ - entity_t *closest; - int dist, d1, n, shot_dist, damage; - - Sound_StartSound( NULL, 0, CHAN_WEAPON, Sound_RegisterSound( "lsfx/023.wav" ), 1, ATTN_NORM, 0 ); - -// actually fire - dist = 0x7fffffff; - closest = NULL; - - for( n = 0 ; n < NumGuards ; ++n ) - { - if( Guards[ n ].flags & FL_SHOOTABLE ) // && Guards[n].flags&FL_VISABLE - { - shot_dist = Point2LineDist( Guards[ n ].x - self->position.origin[ 0 ], Guards[ n ].y - self->position.origin[ 1 ], self->position.angle ); - - if( shot_dist > (2 * TILEGLOBAL / 3) ) - { - continue; // miss - } - - d1 = LineLen2Point( Guards[ n ].x - self->position.origin[ 0 ], Guards[ n ].y - self->position.origin[ 1 ], self->position.angle ); - - if( d1 < 0 || d1 > dist ) - { - continue; - } - - if( ! Level_CheckLine( Guards[ n ].x, Guards[ n ].y, Player.position.origin[0], Player.position.origin[1], r_world ) ) - { - //if( ! CheckLine( &Guards[ n ] ) ) - continue; // obscured - } - - dist = d1; - closest = &Guards[ n ]; - } - } - - if( ! closest || dist > TILE2POS( 1 ) ) - { - return; // missed if further than 1.5 tiles - } - - damage = US_RndT() >> 4; - - A_DamageActor( closest, damage ); // hit something -} - -/* ------------------------------------------------------------------------------ - Function: - - Parameters: - - Returns: - - Notes: - ------------------------------------------------------------------------------ -*/ -PUBLIC void fire_lead( player_t *self ) -{ - entity_t *closest; - int damage; - int dx, dy, dist; - int d1, shot_dist, n; - - switch( self->weapon ) - { - case WEAPON_PISTOL: - Sound_StartSound( NULL, 0, CHAN_WEAPON, Sound_RegisterSound( "sfx/012.wav" ), 1, ATTN_NORM, 0 ); - break; - - case WEAPON_AUTO: - Sound_StartSound( NULL, 0, CHAN_WEAPON, Sound_RegisterSound( "sfx/011.wav" ), 1, ATTN_NORM, 0 ); - break; - - case WEAPON_CHAIN: - Sound_StartSound( NULL, 0, CHAN_WEAPON, Sound_RegisterSound( "sfx/013.wav" ), 1, ATTN_NORM, 0 ); - break; - } - self->madenoise = true; - - dist = 0x7fffffffl; - closest = NULL; - - for( n = 0 ; n < NumGuards; ++n ) - { - if( Guards[ n ].flags & FL_SHOOTABLE ) // && Guards[n].flags&FL_VISABLE - { - shot_dist = Point2LineDist( Guards[ n ].x - self->position.origin[ 0 ], Guards[ n ].y - self->position.origin[ 1 ], self->position.angle ); - if( shot_dist > (2 * TILEGLOBAL / 3) ) - { - continue; // miss - } - - d1 = LineLen2Point( Guards[ n ].x - self->position.origin[ 0 ], Guards[ n ].y - self->position.origin[ 1 ], self->position.angle ); - if( d1 < 0 || d1 > dist ) - { - continue; - } - - if( ! Level_CheckLine( Guards[ n ].x, Guards[ n ].y, Player.position.origin[0], Player.position.origin[1], r_world ) ) - { - //if( ! CheckLine( &Guards[ n ] ) ) - continue; // obscured - } - - dist = d1; - closest = &Guards[ n ]; - } - } - - if( ! closest ) // missed - { - r_trace_t trace; - - trace.a = NormalizeAngle( self->position.angle - DEG2FINE( 2 ) + rand() % (DEG2FINE( 4 ) ) ); - trace.x = self->position.origin[ 0 ]; - trace.y = self->position.origin[ 1 ]; - trace.flags = TRACE_BULLET; - trace.tile_vis = NULL; - R_Trace( &trace, r_world ); - - if( trace.flags & TRACE_HIT_DOOR ) - { - Sound_StartSound( NULL, 0, CHAN_AUTO, Sound_RegisterSound( "lsfx/028.wav" ), 1, ATTN_NORM, 0 ); - } - return; - } - -// hit something - dx = ABS( closest->tilex - self->tilex ); - dy = ABS( closest->tiley - self->tiley ); - dist = max_of_2( dx, dy ); - - if( dist < 2 ) - { - damage = US_RndT() / 4; - } - else if( dist < 4 ) - { - damage = US_RndT() / 6; - } - else - { - if( US_RndT() / 12 < dist ) - { - return; // missed - } - - damage = US_RndT() / 6; - } - - A_DamageActor( closest, damage ); -} diff --git a/wolf3d/newCode/wolfiphone.h b/wolf3d/newCode/wolfiphone.h deleted file mode 100644 index 935a6fb..0000000 --- a/wolf3d/newCode/wolfiphone.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * wolfiphone.h - * wolf3d - * - * Created by John Carmack on 3/13/09. - * Copyright 2009 idSoftware. All rights reserved. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include "iphone/gles_glue.h" - -#include -#include -#include -#undef ALCAPI -#define ALCAPI - -#include "Tremor/ivorbisfile.h" - -#include "env/arch.h" -#include "env/angle.h" -#include "env/matrix.h" -#include "env/vector.h" -#include "env/mymath.h" -#include "env/common_utils.h" -#include "env/cvar.h" -#include "env/zmem.h" -#include "env/mymath.h" -#include "env/cmd.h" -#include "env/num_type.h" -#include "env/filestring.h" -#include "env/filesystem.h" -#include "env/app_def.h" -#include "env/common.h" -#include "env/video.h" -#include "env/texture_manager.h" -#include "env/font_manager.h" -#include "env/renderer.h" -#include "env/opengl_local.h" -#include "env/timer.h" -#include "env/com_string.h" -#include "env/console.h" -#include "env/sound_local.h" -#include "env/sound.h" -#include "env/memory.h" -#include "env/random_number.h" -#include "env/openal_binding.h" -#include "env/glob.h" -#include "env/opengl_local.h" -#include "env/tga.h" -#include "env/wavfile.h" -#include "env/oggfile.h" - - -#include "wolf/wolf_math.h" -#include "wolf/wolf_level.h" -#include "wolf/wolf_local.h" -#include "wolf/wolf_sprites.h" -#include "wolf/wolf_actors.h" -#include "wolf/wolf_actor_ai.h" -#include "wolf/wolf_player.h" -#include "wolf/wolf_powerups.h" -#include "wolf/wolf_raycast.h" -#include "wolf/wolf_renderer.h" - -#include "iphone/iphone_wolf.h" -

    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 I0s^uB14#jH3;+NC literal 0 HcmV?d00001 diff --git a/wolf3d/code/wolf/wolf_actor_ai.c b/wolf3d/code/wolf/wolf_actor_ai.c index ef46fe2..5def2d7 100644 --- a/wolf3d/code/wolf/wolf_actor_ai.c +++ b/wolf3d/code/wolf/wolf_actor_ai.c @@ -710,14 +710,14 @@ PUBLIC void A_Dormant( entity_t *self ) int deltax, deltay; int xl, xh, yl, yh, x, y, n; - deltax = self->x - Player.position.origin[ 0 ]; + deltax = self->x - (int)Player.position.origin[ 0 ]; if( deltax < -MINACTORDIST || deltax > MINACTORDIST ) { goto moveok; } - deltay = self->y - Player.position.origin[ 1 ]; + deltay = self->y - (int)Player.position.origin[ 1 ]; if( deltay < -MINACTORDIST || deltay > MINACTORDIST ) { goto moveok; @@ -911,8 +911,8 @@ PUBLIC void T_Projectile( entity_t *self ) self->x += deltax; self->y += deltay; - deltax = ABS( self->x-Player.position.origin[ 0 ] ); - deltay = ABS( self->y-Player.position.origin[ 1 ] ); + deltax = (int)ABS( self->x-Player.position.origin[ 0 ] ); + deltay = (int)ABS( self->y-Player.position.origin[ 1 ] ); if( ! ProjectileTryMove( self, r_world ) ) { diff --git a/wolf3d/code/wolf/wolf_ai_com.c b/wolf3d/code/wolf/wolf_ai_com.c index 0f2bdc8..611bd12 100644 --- a/wolf3d/code/wolf/wolf_ai_com.c +++ b/wolf3d/code/wolf/wolf_ai_com.c @@ -213,8 +213,8 @@ PRIVATE void AI_Dodge( entity_t *self ) turnaround = opposite8[ self->dir ]; } - deltax = POS2TILE( Player.position.origin[ 0 ] ) - POS2TILE( self->x ); - deltay = POS2TILE( Player.position.origin[ 1 ] ) - POS2TILE( self->y ); + deltax = (int)POS2TILE( Player.position.origin[ 0 ] ) - POS2TILE( self->x ); + deltay = (int)POS2TILE( Player.position.origin[ 1 ] ) - POS2TILE( self->y ); // // arange 5 direction choices in order of preference @@ -307,8 +307,8 @@ PRIVATE void AI_Chase( entity_t *self ) turnaround = opposite8[ olddir ]; d[ 0 ] = d[ 1 ] = dir8_nodir; - deltax = POS2TILE( Player.position.origin[ 0 ] ) - POS2TILE( self->x ); - deltay = POS2TILE( Player.position.origin[ 1 ] ) - POS2TILE( self->y ); + deltax = (int)POS2TILE( Player.position.origin[ 0 ] ) - POS2TILE( self->x ); + deltay = (int)POS2TILE( Player.position.origin[ 1 ] ) - POS2TILE( self->y ); if( deltax > 0 ) { @@ -427,8 +427,8 @@ PRIVATE void AI_Retreat( entity_t *self ) int deltax, deltay; dir8type d[2], tdir; - deltax = POS2TILE( Player.position.origin[ 0 ] ) - POS2TILE( self->x ); - deltay = POS2TILE( Player.position.origin[ 1 ] ) - POS2TILE( self->y ); + deltax = (int)POS2TILE( Player.position.origin[ 0 ] ) - POS2TILE( self->x ); + deltay = (int)POS2TILE( Player.position.origin[ 1 ] ) - POS2TILE( self->y ); d[ 0 ] = deltax < 0 ? dir8_east : dir8_west; d[ 1 ] = deltay < 0 ? dir8_north : dir8_south; @@ -510,8 +510,8 @@ PRIVATE _boolean AI_CheckSight( entity_t *self ) } // if the player is real close, sight is automatic - deltax = Player.position.origin[ 0 ] - self->x; - deltay = Player.position.origin[ 1 ] - self->y; + deltax = (int)Player.position.origin[ 0 ] - self->x; + deltay = (int)Player.position.origin[ 1 ] - self->y; if( ABS( deltax ) < MINSIGHT && ABS( deltay ) < MINSIGHT ) { @@ -870,8 +870,8 @@ PUBLIC void T_Chase( entity_t *self ) dodge = 0; if( Level_CheckLine( self->x, self->y, Player.position.origin[0], Player.position.origin[1], r_world ) ) // got a shot at player? { - dx = ABS( POS2TILE( self->x ) - POS2TILE( Player.position.origin[ 0 ] ) ); - dy = ABS( POS2TILE( self->y ) - POS2TILE( Player.position.origin[ 1 ] ) ); + dx = ABS( (int)POS2TILE( self->x ) - (int)POS2TILE( Player.position.origin[ 0 ] ) ); + dy = ABS( (int)POS2TILE( self->y ) - (int)POS2TILE( Player.position.origin[ 1 ] ) ); dist = max_of_2(dx, dy); if( ! dist || (dist == 1 && self->distance < 16) ) { @@ -1008,8 +1008,8 @@ PUBLIC void T_BossChase( entity_t *self ) W8 dodge; dodge = 0; - dx = ABS( self->tilex - POS2TILE( Player.position.origin[ 0 ] ) ); - dy = ABS( self->tiley - POS2TILE( Player.position.origin[ 1 ] ) ); + dx = ABS( self->tilex - (int)POS2TILE( Player.position.origin[ 0 ] ) ); + dy = ABS( self->tiley - (int)POS2TILE( Player.position.origin[ 1 ] ) ); dist = max_of_2( dx, dy ); if( Level_CheckLine( self->x, self->y, Player.position.origin[0], Player.position.origin[1], r_world ) ) // got a shot at player? @@ -1107,8 +1107,8 @@ PUBLIC void T_Shoot( entity_t *self ) return; // player is behind a wall } - dx = ABS( POS2TILE( self->x ) - POS2TILE( Player.position.origin[ 0 ] ) ); - dy = ABS( POS2TILE( self->y ) - POS2TILE( Player.position.origin[ 1 ] ) ); + dx = ABS( (int)POS2TILE( self->x ) - (int)POS2TILE( Player.position.origin[ 0 ] ) ); + dy = ABS( (int)POS2TILE( self->y ) - (int)POS2TILE( Player.position.origin[ 1 ] ) ); dist = max_of_2( dx, dy ); if( self->type == en_ss || self->type == en_boss ) @@ -1209,8 +1209,8 @@ PUBLIC void T_UShoot( entity_t *self ) T_Shoot( self ); - dx = ABS( self->tilex - POS2TILE( Player.position.origin[ 0 ] ) ); - dy = ABS( self->tiley - POS2TILE( Player.position.origin[ 1 ] ) ); + dx = ABS( self->tilex - (int)POS2TILE( Player.position.origin[ 0 ] ) ); + dy = ABS( self->tiley - (int)POS2TILE( Player.position.origin[ 1 ] ) ); dist = max_of_2( dx, dy ); if( dist <= 1 ) diff --git a/wolf3d/code/wolf/wolf_bj.c b/wolf3d/code/wolf/wolf_bj.c index 0f59ae2..511fb2a 100644 --- a/wolf3d/code/wolf/wolf_bj.c +++ b/wolf3d/code/wolf/wolf_bj.c @@ -42,14 +42,14 @@ void SpawnBJVictory( void ) { entity_t *bj; - bj = SpawnActor( en_bj, POS2TILE(Player.position.origin[0]), POS2TILE(Player.position.origin[1]), dir4_north, r_world ); + bj = SpawnActor( en_bj, (int)POS2TILE(Player.position.origin[0]), (int)POS2TILE(Player.position.origin[1]), dir4_north, r_world ); if( ! bj ) { return; } - bj->x = Player.position.origin[ 0 ]; - bj->y = Player.position.origin[ 1 ]; + bj->x = (int)Player.position.origin[ 0 ]; + bj->y = (int)Player.position.origin[ 1 ]; bj->state = st_path1; bj->speed = BJRUNSPEED; bj->flags = FL_NONMARK; // FL_NEVERMARK; diff --git a/wolf3d/code/wolf/wolf_level.c b/wolf3d/code/wolf/wolf_level.c index 68bc3ee..cb6d71a 100644 --- a/wolf3d/code/wolf/wolf_level.c +++ b/wolf3d/code/wolf/wolf_level.c @@ -868,7 +868,9 @@ PRIVATE void Lvl_RLEWexpand( W16 *source, W16 *dest, #define MAPHEADER_SIZE 49 -#define MAP_SIGNATURE 0x21444921 + +#define MAP_SIGNATURE_64 0x5800000021444921 +#define MAP_SIGNATURE_32 0x21444921 /* @@ -945,14 +947,18 @@ PUBLIC LevelData_t *Level_LoadMap( const char *levelname ) // Process map header // FS_ReadFile( &signature, 1, 4, fhandle ); - if( signature != MAP_SIGNATURE ) - { - iphoneMessageBox("map signature", "signature of the map file is invalid"); - Com_Printf("File signature does not match MAP_SIGNATURE\n"); - return NULL; - } - - + + // DEBUG: DISABLED FOR NOW - this is having issues with 32/64-bit and for right now I'm not worried about the maps being invalid +// if( (signature != MAP_SIGNATURE_32) && (signature != MAP_SIGNATURE_64) ) +// { +// iphoneMessageBox("map signature", "signature of the map file is invalid"); +// Com_Printf("File signature does not match MAP_SIGNATURE\n"); +// return NULL; +// } + + Com_Printf("MAP_SIGNATURE_32: %lu\n", MAP_SIGNATURE_32); + Com_Printf("MAP_SIGNATURE_64: %lu\n", MAP_SIGNATURE_64); + Com_Printf("signature: %lu\n", signature); FS_ReadFile( &rle, 2, 1, fhandle ); @@ -1219,11 +1225,13 @@ PUBLIC int Level_VerifyMap( const char *levelname ) } FS_ReadFile( &signature, 1, 4, fhandle ); - if( signature != MAP_SIGNATURE ) - { - value = 0; - goto cleanup; - } + + // DEBUG: DISABLED FOR NOW - this is having issues with 32/64-bit and for right now I'm not worried about the maps being invalid +// if( (signature != MAP_SIGNATURE_32) && (signature != MAP_SIGNATURE_64) ) +// { +// value = 0; +// goto cleanup; +// } FS_ReadFile( &rle, 2, 1, fhandle ); diff --git a/wolf3d/code/wolf/wolf_opengl.c b/wolf3d/code/wolf/wolf_opengl.c index 194602a..76f59df 100644 --- a/wolf3d/code/wolf/wolf_opengl.c +++ b/wolf3d/code/wolf/wolf_opengl.c @@ -58,7 +58,7 @@ */ PUBLIC void GL_SetDefaultState( void ) { - pfglViewport( 0,0, viddef.height, viddef.width ); + pfglViewport( 0,0, viddef.width, viddef.height ); pfglClearColor( 0.0f, 0.0f, 0.0f, 1.0f ); pfglEnable( GL_TEXTURE_2D ); pfglDisable( GL_DEPTH_TEST ); @@ -351,7 +351,7 @@ PUBLIC void R_DrawSprites( void ) } // prepare values for billboarding - ang = NormalizeAngle( Player.position.angle + ANG_90 ); + ang = (int)NormalizeAngle( (int)Player.position.angle + ANG_90 ); sina = (float)(0.5 * SinTable[ ang ]); cosa = (float)(0.5 * CosTable[ ang ]); @@ -458,7 +458,7 @@ PUBLIC void R_DrawNumber( int x, int y, int number ) pfglBegin( GL_QUADS ); - for( i = length-1 ; i >= 0 ; --i ) + for( i = (int)length-1 ; i >= 0 ; --i ) { col = string[ i ] - 48; diff --git a/wolf3d/code/wolf/wolf_player.c b/wolf3d/code/wolf/wolf_player.c index 4237dda..718464a 100644 --- a/wolf3d/code/wolf/wolf_player.c +++ b/wolf3d/code/wolf/wolf_player.c @@ -184,10 +184,10 @@ PRIVATE _boolean PL_TryMove( player_t *self, LevelData_t *lvl ) int xl, yl, xh, yh, x, y; int d, n; - xl = POS2TILE( Player.position.origin[ 0 ] - PLAYERSIZE ); - yl = POS2TILE( Player.position.origin[ 1 ] - PLAYERSIZE ); - xh = POS2TILE( Player.position.origin[ 0 ] + PLAYERSIZE ); - yh = POS2TILE( Player.position.origin[ 1 ] + PLAYERSIZE ); + xl = (int)POS2TILE( Player.position.origin[ 0 ] - PLAYERSIZE ); + yl = (int)POS2TILE( Player.position.origin[ 1 ] - PLAYERSIZE ); + xh = (int)POS2TILE( Player.position.origin[ 0 ] + PLAYERSIZE ); + yh = (int)POS2TILE( Player.position.origin[ 1 ] + PLAYERSIZE ); // Cheching for solid walls: for( y = yl ; y <= yh ; ++y ) @@ -200,8 +200,8 @@ PRIVATE _boolean PL_TryMove( player_t *self, LevelData_t *lvl ) Door_Opened( &lvl->Doors, x, y) != DOOR_FULLOPEN ) { // iphone hack to allow player to move halfway into door tiles // if the player bounds doesn't cross the middle of the tile, let the move continue - if ( abs( Player.position.origin[0] - TILE2POS( x ) ) <= 0x9000 - && abs( Player.position.origin[1] - TILE2POS( y ) ) <= 0x9000 ) { + if ( abs( (int)Player.position.origin[0] - TILE2POS( x ) ) <= 0x9000 + && abs( (int)Player.position.origin[1] - TILE2POS( y ) ) <= 0x9000 ) { return 0; } } @@ -213,12 +213,12 @@ PRIVATE _boolean PL_TryMove( player_t *self, LevelData_t *lvl ) if( Guards[ n ].state >= st_die1 ) continue; - d = self->position.origin[ 0 ] - Guards[ n ].x; + d = (int)self->position.origin[ 0 ] - Guards[ n ].x; if( d < -MINACTORDIST || d > MINACTORDIST ) continue; - d = self->position.origin[ 1 ] - Guards[ n ].y; + d = (int)self->position.origin[ 1 ] - Guards[ n ].y; if( d < -MINACTORDIST || d > MINACTORDIST) continue; @@ -245,8 +245,8 @@ PRIVATE void PL_ClipMove( player_t *self, int xmove, int ymove ) { int basex, basey; - basex = self->position.origin[ 0 ]; - basey = self->position.origin[ 1 ]; + basex = (int)self->position.origin[ 0 ]; + basey = (int)self->position.origin[ 1 ]; self->position.origin[ 0 ] += xmove; self->position.origin[ 1 ] += ymove; @@ -299,7 +299,7 @@ PRIVATE void PL_ControlMovement( player_t *self, LevelData_t *lvl ) int angle, speed; // rotation - angle = self->position.angle; + angle = (int)self->position.angle; // if(cmd->forwardmove || cmd->sidemove) self->movx = self->movy = 0; // clear accumulated movement @@ -340,8 +340,8 @@ PRIVATE void PL_ControlMovement( player_t *self, LevelData_t *lvl ) // move player and clip movement to walls (check for no-clip mode here) PL_ClipMove( self, self->movx, self->movy ); - self->tilex = POS2TILE( self->position.origin[ 0 ] ); - self->tiley = POS2TILE( self->position.origin[ 1 ] ); + self->tilex = (int)POS2TILE( self->position.origin[ 0 ] ); + self->tiley = (int)POS2TILE( self->position.origin[ 1 ] ); // pick up items easier -- any tile you touch, instead of // just the midpoint tile @@ -349,9 +349,9 @@ PRIVATE void PL_ControlMovement( player_t *self, LevelData_t *lvl ) int x, y; for ( x = -1 ; x <= 1 ; x+= 2 ) { - int tilex = POS2TILE( self->position.origin[0] + x * PLAYERSIZE ); + int tilex = (int)POS2TILE( self->position.origin[0] + x * PLAYERSIZE ); for ( y = -1 ; y <= 1 ; y+= 2 ) { - int tiley = POS2TILE( self->position.origin[1] + y * PLAYERSIZE ); + int tiley = (int)POS2TILE( self->position.origin[1] + y * PLAYERSIZE ); Powerup_PickUp( tilex, tiley ); } } @@ -572,8 +572,13 @@ PUBLIC void PL_Reset(void) PUBLIC void PL_Spawn( placeonplane_t location, LevelData_t *lvl ) { Player.position = location; - Player.tilex = POS2TILE( location.origin[ 0 ] ); - Player.tiley = POS2TILE( location.origin[ 1 ] ); + Player.tilex = (int)POS2TILE( location.origin[ 0 ] ); + Player.tiley = (int)POS2TILE( location.origin[ 1 ] ); + + // DEBUG! TESTING! +// Player.tilex = 1; +// Player.tiley = 15; + Player.areanumber = lvl->areas[ Player.tilex ][ Player.tiley ]; assert( Player.areanumber >= 0 && Player.areanumber < NUMAREAS ); if( Player.areanumber < 0 ) @@ -749,8 +754,8 @@ PUBLIC void PL_Damage( player_t *self, entity_t *attacker, int points ) // note the direction of the last hit for the directional blends { - int dx = attacker->x - self->position.origin[0]; - int dy = attacker->y - self->position.origin[1]; + int dx = attacker->x - (int)self->position.origin[0]; + int dy = attacker->y - (int)self->position.origin[1]; // probably won't ever have damage from self, but check anyway if ( dx != 0 || dy != 0 ) { diff --git a/wolf3d/code/wolf/wolf_raycast.c b/wolf3d/code/wolf/wolf_raycast.c index f8f2ec4..6447478 100644 --- a/wolf3d/code/wolf/wolf_raycast.c +++ b/wolf3d/code/wolf/wolf_raycast.c @@ -58,12 +58,12 @@ PUBLIC void R_RayCast( placeonplane_t viewport, LevelData_t *lvl ) memset( tile_visible, 0, sizeof( tile_visible ) ); // clear tile visible flags // viewport tile coordinates - x = viewport.origin[ 0 ]; - y = viewport.origin[ 1 ]; - angle = viewport.angle; + x = (int)viewport.origin[ 0 ]; + y = (int)viewport.origin[ 1 ]; + angle = (int)viewport.angle; - vx = POS2TILE( viewport.origin[ 0 ] ); - vy = POS2TILE( viewport.origin[ 1 ] ); + vx = (int)POS2TILE( viewport.origin[ 0 ] ); + vy = (int)POS2TILE( viewport.origin[ 1 ] ); trace.tile_vis = tile_visible; trace.flags = TRACE_SIGHT | TRACE_MARK_MAP; diff --git a/wolf3d/code/wolf/wolf_sprites.c b/wolf3d/code/wolf/wolf_sprites.c index 7aee718..00f5d97 100644 --- a/wolf3d/code/wolf/wolf_sprites.c +++ b/wolf3d/code/wolf/wolf_sprites.c @@ -94,7 +94,7 @@ PUBLIC int Sprite_GetNewSprite( void ) if( sprt->flags & SPRT_REMOVE ) { // free spot: clear it first memset( sprt, 0, sizeof( sprite_t ) ); - return n; + return (int)n; } } @@ -260,9 +260,9 @@ PUBLIC int Sprite_CreateVisList( void ) if( tile_visible[ tx ][ ty ] || tile_visible[ tx + 1 ][ ty ] || tile_visible[ tx ][ ty + 1 ] || tile_visible[ tx + 1 ][ ty + 1 ] ) { // player spoted it - visptr->dist = LineLen2Point( sprt->x - Player.position.origin[ 0 ], - sprt->y-Player.position.origin[ 1 ], - Player.position.angle ); //FIXME viewport + visptr->dist = LineLen2Point( (int)sprt->x - (int)Player.position.origin[ 0 ], + (int)sprt->y-(int)Player.position.origin[ 1 ], + (int)Player.position.angle ); //FIXME viewport visptr->x = sprt->x; visptr->y = sprt->y; visptr->ang = sprt->ang; @@ -282,6 +282,6 @@ PUBLIC int Sprite_CreateVisList( void ) qsort( vislist, num_visible, sizeof( visobj_t ), Sprite_cmpVis ); } - return num_visible; + return (int)num_visible; } diff --git a/wolf3d/code/wolf/wolf_weapon.c b/wolf3d/code/wolf/wolf_weapon.c index 4953dfa..529d6d5 100644 --- a/wolf3d/code/wolf/wolf_weapon.c +++ b/wolf3d/code/wolf/wolf_weapon.c @@ -49,14 +49,14 @@ PUBLIC void fire_hit( player_t *self ) { if( Guards[ n ].flags & FL_SHOOTABLE ) // && Guards[n].flags&FL_VISABLE { - shot_dist = Point2LineDist( Guards[ n ].x - self->position.origin[ 0 ], Guards[ n ].y - self->position.origin[ 1 ], self->position.angle ); + shot_dist = Point2LineDist( Guards[ n ].x - (int)self->position.origin[ 0 ], Guards[ n ].y - (int)self->position.origin[ 1 ], (int)self->position.angle ); if( shot_dist > (2 * TILEGLOBAL / 3) ) { continue; // miss } - d1 = LineLen2Point( Guards[ n ].x - self->position.origin[ 0 ], Guards[ n ].y - self->position.origin[ 1 ], self->position.angle ); + d1 = LineLen2Point( Guards[ n ].x - (int)self->position.origin[ 0 ], Guards[ n ].y - (int)self->position.origin[ 1 ], (int)self->position.angle ); if( d1 < 0 || d1 > dist ) { @@ -126,13 +126,13 @@ PUBLIC void fire_lead( player_t *self ) { if( Guards[ n ].flags & FL_SHOOTABLE ) // && Guards[n].flags&FL_VISABLE { - shot_dist = Point2LineDist( Guards[ n ].x - self->position.origin[ 0 ], Guards[ n ].y - self->position.origin[ 1 ], self->position.angle ); + shot_dist = Point2LineDist( Guards[ n ].x - (int)self->position.origin[ 0 ], Guards[ n ].y - (int)self->position.origin[ 1 ], (int)self->position.angle ); if( shot_dist > (2 * TILEGLOBAL / 3) ) { continue; // miss } - d1 = LineLen2Point( Guards[ n ].x - self->position.origin[ 0 ], Guards[ n ].y - self->position.origin[ 1 ], self->position.angle ); + d1 = LineLen2Point( Guards[ n ].x - (int)self->position.origin[ 0 ], Guards[ n ].y - (int)self->position.origin[ 1 ], (int)self->position.angle ); if( d1 < 0 || d1 > dist ) { continue; @@ -153,9 +153,9 @@ PUBLIC void fire_lead( player_t *self ) { r_trace_t trace; - trace.a = NormalizeAngle( self->position.angle - DEG2FINE( 2 ) + rand() % (DEG2FINE( 4 ) ) ); - trace.x = self->position.origin[ 0 ]; - trace.y = self->position.origin[ 1 ]; + trace.a = NormalizeAngle( (int)self->position.angle - DEG2FINE( 2 ) + rand() % (DEG2FINE( 4 ) ) ); + trace.x = (int)self->position.origin[ 0 ]; + trace.y = (int)self->position.origin[ 1 ]; trace.flags = TRACE_BULLET; trace.tile_vis = NULL; R_Trace( &trace, r_world ); diff --git a/wolf3d/code/wolfiphone.h b/wolf3d/code/wolfiphone.h index 472828f..07d3125 100644 --- a/wolf3d/code/wolfiphone.h +++ b/wolf3d/code/wolfiphone.h @@ -107,5 +107,14 @@ extern CFAbsoluteTime soundTime; extern CFAbsoluteTime menuTime; -void picTimingPrint(); -void picTimingClear(); +void picTimingPrint(void); +void picTimingClear(void); + +#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width) +#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height) +#define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT)) +#define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT)) +#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) +#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) +#define IS_IPHONE_X (IS_IPHONE && SCREEN_MAX_LENGTH == 812.0) +extern bool isiPhoneX; diff --git a/wolf3d/newCode/Tremor/CHANGELOG b/wolf3d/newCode/Tremor/CHANGELOG deleted file mode 100644 index 53f2335..0000000 --- a/wolf3d/newCode/Tremor/CHANGELOG +++ /dev/null @@ -1,19 +0,0 @@ -*** 20020517: 1.0.2 *** - - Playback bugfix to floor1; mode mistakenly used for sizing instead - of blockflag - -*** 20020515: 1.0.1 *** - - Added complete API documentation to source tarball. No code - changes. - -*** 20020412: 1.0.1 *** - - Fixed a clipping bug that affected ARM processors; negative - overflows were being properly clipped, but then clobbered to - positive by the positive overflow chec (asm_arm.h:CLIP_TO_15) - -*** 20020403: 1.0.0 *** - - Initial version \ No newline at end of file diff --git a/wolf3d/newCode/Tremor/COPYING b/wolf3d/newCode/Tremor/COPYING deleted file mode 100644 index 6111c6c..0000000 --- a/wolf3d/newCode/Tremor/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2002, Xiph.org Foundation - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -- Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -- Neither the name of the Xiph.org Foundation nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/wolf3d/newCode/Tremor/Makefile.am b/wolf3d/newCode/Tremor/Makefile.am deleted file mode 100644 index d14081f..0000000 --- a/wolf3d/newCode/Tremor/Makefile.am +++ /dev/null @@ -1,38 +0,0 @@ -AUTOMAKE_OPTIONS = foreign - -INCLUDES = -I./ - -lib_LTLIBRARIES = libvorbisidec.la - -libvorbisidec_la_SOURCES = mdct.c block.c window.c \ - synthesis.c info.c \ - floor1.c floor0.c vorbisfile.c \ - res012.c mapping0.c registry.c codebook.c \ - sharedbook.c framing.c bitwise.c \ - codebook.h misc.h mdct_lookup.h\ - os.h mdct.h block.h ivorbisfile.h lsp_lookup.h\ - registry.h window.h window_lookup.h\ - codec_internal.h backends.h ogg.h \ - asm_arm.h ivorbiscodec.h -libvorbisidec_la_LDFLAGS = -version-info @V_LIB_CURRENT@:@V_LIB_REVISION@:@V_LIB_AGE@ - -EXTRA_PROGRAMS = ivorbisfile_example -CLEANFILES = $(EXTRA_PROGRAMS) $(lib_LTLIBRARIES) - -ivorbisfile_example_SOURCES = ivorbisfile_example.c -ivorbisfile_example_LDFLAGS = -static -ivorbisfile_example_LDADD = libvorbisidec.la - -includedir = $(prefix)/include/tremor - -include_HEADERS = ivorbiscodec.h ivorbisfile.h ogg.h os_types.h config_types.h - -example: - -ln -fs . vorbis - $(MAKE) ivorbisfile_example - -debug: - $(MAKE) all CFLAGS="@DEBUG@" - -profile: - $(MAKE) all CFLAGS="@PROFILE@" diff --git a/wolf3d/newCode/Tremor/README b/wolf3d/newCode/Tremor/README deleted file mode 100644 index 1321175..0000000 --- a/wolf3d/newCode/Tremor/README +++ /dev/null @@ -1,46 +0,0 @@ -This README covers the Ogg Vorbis 'Tremor' integer playback codec -source as of date 2002 09 02, version 1.0.0. - - ****** - -The C source in this package will build on any ANSI C compiler and -function completely and properly on any platform. The included build -system assumes GNU build system and make tools (m4, automake, -autoconf, libtool and gmake). GCC is not required, although GCC is -the most tested compiler. To build using GNU tools, type in the -source directory: - -./autogen.sh -make - -Currently, the source implements playback in pure C on all platforms -except ARM, where a [currently] small amount of assembly (see -asm_arm.h) is used to implement 64 bit math operations and fast LSP -computation. If building on ARM without the benefit of GNU build -system tools, be sure that '_ARM_ASSEM_' is #defined by the build -system if this assembly is desired, else the resulting library will -use whatever 64 bit math builtins the compiler implements. - -No math library is required by this source. No floating point -operations are used at any point in either setup or decode. This -decoder library will properly decode any past, current or future -Vorbis I file or stream. - - ******** - -The build system produces a static and [when supported by the OS] -dynamic library named 'libvorbisidec'. This library exposes an API -nearly identical to the BSD reference library's 'libvorbisfile', -including all the features familiar to users of vorbisfile. This API -is similar enough that the proper header file to include is named -'ivorbisfile.h' [included in the source build directory]. Lower level -libvorbis-style headers and structures are in 'ivorbiscodec.h' -[included in the source build directory]. A simple example program, -ivorbisfile_example.c, can be built with 'make example'. - - ******** - -Detailed Tremor API Documentation begins at doc/index.html - -Monty -xiph.org diff --git a/wolf3d/newCode/Tremor/Version_script.in b/wolf3d/newCode/Tremor/Version_script.in deleted file mode 100644 index c0dfde9..0000000 --- a/wolf3d/newCode/Tremor/Version_script.in +++ /dev/null @@ -1,49 +0,0 @@ -# -# Export file for libvorbisidec -# -# Only the symbols listed in the global section will be callable from -# applications linking to libvorbisidec. -# - -@PACKAGE@.so.1 -{ - global: - ov_clear; - ov_open; - ov_open_callbacks; - ov_test; - ov_test_callbacks; - ov_test_open; - ov_bitrate; - ov_bitrate_instant; - ov_streams; - ov_seekable; - ov_serialnumber; - ov_raw_total; - ov_pcm_total; - ov_time_total; - ov_raw_seek; - ov_pcm_seek; - ov_pcm_seek_page; - ov_time_seek; - ov_time_seek_page; - ov_raw_tell; - ov_pcm_tell; - ov_time_tell; - ov_info; - ov_comment; - ov_read; - - vorbis_info_init; - vorbis_info_clear; - vorbis_info_blocksize; - vorbis_comment_init; - vorbis_comment_add; - vorbis_comment_add_tag; - vorbis_comment_query; - vorbis_comment_query_count; - vorbis_comment_clear; - - local: - *; -}; diff --git a/wolf3d/newCode/Tremor/asm_arm.h b/wolf3d/newCode/Tremor/asm_arm.h deleted file mode 100644 index 3a3716d..0000000 --- a/wolf3d/newCode/Tremor/asm_arm.h +++ /dev/null @@ -1,243 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: arm7 and later wide math functions - - ********************************************************************/ - -#ifdef _ARM_ASSEM_ - -#if !defined(_V_WIDE_MATH) && !defined(_LOW_ACCURACY_) -#define _V_WIDE_MATH - -static inline ogg_int32_t MULT32(ogg_int32_t x, ogg_int32_t y) { - int lo,hi; - asm volatile("smull\t%0, %1, %2, %3" - : "=&r"(lo),"=&r"(hi) - : "%r"(x),"r"(y) - : "cc"); - return(hi); -} - -static inline ogg_int32_t MULT31(ogg_int32_t x, ogg_int32_t y) { - return MULT32(x,y)<<1; -} - -static inline ogg_int32_t MULT31_SHIFT15(ogg_int32_t x, ogg_int32_t y) { - int lo,hi; - asm volatile("smull %0, %1, %2, %3\n\t" - "movs %0, %0, lsr #15\n\t" - "adc %1, %0, %1, lsl #17\n\t" - : "=&r"(lo),"=&r"(hi) - : "%r"(x),"r"(y) - : "cc"); - return(hi); -} - -#define MB() asm volatile ("" : : : "memory") - -static inline void XPROD32(ogg_int32_t a, ogg_int32_t b, - ogg_int32_t t, ogg_int32_t v, - ogg_int32_t *x, ogg_int32_t *y) -{ - int x1, y1, l; - asm( "smull %0, %1, %4, %6\n\t" - "smlal %0, %1, %5, %7\n\t" - "rsb %3, %4, #0\n\t" - "smull %0, %2, %5, %6\n\t" - "smlal %0, %2, %3, %7" - : "=&r" (l), "=&r" (x1), "=&r" (y1), "=r" (a) - : "3" (a), "r" (b), "r" (t), "r" (v) - : "cc" ); - *x = x1; - MB(); - *y = y1; -} - -static inline void XPROD31(ogg_int32_t a, ogg_int32_t b, - ogg_int32_t t, ogg_int32_t v, - ogg_int32_t *x, ogg_int32_t *y) -{ - int x1, y1, l; - asm( "smull %0, %1, %4, %6\n\t" - "smlal %0, %1, %5, %7\n\t" - "rsb %3, %4, #0\n\t" - "smull %0, %2, %5, %6\n\t" - "smlal %0, %2, %3, %7" - : "=&r" (l), "=&r" (x1), "=&r" (y1), "=r" (a) - : "3" (a), "r" (b), "r" (t), "r" (v) - : "cc" ); - *x = x1 << 1; - MB(); - *y = y1 << 1; -} - -static inline void XNPROD31(ogg_int32_t a, ogg_int32_t b, - ogg_int32_t t, ogg_int32_t v, - ogg_int32_t *x, ogg_int32_t *y) -{ - int x1, y1, l; - asm( "rsb %2, %4, #0\n\t" - "smull %0, %1, %3, %5\n\t" - "smlal %0, %1, %2, %6\n\t" - "smull %0, %2, %4, %5\n\t" - "smlal %0, %2, %3, %6" - : "=&r" (l), "=&r" (x1), "=&r" (y1) - : "r" (a), "r" (b), "r" (t), "r" (v) - : "cc" ); - *x = x1 << 1; - MB(); - *y = y1 << 1; -} - -#endif - -#ifndef _V_CLIP_MATH -#define _V_CLIP_MATH - -static inline ogg_int32_t CLIP_TO_15(ogg_int32_t x) { - int tmp; - asm volatile("subs %1, %0, #32768\n\t" - "movpl %0, #0x7f00\n\t" - "orrpl %0, %0, #0xff\n" - "adds %1, %0, #32768\n\t" - "movmi %0, #0x8000" - : "+r"(x),"=r"(tmp) - : - : "cc"); - return(x); -} - -#endif - -#ifndef _V_LSP_MATH_ASM -#define _V_LSP_MATH_ASM - -static inline void lsp_loop_asm(ogg_uint32_t *qip,ogg_uint32_t *pip, - ogg_int32_t *qexpp, - ogg_int32_t *ilsp,ogg_int32_t wi, - ogg_int32_t m){ - - ogg_uint32_t qi=*qip,pi=*pip; - ogg_int32_t qexp=*qexpp; - - asm("mov r0,%3;" - "mov r1,%5,asr#1;" - "add r0,r0,r1,lsl#3;" - "1:" - - "ldmdb r0!,{r1,r3};" - "subs r1,r1,%4;" //ilsp[j]-wi - "rsbmi r1,r1,#0;" //labs(ilsp[j]-wi) - "umull %0,r2,r1,%0;" //qi*=labs(ilsp[j]-wi) - - "subs r1,r3,%4;" //ilsp[j+1]-wi - "rsbmi r1,r1,#0;" //labs(ilsp[j+1]-wi) - "umull %1,r3,r1,%1;" //pi*=labs(ilsp[j+1]-wi) - - "cmn r2,r3;" // shift down 16? - "beq 0f;" - "add %2,%2,#16;" - "mov %0,%0,lsr #16;" - "orr %0,%0,r2,lsl #16;" - "mov %1,%1,lsr #16;" - "orr %1,%1,r3,lsl #16;" - "0:" - "cmp r0,%3;\n" - "bhi 1b;\n" - - // odd filter assymetry - "ands r0,%5,#1;\n" - "beq 2f;\n" - "add r0,%3,%5,lsl#2;\n" - - "ldr r1,[r0,#-4];\n" - "mov r0,#0x4000;\n" - - "subs r1,r1,%4;\n" //ilsp[j]-wi - "rsbmi r1,r1,#0;\n" //labs(ilsp[j]-wi) - "umull %0,r2,r1,%0;\n" //qi*=labs(ilsp[j]-wi) - "umull %1,r3,r0,%1;\n" //pi*=labs(ilsp[j+1]-wi) - - "cmn r2,r3;\n" // shift down 16? - "beq 2f;\n" - "add %2,%2,#16;\n" - "mov %0,%0,lsr #16;\n" - "orr %0,%0,r2,lsl #16;\n" - "mov %1,%1,lsr #16;\n" - "orr %1,%1,r3,lsl #16;\n" - - //qi=(pi>>shift)*labs(ilsp[j]-wi); - //pi=(qi>>shift)*labs(ilsp[j+1]-wi); - //qexp+=shift; - - //} - - /* normalize to max 16 sig figs */ - "2:" - "mov r2,#0;" - "orr r1,%0,%1;" - "tst r1,#0xff000000;" - "addne r2,r2,#8;" - "movne r1,r1,lsr #8;" - "tst r1,#0x00f00000;" - "addne r2,r2,#4;" - "movne r1,r1,lsr #4;" - "tst r1,#0x000c0000;" - "addne r2,r2,#2;" - "movne r1,r1,lsr #2;" - "tst r1,#0x00020000;" - "addne r2,r2,#1;" - "movne r1,r1,lsr #1;" - "tst r1,#0x00010000;" - "addne r2,r2,#1;" - "mov %0,%0,lsr r2;" - "mov %1,%1,lsr r2;" - "add %2,%2,r2;" - - : "+r"(qi),"+r"(pi),"+r"(qexp) - : "r"(ilsp),"r"(wi),"r"(m) - : "r0","r1","r2","r3","cc"); - - *qip=qi; - *pip=pi; - *qexpp=qexp; -} - -static inline void lsp_norm_asm(ogg_uint32_t *qip,ogg_int32_t *qexpp){ - - ogg_uint32_t qi=*qip; - ogg_int32_t qexp=*qexpp; - - asm("tst %0,#0x0000ff00;" - "moveq %0,%0,lsl #8;" - "subeq %1,%1,#8;" - "tst %0,#0x0000f000;" - "moveq %0,%0,lsl #4;" - "subeq %1,%1,#4;" - "tst %0,#0x0000c000;" - "moveq %0,%0,lsl #2;" - "subeq %1,%1,#2;" - "tst %0,#0x00008000;" - "moveq %0,%0,lsl #1;" - "subeq %1,%1,#1;" - : "+r"(qi),"+r"(qexp) - : - : "cc"); - *qip=qi; - *qexpp=qexp; -} - -#endif -#endif - diff --git a/wolf3d/newCode/Tremor/autogen.sh b/wolf3d/newCode/Tremor/autogen.sh deleted file mode 100644 index 73c8fca..0000000 --- a/wolf3d/newCode/Tremor/autogen.sh +++ /dev/null @@ -1,120 +0,0 @@ -#!/bin/sh -# Run this to set up the build system: configure, makefiles, etc. -# (based on the version in enlightenment's cvs) - -package="vorbisdec" - -olddir=`pwd` -srcdir=`dirname $0` -test -z "$srcdir" && srcdir=. - -cd "$srcdir" -DIE=0 - -echo "checking for autoconf... " -(autoconf --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have autoconf installed to compile $package." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -VERSIONGREP="sed -e s/.*[^0-9\.]\([0-9]\.[0-9]\).*/\1/" -VERSIONMKINT="sed -e s/[^0-9]//" - -# do we need automake? -if test -r Makefile.am; then - AM_OPTIONS=`fgrep AUTOMAKE_OPTIONS Makefile.am` - AM_NEEDED=`echo $AM_OPTIONS | $VERSIONGREP` - if test x"$AM_NEEDED" = "x$AM_OPTIONS"; then - AM_NEEDED="" - fi - if test -z $AM_NEEDED; then - echo -n "checking for automake... " - AUTOMAKE=automake - ACLOCAL=aclocal - if ($AUTOMAKE --version < /dev/null > /dev/null 2>&1); then - echo "yes" - else - echo "no" - AUTOMAKE= - fi - else - echo -n "checking for automake $AM_NEEDED or later... " - for am in automake-$AM_NEEDED automake$AM_NEEDED automake; do - ($am --version < /dev/null > /dev/null 2>&1) || continue - ver=`$am --version < /dev/null | head -n 1 | $VERSIONGREP | $VERSIONMKINT` - verneeded=`echo $AM_NEEDED | $VERSIONMKINT` - if test $ver -ge $verneeded; then - AUTOMAKE=$am - echo $AUTOMAKE - break - fi - done - test -z $AUTOMAKE && echo "no" - echo -n "checking for aclocal $AM_NEEDED or later... " - for ac in aclocal-$AM_NEEDED aclocal$AM_NEEDED aclocal; do - ($ac --version < /dev/null > /dev/null 2>&1) || continue - ver=`$ac --version < /dev/null | head -n 1 | $VERSIONGREP | $VERSIONMKINT` - verneeded=`echo $AM_NEEDED | $VERSIONMKINT` - if test $ver -ge $verneeded; then - ACLOCAL=$ac - echo $ACLOCAL - break - fi - done - test -z $ACLOCAL && echo "no" - fi - test -z $AUTOMAKE || test -z $ACLOCAL && { - echo - echo "You must have automake installed to compile $package." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - exit 1 - } -fi - -echo -n "checking for libtool... " -for LIBTOOLIZE in libtoolize glibtoolize nope; do - ($LIBTOOLIZE --version) < /dev/null > /dev/null 2>&1 && break -done -if test x$LIBTOOLIZE = xnope; then - echo "nope." - LIBTOOLIZE=libtoolize -else - echo $LIBTOOLIZE -fi -($LIBTOOLIZE --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have libtool installed to compile $package." - echo "Download the appropriate package for your system," - echo "or get the source from one of the GNU ftp sites" - echo "listed in http://www.gnu.org/order/ftp.html" - DIE=1 -} - -if test "$DIE" -eq 1; then - exit 1 -fi - -if test -z "$*"; then - echo "I am going to run ./configure with no arguments - if you wish " - echo "to pass any to it, please specify them on the $0 command line." -fi - -echo "Generating configuration files for $package, please wait...." - -echo " $ACLOCAL $ACLOCAL_FLAGS" -$ACLOCAL $ACLOCAL_FLAGS || exit 1 -echo " $LIBTOOLIZE --automake" -$LIBTOOLIZE --automake || exit 1 -echo " autoheader" -autoheader || exit 1 -echo " $AUTOMAKE --add-missing $AUTOMAKE_FLAGS" -$AUTOMAKE --add-missing $AUTOMAKE_FLAGS || exit 1 -echo " autoconf" -autoconf || exit 1 - -cd $olddir -$srcdir/configure --enable-maintainer-mode "$@" && echo diff --git a/wolf3d/newCode/Tremor/backends.h b/wolf3d/newCode/Tremor/backends.h deleted file mode 100644 index 50c1c45..0000000 --- a/wolf3d/newCode/Tremor/backends.h +++ /dev/null @@ -1,130 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: backend and mapping structures - - ********************************************************************/ - -/* this is exposed up here because we need it for static modes. - Lookups for each backend aren't exposed because there's no reason - to do so */ - -#ifndef _vorbis_backend_h_ -#define _vorbis_backend_h_ - -#include "codec_internal.h" - -/* this would all be simpler/shorter with templates, but.... */ -/* Transform backend generic *************************************/ - -/* only mdct right now. Flesh it out more if we ever transcend mdct - in the transform domain */ - -/* Floor backend generic *****************************************/ -typedef struct{ - vorbis_info_floor *(*unpack)(vorbis_info *,oggpack_buffer *); - vorbis_look_floor *(*look) (vorbis_dsp_state *,vorbis_info_mode *, - vorbis_info_floor *); - void (*free_info) (vorbis_info_floor *); - void (*free_look) (vorbis_look_floor *); - void *(*inverse1) (struct vorbis_block *,vorbis_look_floor *); - int (*inverse2) (struct vorbis_block *,vorbis_look_floor *, - void *buffer,ogg_int32_t *); -} vorbis_func_floor; - -typedef struct{ - int order; - long rate; - long barkmap; - - int ampbits; - int ampdB; - - int numbooks; /* <= 16 */ - int books[16]; - -} vorbis_info_floor0; - -#define VIF_POSIT 63 -#define VIF_CLASS 16 -#define VIF_PARTS 31 -typedef struct{ - int partitions; /* 0 to 31 */ - int partitionclass[VIF_PARTS]; /* 0 to 15 */ - - int class_dim[VIF_CLASS]; /* 1 to 8 */ - int class_subs[VIF_CLASS]; /* 0,1,2,3 (bits: 1< -#include -#include "ogg.h" - -static unsigned long mask[]= -{0x00000000,0x00000001,0x00000003,0x00000007,0x0000000f, - 0x0000001f,0x0000003f,0x0000007f,0x000000ff,0x000001ff, - 0x000003ff,0x000007ff,0x00000fff,0x00001fff,0x00003fff, - 0x00007fff,0x0000ffff,0x0001ffff,0x0003ffff,0x0007ffff, - 0x000fffff,0x001fffff,0x003fffff,0x007fffff,0x00ffffff, - 0x01ffffff,0x03ffffff,0x07ffffff,0x0fffffff,0x1fffffff, - 0x3fffffff,0x7fffffff,0xffffffff }; - -/* mark read process as having run off the end */ -static void _adv_halt(oggpack_buffer *b){ - b->headptr=b->head->buffer->data+b->head->begin+b->head->length; - b->headend=-1; - b->headbit=0; -} - -/* spans forward, skipping as many bytes as headend is negative; if - headend is zero, simply finds next byte. If we're up to the end - of the buffer, leaves headend at zero. If we've read past the end, - halt the decode process. */ -static void _span(oggpack_buffer *b){ - while(b->headend<1){ - if(b->head->next){ - b->count+=b->head->length; - b->head=b->head->next; - b->headptr=b->head->buffer->data+b->head->begin-b->headend; - b->headend+=b->head->length; - }else{ - /* we've either met the end of decode, or gone past it. halt - only if we're past */ - if(b->headend<0 || b->headbit) - /* read has fallen off the end */ - _adv_halt(b); - - break; - } - } -} - -void oggpack_readinit(oggpack_buffer *b,ogg_reference *r){ - memset(b,0,sizeof(*b)); - - b->tail=b->head=r; - b->count=0; - b->headptr=b->head->buffer->data+b->head->begin; - b->headend=b->head->length; - _span(b); -} - -#define _lookspan() while(!end){\ - head=head->next;\ - if(!head) return -1;\ - ptr=head->buffer->data + head->begin;\ - end=head->length;\ - } - -/* Read in bits without advancing the bitptr; bits <= 32 */ -long oggpack_look(oggpack_buffer *b,int bits){ - unsigned long m=mask[bits]; - unsigned long ret=-1; - - bits+=b->headbit; - - if(bits >= b->headend<<3){ - int end=b->headend; - unsigned char *ptr=b->headptr; - ogg_reference *head=b->head; - - if(end<0)return -1; - - if(bits){ - _lookspan(); - ret=*ptr++>>b->headbit; - if(bits>8){ - --end; - _lookspan(); - ret|=*ptr++<<(8-b->headbit); - if(bits>16){ - --end; - _lookspan(); - ret|=*ptr++<<(16-b->headbit); - if(bits>24){ - --end; - _lookspan(); - ret|=*ptr++<<(24-b->headbit); - if(bits>32 && b->headbit){ - --end; - _lookspan(); - ret|=*ptr<<(32-b->headbit); - } - } - } - } - } - - }else{ - - /* make this a switch jump-table */ - ret=b->headptr[0]>>b->headbit; - if(bits>8){ - ret|=b->headptr[1]<<(8-b->headbit); - if(bits>16){ - ret|=b->headptr[2]<<(16-b->headbit); - if(bits>24){ - ret|=b->headptr[3]<<(24-b->headbit); - if(bits>32 && b->headbit) - ret|=b->headptr[4]<<(32-b->headbit); - } - } - } - } - - ret&=m; - return ret; -} - -/* limited to 32 at a time */ -void oggpack_adv(oggpack_buffer *b,int bits){ - bits+=b->headbit; - b->headbit=bits&7; - b->headptr+=bits/8; - if((b->headend-=bits/8)<1)_span(b); -} - -/* spans forward and finds next byte. Never halts */ -static void _span_one(oggpack_buffer *b){ - while(b->headend<1){ - if(b->head->next){ - b->count+=b->head->length; - b->head=b->head->next; - b->headptr=b->head->buffer->data+b->head->begin; - b->headend=b->head->length; - }else - break; - } -} - -static int _halt_one(oggpack_buffer *b){ - if(b->headend<1){ - _adv_halt(b); - return -1; - } - return 0; -} - -int oggpack_eop(oggpack_buffer *b){ - if(b->headend<0)return -1; - return 0; -} - -/* bits <= 32 */ -long oggpack_read(oggpack_buffer *b,int bits){ - unsigned long m=mask[bits]; - ogg_uint32_t ret=-1; - - bits+=b->headbit; - - if(bits >= b->headend<<3){ - - if(b->headend<0)return -1; - - if(bits){ - if (_halt_one(b)) return -1; - ret=*b->headptr>>b->headbit; - - if(bits>=8){ - ++b->headptr; - --b->headend; - _span_one(b); - if(bits>8){ - if (_halt_one(b)) return -1; - ret|=*b->headptr<<(8-b->headbit); - - if(bits>=16){ - ++b->headptr; - --b->headend; - _span_one(b); - if(bits>16){ - if (_halt_one(b)) return -1; - ret|=*b->headptr<<(16-b->headbit); - - if(bits>=24){ - ++b->headptr; - --b->headend; - _span_one(b); - if(bits>24){ - if (_halt_one(b)) return -1; - ret|=*b->headptr<<(24-b->headbit); - - if(bits>=32){ - ++b->headptr; - --b->headend; - _span_one(b); - if(bits>32){ - if (_halt_one(b)) return -1; - if(b->headbit)ret|=*b->headptr<<(32-b->headbit); - - } - } - } - } - } - } - } - } - } - }else{ - - ret=b->headptr[0]>>b->headbit; - if(bits>8){ - ret|=b->headptr[1]<<(8-b->headbit); - if(bits>16){ - ret|=b->headptr[2]<<(16-b->headbit); - if(bits>24){ - ret|=b->headptr[3]<<(24-b->headbit); - if(bits>32 && b->headbit){ - ret|=b->headptr[4]<<(32-b->headbit); - } - } - } - } - - b->headptr+=bits/8; - b->headend-=bits/8; - } - - ret&=m; - b->headbit=bits&7; - return ret; -} - -long oggpack_bytes(oggpack_buffer *b){ - return(b->count+b->headptr-b->head->buffer->data-b->head->begin+ - (b->headbit+7)/8); -} - -long oggpack_bits(oggpack_buffer *b){ - return((b->count+b->headptr-b->head->buffer->data-b->head->begin)*8+ - b->headbit); -} - diff --git a/wolf3d/newCode/Tremor/block.c b/wolf3d/newCode/Tremor/block.c deleted file mode 100644 index 8949253..0000000 --- a/wolf3d/newCode/Tremor/block.c +++ /dev/null @@ -1,453 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: PCM data vector blocking, windowing and dis/reassembly - - ********************************************************************/ - -#include -#include -#include -#include "ogg.h" -#include "ivorbiscodec.h" -#include "codec_internal.h" - -#include "window.h" -#include "registry.h" -#include "misc.h" - -static int ilog(unsigned int v){ - int ret=0; - if(v)--v; - while(v){ - ret++; - v>>=1; - } - return(ret); -} - -/* pcm accumulator examples (not exhaustive): - - <-------------- lW ----------------> - <--------------- W ----------------> -: .....|..... _______________ | -: .''' | '''_--- | |\ | -:.....''' |_____--- '''......| | \_______| -:.................|__________________|_______|__|______| - |<------ Sl ------>| > Sr < |endW - |beginSl |endSl | |endSr - |beginW |endlW |beginSr - - - |< lW >| - <--------------- W ----------------> - | | .. ______________ | - | | ' `/ | ---_ | - |___.'___/`. | ---_____| - |_______|__|_______|_________________| - | >|Sl|< |<------ Sr ----->|endW - | | |endSl |beginSr |endSr - |beginW | |endlW - mult[0] |beginSl mult[n] - - <-------------- lW -----------------> - |<--W-->| -: .............. ___ | | -: .''' |`/ \ | | -:.....''' |/`....\|...| -:.........................|___|___|___| - |Sl |Sr |endW - | | |endSr - | |beginSr - | |endSl - |beginSl - |beginW -*/ - -/* block abstraction setup *********************************************/ - -#ifndef WORD_ALIGN -#define WORD_ALIGN 8 -#endif - -int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb){ - memset(vb,0,sizeof(*vb)); - vb->vd=v; - vb->localalloc=0; - vb->localstore=NULL; - - return(0); -} - -void *_vorbis_block_alloc(vorbis_block *vb,long bytes){ - bytes=(bytes+(WORD_ALIGN-1)) & ~(WORD_ALIGN-1); - if(bytes+vb->localtop>vb->localalloc){ - /* can't just _ogg_realloc... there are outstanding pointers */ - if(vb->localstore){ - struct alloc_chain *link=(struct alloc_chain *)_ogg_malloc(sizeof(*link)); - vb->totaluse+=vb->localtop; - link->next=vb->reap; - link->ptr=vb->localstore; - vb->reap=link; - } - /* highly conservative */ - vb->localalloc=bytes; - vb->localstore=_ogg_malloc(vb->localalloc); - vb->localtop=0; - } - { - void *ret=(void *)(((char *)vb->localstore)+vb->localtop); - vb->localtop+=bytes; - return ret; - } -} - -/* reap the chain, pull the ripcord */ -void _vorbis_block_ripcord(vorbis_block *vb){ - /* reap the chain */ - struct alloc_chain *reap=vb->reap; - while(reap){ - struct alloc_chain *next=reap->next; - _ogg_free(reap->ptr); - memset(reap,0,sizeof(*reap)); - _ogg_free(reap); - reap=next; - } - /* consolidate storage */ - if(vb->totaluse){ - vb->localstore=_ogg_realloc(vb->localstore,vb->totaluse+vb->localalloc); - vb->localalloc+=vb->totaluse; - vb->totaluse=0; - } - - /* pull the ripcord */ - vb->localtop=0; - vb->reap=NULL; -} - -int vorbis_block_clear(vorbis_block *vb){ - _vorbis_block_ripcord(vb); - if(vb->localstore)_ogg_free(vb->localstore); - - memset(vb,0,sizeof(*vb)); - return(0); -} - -static int _vds_init(vorbis_dsp_state *v,vorbis_info *vi){ - int i; - codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; - private_state *b=NULL; - - memset(v,0,sizeof(*v)); - b=(private_state *)(v->backend_state=_ogg_calloc(1,sizeof(*b))); - - v->vi=vi; - b->modebits=ilog(ci->modes); - - /* Vorbis I uses only window type 0 */ - b->window[0]=_vorbis_window(0,ci->blocksizes[0]/2); - b->window[1]=_vorbis_window(0,ci->blocksizes[1]/2); - - /* finish the codebooks */ - if(!ci->fullbooks){ - ci->fullbooks=(codebook *)_ogg_calloc(ci->books,sizeof(*ci->fullbooks)); - for(i=0;ibooks;i++){ - vorbis_book_init_decode(ci->fullbooks+i,ci->book_param[i]); - /* decode codebooks are now standalone after init */ - vorbis_staticbook_destroy(ci->book_param[i]); - ci->book_param[i]=NULL; - } - } - - v->pcm_storage=ci->blocksizes[1]; - v->pcm=(ogg_int32_t **)_ogg_malloc(vi->channels*sizeof(*v->pcm)); - v->pcmret=(ogg_int32_t **)_ogg_malloc(vi->channels*sizeof(*v->pcmret)); - for(i=0;ichannels;i++) - v->pcm[i]=(ogg_int32_t *)_ogg_calloc(v->pcm_storage,sizeof(*v->pcm[i])); - - /* all 1 (large block) or 0 (small block) */ - /* explicitly set for the sake of clarity */ - v->lW=0; /* previous window size */ - v->W=0; /* current window size */ - - /* initialize all the mapping/backend lookups */ - b->mode=(vorbis_look_mapping **)_ogg_calloc(ci->modes,sizeof(*b->mode)); - for(i=0;imodes;i++){ - int mapnum=ci->mode_param[i]->mapping; - int maptype=ci->map_type[mapnum]; - b->mode[i]=_mapping_P[maptype]->look(v,ci->mode_param[i], - ci->map_param[mapnum]); - } - return(0); -} - -int vorbis_synthesis_restart(vorbis_dsp_state *v){ - vorbis_info *vi=v->vi; - codec_setup_info *ci; - - if(!v->backend_state)return -1; - if(!vi)return -1; - ci=vi->codec_setup; - if(!ci)return -1; - - v->centerW=ci->blocksizes[1]/2; - v->pcm_current=v->centerW; - - v->pcm_returned=-1; - v->granulepos=-1; - v->sequence=-1; - ((private_state *)(v->backend_state))->sample_count=-1; - - return(0); -} - -int vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi){ - _vds_init(v,vi); - vorbis_synthesis_restart(v); - - return(0); -} - -void vorbis_dsp_clear(vorbis_dsp_state *v){ - int i; - if(v){ - vorbis_info *vi=v->vi; - codec_setup_info *ci=(codec_setup_info *)(vi?vi->codec_setup:NULL); - private_state *b=(private_state *)v->backend_state; - - if(v->pcm){ - for(i=0;ichannels;i++) - if(v->pcm[i])_ogg_free(v->pcm[i]); - _ogg_free(v->pcm); - if(v->pcmret)_ogg_free(v->pcmret); - } - - /* free mode lookups; these are actually vorbis_look_mapping structs */ - if(ci){ - for(i=0;imodes;i++){ - int mapnum=ci->mode_param[i]->mapping; - int maptype=ci->map_type[mapnum]; - if(b && b->mode)_mapping_P[maptype]->free_look(b->mode[i]); - } - } - - if(b){ - if(b->mode)_ogg_free(b->mode); - _ogg_free(b); - } - - memset(v,0,sizeof(*v)); - } -} - -/* Unlike in analysis, the window is only partially applied for each - block. The time domain envelope is not yet handled at the point of - calling (as it relies on the previous block). */ - -int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb){ - vorbis_info *vi=v->vi; - codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; - private_state *b=v->backend_state; - int i,j; - - if(v->pcm_current>v->pcm_returned && v->pcm_returned!=-1)return(OV_EINVAL); - - v->lW=v->W; - v->W=vb->W; - v->nW=-1; - - if((v->sequence==-1)|| - (v->sequence+1 != vb->sequence)){ - v->granulepos=-1; /* out of sequence; lose count */ - b->sample_count=-1; - } - - v->sequence=vb->sequence; - - if(vb->pcm){ /* no pcm to process if vorbis_synthesis_trackonly - was called on block */ - int n=ci->blocksizes[v->W]/2; - int n0=ci->blocksizes[0]/2; - int n1=ci->blocksizes[1]/2; - - int thisCenter; - int prevCenter; - - if(v->centerW){ - thisCenter=n1; - prevCenter=0; - }else{ - thisCenter=0; - prevCenter=n1; - } - - /* v->pcm is now used like a two-stage double buffer. We don't want - to have to constantly shift *or* adjust memory usage. Don't - accept a new block until the old is shifted out */ - - /* overlap/add PCM */ - - for(j=0;jchannels;j++){ - /* the overlap/add section */ - if(v->lW){ - if(v->W){ - /* large/large */ - ogg_int32_t *pcm=v->pcm[j]+prevCenter; - ogg_int32_t *p=vb->pcm[j]; - for(i=0;ipcm[j]+prevCenter+n1/2-n0/2; - ogg_int32_t *p=vb->pcm[j]; - for(i=0;iW){ - /* small/large */ - ogg_int32_t *pcm=v->pcm[j]+prevCenter; - ogg_int32_t *p=vb->pcm[j]+n1/2-n0/2; - for(i=0;ipcm[j]+prevCenter; - ogg_int32_t *p=vb->pcm[j]; - for(i=0;ipcm[j]+thisCenter; - ogg_int32_t *p=vb->pcm[j]+n; - for(i=0;icenterW) - v->centerW=0; - else - v->centerW=n1; - - /* deal with initial packet state; we do this using the explicit - pcm_returned==-1 flag otherwise we're sensitive to first block - being short or long */ - - if(v->pcm_returned==-1){ - v->pcm_returned=thisCenter; - v->pcm_current=thisCenter; - }else{ - v->pcm_returned=prevCenter; - v->pcm_current=prevCenter+ - ci->blocksizes[v->lW]/4+ - ci->blocksizes[v->W]/4; - } - - } - - /* track the frame number... This is for convenience, but also - making sure our last packet doesn't end with added padding. If - the last packet is partial, the number of samples we'll have to - return will be past the vb->granulepos. - - This is not foolproof! It will be confused if we begin - decoding at the last page after a seek or hole. In that case, - we don't have a starting point to judge where the last frame - is. For this reason, vorbisfile will always try to make sure - it reads the last two marked pages in proper sequence */ - - if(b->sample_count==-1){ - b->sample_count=0; - }else{ - b->sample_count+=ci->blocksizes[v->lW]/4+ci->blocksizes[v->W]/4; - } - - if(v->granulepos==-1){ - if(vb->granulepos!=-1){ /* only set if we have a position to set to */ - - v->granulepos=vb->granulepos; - - /* is this a short page? */ - if(b->sample_count>v->granulepos){ - /* corner case; if this is both the first and last audio page, - then spec says the end is cut, not beginning */ - if(vb->eofflag){ - /* trim the end */ - /* no preceeding granulepos; assume we started at zero (we'd - have to in a short single-page stream) */ - /* granulepos could be -1 due to a seek, but that would result - in a long coun`t, not short count */ - - v->pcm_current-=(b->sample_count-v->granulepos); - }else{ - /* trim the beginning */ - v->pcm_returned+=(b->sample_count-v->granulepos); - if(v->pcm_returned>v->pcm_current) - v->pcm_returned=v->pcm_current; - } - - } - - } - }else{ - v->granulepos+=ci->blocksizes[v->lW]/4+ci->blocksizes[v->W]/4; - if(vb->granulepos!=-1 && v->granulepos!=vb->granulepos){ - - if(v->granulepos>vb->granulepos){ - long extra=v->granulepos-vb->granulepos; - - if(extra) - if(vb->eofflag){ - /* partial last frame. Strip the extra samples off */ - v->pcm_current-=extra; - } /* else {Shouldn't happen *unless* the bitstream is out of - spec. Either way, believe the bitstream } */ - } /* else {Shouldn't happen *unless* the bitstream is out of - spec. Either way, believe the bitstream } */ - v->granulepos=vb->granulepos; - } - } - - /* Update, cleanup */ - - if(vb->eofflag)v->eofflag=1; - return(0); -} - -/* pcm==NULL indicates we just want the pending samples, no more */ -int vorbis_synthesis_pcmout(vorbis_dsp_state *v,ogg_int32_t ***pcm){ - vorbis_info *vi=v->vi; - if(v->pcm_returned>-1 && v->pcm_returnedpcm_current){ - if(pcm){ - int i; - for(i=0;ichannels;i++) - v->pcmret[i]=v->pcm[i]+v->pcm_returned; - *pcm=v->pcmret; - } - return(v->pcm_current-v->pcm_returned); - } - return(0); -} - -int vorbis_synthesis_read(vorbis_dsp_state *v,int bytes){ - if(bytes && v->pcm_returned+bytes>v->pcm_current)return(OV_EINVAL); - v->pcm_returned+=bytes; - return(0); -} - diff --git a/wolf3d/newCode/Tremor/block.h b/wolf3d/newCode/Tremor/block.h deleted file mode 100644 index 5e19354..0000000 --- a/wolf3d/newCode/Tremor/block.h +++ /dev/null @@ -1,24 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2008 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: shared block functions - - ********************************************************************/ - -#ifndef _V_BLOCK_ -#define _V_BLOCK_ - -extern void _vorbis_block_ripcord(vorbis_block *vb); -extern void *_vorbis_block_alloc(vorbis_block *vb,long bytes); - -#endif diff --git a/wolf3d/newCode/Tremor/codebook.c b/wolf3d/newCode/Tremor/codebook.c deleted file mode 100644 index d055870..0000000 --- a/wolf3d/newCode/Tremor/codebook.c +++ /dev/null @@ -1,371 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: basic codebook pack/unpack/code/decode operations - - ********************************************************************/ - -#include -#include -#include -#include "ogg.h" -#include "ivorbiscodec.h" -#include "codebook.h" -#include "misc.h" - -/* unpacks a codebook from the packet buffer into the codebook struct, - readies the codebook auxiliary structures for decode *************/ -int vorbis_staticbook_unpack(oggpack_buffer *opb,static_codebook *s){ - long i,j; - memset(s,0,sizeof(*s)); - - /* make sure alignment is correct */ - if(oggpack_read(opb,24)!=0x564342)goto _eofout; - - /* first the basic parameters */ - s->dim=oggpack_read(opb,16); - s->entries=oggpack_read(opb,24); - if(s->entries==-1)goto _eofout; - - /* codeword ordering.... length ordered or unordered? */ - switch((int)oggpack_read(opb,1)){ - case 0: - /* unordered */ - s->lengthlist=(long *)_ogg_malloc(sizeof(*s->lengthlist)*s->entries); - - /* allocated but unused entries? */ - if(oggpack_read(opb,1)){ - /* yes, unused entries */ - - for(i=0;ientries;i++){ - if(oggpack_read(opb,1)){ - long num=oggpack_read(opb,5); - if(num==-1)goto _eofout; - s->lengthlist[i]=num+1; - }else - s->lengthlist[i]=0; - } - }else{ - /* all entries used; no tagging */ - for(i=0;ientries;i++){ - long num=oggpack_read(opb,5); - if(num==-1)goto _eofout; - s->lengthlist[i]=num+1; - } - } - - break; - case 1: - /* ordered */ - { - long length=oggpack_read(opb,5)+1; - s->lengthlist=(long *)_ogg_malloc(sizeof(*s->lengthlist)*s->entries); - - for(i=0;ientries;){ - long num=oggpack_read(opb,_ilog(s->entries-i)); - if(num==-1)goto _eofout; - for(j=0;jentries;j++,i++) - s->lengthlist[i]=length; - length++; - } - } - break; - default: - /* EOF */ - return(-1); - } - - /* Do we have a mapping to unpack? */ - switch((s->maptype=oggpack_read(opb,4))){ - case 0: - /* no mapping */ - break; - case 1: case 2: - /* implicitly populated value mapping */ - /* explicitly populated value mapping */ - - s->q_min=oggpack_read(opb,32); - s->q_delta=oggpack_read(opb,32); - s->q_quant=oggpack_read(opb,4)+1; - s->q_sequencep=oggpack_read(opb,1); - - { - int quantvals=0; - switch(s->maptype){ - case 1: - quantvals=_book_maptype1_quantvals(s); - break; - case 2: - quantvals=s->entries*s->dim; - break; - } - - /* quantized values */ - s->quantlist=(long *)_ogg_malloc(sizeof(*s->quantlist)*quantvals); - for(i=0;iquantlist[i]=oggpack_read(opb,s->q_quant); - - if(quantvals&&s->quantlist[quantvals-1]==-1)goto _eofout; - } - break; - default: - goto _errout; - } - - /* all set */ - return(0); - - _errout: - _eofout: - vorbis_staticbook_clear(s); - return(-1); -} - -/* the 'eliminate the decode tree' optimization actually requires the - codewords to be MSb first, not LSb. This is an annoying inelegancy - (and one of the first places where carefully thought out design - turned out to be wrong; Vorbis II and future Ogg codecs should go - to an MSb bitpacker), but not actually the huge hit it appears to - be. The first-stage decode table catches most words so that - bitreverse is not in the main execution path. */ - -static ogg_uint32_t bitreverse(ogg_uint32_t x){ - x= ((x>>16)&0x0000ffff) | ((x<<16)&0xffff0000); - x= ((x>> 8)&0x00ff00ff) | ((x<< 8)&0xff00ff00); - x= ((x>> 4)&0x0f0f0f0f) | ((x<< 4)&0xf0f0f0f0); - x= ((x>> 2)&0x33333333) | ((x<< 2)&0xcccccccc); - return((x>> 1)&0x55555555) | ((x<< 1)&0xaaaaaaaa); -} - -STIN long decode_packed_entry_number(codebook *book, - oggpack_buffer *b){ - int read=book->dec_maxlength; - long lo,hi; - long lok = oggpack_look(b,book->dec_firsttablen); - - if (lok >= 0) { - long entry = book->dec_firsttable[lok]; - if(entry&0x80000000UL){ - lo=(entry>>15)&0x7fff; - hi=book->used_entries-(entry&0x7fff); - }else{ - oggpack_adv(b, book->dec_codelengths[entry-1]); - return(entry-1); - } - }else{ - lo=0; - hi=book->used_entries; - } - - lok = oggpack_look(b, read); - - while(lok<0 && read>1) - lok = oggpack_look(b, --read); - - if(lok<0){ - oggpack_adv(b,1); /* force eop */ - return -1; - } - - /* bisect search for the codeword in the ordered list */ - { - ogg_uint32_t testword=bitreverse((ogg_uint32_t)lok); - - while(hi-lo>1){ - long p=(hi-lo)>>1; - long test=book->codelist[lo+p]>testword; - lo+=p&(test-1); - hi-=p&(-test); - } - - if(book->dec_codelengths[lo]<=read){ - oggpack_adv(b, book->dec_codelengths[lo]); - return(lo); - } - } - - oggpack_adv(b, read+1); - return(-1); -} - -/* Decode side is specced and easier, because we don't need to find - matches using different criteria; we simply read and map. There are - two things we need to do 'depending': - - We may need to support interleave. We don't really, but it's - convenient to do it here rather than rebuild the vector later. - - Cascades may be additive or multiplicitive; this is not inherent in - the codebook, but set in the code using the codebook. Like - interleaving, it's easiest to do it here. - addmul==0 -> declarative (set the value) - addmul==1 -> additive - addmul==2 -> multiplicitive */ - -/* returns the [original, not compacted] entry number or -1 on eof *********/ -long vorbis_book_decode(codebook *book, oggpack_buffer *b){ - if(book->used_entries>0){ - long packed_entry=decode_packed_entry_number(book,b); - if(packed_entry>=0) - return(book->dec_index[packed_entry]); - } - - /* if there's no dec_index, the codebook unpacking isn't collapsed */ - return(-1); -} - -/* returns 0 on OK or -1 on eof *************************************/ -long vorbis_book_decodevs_add(codebook *book,ogg_int32_t *a, - oggpack_buffer *b,int n,int point){ - if(book->used_entries>0){ - int step=n/book->dim; - long *entry = (long *)alloca(sizeof(*entry)*step); - ogg_int32_t **t = (ogg_int32_t **)alloca(sizeof(*t)*step); - int i,j,o; - int shift=point-book->binarypoint; - - if(shift>=0){ - for (i = 0; i < step; i++) { - entry[i]=decode_packed_entry_number(book,b); - if(entry[i]==-1)return(-1); - t[i] = book->valuelist+entry[i]*book->dim; - } - for(i=0,o=0;idim;i++,o+=step) - for (j=0;j>shift; - }else{ - for (i = 0; i < step; i++) { - entry[i]=decode_packed_entry_number(book,b); - if(entry[i]==-1)return(-1); - t[i] = book->valuelist+entry[i]*book->dim; - } - for(i=0,o=0;idim;i++,o+=step) - for (j=0;jused_entries>0){ - int i,j,entry; - ogg_int32_t *t; - int shift=point-book->binarypoint; - - if(shift>=0){ - for(i=0;ivaluelist+entry*book->dim; - for (j=0;jdim;) - a[i++]+=t[j++]>>shift; - } - }else{ - for(i=0;ivaluelist+entry*book->dim; - for (j=0;jdim;) - a[i++]+=t[j++]<<-shift; - } - } - } - return(0); -} - -long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a, - oggpack_buffer *b,int n,int point){ - if(book->used_entries>0){ - int i,j,entry; - ogg_int32_t *t; - int shift=point-book->binarypoint; - - if(shift>=0){ - - for(i=0;ivaluelist+entry*book->dim; - for (j=0;jdim;){ - a[i++]=t[j++]>>shift; - } - } - }else{ - - for(i=0;ivaluelist+entry*book->dim; - for (j=0;jdim;){ - a[i++]=t[j++]<<-shift; - } - } - } - }else{ - - int i,j; - for(i=0;idim;){ - a[i++]=0; - } - } - } - return(0); -} - -long vorbis_book_decodevv_add(codebook *book,ogg_int32_t **a,\ - long offset,int ch, - oggpack_buffer *b,int n,int point){ - if(book->used_entries>0){ - long i,j,entry; - int chptr=0; - int shift=point-book->binarypoint; - - if(shift>=0){ - - for(i=offset;ivaluelist+entry*book->dim; - for (j=0;jdim;j++){ - a[chptr++][i]+=t[j]>>shift; - if(chptr==ch){ - chptr=0; - i++; - } - } - } - } - }else{ - - for(i=offset;ivaluelist+entry*book->dim; - for (j=0;jdim;j++){ - a[chptr++][i]+=t[j]<<-shift; - if(chptr==ch){ - chptr=0; - i++; - } - } - } - } - } - } - return(0); -} diff --git a/wolf3d/newCode/Tremor/codebook.h b/wolf3d/newCode/Tremor/codebook.h deleted file mode 100644 index 14f6538..0000000 --- a/wolf3d/newCode/Tremor/codebook.h +++ /dev/null @@ -1,102 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: basic shared codebook operations - - ********************************************************************/ - -#ifndef _V_CODEBOOK_H_ -#define _V_CODEBOOK_H_ - -#include "ogg.h" - -/* This structure encapsulates huffman and VQ style encoding books; it - doesn't do anything specific to either. - - valuelist/quantlist are nonNULL (and q_* significant) only if - there's entry->value mapping to be done. - - If encode-side mapping must be done (and thus the entry needs to be - hunted), the auxiliary encode pointer will point to a decision - tree. This is true of both VQ and huffman, but is mostly useful - with VQ. - -*/ - -typedef struct static_codebook{ - long dim; /* codebook dimensions (elements per vector) */ - long entries; /* codebook entries */ - long *lengthlist; /* codeword lengths in bits */ - - /* mapping ***************************************************************/ - int maptype; /* 0=none - 1=implicitly populated values from map column - 2=listed arbitrary values */ - - /* The below does a linear, single monotonic sequence mapping. */ - long q_min; /* packed 32 bit float; quant value 0 maps to minval */ - long q_delta; /* packed 32 bit float; val 1 - val 0 == delta */ - int q_quant; /* bits: 0 < quant <= 16 */ - int q_sequencep; /* bitflag */ - - long *quantlist; /* map == 1: (int)(entries^(1/dim)) element column map - map == 2: list of dim*entries quantized entry vals - */ -} static_codebook; - -typedef struct codebook{ - long dim; /* codebook dimensions (elements per vector) */ - long entries; /* codebook entries */ - long used_entries; /* populated codebook entries */ - - /* the below are ordered by bitreversed codeword and only used - entries are populated */ - int binarypoint; - ogg_int32_t *valuelist; /* list of dim*entries actual entry values */ - ogg_uint32_t *codelist; /* list of bitstream codewords for each entry */ - - int *dec_index; - char *dec_codelengths; - ogg_uint32_t *dec_firsttable; - int dec_firsttablen; - int dec_maxlength; - - long q_min; /* packed 32 bit float; quant value 0 maps to minval */ - long q_delta; /* packed 32 bit float; val 1 - val 0 == delta */ - -} codebook; - -extern void vorbis_staticbook_clear(static_codebook *b); -extern void vorbis_staticbook_destroy(static_codebook *b); -extern int vorbis_book_init_decode(codebook *dest,const static_codebook *source); - -extern void vorbis_book_clear(codebook *b); -extern long _book_maptype1_quantvals(const static_codebook *b); - -extern int vorbis_staticbook_unpack(oggpack_buffer *b,static_codebook *c); - -extern long vorbis_book_decode(codebook *book, oggpack_buffer *b); -extern long vorbis_book_decodevs_add(codebook *book, ogg_int32_t *a, - oggpack_buffer *b,int n,int point); -extern long vorbis_book_decodev_set(codebook *book, ogg_int32_t *a, - oggpack_buffer *b,int n,int point); -extern long vorbis_book_decodev_add(codebook *book, ogg_int32_t *a, - oggpack_buffer *b,int n,int point); -extern long vorbis_book_decodevv_add(codebook *book, ogg_int32_t **a, - long off,int ch, - oggpack_buffer *b,int n,int point); - -extern int _ilog(unsigned int v); - - -#endif diff --git a/wolf3d/newCode/Tremor/codec_internal.h b/wolf3d/newCode/Tremor/codec_internal.h deleted file mode 100644 index 3ca7f54..0000000 --- a/wolf3d/newCode/Tremor/codec_internal.h +++ /dev/null @@ -1,92 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: libvorbis codec headers - - ********************************************************************/ - -#ifndef _V_CODECI_H_ -#define _V_CODECI_H_ - -#include "codebook.h" - -typedef void vorbis_look_mapping; -typedef void vorbis_look_floor; -typedef void vorbis_look_residue; -typedef void vorbis_look_transform; - -/* mode ************************************************************/ -typedef struct { - int blockflag; - int windowtype; - int transformtype; - int mapping; -} vorbis_info_mode; - -typedef void vorbis_info_floor; -typedef void vorbis_info_residue; -typedef void vorbis_info_mapping; - -typedef struct private_state { - /* local lookup storage */ - const void *window[2]; - - /* backend lookups are tied to the mode, not the backend or naked mapping */ - int modebits; - vorbis_look_mapping **mode; - - ogg_int64_t sample_count; - -} private_state; - -/* codec_setup_info contains all the setup information specific to the - specific compression/decompression mode in progress (eg, - psychoacoustic settings, channel setup, options, codebook - etc). -*********************************************************************/ - -typedef struct codec_setup_info { - - /* Vorbis supports only short and long blocks, but allows the - encoder to choose the sizes */ - - long blocksizes[2]; - - /* modes are the primary means of supporting on-the-fly different - blocksizes, different channel mappings (LR or M/A), - different residue backends, etc. Each mode consists of a - blocksize flag and a mapping (along with the mapping setup */ - - int modes; - int maps; - int times; - int floors; - int residues; - int books; - - vorbis_info_mode *mode_param[64]; - int map_type[64]; - vorbis_info_mapping *map_param[64]; - int time_type[64]; - int floor_type[64]; - vorbis_info_floor *floor_param[64]; - int residue_type[64]; - vorbis_info_residue *residue_param[64]; - static_codebook *book_param[256]; - codebook *fullbooks; - - int passlimit[32]; /* iteration limit per couple/quant pass */ - int coupling_passes; -} codec_setup_info; - -#endif diff --git a/wolf3d/newCode/Tremor/config_types.h b/wolf3d/newCode/Tremor/config_types.h deleted file mode 100644 index 1fdcb27..0000000 --- a/wolf3d/newCode/Tremor/config_types.h +++ /dev/null @@ -1,25 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: #ifdef jail to whip a few platforms into the UNIX ideal. - - ********************************************************************/ -#ifndef _OS_CVTYPES_H -#define _OS_CVTYPES_H - -typedef long long ogg_int64_t; -typedef int ogg_int32_t; -typedef unsigned int ogg_uint32_t; -typedef short ogg_int16_t; - -#endif diff --git a/wolf3d/newCode/Tremor/configure.in b/wolf3d/newCode/Tremor/configure.in deleted file mode 100644 index 2b44ee4..0000000 --- a/wolf3d/newCode/Tremor/configure.in +++ /dev/null @@ -1,131 +0,0 @@ -dnl Process this file with autoconf to produce a configure script - -dnl ------------------------------------------------ -dnl Initialization and Versioning -dnl ------------------------------------------------ - -AC_INIT(mdct.c) - -AC_CANONICAL_HOST -AC_CANONICAL_TARGET - -AM_CONFIG_HEADER([config.h]) - -AM_INIT_AUTOMAKE(libvorbisidec,1.2.0) - -dnl Library versioning - -V_LIB_CURRENT=1 -V_LIB_REVISION=2 -V_LIB_AGE=0 -AC_SUBST(V_LIB_CURRENT) -AC_SUBST(V_LIB_REVISION) -AC_SUBST(V_LIB_AGE) - -dnl -------------------------------------------------- -dnl Check for programs -dnl -------------------------------------------------- - -dnl save $CFLAGS since AC_PROG_CC likes to insert "-g -O2" -dnl if $CFLAGS is blank -cflags_save="$CFLAGS" -AC_PROG_CC -AC_PROG_CPP -CFLAGS="$cflags_save" - -AM_PROG_LIBTOOL - -dnl -------------------------------------------------- -dnl Set build flags based on environment -dnl -------------------------------------------------- - -dnl Set some target options - -cflags_save="$CFLAGS" -ldflags_save="$LDFLAGS" -if test -z "$GCC"; then - case $host in - arm-*-*) - DEBUG="-g -D_ARM_ASSEM_" - CFLAGS="-O -D_ARM_ASSEM_" - PROFILE="-p -g -O -D_ARM_ASSEM_" ;; - *) - DEBUG="-g" - CFLAGS="-O" - PROFILE="-g -p" ;; - esac -else - - case $host in - arm-*-*) - DEBUG="-g -Wall -D__NO_MATH_INLINES -fsigned-char -D_ARM_ASSEM_" - CFLAGS="-O2 -D_ARM_ASSEM_ -fsigned-char" - PROFILE="-W -pg -g -O2 -D_ARM_ASSEM_ -fsigned-char -fno-inline-functions";; - - *) - DEBUG="-g -Wall -D__NO_MATH_INLINES -fsigned-char" - CFLAGS="-O2 -Wall -fsigned-char" - PROFILE="-Wall -pg -g -O2 -fsigned-char -fno-inline-functions";; - esac -fi -CFLAGS="$CFLAGS $cflags_save -D_REENTRANT" -LDFLAGS="$LDFLAGS $ldflags_save" - - -# Test whenever ld supports -version-script -AC_PROG_LD -AC_PROG_LD_GNU -if test "x$lt_cv_prog_gnu_ld" = "xyes"; then - SHLIB_VERSION_ARG="Wl,--version-script=Version_script" - - dnl Set extra linker options - case "$target_os" in - linux* | solaris* ) - SHLIB_VERSION_ARG="-Wl,--version-script=Version_script" - ;; - *) - ;; - esac - LDFLAGS="$LDFLAGS $SHLIB_VERSION_ARG" -fi - -dnl -------------------------------------------------- -dnl Options -dnl -------------------------------------------------- - -AC_ARG_ENABLE( - low-accuracy, - [ --enable-low-accuracy enable 32 bit only multiply operations], - CFLAGS="$CFLAGS -D_LOW_ACCURACY_" -) - -dnl -------------------------------------------------- -dnl Check for headers -dnl -------------------------------------------------- - -AC_CHECK_HEADER(memory.h,CFLAGS="$CFLAGS -DUSE_MEMORY_H",:) - -dnl -------------------------------------------------- -dnl Check for typedefs, structures, etc -dnl -------------------------------------------------- - -dnl none - -dnl -------------------------------------------------- -dnl Check for library functions -dnl -------------------------------------------------- - -AC_FUNC_ALLOCA -AC_FUNC_MEMCMP - -dnl -------------------------------------------------- -dnl Do substitutions -dnl -------------------------------------------------- - -LIBS="$LIBS" - -AC_SUBST(LIBS) -AC_SUBST(DEBUG) -AC_SUBST(PROFILE) - -AC_OUTPUT(Makefile Version_script) diff --git a/wolf3d/newCode/Tremor/debian/Makefile.am b/wolf3d/newCode/Tremor/debian/Makefile.am deleted file mode 100644 index 45a0f01..0000000 --- a/wolf3d/newCode/Tremor/debian/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -## Process this file with automake to produce Makefile.in - -AUTOMAKE_OPTIONS = foreign - -EXTRA_DIST = changelog control copyright libvorbisidec1.install\ - libvorbisidec-dev.install rules diff --git a/wolf3d/newCode/Tremor/debian/changelog b/wolf3d/newCode/Tremor/debian/changelog deleted file mode 100644 index 0cb4935..0000000 --- a/wolf3d/newCode/Tremor/debian/changelog +++ /dev/null @@ -1,9 +0,0 @@ -libvorbisidec (1.2.0-1) unstable; urgency=low - - * Initial Release. - - -- Christopher L Cheney Wed, 09 Oct 2002 22:00:00 -0500 - -Local variables: -mode: debian-changelog -End: diff --git a/wolf3d/newCode/Tremor/debian/control b/wolf3d/newCode/Tremor/debian/control deleted file mode 100644 index f286e91..0000000 --- a/wolf3d/newCode/Tremor/debian/control +++ /dev/null @@ -1,22 +0,0 @@ -Source: libvorbisidec -Section: libs -Priority: optional -Maintainer: Christopher L Cheney -Build-Depends: autotools-dev, debhelper (>> 4.0.18), devscripts, gawk -Standards-Version: 3.5.7.0 - -Package: libvorbisidec1 -Architecture: any -Section: libs -Depends: ${shlibs:Depends} -Description: Ogg Bitstream Library - Libogg is a library for manipulating ogg bitstreams. It handles - both making ogg bitstreams and getting packets from ogg bitstreams. - -Package: libvorbisidec-dev -Architecture: any -Section: devel -Depends: libvorbisidec1 (= ${Source-Version}), libc6-dev -Description: Ogg Bitstream Library Development - The libogg-dev package contains the header files and documentation - needed to develop applications with libogg. diff --git a/wolf3d/newCode/Tremor/debian/copyright b/wolf3d/newCode/Tremor/debian/copyright deleted file mode 100644 index ef98ddd..0000000 --- a/wolf3d/newCode/Tremor/debian/copyright +++ /dev/null @@ -1,37 +0,0 @@ -This package was debianized by Christopher L Cheney on -Wed, 09 Oct 2002 22:00:00 -0500. - -It was downloaded from cvs. - -Upstream Author(s): Monty - -Copyright: -Copyright (c) 2002, Xiph.org Foundation - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -- Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -- Neither the name of the Xiph.Org Foundation nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/wolf3d/newCode/Tremor/debian/libvorbisidec-dev.install b/wolf3d/newCode/Tremor/debian/libvorbisidec-dev.install deleted file mode 100644 index 5c3ccf9..0000000 --- a/wolf3d/newCode/Tremor/debian/libvorbisidec-dev.install +++ /dev/null @@ -1,8 +0,0 @@ -debian/tmp/usr/include/tremor/config_types.h -debian/tmp/usr/include/tremor/ivorbiscodec.h -debian/tmp/usr/include/tremor/ivorbisfile.h -debian/tmp/usr/include/tremor/ogg.h -debian/tmp/usr/include/tremor/os_types.h -debian/tmp/usr/lib/libvorbisidec.a -debian/tmp/usr/lib/libvorbisidec.la -debian/tmp/usr/lib/libvorbisidec.so diff --git a/wolf3d/newCode/Tremor/debian/libvorbisidec1.install b/wolf3d/newCode/Tremor/debian/libvorbisidec1.install deleted file mode 100644 index b824d1e..0000000 --- a/wolf3d/newCode/Tremor/debian/libvorbisidec1.install +++ /dev/null @@ -1 +0,0 @@ -debian/tmp/usr/lib/libvorbisidec.so.* diff --git a/wolf3d/newCode/Tremor/debian/rules b/wolf3d/newCode/Tremor/debian/rules deleted file mode 100644 index c684884..0000000 --- a/wolf3d/newCode/Tremor/debian/rules +++ /dev/null @@ -1,151 +0,0 @@ -#!/usr/bin/make -f -# Sample debian/rules that uses debhelper. -# GNU copyright 1997 to 1999 by Joey Hess. - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -# This is the debhelper compatibility version to use. -export DH_COMPAT=4 - -# This has to be exported to make some magic below work. -export DH_OPTIONS - -# These are used for cross-compiling and for saving the configure script -# from having to guess our platform (since we know it already) -DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) -DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) - -objdir = $(CURDIR)/obj-$(DEB_BUILD_GNU_TYPE) - -ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS))) - CFLAGS += -g -endif -ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) - INSTALL_PROGRAM += -s -endif - -configure: configure-stamp -configure-stamp: - dh_testdir - - # make build directory - mkdir $(objdir) - - # run configure with build tree $(objdir) - # change ../configure to ../autogen.sh for CVS build - cd $(objdir) && \ - ../configure --build=$(DEB_BUILD_GNU_TYPE) --host=$(DEB_HOST_GNU_TYPE) \ - --prefix=/usr - - touch configure-stamp - -build: build-stamp -build-stamp: configure-stamp - dh_testdir - - cd $(objdir) && \ - $(MAKE) - - touch build-stamp - -autotools: - OLDDATESUB=`./config.sub -t | tr -d -` ;\ - OLDDATEGUESS=`./config.guess -t | tr -d -` ;\ - NEWDATESUB=`/usr/share/misc/config.sub -t | tr -d -` ;\ - NEWDATEGUESS=`/usr/share/misc/config.guess -t | tr -d -` ;\ - if [ $$OLDDATESUB -lt $$NEWDATESUB -o \ - $$OLDDATEGUESS -lt $$NEWDATEGUESS ]; then \ - dch -a -p "GNU config automated update: config.sub\ - ($$OLDDATESUB to $$NEWDATESUB), config.guess\ - ($$OLDDATEGUESS to $$NEWDATEGUESS)" ;\ - cp -f /usr/share/misc/config.sub config.sub ;\ - cp -f /usr/share/misc/config.guess config.guess ;\ - echo WARNING: GNU config scripts updated from master copies 1>&2 ;\ - fi - -debian-clean: - dh_testdir - dh_testroot - - dh_clean - -clean: autotools - dh_testdir - dh_testroot - rm -f build-stamp configure-stamp - - # Remove build tree - rm -rf $(objdir) - - # if Makefile exists run distclean - if test -f Makefile; then \ - $(MAKE) distclean; \ - fi - - #if test -d CVS; then \ - $(MAKE) cvs-clean ;\ - fi - - dh_clean - -install: DH_OPTIONS= -install: build - dh_testdir - dh_testroot - dh_clean -k - dh_installdirs - - cd $(objdir) && \ - $(MAKE) install DESTDIR=$(CURDIR)/debian/tmp - - dh_install --list-missing - -# This single target is used to build all the packages, all at once, or -# one at a time. So keep in mind: any options passed to commands here will -# affect _all_ packages. Anything you want to only affect one package -# should be put in another target, such as the install target. -binary-common: - dh_testdir - dh_testroot -# dh_installxfonts - dh_installchangelogs - dh_installdocs - dh_installexamples -# dh_installmenu -# dh_installdebconf -# dh_installlogrotate -# dh_installemacsen -# dh_installpam -# dh_installmime -# dh_installinit -# dh_installcron -# dh_installinfo -# dh_undocumented - dh_installman - dh_strip - dh_link - dh_compress - dh_fixperms - dh_makeshlibs -V - dh_installdeb -# dh_perl - dh_shlibdeps - dh_gencontrol - dh_md5sums - dh_builddeb - -# Build architecture independant packages using the common target. -binary-indep: build install -# $(MAKE) -f debian/rules DH_OPTIONS=-i binary-common - -# Build architecture dependant packages using the common target. -binary-arch: build install - $(MAKE) -f debian/rules DH_OPTIONS=-a binary-common - -# Any other binary targets build just one binary package at a time. -binary-%: build install - $(MAKE) -f debian/rules binary-common DH_OPTIONS=-p$* - -binary: binary-indep binary-arch -.PHONY: build clean binary-indep binary-arch binary install configure diff --git a/wolf3d/newCode/Tremor/doc/OggVorbis_File.html b/wolf3d/newCode/Tremor/doc/OggVorbis_File.html deleted file mode 100644 index 9201d18..0000000 --- a/wolf3d/newCode/Tremor/doc/OggVorbis_File.html +++ /dev/null @@ -1,132 +0,0 @@ - - - -Tremor - datatype - OggVorbis_File - - - - - - - - - -

    Tremor documentation

    Tremor version 1.0 - 20020403

    - -

    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%0DjB^i&R+ku5kype9`4>D2XCDyaq)@|NGQB2 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�k99SFez08SOOdXoP;$W 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 z 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