36 #define LAB_FLAG_NORMAL (0) // default
37 #define LAB_FLAG_NO_ROTATION (1<<0) // don't rotate models
38 #define LAB_FLAG_SHOW_INSIGNIA (1<<1) // show ships with insignia applied
39 #define LAB_FLAG_SHOW_DEBRIS (1<<2) // render debris instead of normal LOD
40 #define LAB_FLAG_SUBMODEL_ROTATE (1<<3) // do rotation for any rotating ship subobjects
41 #define LAB_FLAG_LIGHTNING_ARCS (1<<4) // show damage lightning
42 #define LAB_FLAG_UNUSED (1<<5) // feel free to change that to something you need - Valathil
43 #define LAB_FLAG_SHOW_WEAPONS (1<<6) // determines if external weapons models are displayed
44 #define LAB_FLAG_INITIAL_ROTATION (1<<7) // initial rotation setting
45 #define LAB_FLAG_DESTROYED_SUBSYSTEMS (1<<8) // render model as if all subsystems are destroyed
48 #define LAB_MODE_NONE 0 // not showing anything
49 #define LAB_MODE_SHIP 1 // dealing with ships
50 #define LAB_MODE_WEAPON 2 // dealing with weapons
55 static Window *Lab_toolbar = NULL;
56 static Window *Lab_class_window = NULL;
57 static Window *Lab_class_toolbar = NULL;
58 static Window *Lab_flags_window = NULL;
59 static Window *Lab_render_options_window = NULL;
60 static Window *Lab_variables_window = NULL;
61 static Window *Lab_description_window = NULL;
62 static Text *Lab_description_text = NULL;
63 static TreeItem **Lab_species_nodes = NULL;
65 static bool Lab_in_mission =
false;
66 static int Lab_screen_save_bitmap = -1;
69 static int Lab_insignia_bitmap = -1;
70 static int Lab_insignia_index = -1;
73 static int Lab_selected_index = -1;
74 static int Lab_last_selected_ship = -1;
75 static int Lab_selected_object = -1;
76 static int Lab_last_selected_weapon = -1;
78 static int Lab_model_num = -1;
80 static int Lab_model_LOD = 0;
82 static int Lab_model_debug_flags = 0;
86 static int Lab_bitmap_id = -1;
89 static float Lab_viewer_zoom = 1.2f;
92 static float Lab_viewer_rotation = 0.0f;
98 static int Lab_detail_texture_save = 0;
100 static int anim_timer_start = 0;
106 static int Lab_arc_next_time = -1;
107 static bool Lab_arc_disrupted =
false;
109 static float Lab_thrust_len = 1.0f;
110 static bool Lab_thrust_afterburn =
false;
116 static int Trackball_mode = 1;
117 static int Trackball_active = 0;
132 if (Lab_ship_subsys != NULL) {
133 delete[] Lab_ship_subsys;
134 Lab_ship_subsys = NULL;
137 Lab_ship_model_subsys.clear();
144 if (Lab_selected_index < 0) {
148 if (Lab_selected_index >= static_cast<int>(
Ship_info.size())) {
153 if (
Ship_info[Lab_selected_index].n_subsystems <= 0) {
158 uint n_subsystems =
Ship_info[Lab_selected_index].n_subsystems;
161 for (
uint i = 0;
i < n_subsystems;
i++)
162 Lab_ship_subsys[
i].clear();
164 Lab_ship_model_subsys.reserve(n_subsystems);
166 Lab_ship_model_subsys.push_back(
Ship_info[Lab_selected_index].subsystems[
idx] );
172 if ( (ship_index < 0) && (weapon_index < 0) ) {
173 if (Lab_bitmap_id >= 0) {
175 if (Lab_last_selected_weapon >= 0) {
179 Lab_last_selected_weapon = -1;
185 if ( !Lab_in_mission ) {
186 if (ship_index >= 0) {
188 }
else if (weapon_index >= 0) {
190 if ( (Lab_last_selected_weapon >= 0) && (Lab_last_selected_weapon != weapon_index)) {
192 if (Lab_bitmap_id >= 0) {
203 if (Lab_bitmap_id >= 0) {
206 memset( Lab_bitmap_filename, 0,
sizeof(Lab_bitmap_filename) );
214 bool change_model =
true;
220 if ( (model_fname != NULL) && (Lab_mode ==
LAB_MODE_SHIP) ) {
221 if ( (Lab_selected_index >= 0) && (Lab_selected_index == sel_index) ) {
222 change_model =
false;
226 Lab_selected_index = sel_index;
229 bool valid_ship = ( (Lab_mode ==
LAB_MODE_SHIP) && (sel_index >= 0) );
231 if (Lab_model_num != -1) {
237 if (Lab_weaponmodel_num[j] >= 0) {
240 Lab_weaponmodel_num[j] = -1;
244 if (Lab_last_selected_ship >= 0) {
251 Lab_viewer_zoom = 1.2f;
254 memcpy( &Lab_viewer_pos, &
Ship_info[sel_index].closeup_pos,
sizeof(
vec3d) );
256 Lab_viewer_pos.
xyz.x = Lab_viewer_pos.
xyz.y = 0.0f;
260 if (model_fname != NULL) {
263 if ( !Lab_ship_model_subsys.empty() ) {
264 subsystems = &Lab_ship_model_subsys[0];
267 Lab_model_num =
model_load(model_fname, (valid_ship) ?
Ship_info[sel_index].n_subsystems : 0, subsystems, 0);
269 if (Lab_model_num >= 0) {
270 strcpy_s(Lab_model_filename, model_fname);
272 memset( Lab_model_filename, 0,
sizeof(Lab_model_filename) );
276 if (Lab_model_num >= 0) {
293 Lab_weaponmodel_num[l] = -1;
297 if (Lab_weaponmodel_num[l] >= 0) {
300 memset( Lab_weaponmodel_filename[l], 0,
sizeof(Lab_weaponmodel_filename[l]) );
309 Lab_weaponmodel_num[l] = -1;
313 if (Lab_weaponmodel_num[l] >= 0) {
316 memset( Lab_weaponmodel_filename[l], 0,
sizeof(Lab_weaponmodel_filename[l]) );
323 memset( Lab_model_filename, 0,
sizeof(Lab_model_filename) );
324 if (Lab_weaponmodel_num[0] >= 0) {
326 memset( Lab_weaponmodel_filename[j], 0,
sizeof(Lab_weaponmodel_filename[j]) );
340 if (model_fname == NULL) {
341 Lab_last_selected_ship = -1;
350 float mradius = 0.0f;
370 if (Lab_arc_disrupted) {
387 int n, n_arcs = ((rand() >> 5) % 3) + 1;
400 if (mradius > 200.0
f) {
409 if ( d > max_dist ) {
416 if ( d > max_dist ) {
424 if ( d > max_dist ) {
431 float factor = 1.0f + 0.0025f * mradius;
432 int a =
fl2i(factor * 100.0
f);
433 int b =
fl2i(factor * 1000.0f);
434 int lifetime = (
myrand() % ((
b) - (a) + 1)) + (
a);
443 Lab_arc_pts[
i][0] =
v1;
444 Lab_arc_pts[
i][1] =
v2;
448 Lab_arc_pts[
i][0] =
v2;
449 Lab_arc_pts[
i][1] =
v3;
453 Lab_arc_pts[
i][0] =
v2;
454 Lab_arc_pts[
i][1] = v4;
462 if (Lab_arc_disrupted) {
468 if ( ++n == n_arcs ) {
483 if ( mr < (RAND_MAX / 5) ) {
494 static_one = Lab_arc_pts[
i][0];
496 static_one = Lab_arc_pts[
i][1];
500 if (mradius > 200.0
f) {
515 Lab_arc_pts[
i][mr % 2] =
v1;
523 model_add_arc(Lab_model_num, -1, &Lab_arc_pts[i][0], &Lab_arc_pts[i][1], Lab_arc_type[i]);
541 static float thruster_frame = 0.0f;
542 static float thruster_glow_frame = 0.0f;
543 static int thruster_bitmap = -1;
544 static int thruster_glow_bitmap = -1;
545 static float thruster_glow_noise = 1.0f;
549 int secondary_glow_bitmap = -1;
550 int tertiary_glow_bitmap = -1;
551 static int thruster_distortion_bitmap = -1;
602 rate = 0.67f * (1.0f + Lab_thrust_len);
611 if (thruster_frame < 0.0
f) {
612 thruster_frame = 0.0f;
613 }
else if (thruster_frame > 100.0
f) {
614 thruster_frame = 0.0f;
617 while (thruster_frame > flame_anim->
total_time) {
626 thruster_bitmap = flame_anim->
first_frame + framenum;
628 thruster_frame = 0.0f;
629 thruster_bitmap = -1;
634 if (glow_anim->first_frame >= 0) {
638 if (thruster_glow_frame < 0.0
f) {
639 thruster_glow_frame = 0.0f;
640 }
else if (thruster_glow_frame > 100.0
f) {
641 thruster_glow_frame = 0.0f;
644 while (thruster_glow_frame > glow_anim->total_time) {
645 thruster_glow_frame -= glow_anim->total_time;
648 framenum =
fl2i( (thruster_glow_frame * glow_anim->num_frames) / glow_anim->total_time );
650 CLAMP(framenum, 0, glow_anim->num_frames-1);
653 thruster_glow_bitmap = glow_anim->first_frame;
654 thruster_glow_noise =
Noise[framenum];
656 thruster_glow_frame = 0.0f;
657 thruster_glow_bitmap = -1;
658 thruster_glow_noise = 1.0f;
690 mst.
use_ab = Lab_thrust_afterburn;
718 angles rot_angles, view_angles;
721 if ( (Lab_mode ==
LAB_MODE_SHIP) && (Lab_selected_index >= 0) ) {
745 if (Trackball_active) {
753 if (Trackball_mode == 1) {
756 Lab_viewer_orient = mat2;
759 else if (Trackball_mode == 2) {
763 Lab_viewer_pos.
xyz.x -= (
float)scale_x;
764 Lab_viewer_pos.
xyz.y += (
float)scale_y;
767 else if ( dy && (Trackball_mode == 3) ) {
768 float scale_y = dy * 0.01f;
770 Lab_viewer_zoom += scale_y;
776 Lab_viewer_rotation +=
PI2 * frametime / rev_rate;
778 while (Lab_viewer_rotation >
PI2)
779 Lab_viewer_rotation -=
PI2;
782 view_angles.
p = -0.6f;
783 view_angles.
b = 0.0f;
784 view_angles.
h = 0.0f;
789 rot_angles.
h = Lab_viewer_rotation;
808 float largest_radius = 0.0f;
812 for (i = 0; i < pm->
n_models; i++) {
820 Lab_viewer_pos.
xyz.z = -(largest_radius * 2.0f);
822 CLAMP(Lab_viewer_zoom, 0.08
f, 1.8
f);
832 light_dir.
xyz.y = 1.0f;
833 light_dir.
xyz.x = 0.0000001f;
837 light_dir.
xyz.y = 0.0000001f;
838 light_dir.
xyz.x = sinf(my/150.0
f);
839 light_dir.
xyz.z = cosf(my/150.0
f);
842 light_add_point(&light_dir,1,mx*10.2f+0.1f, 0.5f, 1.0f, 1.0f, 1.0f,-1);
850 int flagggs = Lab_model_flags;
896 for (j = 0; j < Lab_ship_model_subsys[
i].n_triggers; j++) {
902 if ( Lab_ship_model_subsys[i].subobj_num >= 0 ) {
903 model_set_instance(Lab_model_num, Lab_ship_model_subsys[i].subobj_num, &Lab_ship_subsys[i].submodel_info_1 );
905 if ( (Lab_ship_model_subsys[i].subobj_num != Lab_ship_model_subsys[i].turret_gun_sobj) && (Lab_ship_model_subsys[i].turret_gun_sobj >= 0) ) {
906 model_set_instance(Lab_model_num, Lab_ship_model_subsys[i].turret_gun_sobj, &Lab_ship_subsys[i].submodel_info_2 );
920 model_set_instance(Lab_model_num, Lab_ship_model_subsys[i].subobj_num, &Lab_ship_subsys[i].submodel_info_1 );
926 submodel_rotate(&Lab_ship_model_subsys[i], &Lab_ship_subsys[i].submodel_info_1 );
953 if (Lab_weaponmodel_num[l] >= 0) {
964 vec3d secondary_weapon_pos;
970 if (Lab_weaponmodel_num[l] >= 0) {
971 bank = &(
model_get(Lab_model_num))->missile_banks[j];
980 secondary_weapon_pos = bank->
pnt[k];
1019 int render_flags = flagggs;
1020 render_flags &= ~MR_SHOW_THRUSTERS;
1026 if (Lab_weaponmodel_num[l] >= 0) {
1036 vec3d secondary_weapon_pos;
1042 if (Lab_weaponmodel_num[l] >= 0) {
1043 bank = &(
model_get(Lab_model_num))->missile_banks[j];
1052 secondary_weapon_pos = bank->
pnt[k];
1089 static float current_frame = 0.0f;
1090 static float current_glow_frame = 0.0f;
1094 if ( (Lab_selected_index < 0) || (Lab_mode !=
LAB_MODE_WEAPON) || (Lab_bitmap_id < 0) ) {
1107 angles rot_angles, view_angles;
1109 if (Trackball_active) {
1117 if (Trackball_mode == 1) {
1120 Lab_viewer_orient = mat2;
1123 else if (Trackball_mode == 2) {
1124 double scale_x = dx * (double)wip->
laser_length * 0.005;
1125 double scale_y = dy * (
double)wip->
laser_length * 0.005;
1127 Lab_viewer_pos.
xyz.x -= (
float)scale_x;
1128 Lab_viewer_pos.
xyz.y += (
float)scale_y;
1131 else if ( dy && (Trackball_mode == 3) ) {
1132 float scale_y = dy / 100.0f;
1134 Lab_viewer_zoom += scale_y;
1140 Lab_viewer_rotation +=
PI2 * frametime / rev_rate;
1142 while (Lab_viewer_rotation >
PI2) {
1143 Lab_viewer_rotation -=
PI2;
1147 view_angles.
p = -0.6f;
1148 view_angles.
b = 0.0f;
1149 view_angles.
h = 0.0f;
1152 rot_angles.
p = 0.0f;
1153 rot_angles.
b = 0.0f;
1154 rot_angles.
h = Lab_viewer_rotation;
1162 CLAMP(Lab_viewer_zoom, 0.08
f, 1.8
f);
1176 current_frame += frametime;
1179 if (current_frame < 0.0f) {
1180 current_frame = 0.0f;
1181 }
else if (current_frame > 100.0f) {
1182 current_frame = 0.0f;
1204 vec3d headp2, tailp;
1231 current_glow_frame += frametime;
1234 if (current_glow_frame < 0.0f) {
1235 current_glow_frame = 0.0f;
1236 }
else if (current_glow_frame > 100.0f) {
1237 current_glow_frame = 0.0f;
1268 if ( (Lab_model_num < 0) && (Lab_bitmap_id < 0) ) {
1277 if (Lab_model_num >= 0) {
1286 if ( strlen(Lab_model_filename) ) {
1291 }
else if (Lab_bitmap_id >= 0) {
1299 if ( strlen(Lab_bitmap_filename) ) {
1315 if (frametotal != 0.0
f) {
1340 if(Lab_selected_object != -1) {
1349 if (Lab_class_toolbar) {
1353 Lab_class_window = NULL;
1364 if (Lab_class_window == NULL) {
1369 if (Lab_class_toolbar == NULL) {
1379 Lab_class_window->
SetCaption(
"Ship Classes");
1381 Lab_class_window->
SetCaption(
"Weapon Classes");
1401 if (Lab_flags_window != NULL) {
1412 Assert( (Lab_flags_window != NULL) && (flag_name != NULL) );
1425 new_flag.
flag = flag;
1426 new_flag.
second = flags2;
1428 Lab_flags.push_back( new_flag );
1447 if (Lab_flags_window == NULL) {
1518 if ( (Lab_selected_index < 0) || (Lab_mode ==
LAB_MODE_NONE) ) {
1523 if (Lab_flags.empty()) {
1531 for (i = 0; i < Lab_flags.size(); i++) {
1532 if (Lab_flags[i].second) {
1533 Lab_flags[
i].cb->SetFlag(&sip->
flags2, Lab_flags[i].flag);
1535 Lab_flags[
i].cb->SetFlag(&sip->
flags, Lab_flags[i].flag);
1541 for (i = 0; i < Lab_flags.size(); i++) {
1542 if (Lab_flags[i].second) {
1543 Lab_flags[
i].cb->SetFlag(&wip->
wi_flags2, Lab_flags[i].flag);
1545 Lab_flags[
i].cb->SetFlag(&wip->
wi_flags, Lab_flags[i].flag);
1553 Lab_flags_window = NULL;
1560 if (Lab_flags_window == NULL) {
1569 Lab_flags_window->
SetCaption(
"Weapon Flags");
1580 #define VAR_POS_LEFTWIDTH 150
1581 #define VAR_POS_RIGHTWIDTH 100
1582 #define VAR_POS_RIGHTX 160
1584 #define VAR_ADD_HEADER(name) { \
1585 ntp = (Text*)Lab_variables_window->AddChild(new Text((name), (name), VAR_POS_RIGHTX/2, y + 8, VAR_POS_RIGHTWIDTH)); \
1586 y += ntp->GetHeight() + 10; \
1593 Lab_variables_window = NULL;
1595 Lab_variables.clear();
1600 if (Lab_variables_window != NULL) {
1604 Lab_variables.clear();
1612 Assert( (Lab_variables_window != NULL) && (var_name != NULL) );
1627 Lab_variables.push_back( new_text );
1639 if (Lab_variables_window == NULL) {
1740 #define VAR_SET_VALUE(value) { \
1741 Assert( i < Lab_variables.size() ); \
1742 Lab_variables[i]->SetText((value)); \
1746 #define VAR_SET_VALUE_SAVE(value, max_size) { \
1747 Assert( i < Lab_variables.size() ); \
1748 Lab_variables[i]->SetText((value)); \
1749 if ((max_size) < 1) { \
1750 Assert( (max_size) == 0 ); \
1751 Lab_variables[i]->SetSaveLoc(&(value), T_ST_ONENTER); \
1753 Lab_variables[i]->SetSaveLoc(&(value), T_ST_ONENTER, (max_size), 0); \
1767 if (Lab_variables_window == NULL) {
1771 if (Lab_selected_index < 0) {
1862 if (Lab_variables_window != NULL) {
1870 Lab_variables_window->
SetCaption(
"Ship Variables");
1872 Lab_variables_window->
SetCaption(
"Weapon Variables");
1895 Lab_render_options_window = NULL;
1898 #define ADD_RENDER_FLAG(text, flag, var) { \
1899 cbp = (Checkbox*)Lab_render_options_window->AddChild(new Checkbox((text), 2, y)); \
1900 cbp->SetFlag(&(flag), (var)); \
1901 y += cbp->GetHeight() + 2; \
1904 #define ADD_RENDER_BOOL(text, flag) { \
1905 cbp = (Checkbox*)Lab_render_options_window->AddChild(new Checkbox((text), 2, y)); \
1906 cbp->SetBool(&(flag)); \
1907 y += cbp->GetHeight() + 1; \
1917 if (Lab_render_options_window != NULL) {
1922 Assert( Lab_render_options_window != NULL );
1976 cmp = (
Tree*)Lab_render_options_window->
AddChild(
new Tree(
"Detail Options Tree", 0, y + 2, NULL, Lab_render_options_window->
GetWidth()));
1979 ctip = cmp->
AddItem(NULL,
"3D Hardware Textures", 0,
false);
1994 Lab_description_text = NULL;
1995 Lab_description_window = NULL;
2000 if ( (Lab_description_window == NULL) || (Lab_description_text == NULL) ) {
2004 if (Lab_selected_index != -1) {
2008 if (
Ship_info[Lab_selected_index].tech_desc != NULL) {
2011 Lab_description_text->
SetText(
"No description available.");
2016 if (
Weapon_info[Lab_selected_index].tech_desc != NULL) {
2019 Lab_description_text->
SetText(
"No description available.");
2027 if (Lab_description_window != NULL) {
2034 Lab_description_text = (
Text*)Lab_description_window->
AddChild(
new Text(
"Description Text",
"No ship selected.", 0, 0));
2056 if ( (Lab_class_window == NULL) || (Lab_class_toolbar == NULL) ) {
2077 if (Lab_species_nodes != NULL) {
2082 delete [] Lab_species_nodes;
2083 Lab_species_nodes = NULL;
2101 if ( (it->species >= 0) && (it->species < (
int)
Species_info.size()) ) {
2102 stip = Lab_species_nodes[it->species];
2109 if ( !Lab_in_mission ) {
2110 for (
int j = 0; j < it->num_detail_levels; j++) {
2125 if ( !Lab_species_nodes[idx]->HasChildren() ) {
2126 cmp->
AddItem(Lab_species_nodes[idx],
"<none>", 0,
false, NULL);
2141 if (Lab_flags_window != NULL) {
2148 if (Lab_description_window != NULL) {
2152 if (Lab_variables_window != NULL) {
2153 Lab_variables_window->
SetCaption(
"Ship Variables");
2163 Assert( ship_index >= 0 );
2165 if (Lab_selected_object == -1)
2190 Lab_last_selected_ship = Lab_selected_index;
2194 if (
Ship_info[ship_index].uses_team_colors) {
2205 Lab_arc_timestamp[
i] = -1;
2207 Lab_arc_next_time = -1;
2214 if ( !Lab_in_mission ) {
2229 Assert( weap_index >= 0 );
2237 Assert( weap_index >= 0 );
2246 Assert( weap_index >= 0 );
2268 Lab_selected_index = weap_index;
2269 Lab_last_selected_weapon = Lab_selected_index;
2291 if ( (Lab_class_window == NULL) || (Lab_class_toolbar == NULL) ) {
2341 if (
Weapon_info[i].external_model_name[0] !=
'\0') {
2348 if ( !type_nodes[i]->HasChildren() ) {
2349 delete type_nodes[
i];
2352 delete[] type_nodes;
2358 if (Lab_flags_window != NULL) {
2359 Lab_flags_window->
SetCaption(
"Weapon Flags");
2365 if (Lab_description_window != NULL) {
2369 if (Lab_variables_window != NULL) {
2370 Lab_variables_window->
SetCaption(
"Weapon Variables");
2389 Lab_in_mission =
true;
2391 Lab_in_mission =
false;
2394 if (Lab_in_mission) {
2414 if ( !Lab_in_mission ) {
2424 Lab_viewer_zoom = 1.2f;
2425 Lab_viewer_pos.
xyz.x = Lab_viewer_pos.
xyz.y = 0.0f;
2427 Lab_thrust_len = 1.0f;
2428 Lab_thrust_afterburn =
false;
2429 Lab_arc_next_time = -1;
2430 Lab_arc_disrupted =
false;
2432 Lab_weaponmodel_num[
i] = -1;
2437 if ( !Lab_in_mission ) {
2442 Lab_insignia_index = 0;
2461 if (Lab_in_mission) {
2478 Trackball_active = 1;
2485 Trackball_active = 1;
2489 Trackball_active = 0;
2506 if (Lab_insignia_bitmap >= 0) {
2508 Lab_insignia_bitmap = -1;
2518 Lab_arc_disrupted = !Lab_arc_disrupted;
2519 Lab_arc_next_time = -1;
2606 Lab_thrust_len += 0.05f;
2608 Lab_thrust_len -= 0.05f;
2610 CLAMP( Lab_thrust_len, 0.0
f, 1.0
f );
2613 Lab_thrust_afterburn = !Lab_thrust_afterburn;
2629 Lab_class_toolbar = NULL;
2630 Lab_class_window = NULL;
2631 Lab_flags_window = NULL;
2632 Lab_render_options_window = NULL;
2639 if (Lab_species_nodes != NULL) {
2641 delete Lab_species_nodes[
i];
2644 delete[] Lab_species_nodes;
2645 Lab_species_nodes = NULL;
2648 if (Lab_insignia_bitmap >= 0) {
2650 Lab_insignia_bitmap = -1;
2653 Lab_insignia_index = -1;
2655 if (Lab_model_num != -1) {
2662 if (Lab_weaponmodel_num[i] >= 0) {
2665 Lab_weaponmodel_num[
i] = -1;
2669 if (Lab_screen_save_bitmap != 1) {
2671 Lab_screen_save_bitmap = -1;
2674 Lab_ship_model_subsys.clear();
2676 if (Lab_ship_subsys != NULL) {
2677 delete[] Lab_ship_subsys;
2678 Lab_ship_subsys = NULL;
2681 memset( Lab_model_filename, 0,
sizeof(Lab_model_filename) );
void light_add_directional(const vec3d *dir, float intensity, float r, float g, float b, float spec_r, float spec_g, float spec_b, bool specular)
float g3_draw_laser_rgb(const vec3d *headp, float head_width, const vec3d *tailp, float tail_width, int r, int g, int b, uint tmap_flags=TMAP_FLAG_TEXTURED|TMAP_FLAG_RGB, float max_len=0.0f)
void labviewer_update_flags_window()
void labviewer_make_desc_window(Button *caller)
#define gr_scene_texture_end
#define ADD_RENDER_BOOL(text, flag)
void submodel_render_immediate(model_render_params *render_info, int model_num, int submodel_num, matrix *orient, vec3d *pos)
int timestamp(int delta_ms)
#define SIF2_SURFACE_SHIELDS
thrust_pair_bitmap thruster_secondary_glow_info
void DeleteChildren(GUIObject *exception=NULL)
void model_show_damaged(int model_num, int show_damaged)
void game_get_framerate()
GUIScreen * PushScreen(GUIScreen *csp)
#define TMAP_FLAG_XPARENT
#define MR_SHOW_OUTLINE_HTL
#define SIF2_SHOW_SHIP_MODEL
void ship_init_thrusters()
int Cmdline_old_collision_sys
void model_find_world_point(vec3d *outpnt, vec3d *mpnt, int model_num, int submodel_num, const matrix *objorient, const vec3d *objpos)
float vm_vec_mag_quick(const vec3d *v)
int secondary_bank_weapons[MAX_SHIP_SECONDARY_BANKS]
float max_overclocked_speed
matrix * vm_matrix_x_matrix(matrix *dest, const matrix *src0, const matrix *src1)
thrust_pair_bitmap thruster_tertiary_glow_info
bool draw_primary_models[MAX_SHIP_PRIMARY_BANKS]
GLfloat GLfloat GLfloat GLfloat h
shockwave_create_info shockwave
void vm_vec_scale_add(vec3d *dest, const vec3d *src1, const vec3d *src2, float k)
#define VAR_POS_RIGHTWIDTH
#define GST_MOUSE_LEFT_BUTTON
void model_set_instance(int model_num, int sub_model_num, submodel_instance_info *sii, int flags=0)
polymodel * model_get(int model_num)
weapon_info Weapon_info[MAX_WEAPON_TYPES]
#define MOUSE_LEFT_BUTTON
#define SIF_IN_TECH_DATABASE_M
void labviewer_change_ship(Tree *caller)
void weapon_load_bitmaps(int weapon_index)
int debris_objects[MAX_DEBRIS_OBJECTS]
#define gr_end_view_matrix
generic_anim laser_bitmap
int gameseq_get_pushed_state()
submodel_instance_info submodel_info_1
void lab_do_frame(float frametime)
void set_thruster_info(mst_info &info)
matrix * vm_angles_2_matrix(matrix *m, const angles *a)
void vm_rotate_matrix_by_angles(matrix *orient, const angles *tangles)
#define gr_restore_screen
thrust_pair thruster_glow_info
void labviewer_close_desc_window(GUIObject *caller)
float thruster_glow_noise_mult
void _cdecl void void _cdecl void _cdecl Warning(char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
submodel_instance_info submodel_info_2
#define gr_set_clear_color
void light_add_point(const vec3d *pos, float r1, float r2, float intensity, float r, float g, float b, int light_ignore_objnum, float spec_r, float spec_g, float spec_b, bool specular)
uint key_get_shift_status()
__inline void gr_string(int x, int y, const char *string, int resize_mode=GR_RESIZE_FULL)
char * Pilot_squad_image_names[MAX_PILOT_IMAGES]
const float MAX_ARC_LENGTH_PERCENTAGE
int OnFrame(float frametime, bool doevents, bool clearandflip)
#define WIF2_MR_NO_LIGHTING
void labviewer_change_detail_texture(Tree *caller)
void set_flags(uint flags)
struct vec3d::@225::@227 xyz
#define TMAP_HTL_3D_UNLIT
void model_render_immediate(model_render_params *render_info, int model_num, matrix *orient, vec3d *pos, int render, bool sort)
void labviewer_add_model_thrusters(model_render_params *render_info, ship_info *sip)
char external_model_name[MAX_FILENAME_LEN]
float tertiary_glow_rad_factor
GUIObject * Add(GUIObject *new_gauge)
void labviewer_make_variables_window(Button *caller)
#define WIF2_EXTERNAL_WEAPON_LNCH
float thruster_glow_factor
int bm_load_duplicate(const char *filename)
Reloads a bitmap as a duplicate.
float afterburner_fuel_capacity
#define VAR_POS_LEFTWIDTH
void model_add_arc(int model_num, int sub_model_num, vec3d *v1, vec3d *v2, int arc_type)
void labviewer_close_variables_window(GUIObject *caller)
void labviewer_render_model(float frametime)
#define LAB_FLAG_SUBMODEL_ROTATE
void set_detail_level_lock(int detail_level_lock)
void submodel_stepped_rotate(model_subsystem *psub, submodel_instance_info *sii)
void labviewer_change_ship_lod(Tree *caller)
void set_insignia_bitmap(int bitmap)
int mouse_get_pos(int *xpos, int *ypos)
void gr_set_color_fast(color *dst)
#define MR_DEBUG_BAY_PATHS
#define LAB_FLAG_DESTROYED_SUBSYSTEMS
int primary_bank_weapons[MAX_SHIP_PRIMARY_BANKS]
#define WIF_HOMING_ASPECT
std::basic_string< char, std::char_traits< char >, std::allocator< char > > SCP_string
bool PostProcessing_override
#define MODEL_RENDER_TRANS
#define gr_scene_texture_begin
void gr_set_bitmap(int bitmap_num, int alphablend_mode, int bitblt_mode, float alpha)
GLfloat GLfloat GLfloat v2
#define MODEL_RENDER_OPAQUE
void labviewer_update_desc_window()
float Noise[NOISE_NUM_FRAMES]
void labviewer_make_ship_window(Button *caller)
GLenum GLuint GLenum GLsizei const GLchar * buf
int bm_release(int handle, int clear_render_targets)
Frees both a bitmap's data and it's associated slot.
#define gr_end_proj_matrix
float thruster03_glow_rad_factor
#define CLAMP(x, min, max)
void labviewer_make_flags_window(Button *caller)
void shadows_end_render()
void g3_done_instance(bool set_api=false)
const float weapon_glow_scale_r
#define ADD_RENDER_FLAG(text, flag, var)
#define gr_set_view_matrix
thrust_info thruster_info
typedef int(SCP_EXT_CALLCONV *SCPDLL_PFVERSION)(SCPDLL_Version *)
matrix shadows_start_render(matrix *eye_orient, vec3d *eye_pos, float fov, float aspect, float veryneardist, float neardist, float middist, float fardist)
void set_debug_flags(uint flags)
void batch_render_all(int stream_buffer)
void ship_page_out_textures(int ship_index, bool release)
#define GR_ALPHABLEND_FILTER
#define gr_set_proj_matrix
#define SIF2_NO_THRUSTER_GEO_NOISE
void weapon_pause_sounds()
struct matrix::@228::@230 vec
void vm_vec_scale(vec3d *dest, float s)
float thruster_dist_rad_factor
void labviewer_exit(Button *caller)
void gr_opengl_deferred_lighting_finish()
#define WIF_IN_TECH_DATABASE
void gr_opengl_deferred_lighting_end()
void labviewer_variables_clear()
GLboolean GLboolean GLboolean GLboolean a
float g3_draw_laser(const vec3d *headp, float head_width, const vec3d *tailp, float tail_width, uint tmap_flags=TMAP_FLAG_TEXTURED, float max_len=0.0f)
void g3_set_view_matrix(const vec3d *view_pos, const matrix *view_matrix, float zoom)
ai_profile_t * ai_profile
void model_clear_instance(int model_num)
#define LAB_FLAG_SHOW_DEBRIS
void labviewer_populate_flags_window()
void labviewer_setup_subsys_rotation()
generic_anim thruster_glow
#define SIF_SHIP_CLASS_DONT_COLLIDE_INVIS
ai_profile_t Ai_profiles[MAX_AI_PROFILES]
sprintf(buf,"(%f,%f,%f)", v3->xyz.x, v3->xyz.y, v3->xyz.z)
void set_team_color(team_color &clr)
void labviewer_variables_add(int *Y, char *var_name)
void labviewer_make_weap_window(Button *caller)
SCP_string default_team_name
void gr_shade(int x, int y, int w, int h, int resize_mode)
void labviewer_flags_clear()
const char * bm_get_filename(int handle)
Gets the filename of the bitmap indexed by handle, which must exist.
#define GST_MOUSE_RIGHT_BUTTON
float distortion_length_factor
#define LAB_FLAG_INITIAL_ROTATION
float max_shield_strength
#define WIF_PARTICLE_SPEW
void labviewer_change_model(char *model_fname, int lod=0, int sel_index=-1)
#define SIF_BALLISTIC_PRIMARIES
int model_load(char *filename, int n_subsystems, model_subsystem *subsystems, int ferror=1, int duplicate=0)
void SetText(const SCP_string &in_content)
void submodel_rotate(model_subsystem *psub, submodel_instance_info *sii)
void model_page_in_textures(int modelnum, int ship_info_index=-1)
#define SIF_DEFAULT_PLAYER_SHIP
void set_color(color &clr)
char * Weapon_subtype_names[]
generic_anim laser_glow_bitmap
#define SIF_IN_TECH_DATABASE
int Cmdline_bloom_intensity
void SetCloseFunction(void(*in_closefunc)(GUIObject *caller))
vec3d * vm_vec_unrotate(vec3d *dest, const vec3d *src, const matrix *m)
void mouse_get_delta(int *dx, int *dy, int *dz)
void labviewer_close_render_options_window(GUIObject *caller)
int Cmdline_shadow_quality
GLint GLint GLint GLint GLint x
void submodel_get_two_random_points(int model_num, int submodel_num, vec3d *v1, vec3d *v2, vec3d *n1=NULL, vec3d *n2=NULL)
#define MR_SHOW_THRUSTERS
TreeItem * AddItem(TreeItem *parent, const SCP_string &in_name, int in_data=0, bool in_delete_data=true, void(*in_function)(Tree *caller)=NULL)
void labviewer_set_class_window(int mode)
int ship_create(matrix *orient, vec3d *pos, int ship_type, char *ship_name)
GUIObject * AddChild(GUIObject *cgp)
void vm_trackball(int idx, int idy, matrix *RotMat)
int catchup_pixels_per_sec
void model_page_out_textures(int model_num, bool release=false)
float thruster01_glow_rad_factor
int catchup_pixel_penalty
#define WIF2_PIERCE_SHIELDS
void labviewer_change_bitmap(int ship_index=-1, int weapon_index=-1)
GLuint const GLchar * name
void labviewer_update_variables_window()
void labviewer_change_weapon(Tree *caller)
float thruster02_glow_len_factor
void vm_vec_sub(vec3d *dest, const vec3d *src0, const vec3d *src1)
void weapon_unpause_sounds()
void labviewer_add_model_arcs()
#define VAR_SET_VALUE(value)
GLboolean GLboolean GLboolean b
thrust_pair thruster_flame_info
#define MOUSE_RIGHT_BUTTON
typedef float(SCP_EXT_CALLCONV *SCPTRACKIR_PFFLOATVOID)()
#define WIF_PLAYER_ALLOWED
void pilot_load_squad_pic_list()
void gr_opengl_deferred_lighting_begin()
int Num_pilot_squad_images
void obj_delete(int objnum)
float frand()
Return random value in range 0.0..1.0- (1.0- means the closest number less than 1.0)
void submodel_get_two_random_points_better(int model_num, int submodel_num, vec3d *v1, vec3d *v2)
void labviewer_close_weap_window(GUIObject *caller)
void gr_get_string_size(int *w, int *h, const char *text, int len=9999)
void model_set_instance_info(submodel_instance_info *sii, float turn_rate, float turn_accel)
void labviewer_populate_variables_window()
SCP_vector< SCP_string > Hud_shield_filenames
float model_get_radius(int modelnum)
#define LAB_FLAG_SHOW_WEAPONS
SCP_vector< ship_info > Ship_info
#define SIF_KNOSSOS_DEVICE
#define LAB_FLAG_NO_ROTATION
void g3_start_instance_matrix(const vec3d *pos, const matrix *orient, bool set_api=true)
#define TMAP_FLAG_TEXTURED
#define timestamp_elapsed(stamp)
SCP_vector< species_info > Species_info
#define LAB_FLAG_LIGHTNING_ARCS
MINUS_5_PERCENT_THROTTLE.
const float weapon_glow_scale_l
void labviewer_show_tech_model(Tree *caller)
#define LAB_FLAG_SHOW_INSIGNIA
#define gr_copy_effect_texture
int secondary_glow_bitmap
float thruster_dist_len_factor
int check_control(int id, int key)
void light_set_all_relevent()
#define VAR_SET_VALUE_SAVE(value, max_size)
bool draw_secondary_models[MAX_SHIP_SECONDARY_BANKS]
void SetCaption(const SCP_string &in_caption)
#define GSOF_NOTHINGPRESSED
#define timestamp_rand(a, b)
#define GR_BITBLT_MODE_NORMAL
float secondary_glow_rad_factor
TreeItem * GetSelectedItem()
SCP_string Lab_team_color
bool is_minimum_GLSL_version()
void gr_create_shader(shader *shade, ubyte r, ubyte g, ubyte b, ubyte c)
#define MSS_FLAG_STEPPED_ROTATE
SCP_map< SCP_string, team_color > Team_Colors
void labviewer_show_external_model(Tree *caller)
void batch_render_distortion_map_bitmaps(int buffer_handle)
void labviewer_flags_add(int *X, int *Y, char *flag_name, int flag, bool flags2=false)
void _cdecl gr_printf_no_resize(int x, int y, const char *format,...)
void labviewer_close_class_window(GUIObject *caller)
void set_object_number(int num)
float distortion_rad_factor
shockwave_create_info shockwave
void gr_set_shader(shader *shade)
float afterburner_recover_rate
int timer_get_milliseconds()
void gameseq_post_event(int event)
void gr_init_color(color *c, int r, int g, int b)
void labviewer_render_bitmap(float frametime)
void labviewer_close_flags_window(GUIObject *caller)
matrix vmd_identity_matrix
#define timestamp_valid(stamp)
float afterburner_burn_rate
generic_anim thruster_flame
thrust_pair_bitmap thruster_distortion_info
float thruster02_glow_rad_factor
SCP_vector< ship_type_info > Ship_types
void labviewer_make_render_options_window(Button *caller)
const int weapon_glow_alpha
const float weapon_glow_scale_f
void model_unload(int modelnum, int force=0)
#define g3_start_frame(zbuffer_flag)
GLfloat GLfloat GLfloat GLfloat v3
void labviewer_do_render(float frametime)
TreeItem * GetParentItem()
float vm_vec_normalize(vec3d *v)
#define VAR_ADD_HEADER(name)