- (TODO) Texture sizes sometimes vary wildly. New texture browser option: View -...
authornamespace <namespace>
Mon, 6 Nov 2006 20:41:46 +0000 (20:41 +0000)
committernamespace <namespace>
Mon, 6 Nov 2006 20:41:46 +0000 (20:41 +0000)
  Code parts taken from DarkRadiant. (Shaderman)
- Added new texture browser option: View -> Hide Image Missing. (Shaderman)
- Fixed new D3 lights don't have a light_radius key. (Shaderman)
- Fixed hotkey collision (paste to camera/view menu). New View shortcut = ALT+W. (Shaderman)
- Fixed .wad MMB 3d view texture selection bug. (Shaderman)

git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/trunk@121 8a3a26a2-13c4-0310-b231-cf6edde360e5

CHANGES
TODO
plugins/entity/light.cpp
radiant/mainframe.cpp
radiant/texwindow.cpp

diff --git a/CHANGES b/CHANGES
index b44ba02..3970d7c 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,15 @@
 This is the changelog for developers, != changelog for the end user 
 that we distribute with the binaries. (see changelog)
 
+06/11/2006
+namespace
+- (TODO) Texture sizes sometimes vary wildly. New texture browser option: View -> Fixed Size.
+  Code parts taken from DarkRadiant. (Shaderman)
+- Added new texture browser option: View -> Hide Image Missing. (Shaderman)
+- Fixed new D3 lights don't have a light_radius key. (Shaderman)
+- Fixed hotkey collision (paste to camera/view menu). New View shortcut = ALT+W. (Shaderman)
+- Fixed .wad MMB 3d view texture selection bug. (Shaderman)
+
 04/11/2006
 namespace
 - Added warzow-support to q3map2
diff --git a/TODO b/TODO
index aeb5796..8ac79e3 100644 (file)
--- a/TODO
+++ b/TODO
@@ -20,7 +20,6 @@ FEATURES
 - paint-select or equivalent (e.g. area-selection with occlusion)
 - select-complete-tall or equivalent (e.g. subtract-from-selection modifier key)
 - texture pane names are often illegible, becuase 1. they are long and overlap each other and 2. they overlap the outline rectangles around the images themselves.
-- texture sizes sometimes vary wildly.  It would be nice to find a way to normalize their display size so that very big textures are shrunk a little, and very small textures are blown-up a little.
 
 
 Build: document build-menu xml format.
index 537da2c..5fbbafc 100644 (file)
@@ -1337,14 +1337,7 @@ public:
       write_rotation(m_rotationKey.m_rotation, &m_entity);
 
       m_doom3Radius.m_radius = m_doom3Radius.m_radiusTransformed;
-      if(m_doom3Radius.m_radius == m_doom3Radius.m_defaultRadius)
-      {
-        m_entity.setKeyValue("light_radius", "");
-      }
-      else
-      {
-        write_origin(m_doom3Radius.m_radius, &m_entity, "light_radius");
-      }
+      write_origin(m_doom3Radius.m_radius, &m_entity, "light_radius");
     }
   }
   void transformChanged()
