Subversion Repositories Games.Descent

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Portions of this file are copyright Rebirth contributors and licensed as
  3.  * described in COPYING.txt.
  4.  * Portions of this file are copyright Parallax Software and licensed
  5.  * according to the Parallax license below.
  6.  * See COPYING.txt for license details.
  7.  
  8. THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  9. SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
  10. END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  11. ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  12. IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  13. SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  14. FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  15. CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
  16. AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
  17. COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
  18. */
  19.  
  20. /*
  21.  *
  22.  * Print debugging info in ui.
  23.  *
  24.  */
  25.  
  26. #include <cinttypes>
  27. #include <stdio.h>
  28. #include <stdlib.h>
  29. #include <string.h>
  30.  
  31. #include "inferno.h"
  32. #include "window.h"
  33. #include "segment.h"
  34. #include "event.h"
  35. #include "gr.h"
  36. #include "ui.h"
  37. #include "editor.h"
  38. #include "editor/esegment.h"
  39. #include "dxxerror.h"
  40. #include "textures.h"
  41. #include "object.h"
  42. #include "ai.h"
  43. #include "texpage.h"            // Textue selection paging stuff
  44. #include "objpage.h"            // Object selection paging stuff
  45. #include "wall.h"
  46. #include "switch.h"
  47. #include "info.h"
  48.  
  49. int init_info;
  50.  
  51. typedef const char object_type_name[13];
  52. typedef const char control_type_name[15];
  53. typedef const char movement_type_name[15];
  54. typedef const char ai_type_name[13];
  55.  
  56. static object_type_name &get_object_type(int num)
  57. {
  58.         switch (num) {
  59.                 case OBJ_NONE:
  60.                         return "OBJ_NONE    ";
  61.                 case OBJ_WALL:
  62.                         return "OBJ_WALL    ";
  63.                 case OBJ_FIREBALL:
  64.                         return "OBJ_FIREBALL";
  65.                 case OBJ_ROBOT:
  66.                         return "OBJ_ROBOT   ";
  67.                 case OBJ_HOSTAGE:
  68.                         return "OBJ_HOSTAGE ";
  69.                 case OBJ_PLAYER:
  70.                         return "OBJ_PLAYER  ";
  71.                 case OBJ_WEAPON:
  72.                         return "OBJ_WEAPON  ";
  73.                 case OBJ_CAMERA:
  74.                         return "OBJ_CAMERA  ";
  75.                 case OBJ_POWERUP:
  76.                         return "OBJ_POWERUP ";
  77.                 default:
  78.                         return " (unknown)  ";
  79.         }
  80. }
  81.  
  82. static control_type_name &get_control_type(int num)
  83. {
  84.         switch (num) {
  85.                 case CT_NONE:
  86.                         return "CT_NONE       ";
  87.                 case CT_AI:
  88.                         return "CT_AI         ";
  89.                 case CT_EXPLOSION:
  90.                         return "CT_EXPLOSION  ";
  91.                 case CT_FLYING:
  92.                         return "CT_FLYING     ";
  93.                 case CT_SLEW:
  94.                         return "CT_SLEW       ";
  95.                 case CT_FLYTHROUGH:
  96.                         return "CT_FLYTHROUGH ";
  97.                 case CT_WEAPON:
  98.                         return "CT_WEAPON     ";
  99.                 default:
  100.                         return " (unknown)    ";
  101.         }
  102. }
  103.  
  104. static movement_type_name &get_movement_type(int num)
  105. {
  106.         switch (num) {
  107.                 case MT_NONE:
  108.                         return "MT_NONE       ";
  109.                 case MT_PHYSICS:
  110.                         return "MT_PHYSICS    ";
  111.                 default:
  112.                         return " (unknown)    ";
  113.         }
  114. }
  115.  
  116. static ai_type_name &get_ai_behavior(ai_behavior num)
  117. {
  118.         switch (num) {
  119.                 case ai_behavior::AIB_STILL:
  120.                         return "STILL       ";
  121.                 case ai_behavior::AIB_NORMAL:
  122.                         return "NORMAL      ";
  123. #if defined(DXX_BUILD_DESCENT_I)
  124.                 case ai_behavior::AIB_HIDE:
  125.                         return "HIDE        ";
  126.                 case ai_behavior::AIB_FOLLOW_PATH:
  127.                         return "FOLLOW_PATH ";
  128. #elif defined(DXX_BUILD_DESCENT_II)
  129.                 case ai_behavior::AIB_BEHIND:
  130.                         return "BEHIND      ";
  131.                 case ai_behavior::AIB_SNIPE:
  132.                         return "SNIPE       ";
  133.                 case ai_behavior::AIB_FOLLOW:
  134.                         return "FOLLOW      ";
  135. #endif
  136.                 case ai_behavior::AIB_RUN_FROM:
  137.                         return "RUN_FROM    ";
  138.                 default:
  139.                         return " (unknown)  ";
  140.         }
  141. }
  142.  
  143. //      ---------------------------------------------------------------------------------------------------
  144. static void info_display_object_placement(grs_canvas &canvas, int show_all)
  145. {
  146.         auto &Objects = LevelUniqueObjectState.Objects;
  147.         static  int     old_Cur_object_index;
  148.         static  int     old_type;
  149.         static  int     old_movement_type;
  150.         static  int     old_control_type;
  151.         static ai_behavior old_mode;
  152.         if (init_info || show_all ||
  153.                 ( Cur_object_index != old_Cur_object_index) ||
  154.                         ( Objects[Cur_object_index].type != old_type) ||
  155.                         ( Objects[Cur_object_index].movement_type != old_movement_type) ||
  156.                         ( Objects[Cur_object_index].control_type != old_control_type) ||
  157.                         ( Objects[Cur_object_index].ctype.ai_info.behavior != old_mode) ) {
  158.  
  159.                 gr_uprintf(canvas, *canvas.cv_font, 0, 0, "Object id: %4d\n", Cur_object_index);
  160.                 gr_uprintf(canvas, *canvas.cv_font, 0, 16, "Type: %s\n", get_object_type(Objects[Cur_object_index].type));
  161.                 gr_uprintf(canvas, *canvas.cv_font, 0, 32, "Movmnt: %s\n", get_movement_type(Objects[Cur_object_index].movement_type));
  162.                 gr_uprintf(canvas, *canvas.cv_font, 0, 48, "Cntrl: %s\n", get_control_type(Objects[Cur_object_index].control_type));
  163.                 gr_uprintf(canvas, *canvas.cv_font, 0, 64, "Mode: %s\n", get_ai_behavior(Objects[Cur_object_index].ctype.ai_info.behavior));
  164.  
  165.                 old_Cur_object_index = Cur_object_index;
  166.                 old_type = Objects[Cur_object_index].type;
  167.                 old_movement_type = Objects[Cur_object_index].movement_type;
  168.                 old_control_type = Objects[Cur_object_index].control_type;
  169.                 old_mode = Objects[Cur_object_index].ctype.ai_info.behavior;
  170.         }
  171.  
  172. }
  173.  
  174. //      ---------------------------------------------------------------------------------------------------
  175. static void info_display_segsize(grs_canvas &canvas, int show_all)
  176. {
  177.         static  int     old_SegSizeMode;
  178.         if (init_info | show_all) {
  179.                 old_SegSizeMode = -2;
  180.         }
  181.  
  182.         if (old_SegSizeMode != SegSizeMode  ) {
  183.                 const char *name;
  184.                 switch (SegSizeMode) {
  185.                         case SEGSIZEMODE_FREE:          name = "free   ";       break;
  186.                         case SEGSIZEMODE_ALL:           name = "all    ";       break;
  187.                         case SEGSIZEMODE_CURSIDE:       name = "curside";       break;
  188.                         case SEGSIZEMODE_EDGE:          name = "edge   ";       break;
  189.                         case SEGSIZEMODE_VERTEX:        name = "vertex ";       break;
  190.                         default:
  191.                                 Error("Illegal value for SegSizeMode in info.c/info_display_segsize\n");
  192.                 }
  193.                 old_SegSizeMode = SegSizeMode;
  194.                 gr_uprintf(canvas, *canvas.cv_font, 0, 0, "Mode: %s\n", name);
  195.         }
  196.  
  197. }
  198.  
  199. //      ---------------------------------------------------------------------------------------------------
  200. static void info_display_default(grs_canvas &canvas, int show_all)
  201. {
  202.         auto &LevelSharedVertexState = LevelSharedSegmentState.get_vertex_state();
  203.         auto &TmapInfo = LevelUniqueTmapInfoState.TmapInfo;
  204.         static int old_Num_segments = -1;
  205.         static int old_Num_vertices = -1;
  206.         static int old_Num_objects = -1;
  207.         static int old_Cursegp_num = -1;
  208.         static int old_Curside = -1;
  209.         static int old_Cursegp_num_for_verts = -1;
  210.         static int old_CurrentTexture = -1;
  211.         static int old_Num_walls = -1;
  212.         static int old_Num_triggers = -1;
  213.  
  214.         if (init_info | show_all) {
  215.                 init_info = 0;
  216.                 old_Num_segments = -1;
  217.                 old_Num_vertices = -1;
  218.                 old_Num_objects = -1;
  219.                 old_Cursegp_num = -1;
  220.                 old_Cursegp_num_for_verts = -1;
  221.                 old_Curside = -1;
  222.                 old_CurrentTexture = -1;
  223.                 old_Num_walls = -1;
  224.                 old_Num_triggers = -1;
  225.         }
  226.  
  227.         gr_set_fontcolor(canvas, CBLACK, CWHITE);
  228.  
  229.         //--------------- Number of segments ----------------
  230.  
  231.         if (old_Num_segments != LevelSharedSegmentState.Num_segments)
  232.         {
  233.                 old_Num_segments = LevelSharedSegmentState.Num_segments;
  234.                 gr_uprintf(canvas, *canvas.cv_font, 0, 0, "Segments: %4d/%4" PRIuFAST32, LevelSharedSegmentState.Num_segments, static_cast<uint_fast32_t>(MAX_SEGMENTS));
  235.         }
  236.  
  237.         //---------------- Number of vertics -----------------
  238.        
  239.         if (old_Num_vertices != LevelSharedVertexState.Num_vertices)
  240.         {
  241.                 old_Num_vertices = LevelSharedVertexState.Num_vertices;
  242.                 gr_uprintf(canvas, *canvas.cv_font, 0, 16, "Vertices: %4d/%4" PRIuFAST32, LevelSharedVertexState.Num_vertices, static_cast<uint_fast32_t>(MAX_VERTICES));
  243.         }
  244.  
  245.         //---------------- Number of objects -----------------
  246.        
  247.         if (old_Num_objects != LevelUniqueObjectState.num_objects)
  248.         {
  249.                 const auto num_objects = LevelUniqueObjectState.num_objects;
  250.                 old_Num_objects = num_objects;
  251.                 gr_uprintf(canvas, *canvas.cv_font, 0, 32, "Objs: %3d/%3" DXX_PRI_size_type, num_objects, MAX_OBJECTS.value);
  252.         }
  253.  
  254.         //--------------- Current_segment_number -------------
  255.         //--------------- Current_side_number -------------
  256.  
  257.         if (old_Cursegp_num != Cursegp || old_Curside != Curside)
  258.         {
  259.                 old_Cursegp_num = Cursegp;
  260.                 old_Curside = Curside;
  261.                 gr_uprintf(canvas, *canvas.cv_font, 0, 48, "Cursegp/side: %3hu/%1d", static_cast<segnum_t>(Cursegp), Curside);
  262.                 unique_segment &useg = *Cursegp;
  263.                 auto &uside = useg.sides[Curside];
  264.                 gr_uprintf(canvas, *canvas.cv_font, 0, 128, " tmap1,2,o: %3d/%3dx%1d", uside.tmap_num, uside.tmap_num2 & 0x3FFF, (uside.tmap_num2 >> 14) & 3);
  265.         }
  266.  
  267.         //--------------- Current_vertex_numbers -------------
  268.  
  269.         if (old_Cursegp_num_for_verts != Cursegp)
  270.         {
  271.                 old_Cursegp_num_for_verts = Cursegp;
  272.                 gr_uprintf(canvas, *canvas.cv_font, 0, 64, "{%3d,%3d,%3d,%3d,", Cursegp->verts[0],Cursegp->verts[1],
  273.                                                                                                                                                                                          Cursegp->verts[2],Cursegp->verts[3] );
  274.                 gr_uprintf(canvas, *canvas.cv_font, 0, 80," %3d,%3d,%3d,%3d}", Cursegp->verts[4],Cursegp->verts[5],
  275.                                                                                                                                                                                          Cursegp->verts[6],Cursegp->verts[7] );
  276.         }
  277.  
  278.         //--------------- Num walls/links/triggers -------------------------
  279.  
  280.         auto &Walls = LevelUniqueWallSubsystemState.Walls;
  281.         if ( old_Num_walls != Walls.get_count() ) {
  282.                 old_Num_walls = Walls.get_count();
  283.                 gr_uprintf(canvas, *canvas.cv_font, 0, 96, "Walls %3d", Walls.get_count());
  284.         }
  285.  
  286.         //--------------- Num triggers ----------------------
  287.  
  288.         {
  289.         auto &Triggers = LevelUniqueWallSubsystemState.Triggers;
  290.         if ( old_Num_triggers != Triggers.get_count() ) {
  291.                 old_Num_triggers = Triggers.get_count();
  292.                 gr_uprintf(canvas, *canvas.cv_font, 0, 112, "Num_triggers %2d", Triggers.get_count());
  293.         }
  294.         }
  295.  
  296.         //--------------- Current texture number -------------
  297.  
  298.         if ( old_CurrentTexture != CurrentTexture )     {
  299.                 old_CurrentTexture = CurrentTexture;
  300.                 gr_uprintf(canvas, *canvas.cv_font, 0, 144, "Tex/Light: %3d %5.2f", CurrentTexture, f2fl(TmapInfo[CurrentTexture].lighting));
  301.         }
  302. }
  303.  
  304. //      ------------------------------------------------------------------------------------
  305. static void clear_pad_display(grs_canvas &canvas)
  306. {
  307.         gr_clear_canvas(canvas, CWHITE);
  308.         gr_set_fontcolor(canvas, CBLACK, CWHITE);
  309. }
  310.  
  311. //      ------------------------------------------------------------------------------------
  312. static window_event_result info_display_all(window *wind,const d_event &event, const unused_window_userdata_t *)
  313. {
  314.         static int old_padnum = -1;
  315.         int        padnum,show_all = 1;         // always redraw
  316.         grs_canvas *save_canvas = grd_curcanv;
  317.  
  318.         switch (event.type)
  319.         {
  320.                 case EVENT_WINDOW_DRAW:
  321.                 {
  322.                         gr_set_current_canvas(window_get_canvas(*wind));
  323.                         auto &canvas = *grd_curcanv;
  324.  
  325.                         padnum = ui_pad_get_current();
  326.                         Assert(padnum <= MAX_PAD_ID);
  327.  
  328.                         if (padnum != old_padnum) {
  329.                                 old_padnum = padnum;
  330.                                 clear_pad_display(canvas);
  331.                                 //show_all = 1;
  332.                         }
  333.  
  334.                         switch (padnum) {
  335.                                 case OBJECT_PAD_ID:                     // Object placement
  336.                                         info_display_object_placement(canvas, show_all);
  337.                                         break;
  338.                                 case SEGSIZE_PAD_ID:                    // Segment sizing
  339.                                         info_display_segsize(canvas, show_all);
  340.                                         break;
  341.                                 default:
  342.                                         info_display_default(canvas, show_all);
  343.                                         break;
  344.                         }
  345.                         grd_curcanv = save_canvas;
  346.                         return window_event_result::handled;
  347.                 }
  348.                 case EVENT_WINDOW_CLOSE:
  349.                         Pad_info = NULL;
  350.                         break;
  351.                        
  352.                 default:
  353.                         break;
  354.         }
  355.         return window_event_result::ignored;
  356. }
  357.  
  358. //      ------------------------------------------------------------------------------------
  359. window *info_window_create(void)
  360. {
  361.         const auto wind = window_create(*Canv_editor, PAD_X + 250, PAD_Y + 8, 180, 160, info_display_all, unused_window_userdata);
  362.         if (wind)
  363.                 window_set_modal(wind, 0);
  364.        
  365.         return wind;
  366. }
  367.  
  368.  
  369.