-Added ability to use cubic interpolation on image resize (little more quality on non-po2 resizing)
-Added ability for exporter to shrink images to non-integer values. Helps if you want to convert your game artwork from 1080->720 or similar
This commit is contained in:
parent
0840303a9c
commit
e055247b17
107
core/image.cpp
107
core/image.cpp
@ -400,6 +400,102 @@ Image::Format Image::get_format() const{
|
||||
return format;
|
||||
}
|
||||
|
||||
static double _bicubic_interp_kernel( double x ) {
|
||||
|
||||
x = ABS(x);
|
||||
|
||||
double bc = 0;
|
||||
|
||||
if ( x <= 1 )
|
||||
bc = ( 1.5 * x - 2.5 ) * x * x + 1;
|
||||
else if ( x < 2 )
|
||||
bc = ( ( -0.5 * x + 2.5 ) * x - 4 ) * x + 2;
|
||||
|
||||
|
||||
return bc;
|
||||
}
|
||||
|
||||
template<int CC>
|
||||
static void _scale_cubic(const uint8_t* p_src, uint8_t* p_dst, uint32_t p_src_width, uint32_t p_src_height, uint32_t p_dst_width, uint32_t p_dst_height) {
|
||||
|
||||
|
||||
// get source image size
|
||||
int width = p_src_width;
|
||||
int height = p_src_height;
|
||||
double xfac = (double) width / p_dst_width;
|
||||
double yfac = (double) height / p_dst_height;
|
||||
// coordinates of source points and cooefficiens
|
||||
double ox, oy, dx, dy, k1, k2;
|
||||
int ox1, oy1, ox2, oy2;
|
||||
// destination pixel values
|
||||
// width and height decreased by 1
|
||||
int ymax = height - 1;
|
||||
int xmax = width - 1;
|
||||
// temporary pointer
|
||||
|
||||
for ( int y = 0; y < p_dst_height; y++ ) {
|
||||
// Y coordinates
|
||||
oy = (double) y * yfac - 0.5f;
|
||||
oy1 = (int) oy;
|
||||
dy = oy - (double) oy1;
|
||||
|
||||
for ( int x = 0; x < p_dst_width; x++ ) {
|
||||
// X coordinates
|
||||
ox = (double) x * xfac - 0.5f;
|
||||
ox1 = (int) ox;
|
||||
dx = ox - (double) ox1;
|
||||
|
||||
// initial pixel value
|
||||
|
||||
uint8_t *dst=p_dst + (y*p_dst_width+x)*CC;
|
||||
|
||||
double color[CC];
|
||||
for(int i=0;i<CC;i++) {
|
||||
color[i]=0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
for ( int n = -1; n < 3; n++ ) {
|
||||
// get Y cooefficient
|
||||
k1 = _bicubic_interp_kernel( dy - (double) n );
|
||||
|
||||
oy2 = oy1 + n;
|
||||
if ( oy2 < 0 )
|
||||
oy2 = 0;
|
||||
if ( oy2 > ymax )
|
||||
oy2 = ymax;
|
||||
|
||||
for ( int m = -1; m < 3; m++ ) {
|
||||
// get X cooefficient
|
||||
k2 = k1 * _bicubic_interp_kernel( (double) m - dx );
|
||||
|
||||
ox2 = ox1 + m;
|
||||
if ( ox2 < 0 )
|
||||
ox2 = 0;
|
||||
if ( ox2 > xmax )
|
||||
ox2 = xmax;
|
||||
|
||||
// get pixel of original image
|
||||
const uint8_t *p = p_src + (oy2 * p_src_width + ox2)*CC;
|
||||
|
||||
for(int i=0;i<CC;i++) {
|
||||
|
||||
color[i]+=p[i]*k2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(int i=0;i<CC;i++) {
|
||||
dst[i]=CLAMP(Math::fast_ftoi(color[i]),0,255);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
template<int CC>
|
||||
static void _scale_bilinear(const uint8_t* p_src, uint8_t* p_dst, uint32_t p_src_width, uint32_t p_src_height, uint32_t p_dst_width, uint32_t p_dst_height) {
|
||||
|
||||
@ -559,6 +655,17 @@ void Image::resize( int p_width, int p_height, Interpolation p_interpolation ) {
|
||||
}
|
||||
|
||||
} break;
|
||||
case INTERPOLATE_CUBIC: {
|
||||
|
||||
switch(get_format_pixel_size(format)) {
|
||||
case 1: _scale_cubic<1>(r_ptr,w_ptr,width,height,p_width,p_height); break;
|
||||
case 2: _scale_cubic<2>(r_ptr,w_ptr,width,height,p_width,p_height); break;
|
||||
case 3: _scale_cubic<3>(r_ptr,w_ptr,width,height,p_width,p_height); break;
|
||||
case 4: _scale_cubic<4>(r_ptr,w_ptr,width,height,p_width,p_height); break;
|
||||
}
|
||||
|
||||
} break;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
@ -91,6 +91,7 @@ public:
|
||||
|
||||
INTERPOLATE_NEAREST,
|
||||
INTERPOLATE_BILINEAR,
|
||||
INTERPOLATE_CUBIC,
|
||||
/* INTERPOLATE GAUSS */
|
||||
};
|
||||
|
||||
|
@ -1,376 +1,376 @@
|
||||
#
|
||||
# tested on | Windows native | Linux cross-compilation
|
||||
# ------------------------+-------------------+---------------------------
|
||||
# MSVS C++ 2010 Express | WORKS | n/a
|
||||
# Mingw-w64 | WORKS | WORKS
|
||||
# Mingw-w32 | WORKS | WORKS
|
||||
# MinGW | WORKS | untested
|
||||
#
|
||||
#####
|
||||
# Notes about MSVS C++ :
|
||||
#
|
||||
# - MSVC2010-Express compiles to 32bits only.
|
||||
#
|
||||
#####
|
||||
# Notes about Mingw-w64 and Mingw-w32 under Windows :
|
||||
#
|
||||
# - both can be installed using the official installer :
|
||||
# http://mingw-w64.sourceforge.net/download.php#mingw-builds
|
||||
#
|
||||
# - if you want to compile both 32bits and 64bits, don't forget to
|
||||
# run the installer twice to install them both.
|
||||
#
|
||||
# - install them into a path that does not contain spaces
|
||||
# ( example : "C:/Mingw-w32", "C:/Mingw-w64" )
|
||||
#
|
||||
# - if you want to compile faster using the "-j" option, don't forget
|
||||
# to install the appropriate version of the Pywin32 python extension
|
||||
# available from : http://sourceforge.net/projects/pywin32/files/
|
||||
#
|
||||
# - before running scons, you must add into the environment path
|
||||
# the path to the "/bin" directory of the Mingw version you want
|
||||
# to use :
|
||||
#
|
||||
# set PATH=C:/Mingw-w32/bin;%PATH%
|
||||
#
|
||||
# - then, scons should be able to detect gcc.
|
||||
# - Mingw-w32 only compiles 32bits.
|
||||
# - Mingw-w64 only compiles 64bits.
|
||||
#
|
||||
# - it is possible to add them both at the same time into the PATH env,
|
||||
# if you also define the MINGW32_PREFIX and MINGW64_PREFIX environment
|
||||
# variables.
|
||||
# For instance, you could store that set of commands into a .bat script
|
||||
# that you would run just before scons :
|
||||
#
|
||||
# set PATH=C:\mingw-w32\bin;%PATH%
|
||||
# set PATH=C:\mingw-w64\bin;%PATH%
|
||||
# set MINGW32_PREFIX=C:\mingw-w32\bin\
|
||||
# set MINGW64_PREFIX=C:\mingw-w64\bin\
|
||||
#
|
||||
#####
|
||||
# Notes about Mingw, Mingw-w64 and Mingw-w32 under Linux :
|
||||
#
|
||||
# - default toolchain prefixes are :
|
||||
# "i586-mingw32msvc-" for MinGW
|
||||
# "i686-w64-mingw32-" for Mingw-w32
|
||||
# "x86_64-w64-mingw32-" for Mingw-w64
|
||||
#
|
||||
# - if both MinGW and Mingw-w32 are installed on your system
|
||||
# Mingw-w32 should take the priority over MinGW.
|
||||
#
|
||||
# - it is possible to manually override prefixes by defining
|
||||
# the MINGW32_PREFIX and MINGW64_PREFIX environment variables.
|
||||
#
|
||||
#####
|
||||
# Notes about Mingw under Windows :
|
||||
#
|
||||
# - this is the MinGW version from http://mingw.org/
|
||||
# - install it into a path that does not contain spaces
|
||||
# ( example : "C:/MinGW" )
|
||||
# - several DirectX headers might be missing. You can copy them into
|
||||
# the C:/MinGW/include" directory from this page :
|
||||
# https://code.google.com/p/mingw-lib/source/browse/trunk/working/avcodec_to_widget_5/directx_include/
|
||||
# - before running scons, add the path to the "/bin" directory :
|
||||
# set PATH=C:/MinGW/bin;%PATH%
|
||||
# - scons should be able to detect gcc.
|
||||
#
|
||||
|
||||
#####
|
||||
# TODO :
|
||||
#
|
||||
# - finish to cleanup this script to remove all the remains of previous hacks and workarounds
|
||||
# - make it work with the Windows7 SDK that is supposed to enable 64bits compilation for MSVC2010-Express
|
||||
# - confirm it works well with other Visual Studio versions.
|
||||
# - update the wiki about the pywin32 extension required for the "-j" option under Windows.
|
||||
# - update the wiki to document MINGW32_PREFIX and MINGW64_PREFIX
|
||||
#
|
||||
|
||||
import os
|
||||
|
||||
import sys
|
||||
|
||||
|
||||
def is_active():
|
||||
return True
|
||||
|
||||
def get_name():
|
||||
return "Windows"
|
||||
|
||||
def can_build():
|
||||
|
||||
if (os.name=="nt"):
|
||||
#building natively on windows!
|
||||
if (os.getenv("VSINSTALLDIR")):
|
||||
return True
|
||||
else:
|
||||
print("\nMSVC not detected, attempting Mingw.")
|
||||
mingw32 = ""
|
||||
mingw64 = ""
|
||||
if ( os.getenv("MINGW32_PREFIX") ) :
|
||||
mingw32 = os.getenv("MINGW32_PREFIX")
|
||||
if ( os.getenv("MINGW64_PREFIX") ) :
|
||||
mingw64 = os.getenv("MINGW64_PREFIX")
|
||||
|
||||
test = "gcc --version > NUL 2>&1"
|
||||
if os.system(test)!= 0 and os.system(mingw32+test)!=0 and os.system(mingw64+test)!=0 :
|
||||
print("- could not detect gcc.")
|
||||
print("Please, make sure a path to a Mingw /bin directory is accessible into the environment PATH.\n")
|
||||
return False
|
||||
else:
|
||||
print("- gcc detected.")
|
||||
|
||||
return True
|
||||
|
||||
if (os.name=="posix"):
|
||||
|
||||
mingw = "i586-mingw32msvc-"
|
||||
mingw64 = "x86_64-w64-mingw32-"
|
||||
mingw32 = "i686-w64-mingw32-"
|
||||
|
||||
if (os.getenv("MINGW32_PREFIX")):
|
||||
mingw32=os.getenv("MINGW32_PREFIX")
|
||||
mingw = mingw32
|
||||
if (os.getenv("MINGW64_PREFIX")):
|
||||
mingw64=os.getenv("MINGW64_PREFIX")
|
||||
|
||||
test = "gcc --version &>/dev/null"
|
||||
if (os.system(mingw+test) == 0 or os.system(mingw64+test) == 0 or os.system(mingw32+test) == 0):
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def get_opts():
|
||||
|
||||
mingw=""
|
||||
mingw32=""
|
||||
mingw64=""
|
||||
if ( os.name == "posix" ):
|
||||
mingw = "i586-mingw32msvc-"
|
||||
mingw32 = "i686-w64-mingw32-"
|
||||
mingw64 = "x86_64-w64-mingw32-"
|
||||
|
||||
if os.system(mingw32+"gcc --version &>/dev/null") != 0 :
|
||||
mingw32 = mingw
|
||||
|
||||
if (os.getenv("MINGW32_PREFIX")):
|
||||
mingw32=os.getenv("MINGW32_PREFIX")
|
||||
mingw = mingw32
|
||||
if (os.getenv("MINGW64_PREFIX")):
|
||||
mingw64=os.getenv("MINGW64_PREFIX")
|
||||
|
||||
|
||||
return [
|
||||
('mingw_prefix','Mingw Prefix',mingw32),
|
||||
('mingw_prefix_64','Mingw Prefix 64 bits',mingw64),
|
||||
]
|
||||
|
||||
def get_flags():
|
||||
|
||||
return [
|
||||
('freetype','builtin'), #use builtin freetype
|
||||
('openssl','builtin'), #use builtin openssl
|
||||
('theora','no'),
|
||||
]
|
||||
|
||||
|
||||
|
||||
def configure(env):
|
||||
|
||||
env.Append(CPPPATH=['#platform/windows'])
|
||||
|
||||
|
||||
if (os.name=="nt" and os.getenv("VSINSTALLDIR")!=None):
|
||||
#build using visual studio
|
||||
env['ENV']['TMP'] = os.environ['TMP']
|
||||
env.Append(CPPPATH=['#platform/windows/include'])
|
||||
env.Append(LIBPATH=['#platform/windows/lib'])
|
||||
|
||||
if (env["freetype"]!="no"):
|
||||
env.Append(CCFLAGS=['/DFREETYPE_ENABLED'])
|
||||
env.Append(CPPPATH=['#tools/freetype'])
|
||||
env.Append(CPPPATH=['#tools/freetype/freetype/include'])
|
||||
|
||||
if (env["target"]=="release"):
|
||||
|
||||
env.Append(CCFLAGS=['/O2'])
|
||||
env.Append(LINKFLAGS=['/SUBSYSTEM:WINDOWS'])
|
||||
env.Append(LINKFLAGS=['/ENTRY:mainCRTStartup'])
|
||||
|
||||
elif (env["target"]=="release_debug"):
|
||||
|
||||
env.Append(CCFLAGS=['/O2','/DDEBUG_ENABLED'])
|
||||
env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE'])
|
||||
elif (env["target"]=="debug_release"):
|
||||
|
||||
env.Append(CCFLAGS=['/Zi','/Od'])
|
||||
env.Append(LINKFLAGS=['/DEBUG'])
|
||||
env.Append(LINKFLAGS=['/SUBSYSTEM:WINDOWS'])
|
||||
env.Append(LINKFLAGS=['/ENTRY:mainCRTStartup'])
|
||||
|
||||
elif (env["target"]=="debug"):
|
||||
|
||||
env.Append(CCFLAGS=['/Zi','/DDEBUG_ENABLED','/DDEBUG_MEMORY_ENABLED','/DD3D_DEBUG_INFO','/Od'])
|
||||
env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE'])
|
||||
env.Append(LINKFLAGS=['/DEBUG'])
|
||||
|
||||
|
||||
env.Append(CCFLAGS=['/MT','/Gd','/GR','/nologo'])
|
||||
env.Append(CXXFLAGS=['/TP'])
|
||||
env.Append(CPPFLAGS=['/DMSVC', '/GR', ])
|
||||
env.Append(CCFLAGS=['/I'+os.getenv("WindowsSdkDir")+"/Include"])
|
||||
env.Append(CCFLAGS=['/DWINDOWS_ENABLED'])
|
||||
env.Append(CCFLAGS=['/DRTAUDIO_ENABLED'])
|
||||
env.Append(CCFLAGS=['/DWIN32'])
|
||||
env.Append(CCFLAGS=['/DTYPED_METHOD_BIND'])
|
||||
|
||||
env.Append(CCFLAGS=['/DGLES2_ENABLED'])
|
||||
|
||||
env.Append(CCFLAGS=['/DGLEW_ENABLED'])
|
||||
LIBS=['winmm','opengl32','dsound','kernel32','ole32','user32','gdi32', 'IPHLPAPI','Shlwapi', 'wsock32', 'shell32','advapi32']
|
||||
env.Append(LINKFLAGS=[p+env["LIBSUFFIX"] for p in LIBS])
|
||||
|
||||
env.Append(LIBPATH=[os.getenv("WindowsSdkDir")+"/Lib"])
|
||||
if (os.getenv("DXSDK_DIR")):
|
||||
DIRECTX_PATH=os.getenv("DXSDK_DIR")
|
||||
else:
|
||||
DIRECTX_PATH="C:/Program Files/Microsoft DirectX SDK (March 2009)"
|
||||
|
||||
if (os.getenv("VCINSTALLDIR")):
|
||||
VC_PATH=os.getenv("VCINSTALLDIR")
|
||||
else:
|
||||
VC_PATH=""
|
||||
|
||||
env.Append(CCFLAGS=["/I" + p for p in os.getenv("INCLUDE").split(";")])
|
||||
env.Append(LIBPATH=[p for p in os.getenv("LIB").split(";")])
|
||||
env.Append(CCFLAGS=["/I"+DIRECTX_PATH+"/Include"])
|
||||
env.Append(LIBPATH=[DIRECTX_PATH+"/Lib/x86"])
|
||||
env['ENV'] = os.environ;
|
||||
else:
|
||||
|
||||
# Workaround for MinGW. See:
|
||||
# http://www.scons.org/wiki/LongCmdLinesOnWin32
|
||||
if (os.name=="nt"):
|
||||
import subprocess
|
||||
|
||||
def mySubProcess(cmdline,env):
|
||||
#print "SPAWNED : " + cmdline
|
||||
startupinfo = subprocess.STARTUPINFO()
|
||||
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
|
||||
proc = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE, startupinfo=startupinfo, shell = False, env = env)
|
||||
data, err = proc.communicate()
|
||||
rv = proc.wait()
|
||||
if rv:
|
||||
print "====="
|
||||
print err
|
||||
print "====="
|
||||
return rv
|
||||
|
||||
def mySpawn(sh, escape, cmd, args, env):
|
||||
|
||||
newargs = ' '.join(args[1:])
|
||||
cmdline = cmd + " " + newargs
|
||||
|
||||
rv=0
|
||||
if len(cmdline) > 32000 and cmd.endswith("ar") :
|
||||
cmdline = cmd + " " + args[1] + " " + args[2] + " "
|
||||
for i in range(3,len(args)) :
|
||||
rv = mySubProcess( cmdline + args[i], env )
|
||||
if rv :
|
||||
break
|
||||
else:
|
||||
rv = mySubProcess( cmdline, env )
|
||||
|
||||
return rv
|
||||
|
||||
env['SPAWN'] = mySpawn
|
||||
|
||||
#build using mingw
|
||||
if (os.name=="nt"):
|
||||
env['ENV']['TMP'] = os.environ['TMP'] #way to go scons, you can be so stupid sometimes
|
||||
else:
|
||||
env["PROGSUFFIX"]=env["PROGSUFFIX"]+".exe" # for linux cross-compilation
|
||||
|
||||
mingw_prefix=""
|
||||
|
||||
if (env["bits"]=="default"):
|
||||
env["bits"]="32"
|
||||
|
||||
if (env["bits"]=="32"):
|
||||
env.Append(LINKFLAGS=['-static'])
|
||||
env.Append(LINKFLAGS=['-static-libgcc'])
|
||||
env.Append(LINKFLAGS=['-static-libstdc++'])
|
||||
mingw_prefix=env["mingw_prefix"];
|
||||
else:
|
||||
env.Append(LINKFLAGS=['-static'])
|
||||
mingw_prefix=env["mingw_prefix_64"];
|
||||
|
||||
nulstr=""
|
||||
|
||||
if (os.name=="posix"):
|
||||
nulstr=">/dev/null"
|
||||
else:
|
||||
nulstr=">nul"
|
||||
|
||||
|
||||
|
||||
# if os.system(mingw_prefix+"gcc --version"+nulstr)!=0:
|
||||
# #not really super consistent but..
|
||||
# print("Can't find Windows compiler: "+mingw_prefix)
|
||||
# sys.exit(255)
|
||||
|
||||
if (env["target"]=="release"):
|
||||
|
||||
env.Append(CCFLAGS=['-O3','-ffast-math','-fomit-frame-pointer','-msse2'])
|
||||
env.Append(LINKFLAGS=['-Wl,--subsystem,windows'])
|
||||
|
||||
elif (env["target"]=="release_debug"):
|
||||
|
||||
env.Append(CCFLAGS=['-O2','-DDEBUG_ENABLED'])
|
||||
|
||||
elif (env["target"]=="debug"):
|
||||
|
||||
env.Append(CCFLAGS=['-g', '-Wall','-DDEBUG_ENABLED','-DDEBUG_MEMORY_ENABLED'])
|
||||
|
||||
if (env["freetype"]!="no"):
|
||||
env.Append(CCFLAGS=['-DFREETYPE_ENABLED'])
|
||||
env.Append(CPPPATH=['#tools/freetype'])
|
||||
env.Append(CPPPATH=['#tools/freetype/freetype/include'])
|
||||
|
||||
env["CC"]=mingw_prefix+"gcc"
|
||||
env['AS']=mingw_prefix+"as"
|
||||
env['CXX'] = mingw_prefix+"g++"
|
||||
env['AR'] = mingw_prefix+"ar"
|
||||
env['RANLIB'] = mingw_prefix+"ranlib"
|
||||
env['LD'] = mingw_prefix+"g++"
|
||||
|
||||
#env['CC'] = "winegcc"
|
||||
#env['CXX'] = "wineg++"
|
||||
|
||||
env.Append(CCFLAGS=['-DWINDOWS_ENABLED','-mwindows'])
|
||||
env.Append(CPPFLAGS=['-DRTAUDIO_ENABLED'])
|
||||
env.Append(CCFLAGS=['-DGLES2_ENABLED','-DGLEW_ENABLED'])
|
||||
env.Append(LIBS=['mingw32','opengl32', 'dsound', 'ole32', 'd3d9','winmm','gdi32','iphlpapi','shlwapi','wsock32','kernel32'])
|
||||
|
||||
# if (env["bits"]=="32"):
|
||||
# # env.Append(LIBS=['gcc_s'])
|
||||
# #--with-arch=i686
|
||||
# env.Append(CPPFLAGS=['-march=i686'])
|
||||
# env.Append(LINKFLAGS=['-march=i686'])
|
||||
|
||||
|
||||
|
||||
|
||||
#'d3dx9d'
|
||||
env.Append(CPPFLAGS=['-DMINGW_ENABLED'])
|
||||
env.Append(LINKFLAGS=['-g'])
|
||||
|
||||
import methods
|
||||
env.Append( BUILDERS = { 'GLSL120' : env.Builder(action = methods.build_legacygl_headers, suffix = 'glsl.h',src_suffix = '.glsl') } )
|
||||
env.Append( BUILDERS = { 'GLSL' : env.Builder(action = methods.build_glsl_headers, suffix = 'glsl.h',src_suffix = '.glsl') } )
|
||||
env.Append( BUILDERS = { 'HLSL9' : env.Builder(action = methods.build_hlsl_dx9_headers, suffix = 'hlsl.h',src_suffix = '.hlsl') } )
|
||||
env.Append( BUILDERS = { 'GLSL120GLES' : env.Builder(action = methods.build_gles2_headers, suffix = 'glsl.h',src_suffix = '.glsl') } )
|
||||
|
||||
|
||||
|
||||
#
|
||||
# tested on | Windows native | Linux cross-compilation
|
||||
# ------------------------+-------------------+---------------------------
|
||||
# MSVS C++ 2010 Express | WORKS | n/a
|
||||
# Mingw-w64 | WORKS | WORKS
|
||||
# Mingw-w32 | WORKS | WORKS
|
||||
# MinGW | WORKS | untested
|
||||
#
|
||||
#####
|
||||
# Notes about MSVS C++ :
|
||||
#
|
||||
# - MSVC2010-Express compiles to 32bits only.
|
||||
#
|
||||
#####
|
||||
# Notes about Mingw-w64 and Mingw-w32 under Windows :
|
||||
#
|
||||
# - both can be installed using the official installer :
|
||||
# http://mingw-w64.sourceforge.net/download.php#mingw-builds
|
||||
#
|
||||
# - if you want to compile both 32bits and 64bits, don't forget to
|
||||
# run the installer twice to install them both.
|
||||
#
|
||||
# - install them into a path that does not contain spaces
|
||||
# ( example : "C:/Mingw-w32", "C:/Mingw-w64" )
|
||||
#
|
||||
# - if you want to compile faster using the "-j" option, don't forget
|
||||
# to install the appropriate version of the Pywin32 python extension
|
||||
# available from : http://sourceforge.net/projects/pywin32/files/
|
||||
#
|
||||
# - before running scons, you must add into the environment path
|
||||
# the path to the "/bin" directory of the Mingw version you want
|
||||
# to use :
|
||||
#
|
||||
# set PATH=C:/Mingw-w32/bin;%PATH%
|
||||
#
|
||||
# - then, scons should be able to detect gcc.
|
||||
# - Mingw-w32 only compiles 32bits.
|
||||
# - Mingw-w64 only compiles 64bits.
|
||||
#
|
||||
# - it is possible to add them both at the same time into the PATH env,
|
||||
# if you also define the MINGW32_PREFIX and MINGW64_PREFIX environment
|
||||
# variables.
|
||||
# For instance, you could store that set of commands into a .bat script
|
||||
# that you would run just before scons :
|
||||
#
|
||||
# set PATH=C:\mingw-w32\bin;%PATH%
|
||||
# set PATH=C:\mingw-w64\bin;%PATH%
|
||||
# set MINGW32_PREFIX=C:\mingw-w32\bin\
|
||||
# set MINGW64_PREFIX=C:\mingw-w64\bin\
|
||||
#
|
||||
#####
|
||||
# Notes about Mingw, Mingw-w64 and Mingw-w32 under Linux :
|
||||
#
|
||||
# - default toolchain prefixes are :
|
||||
# "i586-mingw32msvc-" for MinGW
|
||||
# "i686-w64-mingw32-" for Mingw-w32
|
||||
# "x86_64-w64-mingw32-" for Mingw-w64
|
||||
#
|
||||
# - if both MinGW and Mingw-w32 are installed on your system
|
||||
# Mingw-w32 should take the priority over MinGW.
|
||||
#
|
||||
# - it is possible to manually override prefixes by defining
|
||||
# the MINGW32_PREFIX and MINGW64_PREFIX environment variables.
|
||||
#
|
||||
#####
|
||||
# Notes about Mingw under Windows :
|
||||
#
|
||||
# - this is the MinGW version from http://mingw.org/
|
||||
# - install it into a path that does not contain spaces
|
||||
# ( example : "C:/MinGW" )
|
||||
# - several DirectX headers might be missing. You can copy them into
|
||||
# the C:/MinGW/include" directory from this page :
|
||||
# https://code.google.com/p/mingw-lib/source/browse/trunk/working/avcodec_to_widget_5/directx_include/
|
||||
# - before running scons, add the path to the "/bin" directory :
|
||||
# set PATH=C:/MinGW/bin;%PATH%
|
||||
# - scons should be able to detect gcc.
|
||||
#
|
||||
|
||||
#####
|
||||
# TODO :
|
||||
#
|
||||
# - finish to cleanup this script to remove all the remains of previous hacks and workarounds
|
||||
# - make it work with the Windows7 SDK that is supposed to enable 64bits compilation for MSVC2010-Express
|
||||
# - confirm it works well with other Visual Studio versions.
|
||||
# - update the wiki about the pywin32 extension required for the "-j" option under Windows.
|
||||
# - update the wiki to document MINGW32_PREFIX and MINGW64_PREFIX
|
||||
#
|
||||
|
||||
import os
|
||||
|
||||
import sys
|
||||
|
||||
|
||||
def is_active():
|
||||
return True
|
||||
|
||||
def get_name():
|
||||
return "Windows"
|
||||
|
||||
def can_build():
|
||||
|
||||
if (os.name=="nt"):
|
||||
#building natively on windows!
|
||||
if (os.getenv("VSINSTALLDIR")):
|
||||
return True
|
||||
else:
|
||||
print("\nMSVC not detected, attempting Mingw.")
|
||||
mingw32 = ""
|
||||
mingw64 = ""
|
||||
if ( os.getenv("MINGW32_PREFIX") ) :
|
||||
mingw32 = os.getenv("MINGW32_PREFIX")
|
||||
if ( os.getenv("MINGW64_PREFIX") ) :
|
||||
mingw64 = os.getenv("MINGW64_PREFIX")
|
||||
|
||||
test = "gcc --version > NUL 2>&1"
|
||||
if os.system(test)!= 0 and os.system(mingw32+test)!=0 and os.system(mingw64+test)!=0 :
|
||||
print("- could not detect gcc.")
|
||||
print("Please, make sure a path to a Mingw /bin directory is accessible into the environment PATH.\n")
|
||||
return False
|
||||
else:
|
||||
print("- gcc detected.")
|
||||
|
||||
return True
|
||||
|
||||
if (os.name=="posix"):
|
||||
|
||||
mingw = "i586-mingw32msvc-"
|
||||
mingw64 = "x86_64-w64-mingw32-"
|
||||
mingw32 = "i686-w64-mingw32-"
|
||||
|
||||
if (os.getenv("MINGW32_PREFIX")):
|
||||
mingw32=os.getenv("MINGW32_PREFIX")
|
||||
mingw = mingw32
|
||||
if (os.getenv("MINGW64_PREFIX")):
|
||||
mingw64=os.getenv("MINGW64_PREFIX")
|
||||
|
||||
test = "gcc --version &>/dev/null"
|
||||
if (os.system(mingw+test) == 0 or os.system(mingw64+test) == 0 or os.system(mingw32+test) == 0):
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def get_opts():
|
||||
|
||||
mingw=""
|
||||
mingw32=""
|
||||
mingw64=""
|
||||
if ( os.name == "posix" ):
|
||||
mingw = "i586-mingw32msvc-"
|
||||
mingw32 = "i686-w64-mingw32-"
|
||||
mingw64 = "x86_64-w64-mingw32-"
|
||||
|
||||
if os.system(mingw32+"gcc --version &>/dev/null") != 0 :
|
||||
mingw32 = mingw
|
||||
|
||||
if (os.getenv("MINGW32_PREFIX")):
|
||||
mingw32=os.getenv("MINGW32_PREFIX")
|
||||
mingw = mingw32
|
||||
if (os.getenv("MINGW64_PREFIX")):
|
||||
mingw64=os.getenv("MINGW64_PREFIX")
|
||||
|
||||
|
||||
return [
|
||||
('mingw_prefix','Mingw Prefix',mingw32),
|
||||
('mingw_prefix_64','Mingw Prefix 64 bits',mingw64),
|
||||
]
|
||||
|
||||
def get_flags():
|
||||
|
||||
return [
|
||||
('freetype','builtin'), #use builtin freetype
|
||||
('openssl','builtin'), #use builtin openssl
|
||||
('theora','no'),
|
||||
]
|
||||
|
||||
|
||||
|
||||
def configure(env):
|
||||
|
||||
env.Append(CPPPATH=['#platform/windows'])
|
||||
|
||||
|
||||
if (os.name=="nt" and os.getenv("VSINSTALLDIR")!=None):
|
||||
#build using visual studio
|
||||
env['ENV']['TMP'] = os.environ['TMP']
|
||||
env.Append(CPPPATH=['#platform/windows/include'])
|
||||
env.Append(LIBPATH=['#platform/windows/lib'])
|
||||
|
||||
if (env["freetype"]!="no"):
|
||||
env.Append(CCFLAGS=['/DFREETYPE_ENABLED'])
|
||||
env.Append(CPPPATH=['#tools/freetype'])
|
||||
env.Append(CPPPATH=['#tools/freetype/freetype/include'])
|
||||
|
||||
if (env["target"]=="release"):
|
||||
|
||||
env.Append(CCFLAGS=['/O2'])
|
||||
env.Append(LINKFLAGS=['/SUBSYSTEM:WINDOWS'])
|
||||
env.Append(LINKFLAGS=['/ENTRY:mainCRTStartup'])
|
||||
|
||||
elif (env["target"]=="release_debug"):
|
||||
|
||||
env.Append(CCFLAGS=['/O2','/DDEBUG_ENABLED'])
|
||||
env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE'])
|
||||
elif (env["target"]=="debug_release"):
|
||||
|
||||
env.Append(CCFLAGS=['/Zi','/Od'])
|
||||
env.Append(LINKFLAGS=['/DEBUG'])
|
||||
env.Append(LINKFLAGS=['/SUBSYSTEM:WINDOWS'])
|
||||
env.Append(LINKFLAGS=['/ENTRY:mainCRTStartup'])
|
||||
|
||||
elif (env["target"]=="debug"):
|
||||
|
||||
env.Append(CCFLAGS=['/Zi','/DDEBUG_ENABLED','/DDEBUG_MEMORY_ENABLED','/DD3D_DEBUG_INFO','/Od'])
|
||||
env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE'])
|
||||
env.Append(LINKFLAGS=['/DEBUG'])
|
||||
|
||||
|
||||
env.Append(CCFLAGS=['/MT','/Gd','/GR','/nologo'])
|
||||
env.Append(CXXFLAGS=['/TP'])
|
||||
env.Append(CPPFLAGS=['/DMSVC', '/GR', ])
|
||||
env.Append(CCFLAGS=['/I'+os.getenv("WindowsSdkDir")+"/Include"])
|
||||
env.Append(CCFLAGS=['/DWINDOWS_ENABLED'])
|
||||
env.Append(CCFLAGS=['/DRTAUDIO_ENABLED'])
|
||||
env.Append(CCFLAGS=['/DWIN32'])
|
||||
env.Append(CCFLAGS=['/DTYPED_METHOD_BIND'])
|
||||
|
||||
env.Append(CCFLAGS=['/DGLES2_ENABLED'])
|
||||
|
||||
env.Append(CCFLAGS=['/DGLEW_ENABLED'])
|
||||
LIBS=['winmm','opengl32','dsound','kernel32','ole32','user32','gdi32', 'IPHLPAPI','Shlwapi', 'wsock32', 'shell32','advapi32']
|
||||
env.Append(LINKFLAGS=[p+env["LIBSUFFIX"] for p in LIBS])
|
||||
|
||||
env.Append(LIBPATH=[os.getenv("WindowsSdkDir")+"/Lib"])
|
||||
if (os.getenv("DXSDK_DIR")):
|
||||
DIRECTX_PATH=os.getenv("DXSDK_DIR")
|
||||
else:
|
||||
DIRECTX_PATH="C:/Program Files/Microsoft DirectX SDK (March 2009)"
|
||||
|
||||
if (os.getenv("VCINSTALLDIR")):
|
||||
VC_PATH=os.getenv("VCINSTALLDIR")
|
||||
else:
|
||||
VC_PATH=""
|
||||
|
||||
env.Append(CCFLAGS=["/I" + p for p in os.getenv("INCLUDE").split(";")])
|
||||
env.Append(LIBPATH=[p for p in os.getenv("LIB").split(";")])
|
||||
env.Append(CCFLAGS=["/I"+DIRECTX_PATH+"/Include"])
|
||||
env.Append(LIBPATH=[DIRECTX_PATH+"/Lib/x86"])
|
||||
env['ENV'] = os.environ;
|
||||
else:
|
||||
|
||||
# Workaround for MinGW. See:
|
||||
# http://www.scons.org/wiki/LongCmdLinesOnWin32
|
||||
if (os.name=="nt"):
|
||||
import subprocess
|
||||
|
||||
def mySubProcess(cmdline,env):
|
||||
#print "SPAWNED : " + cmdline
|
||||
startupinfo = subprocess.STARTUPINFO()
|
||||
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
|
||||
proc = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE, startupinfo=startupinfo, shell = False, env = env)
|
||||
data, err = proc.communicate()
|
||||
rv = proc.wait()
|
||||
if rv:
|
||||
print "====="
|
||||
print err
|
||||
print "====="
|
||||
return rv
|
||||
|
||||
def mySpawn(sh, escape, cmd, args, env):
|
||||
|
||||
newargs = ' '.join(args[1:])
|
||||
cmdline = cmd + " " + newargs
|
||||
|
||||
rv=0
|
||||
if len(cmdline) > 32000 and cmd.endswith("ar") :
|
||||
cmdline = cmd + " " + args[1] + " " + args[2] + " "
|
||||
for i in range(3,len(args)) :
|
||||
rv = mySubProcess( cmdline + args[i], env )
|
||||
if rv :
|
||||
break
|
||||
else:
|
||||
rv = mySubProcess( cmdline, env )
|
||||
|
||||
return rv
|
||||
|
||||
env['SPAWN'] = mySpawn
|
||||
|
||||
#build using mingw
|
||||
if (os.name=="nt"):
|
||||
env['ENV']['TMP'] = os.environ['TMP'] #way to go scons, you can be so stupid sometimes
|
||||
else:
|
||||
env["PROGSUFFIX"]=env["PROGSUFFIX"]+".exe" # for linux cross-compilation
|
||||
|
||||
mingw_prefix=""
|
||||
|
||||
if (env["bits"]=="default"):
|
||||
env["bits"]="32"
|
||||
|
||||
if (env["bits"]=="32"):
|
||||
env.Append(LINKFLAGS=['-static'])
|
||||
env.Append(LINKFLAGS=['-static-libgcc'])
|
||||
env.Append(LINKFLAGS=['-static-libstdc++'])
|
||||
mingw_prefix=env["mingw_prefix"];
|
||||
else:
|
||||
env.Append(LINKFLAGS=['-static'])
|
||||
mingw_prefix=env["mingw_prefix_64"];
|
||||
|
||||
nulstr=""
|
||||
|
||||
if (os.name=="posix"):
|
||||
nulstr=">/dev/null"
|
||||
else:
|
||||
nulstr=">nul"
|
||||
|
||||
|
||||
|
||||
# if os.system(mingw_prefix+"gcc --version"+nulstr)!=0:
|
||||
# #not really super consistent but..
|
||||
# print("Can't find Windows compiler: "+mingw_prefix)
|
||||
# sys.exit(255)
|
||||
|
||||
if (env["target"]=="release"):
|
||||
|
||||
env.Append(CCFLAGS=['-O3','-ffast-math','-fomit-frame-pointer','-msse2'])
|
||||
env.Append(LINKFLAGS=['-Wl,--subsystem,windows'])
|
||||
|
||||
elif (env["target"]=="release_debug"):
|
||||
|
||||
env.Append(CCFLAGS=['-O2','-DDEBUG_ENABLED'])
|
||||
|
||||
elif (env["target"]=="debug"):
|
||||
|
||||
env.Append(CCFLAGS=['-g', '-Wall','-DDEBUG_ENABLED','-DDEBUG_MEMORY_ENABLED'])
|
||||
|
||||
if (env["freetype"]!="no"):
|
||||
env.Append(CCFLAGS=['-DFREETYPE_ENABLED'])
|
||||
env.Append(CPPPATH=['#tools/freetype'])
|
||||
env.Append(CPPPATH=['#tools/freetype/freetype/include'])
|
||||
|
||||
env["CC"]=mingw_prefix+"gcc"
|
||||
env['AS']=mingw_prefix+"as"
|
||||
env['CXX'] = mingw_prefix+"g++"
|
||||
env['AR'] = mingw_prefix+"ar"
|
||||
env['RANLIB'] = mingw_prefix+"ranlib"
|
||||
env['LD'] = mingw_prefix+"g++"
|
||||
|
||||
#env['CC'] = "winegcc"
|
||||
#env['CXX'] = "wineg++"
|
||||
|
||||
env.Append(CCFLAGS=['-DWINDOWS_ENABLED','-mwindows'])
|
||||
env.Append(CPPFLAGS=['-DRTAUDIO_ENABLED'])
|
||||
env.Append(CCFLAGS=['-DGLES2_ENABLED','-DGLEW_ENABLED'])
|
||||
env.Append(LIBS=['mingw32','opengl32', 'dsound', 'ole32', 'd3d9','winmm','gdi32','iphlpapi','shlwapi','wsock32','kernel32'])
|
||||
|
||||
# if (env["bits"]=="32"):
|
||||
# # env.Append(LIBS=['gcc_s'])
|
||||
# #--with-arch=i686
|
||||
# env.Append(CPPFLAGS=['-march=i686'])
|
||||
# env.Append(LINKFLAGS=['-march=i686'])
|
||||
|
||||
|
||||
|
||||
|
||||
#'d3dx9d'
|
||||
env.Append(CPPFLAGS=['-DMINGW_ENABLED'])
|
||||
env.Append(LINKFLAGS=['-g'])
|
||||
|
||||
import methods
|
||||
env.Append( BUILDERS = { 'GLSL120' : env.Builder(action = methods.build_legacygl_headers, suffix = 'glsl.h',src_suffix = '.glsl') } )
|
||||
env.Append( BUILDERS = { 'GLSL' : env.Builder(action = methods.build_glsl_headers, suffix = 'glsl.h',src_suffix = '.glsl') } )
|
||||
env.Append( BUILDERS = { 'HLSL9' : env.Builder(action = methods.build_hlsl_dx9_headers, suffix = 'hlsl.h',src_suffix = '.hlsl') } )
|
||||
env.Append( BUILDERS = { 'GLSL120GLES' : env.Builder(action = methods.build_gles2_headers, suffix = 'glsl.h',src_suffix = '.glsl') } )
|
||||
|
||||
|
||||
|
||||
|
@ -1420,12 +1420,12 @@ EditorImportExport::ImageAction EditorImportExport::get_export_image_action() co
|
||||
return image_action;
|
||||
}
|
||||
|
||||
void EditorImportExport::set_export_image_shrink(int p_shrink) {
|
||||
void EditorImportExport::set_export_image_shrink(float p_shrink) {
|
||||
|
||||
image_shrink=p_shrink;
|
||||
}
|
||||
|
||||
int EditorImportExport::get_export_image_shrink() const{
|
||||
float EditorImportExport::get_export_image_shrink() const{
|
||||
|
||||
return image_shrink;
|
||||
}
|
||||
@ -1496,12 +1496,12 @@ bool EditorImportExport::image_export_group_get_make_atlas(const StringName& p_e
|
||||
return image_groups[p_export_group].make_atlas;
|
||||
|
||||
}
|
||||
void EditorImportExport::image_export_group_set_shrink(const StringName& p_export_group,int p_amount){
|
||||
void EditorImportExport::image_export_group_set_shrink(const StringName& p_export_group,float p_amount){
|
||||
ERR_FAIL_COND(!image_groups.has(p_export_group));
|
||||
image_groups[p_export_group].shrink=p_amount;
|
||||
|
||||
}
|
||||
int EditorImportExport::image_export_group_get_shrink(const StringName& p_export_group) const{
|
||||
float EditorImportExport::image_export_group_get_shrink(const StringName& p_export_group) const{
|
||||
|
||||
ERR_FAIL_COND_V(!image_groups.has(p_export_group),1);
|
||||
return image_groups[p_export_group].shrink;
|
||||
|
@ -252,7 +252,7 @@ protected:
|
||||
ImageAction action;
|
||||
bool make_atlas;
|
||||
float lossy_quality;
|
||||
int shrink;
|
||||
float shrink;
|
||||
};
|
||||
|
||||
Vector<Ref<EditorExportPlugin> > export_plugins;
|
||||
@ -260,7 +260,7 @@ protected:
|
||||
Map<String,int> by_idx;
|
||||
ImageAction image_action;
|
||||
float image_action_compress_quality;
|
||||
int image_shrink;
|
||||
float image_shrink;
|
||||
Set<String> image_formats;
|
||||
|
||||
ExportFilter export_filter;
|
||||
@ -310,8 +310,8 @@ public:
|
||||
void set_export_image_action(ImageAction p_action);
|
||||
ImageAction get_export_image_action() const;
|
||||
|
||||
void set_export_image_shrink(int p_shrink);
|
||||
int get_export_image_shrink() const;
|
||||
void set_export_image_shrink(float p_shrink);
|
||||
float get_export_image_shrink() const;
|
||||
|
||||
void set_export_image_quality(float p_quality);
|
||||
float get_export_image_quality() const;
|
||||
@ -326,8 +326,8 @@ public:
|
||||
ImageAction image_export_group_get_image_action(const StringName& p_export_group) const;
|
||||
void image_export_group_set_make_atlas(const StringName& p_export_group,bool p_make);
|
||||
bool image_export_group_get_make_atlas(const StringName& p_export_group) const;
|
||||
void image_export_group_set_shrink(const StringName& p_export_group,int p_amount);
|
||||
int image_export_group_get_shrink(const StringName& p_export_group) const;
|
||||
void image_export_group_set_shrink(const StringName& p_export_group,float p_amount);
|
||||
float image_export_group_get_shrink(const StringName& p_export_group) const;
|
||||
void image_export_group_set_lossy_quality(const StringName& p_export_group,float p_quality);
|
||||
float image_export_group_get_lossy_quality(const StringName& p_export_group) const;
|
||||
|
||||
|
@ -828,7 +828,7 @@ Error EditorTextureImportPlugin::import(const String& p_path, const Ref<Resource
|
||||
}
|
||||
|
||||
|
||||
Error EditorTextureImportPlugin::_process_texture_data(Ref<ImageTexture> &texture,int format, float quality,int flags,EditorExportPlatform::ImageCompression p_compr,int tex_flags,int shrink) {
|
||||
Error EditorTextureImportPlugin::_process_texture_data(Ref<ImageTexture> &texture,int format, float quality,int flags,EditorExportPlatform::ImageCompression p_compr,int tex_flags,float shrink) {
|
||||
|
||||
|
||||
if (format==IMAGE_FORMAT_COMPRESS_DISK_LOSSLESS || format==IMAGE_FORMAT_COMPRESS_DISK_LOSSY) {
|
||||
@ -866,7 +866,7 @@ Error EditorTextureImportPlugin::_process_texture_data(Ref<ImageTexture> &textur
|
||||
|
||||
int orig_w=image.get_width();
|
||||
int orig_h=image.get_height();
|
||||
image.resize(orig_w/shrink,orig_h/shrink);
|
||||
image.resize(orig_w/shrink,orig_h/shrink,Image::INTERPOLATE_CUBIC);
|
||||
texture->create_from_image(image,tex_flags);
|
||||
texture->set_size_override(Size2(orig_w,orig_h));
|
||||
|
||||
@ -926,7 +926,7 @@ Error EditorTextureImportPlugin::_process_texture_data(Ref<ImageTexture> &textur
|
||||
int orig_h=image.get_height();
|
||||
|
||||
if (shrink>1) {
|
||||
image.resize(orig_w/shrink,orig_h/shrink);
|
||||
image.resize(orig_w/shrink,orig_h/shrink,Image::INTERPOLATE_CUBIC);
|
||||
texture->create_from_image(image,tex_flags);
|
||||
texture->set_size_override(Size2(orig_w,orig_h));
|
||||
}
|
||||
@ -987,7 +987,7 @@ Error EditorTextureImportPlugin::import2(const String& p_path, const Ref<Resourc
|
||||
tex_flags|=Texture::FLAG_ANISOTROPIC_FILTER;
|
||||
|
||||
print_line("path: "+p_path+" flags: "+itos(tex_flags));
|
||||
int shrink=1;
|
||||
float shrink=1;
|
||||
if (from->has_option("shrink"))
|
||||
shrink=from->get_option("shrink");
|
||||
|
||||
|
@ -70,7 +70,7 @@ private:
|
||||
static EditorTextureImportPlugin *singleton[MODE_MAX];
|
||||
//used by other importers such as mesh
|
||||
|
||||
Error _process_texture_data(Ref<ImageTexture> &texture, int format, float quality, int flags,EditorExportPlatform::ImageCompression p_compr,int tex_flags,int shrink);
|
||||
Error _process_texture_data(Ref<ImageTexture> &texture, int format, float quality, int flags,EditorExportPlatform::ImageCompression p_compr,int tex_flags,float shrink);
|
||||
void compress_image(EditorExportPlatform::ImageCompression p_mode,Image& image,bool p_smaller);
|
||||
public:
|
||||
|
||||
|
@ -1156,7 +1156,7 @@ ProjectExportDialog::ProjectExportDialog(EditorNode *p_editor) {
|
||||
image_shrink = memnew( SpinBox );
|
||||
image_shrink->set_min(1);
|
||||
image_shrink->set_max(8);
|
||||
image_shrink->set_step(1);
|
||||
image_shrink->set_step(0.1);
|
||||
image_vb->add_margin_child("Shrink All Images:",image_shrink);
|
||||
sections->add_child(image_vb);
|
||||
|
||||
@ -1237,7 +1237,7 @@ ProjectExportDialog::ProjectExportDialog(EditorNode *p_editor) {
|
||||
group_shrink->set_min(1);
|
||||
group_shrink->set_max(8);
|
||||
group_shrink->set_val(1);
|
||||
group_shrink->set_step(1);
|
||||
group_shrink->set_step(0.001);
|
||||
group_options->add_margin_child("Shrink By:",group_shrink);
|
||||
group_shrink->connect("value_changed",this,"_group_changed");
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user