index 9eb022c..fd54a11 100644 (file)
@@ -2024,7 +2024,7 @@ GtkWidget* g_toggle_entitylist_item = 0;
 GtkMenuItem* create_view_menu(MainFrame::EViewStyle style)
 {
   // View menu
-  GtkMenuItem* view_menu_item = new_sub_menu_item_with_mnemonic("_View");
+  GtkMenuItem* view_menu_item = new_sub_menu_item_with_mnemonic("Vie_w");
   GtkMenu* menu = GTK_MENU(gtk_menu_item_get_submenu(view_menu_item));
   if (g_Layout_enableDetachableMenus.m_value)
     menu_tearoff (menu);
index cc5ef13..a3a17b0 100644 (file)
@@ -140,6 +140,8 @@ typedef ReferenceCaller1<TextureGroups, const char*, TextureGroups_addDirectory>
 namespace
 {
   bool g_TextureBrowser_shaderlistOnly = false;
+  bool g_TextureBrowser_fixedSize = false;
+  bool g_TextureBrowser_filterNotex = false;
 }
 
 class DeferredAdjustment
@@ -210,6 +212,12 @@ typedef FreeCaller1<const BoolImportCallback&, TextureBrowser_showShadersExport>
 void TextureBrowser_showShaderlistOnly(const BoolImportCallback& importer);
 typedef FreeCaller1<const BoolImportCallback&, TextureBrowser_showShaderlistOnly> TextureBrowserShowShaderlistOnlyExport;
 
+void TextureBrowser_fixedSize(const BoolImportCallback& importer);
+typedef FreeCaller1<const BoolImportCallback&, TextureBrowser_fixedSize> TextureBrowserFixedSizeExport;
+
+void TextureBrowser_filterNotex(const BoolImportCallback& importer);
+typedef FreeCaller1<const BoolImportCallback&, TextureBrowser_filterNotex> TextureBrowserFilterNotexExport;
+
 class TextureBrowser
 {
 public:
@@ -243,6 +251,8 @@ public:
   ToggleItem m_hideunused_item;
   ToggleItem m_showshaders_item;
   ToggleItem m_showshaderlistonly_item;
+  ToggleItem m_fixedsize_item;
+  ToggleItem m_filternotex_item;
 
   guint m_sizeHandler;
   guint m_exposeHandler;
@@ -267,12 +277,53 @@ public:
   bool m_rmbSelected;
   bool m_searchedTags;
   bool m_tags;
+  // The uniform size (in pixels) that textures are resized to when m_resizeTextures is true.
+  int m_uniformTextureSize;
+  // Return the display width of a texture in the texture browser
+  int getTextureWidth(qtexture_t* tex)
+  {
+    int width;
+    if (!g_TextureBrowser_fixedSize)
+    {
+      // Don't use uniform size
+      width = (int)(tex->width * ((float)m_textureScale / 100));
+    } else if
+      (tex->width >= tex->height)
+    {
+      // Texture is square, or wider than it is tall
+      width = m_uniformTextureSize;
+    } else {
+      // Otherwise, preserve the texture's aspect ratio
+      width = (int)(m_uniformTextureSize * ((float)tex->width / tex->height));
+    }
+    return width;
+  }
+  // Return the display height of a texture in the texture browser
+  int getTextureHeight(qtexture_t* tex)
+  {
+    int height;
+    if (!g_TextureBrowser_fixedSize)
+    {
+      // Don't use uniform size
+      height = (int)(tex->height * ((float)m_textureScale / 100));
+    } else if (tex->height >= tex->width)
+    {
+      // Texture is square, or taller than it is wide
+      height = m_uniformTextureSize;
+    } else {
+      // Otherwise, preserve the texture's aspect ratio
+      height = (int)(m_uniformTextureSize * ((float)tex->height / tex->width));
+    }
+    return height;
+  }
 
   TextureBrowser() :
     m_texture_scroll(0),
     m_hideunused_item(TextureBrowserHideUnusedExport()),
        m_showshaders_item(TextureBrowserShowShadersExport()),
        m_showshaderlistonly_item(TextureBrowserShowShaderlistOnlyExport()),
+    m_fixedsize_item(TextureBrowserFixedSizeExport()),
+    m_filternotex_item(TextureBrowserFilterNotexExport()),
     m_heightChanged(true),
     m_originInvalid(true),
     m_scrollAdjustment(TextureBrowser_scrollChanged, this),
@@ -285,7 +336,8 @@ public:
        m_hideUnused(false),
        m_rmbSelected(false),
        m_searchedTags(false),
-       m_tags(false)
+    m_tags(false),
+    m_uniformTextureSize(128)
   {
   }
 };
@@ -355,7 +407,10 @@ void TextureBrowser_SetSelectedShader(TextureBrowser& textureBrowser, const char
 
   if(filename.empty())
   {
-    gtk_widget_set_sensitive(textureBrowser.m_shader_info_item, FALSE);
+    if(textureBrowser.m_shader_info_item != NULL)
+    {
+      gtk_widget_set_sensitive(textureBrowser.m_shader_info_item, FALSE);
+    }
   } else {
     gtk_widget_set_sensitive(textureBrowser.m_shader_info_item, TRUE);
   }
@@ -396,8 +451,8 @@ void Texture_NextPos(TextureBrowser& textureBrowser, TextureLayout& layout, qtex
 {
   qtexture_t* q = current_texture;
 
-  int nWidth = (int)(q->width * ((float)textureBrowser.m_textureScale / 100));
-  int nHeight = (int)(q->height * ((float)textureBrowser.m_textureScale / 100));
+  int nWidth = textureBrowser.getTextureWidth(q);
+  int nHeight = textureBrowser.getTextureHeight(q);
   if (layout.current_x + nWidth > textureBrowser.width-8 && layout.current_row)
   { // go to the next row unless the texture is the first on the row
     layout.current_x = 8;
@@ -414,8 +469,8 @@ void Texture_NextPos(TextureBrowser& textureBrowser, TextureLayout& layout, qtex
   if (layout.current_row < nHeight)
     layout.current_row = nHeight;
 
-  // never go less than 64, or the names get all crunched up
-  layout.current_x += nWidth < 64 ? 64 : nWidth;
+  // never go less than 96, or the names get all crunched up
+  layout.current_x += nWidth < 96 ? 96 : nWidth;
   layout.current_x += 8;
 }
 
@@ -433,9 +488,18 @@ bool TextureSearch_IsShown(const char* name)
   }
 }
 
+CopiedString g_notex;
+CopiedString g_shadernotex;
+
 // if texture_showinuse jump over non in-use textures
 bool Texture_IsShown(IShader* shader, bool show_shaders, bool hideUnused)
 {
+  // filter notex / shadernotex images
+  if(g_TextureBrowser_filterNotex && (string_equal(g_notex.c_str(), shader->getTexture()->name) || string_equal(g_shadernotex.c_str(), shader->getTexture()->name)))
+  {
+    return false;
+  }
+
   if(g_TextureBrowser_currentDirectory == "Untagged")
   {
        std::set<CopiedString>::iterator iter;
@@ -504,7 +568,7 @@ void TextureBrowser_evaluateHeight(TextureBrowser& textureBrowser)
 
       int   x, y;
       Texture_NextPos(textureBrowser, layout, shader->getTexture(), &x, &y);
-      textureBrowser.m_nTotalHeight = std::max(textureBrowser.m_nTotalHeight, abs(layout.current_y) + TextureBrowser_fontHeight(textureBrowser) + (int)(shader->getTexture()->height * ((float)textureBrowser.m_textureScale / 100)) + 4);
+      textureBrowser.m_nTotalHeight = std::max(textureBrowser.m_nTotalHeight, abs(layout.current_y) + TextureBrowser_fontHeight(textureBrowser) + textureBrowser.getTextureHeight(shader->getTexture()) + 4);
     }
   }
 }
@@ -804,6 +868,18 @@ void TextureBrowser_showShaderlistOnly(const BoolImportCallback& importer)
 }
 typedef FreeCaller1<const BoolImportCallback&, TextureBrowser_showShaderlistOnly> TextureBrowserShowShaderlistOnlyExport;
 
+void TextureBrowser_fixedSize(const BoolImportCallback& importer)
+{
+  importer(g_TextureBrowser_fixedSize);
+}
+typedef FreeCaller1<const BoolImportCallback&, TextureBrowser_fixedSize> TextureBrowser_FixedSizeExport;
+
+void TextureBrowser_filterNotex(const BoolImportCallback& importer)
+{
+  importer(g_TextureBrowser_filterNotex);
+}
+typedef FreeCaller1<const BoolImportCallback&, TextureBrowser_filterNotex> TextureBrowser_filterNotexExport;
+
 void TextureBrowser_SetHideUnused(TextureBrowser& textureBrowser, bool hideUnused)
 {
   if(hideUnused)
@@ -895,9 +971,9 @@ IShader* Texture_At(TextureBrowser& textureBrowser, int mx, int my)
     qtexture_t  *q = shader->getTexture();
     if (!q)
       break;
-
-    int nWidth = (int)(q->width * ((float)textureBrowser.m_textureScale / 100));
-    int nHeight = (int)(q->height * ((float)textureBrowser.m_textureScale / 100));
+    
+    int nWidth = textureBrowser.getTextureWidth(q);
+    int nHeight = textureBrowser.getTextureHeight(q);
     if (mx > x && mx - x < nWidth
       && my < y && y - my < nHeight + TextureBrowser_fontHeight(textureBrowser))
     {
@@ -1033,8 +1109,8 @@ void Texture_Draw(TextureBrowser& textureBrowser)
     if (!q)
       break;
 
-    int nWidth = (int)(q->width * ((float)textureBrowser.m_textureScale / 100));
-    int nHeight = (int)(q->height * ((float)textureBrowser.m_textureScale / 100));
+    int nWidth = textureBrowser.getTextureWidth(q);
+    int nHeight = textureBrowser.getTextureHeight(q);
 
     if (y != last_y)
     {
@@ -1124,9 +1200,9 @@ void Texture_Draw(TextureBrowser& textureBrowser)
       // draw the texture name
       glDisable (GL_TEXTURE_2D);
       glColor3f (1,1,1);
-
-      glRasterPos2i (x, y-TextureBrowser_fontHeight(textureBrowser)+2);
-
+      
+      glRasterPos2i (x, y-TextureBrowser_fontHeight(textureBrowser)+5);
+      
       // don't draw the directory name
       const char* name = shader->getName();
       name += strlen(name);
@@ -1600,6 +1676,12 @@ GtkMenuItem* TextureBrowser_constructViewMenu(GtkMenu* menu)
     menu_tearoff (menu);
 
   create_check_menu_item_with_mnemonic(menu, "Hide _Unused", "ShowInUse");
+  if(string_empty(g_pGameDescription->getKeyValue("show_wads")))
+  {
+    create_check_menu_item_with_mnemonic(menu, "Hide Image Missing", "FilterNotex");
+  }
+  menu_separator(menu);
+
   create_menu_item_with_mnemonic(menu, "Show All", "ShowAllTextures");
 
   // we always want to show shaders but don't want a "Show Shaders" menu for doom3 and .wad file games
@@ -1621,6 +1703,8 @@ GtkMenuItem* TextureBrowser_constructViewMenu(GtkMenu* menu)
     create_menu_item_with_mnemonic(menu, "Show Untagged", "ShowUntagged");
   }
 
+  create_check_menu_item_with_mnemonic(menu, "Fixed Size", "FixedSize");
+
   if(string_empty(g_pGameDescription->getKeyValue("show_wads")))
   {
     menu_separator(menu);
@@ -1937,6 +2021,17 @@ void TextureBrowser_checkTagFile()
   }
 }
 
+void TextureBrowser_SetNotex()
+{
+  StringOutputStream name(256);
+  name << GlobalRadiant().getAppPath() << "bitmaps/notex.bmp";
+  g_notex = name.c_str();
+
+  name = NULL;
+  name << GlobalRadiant().getAppPath() << "bitmaps/shadernotex.bmp";
+  g_shadernotex = name.c_str();
+}
+
 GtkWidget* TextureBrowser_constructWindow(GtkWindow* toplevel)
 {
   // The gl_widget and the tag assignment frame should be packed into a GtkVPaned with the slider
@@ -1945,6 +2040,7 @@ GtkWidget* TextureBrowser_constructWindow(GtkWindow* toplevel)
   // for the "once-the-gtk-libs-are-updated-TODO-list" :x
 
   TextureBrowser_checkTagFile();
+  TextureBrowser_SetNotex();
 
   GlobalShaderSystem().setActiveShadersChangedNotify(ReferenceCaller<TextureBrowser, TextureBrowser_activeShadersChanged>(g_TextureBrowser));
 
@@ -2436,6 +2532,20 @@ void TextureBrowser_showUntagged()
   }
 }
 
+void TextureBrowser_FixedSize()
+{
+  g_TextureBrowser_fixedSize ^= 1;
+  GlobalTextureBrowser().m_fixedsize_item.update();
+  TextureBrowser_activeShadersChanged(GlobalTextureBrowser());
+}
+
+void TextureBrowser_FilterNotex()
+{
+  g_TextureBrowser_filterNotex ^= 1;
+  GlobalTextureBrowser().m_filternotex_item.update();
+  TextureBrowser_activeShadersChanged(GlobalTextureBrowser());
+}
+
 void TextureBrowser_exportTitle(const StringImportCallback& importer)
 {
   StringOutputStream buffer(64);
@@ -2555,6 +2665,8 @@ void TextureBrowser_Construct()
   GlobalCommands_insert("ToggleTextures", FreeCaller<TextureBrowser_toggleShow>(), Accelerator('T'));
   GlobalToggles_insert("ToggleShowShaders", FreeCaller<TextureBrowser_ToggleShowShaders>(), ToggleItem::AddCallbackCaller(g_TextureBrowser.m_showshaders_item));
   GlobalToggles_insert("ToggleShowShaderlistOnly", FreeCaller<TextureBrowser_ToggleShowShaderListOnly>(), ToggleItem::AddCallbackCaller(g_TextureBrowser.m_showshaderlistonly_item));
+  GlobalToggles_insert("FixedSize", FreeCaller<TextureBrowser_FixedSize>(), ToggleItem::AddCallbackCaller(g_TextureBrowser.m_fixedsize_item));
+  GlobalToggles_insert("FilterNotex", FreeCaller<TextureBrowser_FilterNotex>(), ToggleItem::AddCallbackCaller(g_TextureBrowser.m_filternotex_item));
 
   GlobalPreferenceSystem().registerPreference("TextureScale",
     makeSizeStringImportCallback(TextureBrowserSetScaleCaller(g_TextureBrowser)),
@@ -2566,6 +2678,8 @@ void TextureBrowser_Construct()
   );
   GlobalPreferenceSystem().registerPreference("ShowShaders", BoolImportStringCaller(GlobalTextureBrowser().m_showShaders), BoolExportStringCaller(GlobalTextureBrowser().m_showShaders));
   GlobalPreferenceSystem().registerPreference("ShowShaderlistOnly", BoolImportStringCaller(g_TextureBrowser_shaderlistOnly), BoolExportStringCaller(g_TextureBrowser_shaderlistOnly));
+  GlobalPreferenceSystem().registerPreference("FixedSize", BoolImportStringCaller(g_TextureBrowser_fixedSize), BoolExportStringCaller(g_TextureBrowser_fixedSize));
+  GlobalPreferenceSystem().registerPreference("FilterNotex", BoolImportStringCaller(g_TextureBrowser_filterNotex), BoolExportStringCaller(g_TextureBrowser_filterNotex));
   GlobalPreferenceSystem().registerPreference("LoadShaders", IntImportStringCaller(reinterpret_cast<int&>(GlobalTextureBrowser().m_startupShaders)), IntExportStringCaller(reinterpret_cast<int&>(GlobalTextureBrowser().m_startupShaders)));
   GlobalPreferenceSystem().registerPreference("WheelMouseInc", SizeImportStringCaller(GlobalTextureBrowser().m_mouseWheelScrollIncrement), SizeExportStringCaller(GlobalTextureBrowser().m_mouseWheelScrollIncrement));
   GlobalPreferenceSystem().registerPreference("SI_Colors0", Vector3ImportStringCaller(GlobalTextureBrowser().color_textureback), Vector3ExportStringCaller(GlobalTextureBrowser().color_textureback));