diff --git a/panda/src/display/config_display.cxx b/panda/src/display/config_display.cxx index 306f3d1470..c15e438626 100644 --- a/panda/src/display/config_display.cxx +++ b/panda/src/display/config_display.cxx @@ -127,6 +127,14 @@ ConfigVariableBool depth_offset_decals "because it appears that many graphics drivers have issues with " "their depth offset implementation.")); +ConfigVariableBool auto_generate_mipmaps +("auto-generate-mipmaps", false, + PRC_DESC("Set this true to use the hardware to generate mipmaps " + "automatically in all cases, if supported. Set it false " + "to generate mipmaps in software when possible. This is " + "false by default because some drivers (Intel) seem to do a " + "poor job of generating mipmaps when needed.")); + ConfigVariableInt win_size ("win-size", "640 480", PRC_DESC("This is the default size at which to open a new window. This " diff --git a/panda/src/display/config_display.h b/panda/src/display/config_display.h index 8fb502ecfb..f731bbd2c6 100644 --- a/panda/src/display/config_display.h +++ b/panda/src/display/config_display.h @@ -36,47 +36,48 @@ ConfigureDecl(config_display, EXPCL_PANDA, EXPTP_PANDA); NotifyCategoryDecl(display, EXPCL_PANDA, EXPTP_PANDA); NotifyCategoryDecl(gsg, EXPCL_PANDA, EXPTP_PANDA); -extern ConfigVariableBool view_frustum_cull; -extern ConfigVariableBool pstats_unused_states; +extern EXPCL_PANDA ConfigVariableBool view_frustum_cull; +extern EXPCL_PANDA ConfigVariableBool pstats_unused_states; -extern ConfigVariableString threading_model; -extern ConfigVariableBool auto_flip; -extern ConfigVariableBool yield_timeslice; +extern EXPCL_PANDA ConfigVariableString threading_model; +extern EXPCL_PANDA ConfigVariableBool auto_flip; +extern EXPCL_PANDA ConfigVariableBool yield_timeslice; -extern ConfigVariableString screenshot_filename; -extern ConfigVariableString screenshot_extension; +extern EXPCL_PANDA ConfigVariableString screenshot_filename; +extern EXPCL_PANDA ConfigVariableString screenshot_extension; -extern ConfigVariableBool show_buffers; +extern EXPCL_PANDA ConfigVariableBool show_buffers; -extern ConfigVariableBool prefer_parasite_buffer; -extern ConfigVariableBool prefer_single_buffer; +extern EXPCL_PANDA ConfigVariableBool prefer_parasite_buffer; +extern EXPCL_PANDA ConfigVariableBool prefer_single_buffer; -extern ConfigVariableBool copy_texture_inverted; -extern ConfigVariableBool window_inverted; -extern ConfigVariableBool depth_offset_decals; +extern EXPCL_PANDA ConfigVariableBool copy_texture_inverted; +extern EXPCL_PANDA ConfigVariableBool window_inverted; +extern EXPCL_PANDA ConfigVariableBool depth_offset_decals; +extern EXPCL_PANDA ConfigVariableBool auto_generate_mipmaps; -extern ConfigVariableInt win_size; -extern ConfigVariableInt win_origin; -extern ConfigVariableInt win_width; -extern ConfigVariableInt win_height; -extern ConfigVariableInt win_origin_x; -extern ConfigVariableInt win_origin_y; -extern ConfigVariableBool fullscreen; -extern ConfigVariableBool undecorated; -extern ConfigVariableBool cursor_hidden; -extern ConfigVariableFilename icon_filename; -extern ConfigVariableFilename cursor_filename; -extern ConfigVariableEnum z_order; -extern ConfigVariableString window_title; +extern EXPCL_PANDA ConfigVariableInt win_size; +extern EXPCL_PANDA ConfigVariableInt win_origin; +extern EXPCL_PANDA ConfigVariableInt win_width; +extern EXPCL_PANDA ConfigVariableInt win_height; +extern EXPCL_PANDA ConfigVariableInt win_origin_x; +extern EXPCL_PANDA ConfigVariableInt win_origin_y; +extern EXPCL_PANDA ConfigVariableBool fullscreen; +extern EXPCL_PANDA ConfigVariableBool undecorated; +extern EXPCL_PANDA ConfigVariableBool cursor_hidden; +extern EXPCL_PANDA ConfigVariableFilename icon_filename; +extern EXPCL_PANDA ConfigVariableFilename cursor_filename; +extern EXPCL_PANDA ConfigVariableEnum z_order; +extern EXPCL_PANDA ConfigVariableString window_title; -extern ConfigVariableString framebuffer_mode; -extern ConfigVariableInt depth_bits; -extern ConfigVariableInt color_bits; -extern ConfigVariableInt alpha_bits; -extern ConfigVariableInt stencil_bits; -extern ConfigVariableInt multisamples; +extern EXPCL_PANDA ConfigVariableString framebuffer_mode; +extern EXPCL_PANDA ConfigVariableInt depth_bits; +extern EXPCL_PANDA ConfigVariableInt color_bits; +extern EXPCL_PANDA ConfigVariableInt alpha_bits; +extern EXPCL_PANDA ConfigVariableInt stencil_bits; +extern EXPCL_PANDA ConfigVariableInt multisamples; -extern ConfigVariableDouble background_color; +extern EXPCL_PANDA ConfigVariableDouble background_color; extern EXPCL_PANDA void init_libdisplay(); diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index 62698e71aa..ea90e632f2 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -3319,7 +3319,8 @@ specify_texture(Texture *tex) { } #endif - if (_supports_generate_mipmap) { + if (_supports_generate_mipmap && + (auto_generate_mipmaps || !tex->might_have_ram_image())) { // If the hardware can automatically generate mipmaps, ask it to // do so now, but only if the texture requires them. GLP(TexParameteri)(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, uses_mipmaps); @@ -3453,7 +3454,7 @@ apply_texture_immediate(CLP(TextureContext) *gtc, Texture *tex) { << (int)type << ", " << tex->get_name() << ")\n"; #endif - bool uses_mipmaps = tex->uses_mipmaps() && !CLP(ignore_mipmaps); + bool uses_mipmaps = (tex->uses_mipmaps() && !CLP(ignore_mipmaps)) || CLP(force_mipmaps); #ifndef NDEBUG if (CLP(force_mipmaps)) { @@ -3470,7 +3471,7 @@ apply_texture_immediate(CLP(TextureContext) *gtc, Texture *tex) { } else #endif - if (!_supports_generate_mipmap) { + if (!_supports_generate_mipmap || !auto_generate_mipmaps) { // We only need to build the mipmaps by hand if the GL // doesn't support generating them automatically. GLUP(Build2DMipmaps)(GL_TEXTURE_2D, internal_format, diff --git a/panda/src/linmath/lvector3_src.I b/panda/src/linmath/lvector3_src.I index 7c3d512f22..459733f294 100644 --- a/panda/src/linmath/lvector3_src.I +++ b/panda/src/linmath/lvector3_src.I @@ -233,9 +233,11 @@ angle_rad(const FLOATNAME(LVector3) &other) const { // This algorithm yields better results than acos(dot(other)), which // behaves poorly as dot(other) approaches 1.0. if (dot(other) < 0.0f) { - return MathNumbers::cpi((FLOATTYPE)0.0f) - 2.0f * casin((-(*this)-other).length()); + FLOATTYPE a = ((*this)+other).length() / 2.0f; + return MathNumbers::cpi((FLOATTYPE)0.0f) - 2.0f * casin(min(a, (FLOATTYPE)1.0)); } else { - return 2.0f * casin(((*this)-other).length() / 2.0f); + FLOATTYPE a = ((*this)-other).length() / 2.0f; + return 2.0f * casin(min(a, (FLOATTYPE)1.0)); } } diff --git a/panda/src/text/fontPool.cxx b/panda/src/text/fontPool.cxx index 17614251c8..4af6735667 100644 --- a/panda/src/text/fontPool.cxx +++ b/panda/src/text/fontPool.cxx @@ -114,7 +114,7 @@ ns_load_font(const string &str) { return NULL; } - _fonts[filename] = font; + _fonts[index_str] = font; return font; } @@ -124,9 +124,14 @@ ns_load_font(const string &str) { // Description: The nonstatic implementation of add_font(). //////////////////////////////////////////////////////////////////// void FontPool:: -ns_add_font(const string &filename, TextFont *font) { +ns_add_font(const string &str, TextFont *font) { + string index_str; + Filename filename; + int face_index; + lookup_filename(str, index_str, filename, face_index); + // We blow away whatever font was there previously, if any. - _fonts[filename] = font; + _fonts[index_str] = font; } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/text/fontPool.h b/panda/src/text/fontPool.h index 5b0c7500d7..b2de05b6af 100644 --- a/panda/src/text/fontPool.h +++ b/panda/src/text/fontPool.h @@ -56,7 +56,7 @@ private: bool ns_has_font(const string &str); TextFont *ns_load_font(const string &str); - void ns_add_font(const string &filename, TextFont *font); + void ns_add_font(const string &str, TextFont *font); void ns_release_font(const string &filename); void ns_release_all_fonts(); int ns_garbage_collect();