aboutsummaryrefslogtreecommitdiff
path: root/src/parsec/vid_plug.cpp
blob: dfc2de7db1ebcced4e3575aec8c452c05832c56a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
/*
 * PARSEC - Subsystem Switching
 *
 * $Author: uberlinuxguy $ - $Date: 2004/09/26 03:43:42 $
 *
 * Orginally written by:
 *   Copyright (c) Markus Hadwiger     <msh@parsec.org>   1998-2000
 *
 *  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
 */ 

// C library
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// compilation flags/debug support
#include "config.h"
#include "debug.h"

// general definitions
#include "general.h"
#include "objstruc.h"

// global externals
#include "globals.h"

// subsystem headers
#include "inp_defs.h"
#include "vid_defs.h"

// subsystem linkage info
#include "linkinfo.h"

// mathematics header
#include "utl_math.h"

// local module header
#include "vid_plug.h"

// proprietary module headers
#include "con_ext.h"
#include "con_main.h"
#include "e_color.h"
#include "e_demo.h"
#include "e_loader.h"
#include "h_drwhud.h"
#include "h_supp.h"
#include "part_sys.h"
#include "sys_bind.h"
#include "vid_init.h"



// on-the-fly video subsystem switching ---------------------------------------
//
int VID_PlugInSubsys( const char *subsysname )
{
	ASSERT( subsysname != NULL );

	// ensure no replay in progress while switching
	if ( DEMO_ReplayActive() ) {
		DEMO_StopReplay();
	}

	// plug in new subsystems and perform switch
	if ( TextModeActive ) {

		// bind new subsystems
		SYS_BindDynamicFunctions();

		// init new video subsystem
		VID_InitSubsystem();

	} else {

		// switch back to text mode
		VIDs_RestoreDisplay();

		// init new video subsystem
		VID_InitSubsystem();

		// switch to new video mode
		VID_InitMode();

		// set up data depending on video mode
		VID_SetupDependentData();

		// init hud geometry
		InitHudDisplay();

		// init sizes of particles
		InitParticleSizes();

		// check console extents
		CheckConExtents();
	}

	// make sure mouse tracking works correctly
	INPs_MouseKillHandler();
	INPs_MouseInitHandler();

	return TRUE;
}


// change video mode on-the-fly in game mode ----------------------------------
//
int VID_HotChangeMode( int xres, int yres, bool fullscreen, int bpp )
{
	printf("HotChangeMode requested for xres: %d, yres: %d\n", xres, yres);
	
	int resindex = GetResolutionIndex(xres, yres);
	if (resindex < 0)
		return FALSE;
	
	// take init options override (from command line) into account
	if ( TextModeActive ) {
		
		// override only if forced by user
		if ( InitOp_FlipSynched != -1 ) {
			FlipSynched = InitOp_FlipSynched;
		}

		// exit if full init options override
		if (InitOp_Resolution.isValid() && InitOp_WindowedMode != -1)
			return TRUE;

		// override resolution, take fullscreen/windowed
		if (InitOp_Resolution.isValid()) {
			xres = Op_Resolution.width;
			yres = Op_Resolution.height;
			bpp  = VID_MapOptToBpp( Op_ColorDepth );
		}

		// override fullscreen/windowed, take resolution
		if ( InitOp_WindowedMode != -1 ) {
			fullscreen = !Op_WindowedMode;
		}
	}

	// set options corresponding to mode
	Op_Resolution.set(xres, yres);
	Op_ColorDepth	= VID_MapBppToOpt( bpp );
	Op_WindowedMode	= !fullscreen;

	// make sure this also works before VID_InitMode() has been
	// called for the first video mode init. in that case the
	// specified mode will be initialized later on.
	if ( TextModeActive )
		return TRUE;

	// switch to new video mode
	printf("Called from VID_HotChangeMode()\n");
	VID_ApplyOptions();

	return TRUE;
}