2 * Copyright (C) Volition, Inc. 1999. All rights reserved.
4 * All source code herein is the property of Volition, Inc. You may not sell
5 * or otherwise commercially exploit the source or things you created based on
10 * $Logfile: /Freespace2/code/Starfield/Nebula.cpp $
15 * Code to load & display nebulas
18 * Revision 1.9 2004/09/20 01:31:45 theoddone33
21 * Revision 1.8 2004/06/11 02:07:39 tigital
22 * byte-swapping changes for bigendian systems
24 * Revision 1.7 2003/05/25 02:30:44 taylor
27 * Revision 1.6 2002/06/17 06:33:11 relnev
28 * ryan's struct patch for gcc 2.95
30 * Revision 1.5 2002/06/09 04:41:27 relnev
31 * added copyright header
33 * Revision 1.4 2002/06/02 04:26:34 relnev
36 * Revision 1.3 2002/05/26 20:22:48 theoddone33
37 * Most of network/ works
39 * Revision 1.2 2002/05/04 04:36:56 theoddone33
40 * More changes, took out a lot of the sound stuff which will bite later but
43 * Revision 1.1.1.1 2002/05/03 03:28:10 root
47 * 14 9/01/99 11:26p Dave
48 * Fixed release build warnings.
50 * 13 8/30/99 5:01p Dave
51 * Made d3d do less state changing in the nebula. Use new chat server for
54 * 12 7/29/99 10:47p Dave
55 * Standardized D3D fogging using vertex fog. Shook out Savage 4 bugs.
57 * 11 7/14/99 9:42a Dave
58 * Put in clear_color debug function. Put in base for 3dnow stuff / P3
61 * 10 6/22/99 7:03p Dave
62 * New detail options screen.
64 * 9 3/31/99 8:24p Dave
65 * Beefed up all kinds of stuff, incluging beam weapons, nebula effects
66 * and background nebulae. Added per-ship non-dimming pixel colors.
68 * 8 12/09/98 7:34p Dave
69 * Cleanup up nebula effect. Tweaked many values.
71 * 7 12/08/98 9:36a Dave
72 * Almost done nebula effect for D3D. Looks 85% as good as Glide.
74 * 6 12/07/98 5:51p Dave
75 * Finally got d3d fog working! Now we just need to tweak values.
77 * 5 12/06/98 2:36p Dave
78 * Drastically improved nebula fogging.
80 * 4 11/14/98 5:33p Dave
81 * Lots of nebula work. Put in ship contrails.
83 * 3 11/11/98 5:37p Dave
84 * Checkin for multiplayer testing.
86 * 2 10/07/98 10:54a Dave
89 * 1 10/07/98 10:51a Dave
91 * 15 5/13/98 2:53p John
92 * Made subspace effect work under software. Had to add new inner loop to
93 * tmapper. Added glows to end of subspace effect. Made subspace effect
94 * levels use gamepalette-subspace palette.
96 * 14 4/10/98 5:20p John
97 * Changed RGB in lighting structure to be ubytes. Removed old
98 * not-necessary 24 bpp software stuff.
100 * 13 3/22/98 11:02a John
101 * Made a bunch of the detail levels actually do something
103 * 12 2/22/98 12:19p John
104 * Externalized some strings
106 * 11 1/23/98 5:08p John
107 * Took L out of vertex structure used B (blue) instead. Took all small
108 * fireballs out of fireball types and used particles instead. Fixed some
109 * debris explosion things. Restructured fireball code. Restructured
110 * some lighting code. Made dynamic lighting on by default. Made groups
111 * of lasers only cast one light. Made fireballs not cast light.
113 * 10 1/10/98 1:14p John
114 * Added explanation to debug console commands
116 * 9 12/21/97 4:33p John
117 * Made debug console functions a class that registers itself
118 * automatically, so you don't need to add the function to
119 * debugfunctions.cpp.
121 * 8 11/25/97 11:40a Hoffoss
122 * Added support for nebula placement editing.
124 * 7 11/24/97 12:04p John
126 * 6 11/21/97 2:55p Hoffoss
127 * Added Nebula support to Fred. Implemented loading and saving nebula
128 * info to/from mission files.
130 * 5 11/21/97 11:32a John
131 * Added nebulas. Fixed some warpout bugs.
133 * 4 11/19/97 10:47p Adam
134 * upped MAX_TRIS to 200. Whaddya think this is, I-War?
136 * 3 11/16/97 2:41p John
137 * added a debug function to load a nebula into the game.
139 * 2 11/16/97 2:29p John
140 * added versioning to nebulas; put nebula code into freespace.
142 * 1 11/16/97 1:14p John
148 #include "floating.h"
152 #include "starfield.h"
155 #include "freespace.h"
160 #include "linklist.h"
162 #include "missionparse.h"
166 #define MAX_POINTS 300
168 static int num_pts = 0;
170 static vector nebula_vecs[MAX_POINTS];
171 static vertex nebula_verts[MAX_POINTS];
173 static float scale_factor = 1.0f;
175 static int num_tris = 0;
176 static int tri[MAX_TRIS][3];
178 static int Nebula_loaded = 0;
179 static angles Nebula_pbh;
180 static matrix Nebula_orient;
188 if (!Nebula_loaded) return;
193 #define NEBULA_FILE_ID NOX("NEBU")
194 #define NEBULA_MAJOR_VERSION 1 // Can be 1-?
195 #define NEBULA_MINOR_VERSION 0 // Can be 0-99
200 void project_2d_onto_sphere( vector *pnt, float u, float v )
204 a = PI * (2.0f * u - 1.0f );
206 s = scale_factor * fl_sqrt( 1.0f - z*z );
207 x = s * (float)cos(a);
208 y = s * (float)sin(a);
214 // Version 199 mean major version=1, minor=99.
215 // Changing major means no longer compatible.
217 // 1.00 - initial version
219 // returns 0 if failed
220 int load_nebula(const char *filename)
224 int version, major;//, minor;
226 fp = cfopen(filename, "rb");
233 cfread( id, 4, 1, fp );
234 if ( strncmp( id, NEBULA_FILE_ID, 4)) {
235 mprintf(( "Not a valid nebula file.\n" ));
238 cfread( &version, sizeof(int), 1, fp );
239 version = INTEL_INT(version);
240 major = version / 100;
241 //minor = version % 100;
243 if ( major != NEBULA_MAJOR_VERSION ) {
244 mprintf(( "An out of date nebula file.\n" ));
248 cfread( &num_pts, sizeof(int), 1, fp );
249 num_pts = INTEL_INT(num_pts);
250 SDL_assert( num_pts < MAX_POINTS );
251 cfread( &num_tris, sizeof(int), 1, fp );
252 num_tris = INTEL_INT(num_tris);
253 SDL_assert( num_tris < MAX_TRIS );
255 for (int i=0; i<num_pts; i++ ) {
259 cfread( &xf, sizeof(float), 1, fp );
260 cfread( &yf, sizeof(float), 1, fp );
261 cfread( &l, sizeof(int), 1, fp );
262 xf = INTEL_FLOAT(xf);
263 yf = INTEL_FLOAT(yf);
265 project_2d_onto_sphere( &nebula_vecs[i], 1.0f - xf, yf );
266 vm_vec_scale( &nebula_vecs[i], 10.0f );
267 nebula_verts[i].b = ubyte((l*255)/31);
269 // throw in some randomness to the nebula vertices depth
272 for (int i=0; i<num_tris; i++ ) {
273 cfread( &tri[i][0], sizeof(int), 1, fp );
274 cfread( &tri[i][1], sizeof(int), 1, fp );
275 cfread( &tri[i][2], sizeof(int), 1, fp );
276 tri[i][0] = INTEL_INT(tri[i][0]);
277 tri[i][1] = INTEL_INT(tri[i][1]);
278 tri[i][2] = INTEL_INT(tri[i][2]);
286 void nebula_init( const char *filename, int pitch, int bank, int heading )
290 a.p = ANG_TO_RAD((float) pitch);
291 a.b = ANG_TO_RAD((float) bank);
292 a.h = ANG_TO_RAD((float) heading);
293 nebula_init(filename, &a);
296 void nebula_init( const char *filename, angles * pbh )
298 if ( Nebula_loaded ) {
302 if ( load_nebula( cf_add_ext(filename, NOX(".neb")) ) ) {
308 vm_angles_2_matrix(&Nebula_orient, &Nebula_pbh );
314 Nebula_orient = vmd_identity_matrix;
324 if ( !Nebula_loaded ) {
328 // in FS1 this is nebula on/off
329 if ( !Detail.planets_suns ) {
333 // Rotate the nebula.
334 g3_start_instance_matrix( NULL, &Nebula_orient );
336 for (i=0; i<num_pts; i++ ) {
337 g3_rotate_faraway_vertex( &nebula_verts[i], &nebula_vecs[i] );
338 g3_project_vertex( &nebula_verts[i] );
341 int saved_gr_zbuffering = gr_zbuffer_get();
343 gr_zbuffer_set(GR_ZBUFF_NONE);
345 for (i=0; i<num_tris; i++ ) {
349 verts[0] = &nebula_verts[tri[i][0]];
350 verts[1] = &nebula_verts[tri[i][1]];
351 verts[2] = &nebula_verts[tri[i][2]];
353 g3_draw_poly(3, verts, TMAP_FLAG_RAMP | TMAP_FLAG_GOURAUD | TMAP_FLAG_NEBULA );
358 gr_zbuffer_set(saved_gr_zbuffering);
360 // always switch off fogging for good measure
361 if((The_mission.flags & MISSION_FLAG_FULLNEB) && (Neb2_render_mode == NEB2_RENDER_NONE)){
362 gr_fog_set(GR_FOGMODE_NONE, 0, 0, 0, -1.0f, -1.0f);
367 DCF(nebula,"Loads a different nebula")
370 dc_get_arg(ARG_STRING|ARG_NONE);
371 if ( Dc_arg_type == ARG_NONE ) {
374 nebula_init( Dc_arg );
378 dc_printf( "Usage: nebula filename\nLoads the nebula file. No filename takes away nebula\n" );