diff --git a/doc/makepanda/confauto.in b/doc/makepanda/confauto.in index 9053212768..0e9eb47fbc 100755 --- a/doc/makepanda/confauto.in +++ b/doc/makepanda/confauto.in @@ -1,90 +1,90 @@ -########################################################### -### ### -### Panda3D Configuration File - Auto-Generated Portion ### -### ### -### Editing this file is not recommended. Most of these ### -### directives can be overriden in Config.prc ### -### ### -########################################################### - -# Define the display types that have been compiled in. Panda will -# pick one of these by going through the list in this order until one -# is found that works, unless the user specifically requests a -# particular display type with the load-display directive. - -aux-display pandagl -aux-display pandadx9 -aux-display pandadx8 -aux-display pandadx7 - -# The egg loader is handy to have available by default. This allows -# clients to load egg files. (The bam loader is built-in so bam files -# are always loadable). - -# By qualifying with the extension "egg", we indicate the egg loader -# should be made available only if you explicitly name a file with an -# .egg extension. - -load-file-type egg pandaegg - -# The following lines define some handy object types to use within the -# egg syntax. This remaps { name } into whatever egg -# syntax is given by egg-object-type-name, which makes a handy -# abbreviation for modeling packages (like Maya) to insert -# sophisticated egg syntax into the generated egg file, using a single -# object type string. - -egg-object-type-portal portal { 1 } -egg-object-type-polylight polylight { 1 } -egg-object-type-seq24 { 1 } fps { 24 } -egg-object-type-seq12 { 1 } fps { 12 } -egg-object-type-indexed indexed { 1 } - -# These are just shortcuts to define the Model and DCS flags, which -# indicate nodes that should not be flattened out of the hierarchy -# during the conversion process. DCS goes one step further and -# indicates that the node's transform is important and should be -# preserved (DCS stands for Dynamic Coordinate System). - -egg-object-type-model { 1 } -egg-object-type-dcs { 1 } - -# The following define various kinds of collision geometry. These -# mark the geometry at this level and below as invisible collision -# polygons, which can be used by Panda's collision system to detect -# collisions more optimally than regular visible polygons. - -egg-object-type-barrier { Polyset descend } -egg-object-type-sphere { Sphere descend } -egg-object-type-invsphere { InvSphere descend } -egg-object-type-tube { Tube descend } - -# As above, but these are flagged to be "intangible", so that they -# will trigger an event but not stop an object from passing through. - -egg-object-type-trigger { Polyset descend intangible } -egg-object-type-trigger-sphere { Sphere descend intangible } - -# "bubble" puts an invisible bubble around an object, but does not -# otherwise remove the geometry. - -egg-object-type-bubble { Sphere keep descend } - -# "ghost" turns off the normal collide bit that is set on visible -# geometry by default, so that if you are using visible geometry for -# collisions, this particular geometry will not be part of those -# collisions--it is ghostlike. - -egg-object-type-ghost collide-mask { 0 } - -# This module allows direct loading of formats like .flt, .mb, or .dxf - -load-file-type ptloader - -# Define a new egg object type. See the comments in _panda.prc about this. - -egg-object-type-direct-widget collide-mask { 0x80000000 } { Polyset descend } - -# Define a new cull bin that will render on top of everything else. - -cull-bin gui-popup 60 unsorted +########################################################### +### ### +### Panda3D Configuration File - Auto-Generated Portion ### +### ### +### Editing this file is not recommended. Most of these ### +### directives can be overriden in Config.prc ### +### ### +########################################################### + +# Define the display types that have been compiled in. Panda will +# pick one of these by going through the list in this order until one +# is found that works, unless the user specifically requests a +# particular display type with the load-display directive. + +aux-display pandagl +aux-display pandadx9 +aux-display pandadx8 +aux-display pandadx7 + +# The egg loader is handy to have available by default. This allows +# clients to load egg files. (The bam loader is built-in so bam files +# are always loadable). + +# By qualifying with the extension "egg", we indicate the egg loader +# should be made available only if you explicitly name a file with an +# .egg extension. + +load-file-type egg pandaegg + +# The following lines define some handy object types to use within the +# egg syntax. This remaps { name } into whatever egg +# syntax is given by egg-object-type-name, which makes a handy +# abbreviation for modeling packages (like Maya) to insert +# sophisticated egg syntax into the generated egg file, using a single +# object type string. + +egg-object-type-portal portal { 1 } +egg-object-type-polylight polylight { 1 } +egg-object-type-seq24 { 1 } fps { 24 } +egg-object-type-seq12 { 1 } fps { 12 } +egg-object-type-indexed indexed { 1 } + +# These are just shortcuts to define the Model and DCS flags, which +# indicate nodes that should not be flattened out of the hierarchy +# during the conversion process. DCS goes one step further and +# indicates that the node's transform is important and should be +# preserved (DCS stands for Dynamic Coordinate System). + +egg-object-type-model { 1 } +egg-object-type-dcs { 1 } + +# The following define various kinds of collision geometry. These +# mark the geometry at this level and below as invisible collision +# polygons, which can be used by Panda's collision system to detect +# collisions more optimally than regular visible polygons. + +egg-object-type-barrier { Polyset descend } +egg-object-type-sphere { Sphere descend } +egg-object-type-invsphere { InvSphere descend } +egg-object-type-tube { Tube descend } + +# As above, but these are flagged to be "intangible", so that they +# will trigger an event but not stop an object from passing through. + +egg-object-type-trigger { Polyset descend intangible } +egg-object-type-trigger-sphere { Sphere descend intangible } + +# "bubble" puts an invisible bubble around an object, but does not +# otherwise remove the geometry. + +egg-object-type-bubble { Sphere keep descend } + +# "ghost" turns off the normal collide bit that is set on visible +# geometry by default, so that if you are using visible geometry for +# collisions, this particular geometry will not be part of those +# collisions--it is ghostlike. + +egg-object-type-ghost collide-mask { 0 } + +# This module allows direct loading of formats like .flt, .mb, or .dxf + +load-file-type ptloader + +# Define a new egg object type. See the comments in _panda.prc about this. + +egg-object-type-direct-widget collide-mask { 0x80000000 } { Polyset descend } + +# Define a new cull bin that will render on top of everything else. + +cull-bin gui-popup 60 unsorted diff --git a/doc/makepanda/config.in b/doc/makepanda/config.in index 7966faff6d..6aa6cde19a 100755 --- a/doc/makepanda/config.in +++ b/doc/makepanda/config.in @@ -1,74 +1,74 @@ -########################################################### -### ### -### Panda3D Configuration File - User-Editable Portion ### -### ### -########################################################### - -# Uncomment one of the following lines to choose whether you should -# run using OpenGL or DirectX rendering. - -load-display pandagl - -# These control the placement and size of the default rendering window. - -win-origin 100 0 -win-size 800 600 - -# Uncomment this line if you want to run Panda fullscreen instead of -# in a window. - -fullscreen #f - -# If you don't object to running OpenGL in software leave the keyword -# "software" in the following line, otherwise remove it to force -# hardware only. - -framebuffer-mode rgba double-buffer depth hardware - -# These control the amount of output Panda gives for some various -# categories. The severity levels, in order, are "spam", "debug", -# "info", "warning", and "fatal"; the default is "info". Uncomment -# one (or define a new one for the particular category you wish to -# change) to control this output. - -notify-level warning -default-directnotify-level warning - -# These specify where model files may be loaded from. You probably -# want to set this to a sensible path for yourself. $THIS_PRC_DIR is -# a special variable that indicates the same directory as this -# particular Config.prc file. - -model-path . -model-path $THIS_PRC_DIR/.. -model-path $THIS_PRC_DIR/../models -sound-path . -sound-path $THIS_PRC_DIR/.. -sound-path $THIS_PRC_DIR/../models -texture-path . -texture-path $THIS_PRC_DIR/.. -texture-path $THIS_PRC_DIR/../models - -# This enable the automatic creation of a TK window when running -# Direct. - -want-directtools #f -want-tk #f - -# Enable/disable performance profiling tool and frame-rate meter - -want-pstats #f -show-frame-rate-meter #f - -# This enables simple networked programs to easily provide a DC file - -dc-file sample.dc - -# Enable audio using the FMod audio library by default: - -audio-library-name fmod_audio - -# The new version of panda supports hardware vertex animation, but it's not quite ready - -hardware-animated-vertices 0 - +########################################################### +### ### +### Panda3D Configuration File - User-Editable Portion ### +### ### +########################################################### + +# Uncomment one of the following lines to choose whether you should +# run using OpenGL or DirectX rendering. + +load-display pandagl + +# These control the placement and size of the default rendering window. + +win-origin 100 0 +win-size 800 600 + +# Uncomment this line if you want to run Panda fullscreen instead of +# in a window. + +fullscreen #f + +# If you don't object to running OpenGL in software leave the keyword +# "software" in the following line, otherwise remove it to force +# hardware only. + +framebuffer-mode rgba double-buffer depth hardware + +# These control the amount of output Panda gives for some various +# categories. The severity levels, in order, are "spam", "debug", +# "info", "warning", and "fatal"; the default is "info". Uncomment +# one (or define a new one for the particular category you wish to +# change) to control this output. + +notify-level warning +default-directnotify-level warning + +# These specify where model files may be loaded from. You probably +# want to set this to a sensible path for yourself. $THIS_PRC_DIR is +# a special variable that indicates the same directory as this +# particular Config.prc file. + +model-path . +model-path $THIS_PRC_DIR/.. +model-path $THIS_PRC_DIR/../models +sound-path . +sound-path $THIS_PRC_DIR/.. +sound-path $THIS_PRC_DIR/../models +texture-path . +texture-path $THIS_PRC_DIR/.. +texture-path $THIS_PRC_DIR/../models + +# This enable the automatic creation of a TK window when running +# Direct. + +want-directtools #f +want-tk #f + +# Enable/disable performance profiling tool and frame-rate meter + +want-pstats #f +show-frame-rate-meter #f + +# This enables simple networked programs to easily provide a DC file + +dc-file sample.dc + +# Enable audio using the FMod audio library by default: + +audio-library-name fmod_audio + +# The new version of panda supports hardware vertex animation, but it's not quite ready + +hardware-animated-vertices 0 + diff --git a/panda/src/glstuff/glShaderContext_src.cxx b/panda/src/glstuff/glShaderContext_src.cxx index 7b985281de..4ffb42d33b 100755 --- a/panda/src/glstuff/glShaderContext_src.cxx +++ b/panda/src/glstuff/glShaderContext_src.cxx @@ -362,6 +362,13 @@ update_shader_texture_bindings(CLP(ShaderContext) *prev, GSG *gsg) TextureStage *stage = gsg->_target._texture->get_on_stage(_cg_texbind[i].stage); tex = gsg->_target._texture->get_on_texture(stage); } + if (_cg_texbind[i].suffix != 0) { + // The suffix feature is inefficient. It is a temporary hack. + if (tex == 0) { + continue; + } + tex = tex->load_related(_cg_texbind[i].suffix); + } if ((tex == 0) || (tex->get_texture_type() != _cg_texbind[i].desiredtype)) { continue; } @@ -824,11 +831,14 @@ compile_cg_parameter(CGparameter p) } if (pieces[0] == "tex") { - if ((!errchk_cg_parameter_words(p,2)) || - (!errchk_cg_parameter_direction(p, CG_IN)) || + if ((!errchk_cg_parameter_direction(p, CG_IN)) || (!errchk_cg_parameter_variance(p, CG_UNIFORM)) || (!errchk_cg_parameter_sampler(p))) return false; + if ((pieces.size() != 2)&&(pieces.size() != 3)) { + errchk_cg_output(p, "Invalid parameter name"); + return false; + } ShaderTexBind bind; bind.parameter = p; bind.name = 0; @@ -842,6 +852,9 @@ compile_cg_parameter(CGparameter p) errchk_cg_output(p, "Invalid type for a tex-parameter"); return false; } + if (pieces.size()==3) { + bind.suffix = InternalName::make(((string)"-") + pieces[2]); + } _cg_texbind.push_back(bind); return true; } diff --git a/panda/src/glstuff/glShaderContext_src.h b/panda/src/glstuff/glShaderContext_src.h index 4c88cdba08..150a96c5df 100755 --- a/panda/src/glstuff/glShaderContext_src.h +++ b/panda/src/glstuff/glShaderContext_src.h @@ -65,6 +65,7 @@ private: PT(InternalName) name; int stage; int desiredtype; + PT(InternalName) suffix; }; struct ShaderTransBind { CGparameter parameter; diff --git a/panda/src/gobj/texture.cxx b/panda/src/gobj/texture.cxx index 6bc9b1a778..40a44fd97b 100644 --- a/panda/src/gobj/texture.cxx +++ b/panda/src/gobj/texture.cxx @@ -750,6 +750,45 @@ store(PNMImage &pnmimage, int z) const { return false; } +//////////////////////////////////////////////////////////////////// +// Function: Texture::load_related +// Access: Published +// Description: Loads a texture whose filename is derived by +// concatenating a suffix to the filename of this +// texture. May return NULL, for example, if this +// texture doesn't have a filename. +//////////////////////////////////////////////////////////////////// +Texture *Texture:: +load_related(const PT(InternalName) &suffix) const { + RelatedTextures::const_iterator ti; + ti = _related_textures.find(suffix); + if (ti != _related_textures.end()) { + return (*ti).second; + } + if (!has_fullpath()) { + return (Texture*)NULL; + } + Filename main = get_fullpath(); + main.set_basename_wo_extension(main.get_basename_wo_extension() + + suffix->get_name()); + Texture *res; + if (has_alpha_fullpath()) { + Filename alph = get_alpha_fullpath(); + alph.set_basename_wo_extension(alph.get_basename_wo_extension() + + suffix->get_name()); + res = TexturePool::load_texture(main, alph, + _primary_file_num_channels, + _alpha_file_channel); + } else { + res = TexturePool::load_texture(main, + _primary_file_num_channels); + } + // I'm casting away the const-ness of 'this' because this + // field is only a cache. + ((Texture *)this)->_related_textures.insert(RelatedTextures::value_type(suffix, res)); + return res; +} + //////////////////////////////////////////////////////////////////// // Function: Texture::set_wrap_u // Access: Published diff --git a/panda/src/gobj/texture.h b/panda/src/gobj/texture.h index aff6b4458f..8b93f826e4 100644 --- a/panda/src/gobj/texture.h +++ b/panda/src/gobj/texture.h @@ -24,6 +24,7 @@ #include "filename.h" #include "typedWritableReferenceCount.h" #include "namable.h" +#include "internalName.h" #include "graphicsStateGuardianBase.h" #include "pmap.h" @@ -181,6 +182,8 @@ PUBLISHED: virtual bool load(const PNMImage &pnmimage, int z = 0); bool store(PNMImage &pnmimage, int z = 0) const; + Texture *load_related(const PT(InternalName) &suffix) const; + INLINE bool has_filename() const; INLINE const Filename &get_filename() const; INLINE bool has_alpha_filename() const; @@ -353,6 +356,14 @@ protected: typedef pmap Contexts; Contexts _contexts; + // It is common, when using normal maps, specular maps, gloss maps, + // and such, to use a file naming convention where the filenames + // of the special maps are derived by concatenating a suffix to + // the name of the diffuse map. The following table enables + // lookup of the special maps given the diffuse map and the suffix. + typedef pmap RelatedTextures; + RelatedTextures _related_textures; + // This value represents the intersection of all the dirty flags of // the various TextureContexts that might be associated with this // texture.