menus...
* help+: Blendmodes cheatsheet
misc...
* fix treemodel Clang compilation
* fix: 1x1 textures crash and appearence
* fix of: create func static in non doom3 gametype = group entity w/o objects
* merged tex bro textures borders; stipple indicates shaders
* realigned tex bro text, so one doesn't collide with textures borders
* fix of texture focusing in tex bro
* grayscale RLE TGA support
* unsupported Doom 3 entity keys: popup->log warning
* patch inspector: +flip texture buttons
* disabled texture lock by default (confuses novices, suddenly)
* added MeshTex plugin src to project, compiled, fixed (works now-)
template<typename Element>
class AllocatedMatrix : public Matrix<Element>
{
- std::size_t m_x, m_y;
- Element* m_data;
+ //std::size_t m_x, m_y;
+ //Element* m_data;
public: // public methods
/**
* @param x Matrix x dimension.
* @param y Matrix y dimension.
*/
- AllocatedMatrix(std::size_t x, std::size_t y) : m_x(x), m_y(y), m_data(_allocated = new Element[x*y]){}
-// Matrix(x, y, (_allocated = new Element[x*y])) {}
+ //AllocatedMatrix(std::size_t x, std::size_t y) : m_x(x), m_y(y), m_data(_allocated = new Element[x*y]){} //doesnt work.
+ //AllocatedMatrix(std::size_t x, std::size_t y) : Matrix(x, y, (_allocated = new Element[x*y])) {} //msvc
+ typedef Matrix<Element> matrix_type;
+ AllocatedMatrix(std::size_t x, std::size_t y) : matrix_type(x, y, (_allocated = new Element[x*y])) {}
+
/**
* Destructor. Deallocates the data array.
Element *_allocated;
};
-#endif // #if !defined(INCLUDED_ALLOCATEDMATRIX_H)
\ No newline at end of file
+#endif // #if !defined(INCLUDED_ALLOCATEDMATRIX_H)
*/
PluginUI::PluginUI()
{
+ PluginUI::singleton = this;
// Instantiate and register the Set S/T Scale dialog. We need a non-generic
// handle on this one too, because it will be used as input to the Get Info
// dialog constructor below.
{
}
+PluginUI* PluginUI::singleton = 0;
/**
* Get the singleton instance of the UI manager. Note that callers should
* almost certainly invoke the UIInstance global function instead of using
PluginUI&
PluginUI::Instance()
{
- static PluginUI singleton;
- return singleton;
+ //static PluginUI singleton;
+ //return singleton;
+ if(!singleton)
+ singleton = new PluginUI();
+ return *singleton;
}
/**
PluginUI();
~PluginUI();
//@}
+ // C++ 03
+ // ========
+ // Dont forget to declare these two. You want to make sure they
+ // are unacceptable otherwise you may accidentally get copies of
+ // your singleton appearing.
+ PluginUI(PluginUI const&); // Don't Implement
+ void operator=(PluginUI const&); // Don't implement
+
+ static PluginUI* singleton;
public: // public methods
static PluginUI& Instance();
};
-#endif // #if !defined(INCLUDED_PLUGINUI_H)
\ No newline at end of file
+#endif // #if !defined(INCLUDED_PLUGINUI_H)
</style>
</head>
<body>
-<p class="p1"><a href="http://dev.xonotic.org/projects/xonotic/wiki/Mapping">Xonotic Mapping Wiki</A></p>
+<p class="p1"><a href="https://gitlab.com/xonotic/xonotic/wikis/Mapping/Mapping">Xonotic Mapping Wiki</A></p>
</body>
</html>
return string_equal_n( string, prefix, string_length( prefix ) );
}
+/// \brief Returns true if the ending of \p string is equal to \p suffix.
+/// O(n)
+inline bool string_equal_suffix( const char* string, const char* suffix){
+ const char *s = string + string_length( string ) - string_length( suffix );
+ return string_equal_n( s , suffix, string_length( suffix ) );
+}
+
/// \brief Copies \p other into \p string and returns \p string.
/// Assumes that the space allocated for \p string is at least string_length(other) + 1.
/// O(n)
}
+class TargaDecodeGrayPixelRLE
+{
+TargaPacketSize m_packetSize;
+RGBAPixel m_pixel;
+TargaPacket m_packet;
+public:
+TargaDecodeGrayPixelRLE() : m_packetSize( 0 ){
+}
+void operator()( PointerInputStream& istream, RGBAPixel& pixel ){
+ if ( m_packetSize == 0 ) {
+ targa_packet_read_istream( m_packet, istream );
+ m_packetSize = targa_packet_size( m_packet );
+
+ if ( targa_packet_is_rle( m_packet ) ) {
+ istream_read_gray( istream, m_pixel );
+ }
+ }
+
+ if ( targa_packet_is_rle( m_packet ) ) {
+ pixel = m_pixel;
+ }
+ else
+ {
+ istream_read_gray( istream, pixel );
+ }
+
+ --m_packetSize;
+}
+};
+
+template<typename Flip>
+void targa_decode_rle_grayscale( PointerInputStream& istream, RGBAImage& image, const Flip& flip ){
+ TargaDecodeGrayPixelRLE decode;
+ image_decode( istream, decode, image, flip );
+}
+
class TargaDecodeRGBPixelRLE
{
TargaPacketSize m_packetSize;
return 0;
}
}
- else if ( targa_header.image_type == 10 ) {
+ else if ( targa_header.image_type == 10 || targa_header.image_type == 11 ) {
switch ( targa_header.pixel_size )
{
+ case 8:
+ targa_decode_rle_grayscale( istream, *image, flip );
+ break;
case 24:
targa_decode_rle_rgb( istream, *image, flip );
break;
targa_header_read_istream( targa_header, istream );
- if ( targa_header.image_type != 2 && targa_header.image_type != 10 && targa_header.image_type != 3 ) {
+ if ( targa_header.image_type != 2 && targa_header.image_type != 10 && targa_header.image_type != 3 && targa_header.image_type != 11 ) {
globalErrorStream() << "LoadTGA: TGA type " << targa_header.image_type << " not supported\n";
- globalErrorStream() << "LoadTGA: Only type 2 (RGB), 3 (gray), and 10 (RGB) TGA images supported\n";
+ globalErrorStream() << "LoadTGA: Only type 2 (RGB), 3 (gray), 10 (RGB), and 11 (gray) TGA images supported\n";
return 0;
}
return 0;
}
- if ( ( targa_header.pixel_size != 32 && targa_header.pixel_size != 24 )
- && targa_header.image_type != 3 ) {
- globalErrorStream() << "LoadTGA: Only 32 or 24 bit images supported\n";
+ if ( ( ( targa_header.image_type == 2 || targa_header.image_type == 10 ) && targa_header.pixel_size != 32 && targa_header.pixel_size != 24 ) ||
+ ( ( targa_header.image_type == 3 || targa_header.image_type == 11 ) && targa_header.pixel_size != 8 ) ) {
+ globalErrorStream() << "LoadTGA: Only 32, 24 or 8 bit images supported\n";
return 0;
}
Image* LoadTGA( ArchiveFile& file ){
ScopedArchiveBuffer buffer( file );
return LoadTGABuff( buffer.buffer );
-}
+}
\ No newline at end of file
QuantiseFunc Face::m_quantise;
EBrushType Face::m_type;
EBrushType FacePlane::m_type;
-bool g_brush_texturelock_enabled = true;
+bool g_brush_texturelock_enabled = false;
EBrushType Brush::m_type;
double Brush::m_maxWorldCoord = 0;
else
{
CopiedString tmp( key );
- ASSERT_MESSAGE( !string_equal_n( key, "editor_", 7 ), "unsupported editor key: " << makeQuoted( key ) );
+ //ASSERT_MESSAGE( !string_equal_n( key, "editor_", 7 ), "unsupported editor key: " << makeQuoted( key ) );
+ if ( string_equal_n( key, "editor_", 7 ) ) {
+ globalErrorStream() << "unsupported editor key " << makeQuoted( key ) ;
+ }
EntityClassAttribute& attribute = EntityClass_insertAttribute( entityClass, key ).second;
attribute.m_type = "string";
const char* value;
bool isModel = ( string_compare_nocase_n( name, "misc_", 5 ) == 0 && string_equal_nocase( name + string_length( name ) - 5, "model" ) ) // misc_*model (also misc_model)
|| string_equal_nocase( name, "model_static" )
- || ( GlobalSelectionSystem().countSelected() == 0 && string_equal_nocase( name, "func_static" ) );
+ || ( GlobalSelectionSystem().countSelected() == 0 && string_equal_nocase( name, "func_static" ) && g_pGameDescription->mGameType == "doom3" );
bool brushesSelected = Scene_countSelectedBrushes( GlobalSceneGraph() ) != 0;
create_menu_item_with_mnemonic( menu, "_Duplicate", "CloneSelection" );
create_menu_item_with_mnemonic( menu, "Duplicate, make uni_que", "CloneSelectionAndMakeUnique" );
create_menu_item_with_mnemonic( menu, "D_elete", "DeleteSelection" );
- menu_separator( menu );
- create_menu_item_with_mnemonic( menu, "Snap To Grid", "SnapToGrid" );
//create_menu_item_with_mnemonic( menu, "Pa_rent", "ParentSelection" );
menu_separator( menu );
create_menu_item_with_mnemonic( menu, "C_lear Selection", "UnSelectSelection" );
create_check_menu_item_with_mnemonic( menu_in_menu, "_Faces", "DragFaces" );
}
+ menu_separator( menu );
+ create_menu_item_with_mnemonic( menu, "Snap To Grid", "SnapToGrid" );
+
menu_separator( menu );
{
void Patch_registerShortcuts(){
// command_connect_accelerator( "InvertCurveTextureX" );
// command_connect_accelerator( "InvertCurveTextureY" );
- command_connect_accelerator( "IncPatchColumn" );
- command_connect_accelerator( "IncPatchRow" );
- command_connect_accelerator( "DecPatchColumn" );
- command_connect_accelerator( "DecPatchRow" );
+// command_connect_accelerator( "PatchInsertInsertColumn" );
+// command_connect_accelerator( "PatchInsertInsertRow" );
+// command_connect_accelerator( "PatchDeleteLastColumn" );
+// command_connect_accelerator( "PatchDeleteLastRow" );
// command_connect_accelerator( "NaturalizePatch" );
//command_connect_accelerator("CapCurrentCurve");
}
}
static void OnBtnPatchdetails( GtkWidget *widget, gpointer data ){
- UndoableCommand command( "patchCapTexture" );
-
- Scene_PatchCapTexture_Selected( GlobalSceneGraph() );
+ Patch_CapTexture();
}
static void OnBtnPatchfit( GtkWidget *widget, gpointer data ){
- UndoableCommand command( "patchFitTexture" );
-
- Scene_PatchTileTexture_Selected( GlobalSceneGraph(), 1, 1 );
+ Patch_FitTexture();
}
static void OnBtnPatchnatural( GtkWidget *widget, gpointer data ){
- UndoableCommand command( "patchNaturalTexture" );
-
- Scene_PatchNaturalTexture_Selected( GlobalSceneGraph() );
+ Patch_NaturalTexture();
}
static void OnBtnPatchreset( GtkWidget *widget, gpointer data ){
- float fx, fy;
- if ( DoTextureLayout( &fx, &fy ) == eIDOK ) {
- UndoableCommand command( "patchTileTexture" );
- Scene_PatchTileTexture_Selected( GlobalSceneGraph(), fx, fy );
- }
+ Patch_ResetTexture();
+}
+
+static void OnBtnPatchFlipX( GtkWidget *widget, gpointer data ){
+ Patch_FlipTextureX();
+}
+
+static void OnBtnPatchFlipY( GtkWidget *widget, gpointer data ){
+ Patch_FlipTextureY();
}
struct PatchRotateTexture
g_signal_connect( G_OBJECT( entry ), "key_press_event", G_CALLBACK( OnDialogKey ), 0 );
}
{
- GtkTable* table = GTK_TABLE( gtk_table_new( 5, 3, FALSE ) );
+ GtkTable* table = GTK_TABLE( gtk_table_new( 5, 4, FALSE ) );
gtk_widget_show( GTK_WIDGET( table ) );
gtk_box_pack_start( GTK_BOX( vbox2 ), GTK_WIDGET( table ), TRUE, TRUE, 0 );
gtk_table_set_row_spacings( table, 5 );
{
GtkLabel* label = GTK_LABEL( gtk_label_new( "Horizontal Shift Step" ) );
gtk_widget_show( GTK_WIDGET( label ) );
- gtk_table_attach( table, GTK_WIDGET( label ), 2, 3, 0, 1,
- (GtkAttachOptions)( GTK_FILL ),
+ gtk_table_attach( table, GTK_WIDGET( label ), 2, 4, 0, 1,
+ (GtkAttachOptions)( GTK_FILL|GTK_EXPAND ),
(GtkAttachOptions)( 0 ), 0, 0 );
gtk_misc_set_alignment( GTK_MISC( label ), 0, 0.5 );
}
{
GtkLabel* label = GTK_LABEL( gtk_label_new( "Vertical Shift Step" ) );
gtk_widget_show( GTK_WIDGET( label ) );
- gtk_table_attach( table, GTK_WIDGET( label ), 2, 3, 1, 2,
- (GtkAttachOptions)( GTK_FILL ),
+ gtk_table_attach( table, GTK_WIDGET( label ), 2, 4, 1, 2,
+ (GtkAttachOptions)( GTK_FILL|GTK_EXPAND ),
(GtkAttachOptions)( 0 ), 0, 0 );
gtk_misc_set_alignment( GTK_MISC( label ), 0, 0.5 );
}
GtkLabel* label = GTK_LABEL( gtk_label_new( "Horizontal Stretch Step" ) );
gtk_widget_show( GTK_WIDGET( label ) );
gtk_table_attach( table, GTK_WIDGET( label ), 2, 3, 2, 3,
- (GtkAttachOptions)( GTK_FILL ),
+ (GtkAttachOptions)( GTK_FILL|GTK_EXPAND ),
(GtkAttachOptions)( 0 ), 0, 0 );
gtk_misc_set_alignment( GTK_MISC( label ), 0, 0.5 );
}
+ {
+ GtkButton* button = GTK_BUTTON( gtk_button_new_with_label( "FlipX" ) );
+ gtk_widget_show( GTK_WIDGET( button ) );
+ gtk_table_attach( table, GTK_WIDGET( button ), 3, 4, 2, 3,
+ (GtkAttachOptions)( GTK_FILL ),
+ (GtkAttachOptions)( 0 ), 0, 0 );
+ g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( OnBtnPatchFlipX ), 0 );
+ gtk_widget_set_usize( GTK_WIDGET( button ), 60, -1 );
+ }
{
GtkLabel* label = GTK_LABEL( gtk_label_new( "Vertical Stretch Step" ) );
gtk_widget_show( GTK_WIDGET( label ) );
gtk_table_attach( table, GTK_WIDGET( label ), 2, 3, 3, 4,
- (GtkAttachOptions)( GTK_FILL ),
+ (GtkAttachOptions)( GTK_FILL|GTK_EXPAND ),
(GtkAttachOptions)( 0 ), 0, 0 );
gtk_misc_set_alignment( GTK_MISC( label ), 0, 0.5 );
}
+ {
+ GtkButton* button = GTK_BUTTON( gtk_button_new_with_label( "FlipY" ) );
+ gtk_widget_show( GTK_WIDGET( button ) );
+ gtk_table_attach( table, GTK_WIDGET( button ), 3, 4, 3, 4,
+ (GtkAttachOptions)( GTK_FILL ),
+ (GtkAttachOptions)( 0 ), 0, 0 );
+ g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( OnBtnPatchFlipY ), 0 );
+ gtk_widget_set_usize( GTK_WIDGET( button ), 60, -1 );
+ }
{
GtkLabel* label = GTK_LABEL( gtk_label_new( "Rotate Step" ) );
gtk_widget_show( GTK_WIDGET( label ) );
- gtk_table_attach( table, GTK_WIDGET( label ), 2, 3, 4, 5,
- (GtkAttachOptions)( GTK_FILL ),
+ gtk_table_attach( table, GTK_WIDGET( label ), 2, 4, 4, 5,
+ (GtkAttachOptions)( GTK_FILL|GTK_EXPAND ),
(GtkAttachOptions)( 0 ), 0, 0 );
gtk_misc_set_alignment( GTK_MISC( label ), 0, 0.5 );
}
Scene_PatchNaturalTexture_Selected( GlobalSceneGraph() );
}
+void Patch_CapTexture(){
+ UndoableCommand command( "patchCapTexture" );
+ Scene_PatchCapTexture_Selected( GlobalSceneGraph() );
+}
+
+void Patch_ResetTexture(){
+ float fx, fy;
+ if ( DoTextureLayout( &fx, &fy ) == eIDOK ) {
+ UndoableCommand command( "patchTileTexture" );
+ Scene_PatchTileTexture_Selected( GlobalSceneGraph(), fx, fy );
+ }
+}
+
+void Patch_FitTexture(){
+ UndoableCommand command( "patchFitTexture" );
+ Scene_PatchTileTexture_Selected( GlobalSceneGraph(), 1, 1 );
+}
+
void DoPatchDeformDlg();
void Patch_Deform(){
void Patch_registerCommands(){
GlobalCommands_insert( "InvertCurveTextureX", FreeCaller<Patch_FlipTextureX>(), Accelerator( 'I', (GdkModifierType)( GDK_SHIFT_MASK | GDK_CONTROL_MASK ) ) );
GlobalCommands_insert( "InvertCurveTextureY", FreeCaller<Patch_FlipTextureY>(), Accelerator( 'I', (GdkModifierType)GDK_SHIFT_MASK ) );
- GlobalCommands_insert( "IncPatchColumn", FreeCaller<Patch_InsertInsertColumn>(), Accelerator( GDK_KP_Add, (GdkModifierType)( GDK_SHIFT_MASK | GDK_CONTROL_MASK ) ) );
- GlobalCommands_insert( "IncPatchRow", FreeCaller<Patch_InsertInsertRow>(), Accelerator( GDK_KP_Add, (GdkModifierType)GDK_CONTROL_MASK ) );
- GlobalCommands_insert( "DecPatchColumn", FreeCaller<Patch_DeleteLastColumn>(), Accelerator( GDK_KP_Subtract, (GdkModifierType)( GDK_SHIFT_MASK | GDK_CONTROL_MASK ) ) );
- GlobalCommands_insert( "DecPatchRow", FreeCaller<Patch_DeleteLastRow>(), Accelerator( GDK_KP_Subtract, (GdkModifierType)GDK_CONTROL_MASK ) );
GlobalCommands_insert( "NaturalizePatch", FreeCaller<Patch_NaturalTexture>(), Accelerator( 'N', (GdkModifierType)GDK_CONTROL_MASK ) );
GlobalCommands_insert( "PatchCylinder", FreeCaller<Patch_Cylinder>() );
GlobalCommands_insert( "PatchDenseCylinder", FreeCaller<Patch_DenseCylinder>() );
GlobalCommands_insert( "PatchCone", FreeCaller<Patch_Cone>() );
GlobalCommands_insert( "PatchSphere", FreeCaller<Patch_Sphere>() );
GlobalCommands_insert( "SimplePatchMesh", FreeCaller<Patch_Plane>(), Accelerator( 'P', (GdkModifierType)GDK_SHIFT_MASK ) );
- GlobalCommands_insert( "PatchInsertInsertColumn", FreeCaller<Patch_InsertInsertColumn>() );
+ GlobalCommands_insert( "PatchInsertInsertColumn", FreeCaller<Patch_InsertInsertColumn>(), Accelerator( GDK_KP_Add, (GdkModifierType)( GDK_SHIFT_MASK | GDK_CONTROL_MASK ) ) );
GlobalCommands_insert( "PatchInsertAddColumn", FreeCaller<Patch_InsertAddColumn>() );
- GlobalCommands_insert( "PatchInsertInsertRow", FreeCaller<Patch_InsertInsertRow>() );
+ GlobalCommands_insert( "PatchInsertInsertRow", FreeCaller<Patch_InsertInsertRow>(), Accelerator( GDK_KP_Add, (GdkModifierType)GDK_CONTROL_MASK ) );
GlobalCommands_insert( "PatchInsertAddRow", FreeCaller<Patch_InsertAddRow>() );
GlobalCommands_insert( "PatchDeleteFirstColumn", FreeCaller<Patch_DeleteFirstColumn>() );
- GlobalCommands_insert( "PatchDeleteLastColumn", FreeCaller<Patch_DeleteLastColumn>() );
+ GlobalCommands_insert( "PatchDeleteLastColumn", FreeCaller<Patch_DeleteLastColumn>(), Accelerator( GDK_KP_Subtract, (GdkModifierType)( GDK_SHIFT_MASK | GDK_CONTROL_MASK ) ) );
GlobalCommands_insert( "PatchDeleteFirstRow", FreeCaller<Patch_DeleteFirstRow>() );
- GlobalCommands_insert( "PatchDeleteLastRow", FreeCaller<Patch_DeleteLastRow>() );
+ GlobalCommands_insert( "PatchDeleteLastRow", FreeCaller<Patch_DeleteLastRow>(), Accelerator( GDK_KP_Subtract, (GdkModifierType)GDK_CONTROL_MASK ) );
GlobalCommands_insert( "InvertCurve", FreeCaller<Patch_Invert>(), Accelerator( 'I', (GdkModifierType)GDK_CONTROL_MASK ) );
GlobalCommands_insert( "RedisperseRows", FreeCaller<Patch_RedisperseRows>(), Accelerator( 'E', (GdkModifierType)GDK_CONTROL_MASK ) );
GlobalCommands_insert( "RedisperseCols", FreeCaller<Patch_RedisperseCols>(), Accelerator( 'E', (GdkModifierType)( GDK_SHIFT_MASK | GDK_CONTROL_MASK ) ) );
if ( g_Layout_enableDetachableMenus.m_value ) {
menu_tearoff( menu_in_menu );
}
- create_menu_item_with_mnemonic( menu_in_menu, "Insert (2) Columns", "PatchInsertInsertColumn" );
create_menu_item_with_mnemonic( menu_in_menu, "Add (2) Columns", "PatchInsertAddColumn" );
+ create_menu_item_with_mnemonic( menu_in_menu, "Insert (2) Columns", "PatchInsertInsertColumn" );
menu_separator( menu_in_menu );
- create_menu_item_with_mnemonic( menu_in_menu, "Insert (2) Rows", "PatchInsertInsertRow" );
create_menu_item_with_mnemonic( menu_in_menu, "Add (2) Rows", "PatchInsertAddRow" );
+ create_menu_item_with_mnemonic( menu_in_menu, "Insert (2) Rows", "PatchInsertInsertRow" );
}
{
GtkMenu* menu_in_menu = create_sub_menu_with_mnemonic( menu, "Delete" );
void Patch_registerPreferencesPage();
+void Patch_NaturalTexture();
+void Patch_CapTexture();
+void Patch_ResetTexture();
+void Patch_FitTexture();
+void Patch_FlipTextureX();
+void Patch_FlipTextureY();
+
class PatchCreator;
extern PatchCreator* g_patchCreator;
}
static void OnBtnPatchdetails( GtkWidget *widget, gpointer data ){
- Scene_PatchCapTexture_Selected( GlobalSceneGraph() );
+ Patch_CapTexture();
}
static void OnBtnPatchnatural( GtkWidget *widget, gpointer data ){
- Scene_PatchNaturalTexture_Selected( GlobalSceneGraph() );
+ Patch_NaturalTexture();
}
static void OnBtnPatchreset( GtkWidget *widget, gpointer data ){
- float fx, fy;
-
- if ( DoTextureLayout( &fx, &fy ) == eIDOK ) {
- Scene_PatchTileTexture_Selected( GlobalSceneGraph(), fx, fy );
- }
+ Patch_ResetTexture();
}
static void OnBtnPatchFit( GtkWidget *widget, gpointer data ){
- Scene_PatchTileTexture_Selected( GlobalSceneGraph(), 1, 1 );
+ Patch_FitTexture();
}
static void OnBtnAxial( GtkWidget *widget, gpointer data ){
// Don't use uniform size
W = (int)( tex->width * ( (float)m_textureScale / 100 ) );
H = (int)( tex->height * ( (float)m_textureScale / 100 ) );
+ if ( W < 1 ) W = 1;
+ if ( H < 1 ) H = 1;
if ( g_TextureBrowser_fixedSize ){
if ( W >= H ) {
textureBrowser.getTextureWH( q, nWidth, nHeight );
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;
- layout.current_y -= layout.current_row + TextureBrowser_fontHeight( textureBrowser ) + 4;
+ layout.current_y -= layout.current_row + TextureBrowser_fontHeight( textureBrowser ) + 4;//+4
layout.current_row = 0;
}
// we have found when texdef->name and the shader name match
// NOTE: as everywhere else for our comparisons, we are not case sensitive
if ( shader_equal( name, shader->getName() ) ) {
- int textureHeight = (int)( q->height * ( (float)textureBrowser.m_textureScale / 100 ) )
- + 2 * TextureBrowser_fontHeight( textureBrowser );
+ //int textureHeight = (int)( q->height * ( (float)textureBrowser.m_textureScale / 100 ) ) + 2 * TextureBrowser_fontHeight( textureBrowser );
+ int textureWidth, textureHeight;
+ textureBrowser.getTextureWH( q, textureWidth, textureHeight );
+ textureHeight += 2 * TextureBrowser_fontHeight( textureBrowser );
+
int originy = TextureBrowser_getOriginY( textureBrowser );
if ( y > originy ) {
- originy = y;
+ originy = y + 4;
}
if ( y - textureHeight < originy - textureBrowser.height ) {
// if !texture_showinuse: (some textures displayed may not be in use)
// draw an additional square around with 0.5 1 0.5 color
glLineWidth( 1 );
- // shader border:
- if ( !shader->IsDefault() ) {
- //real 1px white/black stipple
- glColor3f( 0, 0, 0 );
- glDisable( GL_TEXTURE_2D );
-
- float xf = (float)x;
- float yf = (float)( y - TextureBrowser_fontHeight( textureBrowser ) );
- glBegin( GL_LINE_LOOP );
- glVertex2f( xf - 1.5,yf + 1.5 );
- glVertex2f( xf - 1.5,yf - nHeight - 1.5 );
- glVertex2f( xf + 1.5 + nWidth,yf - nHeight - 1.5 );
- glVertex2f( xf + 1.5 + nWidth,yf + 1.5 );
-
- glEnd();
-
- glEnable( GL_LINE_STIPPLE );
- glLineStipple( 1, 0x0FFF );
-
- glBegin( GL_LINE_LOOP );
- glColor3f( 1, 1, 1 );
-
- glVertex2f( xf - 1.5,yf + 1.5 );
- glVertex2f( xf - 1.5,yf - nHeight - 1.5 );
- glVertex2f( xf + 1.5 + nWidth,yf - nHeight - 1.5 );
- glVertex2f( xf + 1.5 + nWidth,yf + 1.5 );
-
- glEnd();
- glDisable( GL_LINE_STIPPLE );
- glEnable( GL_TEXTURE_2D );
-
- }
+ const float xf = (float)x;
+ const float yf = (float)( y - TextureBrowser_fontHeight( textureBrowser ) );
+ float xfMax = xf + 1.5 + nWidth;
+ float xfMin = xf - 1.5;
+ float yfMax = yf + 1.5;
+ float yfMin = yf - nHeight - 1.5;
+
+ //selected texture
if ( shader_equal( TextureBrowser_GetSelectedShader( textureBrowser ), shader->getName() ) ) {
glLineWidth( 2 );
if ( textureBrowser.m_rmbSelected ) {
else {
glColor3f( 1,0,0 );
}
+ xfMax += .5;
+ xfMin -= .5;
+ yfMax += .5;
+ yfMin -= .5;
glDisable( GL_TEXTURE_2D );
-
glBegin( GL_LINE_LOOP );
- glVertex2i( x - 4,y - TextureBrowser_fontHeight( textureBrowser ) + 4 );
- glVertex2i( x - 4,y - TextureBrowser_fontHeight( textureBrowser ) - nHeight - 4 );
- glVertex2i( x + 4 + nWidth,y - TextureBrowser_fontHeight( textureBrowser ) - nHeight - 4 );
- glVertex2i( x + 4 + nWidth,y - TextureBrowser_fontHeight( textureBrowser ) + 4 );
+ glVertex2f( xfMin ,yfMax );
+ glVertex2f( xfMin ,yfMin );
+ glVertex2f( xfMax ,yfMin );
+ glVertex2f( xfMax ,yfMax );
glEnd();
-
glEnable( GL_TEXTURE_2D );
- glLineWidth( 1 );
}
// highlight in-use textures
else if ( !textureBrowser.m_hideUnused && shader->IsInUse() ) {
- //1px with float
- float xf = (float)x;
- float yf = (float)( y - TextureBrowser_fontHeight( textureBrowser ) );
glColor3f( 0.5,1,0.5 );
glDisable( GL_TEXTURE_2D );
glBegin( GL_LINE_LOOP );
- glVertex2f( xf - 3.5,yf + 3.5 );
- glVertex2f( xf - 3.5,yf - nHeight - 3.5 );
- glVertex2f( xf + 3.5 + nWidth,yf - nHeight - 3.5 );
- glVertex2f( xf + 3.5 + nWidth,yf + 3.5 );
+ glVertex2f( xfMin ,yfMax );
+ glVertex2f( xfMin ,yfMin );
+ glVertex2f( xfMax ,yfMin );
+ glVertex2f( xfMax ,yfMax );
+ glEnd();
+ glEnable( GL_TEXTURE_2D );
+ }
+ // shader white border:
+ else if ( !shader->IsDefault() ) {
+ glColor3f( 1, 1, 1 );
+ glDisable( GL_TEXTURE_2D );
+ glBegin( GL_LINE_LOOP );
+ glVertex2f( xfMin ,yfMax );
+ glVertex2f( xfMin ,yfMin );
+ glVertex2f( xfMax ,yfMin );
+ glVertex2f( xfMax ,yfMax );
glEnd();
+ }
+
+ // shader stipple:
+ if ( !shader->IsDefault() ) {
+ glEnable( GL_LINE_STIPPLE );
+ glLineStipple( 1, 0xF000 );
+ glBegin( GL_LINE_LOOP );
+ glColor3f( 0, 0, 0 );
+ glVertex2f( xfMin ,yfMax );
+ glVertex2f( xfMin ,yfMin );
+ glVertex2f( xfMax ,yfMin );
+ glVertex2f( xfMax ,yfMax );
+ glEnd();
+ glDisable( GL_LINE_STIPPLE );
glEnable( GL_TEXTURE_2D );
}
glDisable( GL_TEXTURE_2D );
glColor3f( 1,1,1 );
- glRasterPos2i( x, y - TextureBrowser_fontHeight( textureBrowser ) + 5 );
+ glRasterPos2i( x, y - TextureBrowser_fontHeight( textureBrowser ) + 2 );//+5
// don't draw the directory name
const char* name = shader->getName();
};
void node_attach_name_changed_callback( scene::Node& node, const NameCallback& callback ){
- if ( &node != 0 ) {
+ // line 650: Reference cannot be bound to dereferenced null pointer in well-defined
+ // C++ code, and Clang will assume that comparison below always evaluates
+ // to true, resulting in a segmentation fault. Use a dirty hack to force
+ // Clang to check those "bad" references for null nonetheless.
+ volatile intptr_t n = (intptr_t)&node;
+
+ if ( n != 0 ) {
Nameable* nameable = Node_getNameable( node );
if ( nameable != 0 ) {
nameable->attach( callback );
}
}
void node_detach_name_changed_callback( scene::Node& node, const NameCallback& callback ){
- if ( &node != 0 ) {
+ volatile intptr_t n = (intptr_t)&node; // see the comment on line 650
+
+ if ( n != 0 ) {
Nameable* nameable = Node_getNameable( node );
if ( nameable != 0 ) {
nameable->detach( callback );
const char* node_get_name( scene::Node& node );
const char* node_get_name_safe( scene::Node& node ){
- if ( &node == 0 ) {
+ volatile intptr_t n = (intptr_t)&node; // see the comment on line 650
+ if ( n == 0 ) {
return "";
}
return node_get_name( node );
}
void node_attach_name_changed_callback( scene::Node& node, const NameCallback& callback ){
- if ( &node != 0 ) {
+ volatile intptr_t n = (intptr_t)&node; // see the comment on line 650
+ if ( n != 0 ) {
Nameable* nameable = Node_getNameable( node );
if ( nameable != 0 ) {
nameable->attach( callback );
}
}
void node_detach_name_changed_callback( scene::Node& node, const NameCallback& callback ){
- if ( &node != 0 ) {
+ volatile intptr_t n = (intptr_t)&node; // see the comment on line 650
+ if ( n != 0 ) {
Nameable* nameable = Node_getNameable( node );
if ( nameable != 0 ) {
nameable->detach( callback );
<item name="Complete list of entity keys" url="docs/Complete_list_of_entity_keys.htm"/>
<item name="Complete list of shader keywords" url="docs/Complete_list_of_shader_keywords.htm"/>
<item name="Q3Map2 - FS20 - R5 readme" url="docs/fsr_readme.txt"/>
+<item name="Blendmodes cheatsheet" url="docs/Blendmodes_cheatsheet.jpg"/>
<!--item name="ETB documentation (web)" url="http://www.map-craft.com/modules.php?name=ETB"/-->
</links>