mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -04:00
Better profile override system
This commit is contained in:
parent
803711741d
commit
a1f60a2e4c
@ -1430,7 +1430,7 @@ cg_compile_for(const ShaderCaps &caps,
|
|||||||
// Description: Construct a Shader.
|
// Description: Construct a Shader.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
Shader::
|
Shader::
|
||||||
Shader(const Filename &filename, const string &text) :
|
Shader(const Filename &filename, const string &text, const string &vprofile, const string &fprofile) :
|
||||||
_filename(filename),
|
_filename(filename),
|
||||||
_text(text),
|
_text(text),
|
||||||
_header(""),
|
_header(""),
|
||||||
@ -1443,11 +1443,28 @@ Shader(const Filename &filename, const string &text) :
|
|||||||
parse_line(_header, true, true);
|
parse_line(_header, true, true);
|
||||||
|
|
||||||
#ifdef HAVE_CG
|
#ifdef HAVE_CG
|
||||||
|
_error_flag = false;
|
||||||
_cg_context = 0;
|
_cg_context = 0;
|
||||||
_cg_vprogram = 0;
|
_cg_vprogram = 0;
|
||||||
_cg_fprogram = 0;
|
_cg_fprogram = 0;
|
||||||
_cg_vprofile = CG_PROFILE_UNKNOWN;
|
_cg_vprofile = CG_PROFILE_UNKNOWN;
|
||||||
_cg_fprofile = CG_PROFILE_UNKNOWN;
|
_cg_fprofile = CG_PROFILE_UNKNOWN;
|
||||||
|
if (vprofile != "") {
|
||||||
|
CGprofile p = cgGetProfile(vprofile.c_str());
|
||||||
|
if (p == CG_PROFILE_UNKNOWN) {
|
||||||
|
gobj_cat.error() << "Invalid vertex profile: " << vprofile << "\n";
|
||||||
|
_error_flag = true;
|
||||||
|
}
|
||||||
|
_cg_vprofile = (int)p;
|
||||||
|
}
|
||||||
|
if (fprofile != "") {
|
||||||
|
CGprofile p = cgGetProfile(fprofile.c_str());
|
||||||
|
if (p == CG_PROFILE_UNKNOWN) {
|
||||||
|
gobj_cat.error() << "Invalid fragment profile: " << fprofile << "\n";
|
||||||
|
_error_flag = true;
|
||||||
|
}
|
||||||
|
_cg_fprofile = (int)p;
|
||||||
|
}
|
||||||
if (_default_caps._ultimate_vprofile == 0) {
|
if (_default_caps._ultimate_vprofile == 0) {
|
||||||
_default_caps._active_vprofile = CG_PROFILE_UNKNOWN;
|
_default_caps._active_vprofile = CG_PROFILE_UNKNOWN;
|
||||||
_default_caps._active_fprofile = CG_PROFILE_UNKNOWN;
|
_default_caps._active_fprofile = CG_PROFILE_UNKNOWN;
|
||||||
@ -1455,8 +1472,8 @@ Shader(const Filename &filename, const string &text) :
|
|||||||
_default_caps._ultimate_fprofile = JCG_PROFILE_GLSLF;
|
_default_caps._ultimate_fprofile = JCG_PROFILE_GLSLF;
|
||||||
}
|
}
|
||||||
if (_header == "//Cg") {
|
if (_header == "//Cg") {
|
||||||
if (cg_analyze_shader(_default_caps)) {
|
if (!cg_analyze_shader(_default_caps)) {
|
||||||
_error_flag = false;
|
_error_flag = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
gobj_cat.error()
|
gobj_cat.error()
|
||||||
@ -1485,20 +1502,30 @@ Shader::
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: Shader::load
|
// Function: Shader::load
|
||||||
// Access: Published, Static
|
// Access: Published, Static
|
||||||
// Description:
|
// Description: Loads the shader with the given filename.
|
||||||
|
// If the optional vshader or fshader parameters
|
||||||
|
// are set and non-empty, it will be used to override
|
||||||
|
// all other profile settings (it even overrides
|
||||||
|
// the basic-shaders-only flag) and forces the shader
|
||||||
|
// to use the given profile.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
PT(Shader) Shader::
|
PT(Shader) Shader::
|
||||||
load(const string &file) {
|
load(const string &file, const string &vprofile, const string &fprofile) {
|
||||||
return load(Filename(file));
|
return load(Filename(file));
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: Shader::load
|
// Function: Shader::load
|
||||||
// Access: Published, Static
|
// Access: Published, Static
|
||||||
// Description:
|
// Description: Loads the shader with the given filename.
|
||||||
|
// If the optional vshader or fshader parameters
|
||||||
|
// are set and non-empty, it will be used to override
|
||||||
|
// all other profile settings (it even overrides
|
||||||
|
// the basic-shaders-only flag) and forces the shader
|
||||||
|
// to use the given profile.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
PT(Shader) Shader::
|
PT(Shader) Shader::
|
||||||
load(const Filename &file) {
|
load(const Filename &file, const string &vprofile, const string &fprofile) {
|
||||||
LoadTable::const_iterator i = _load_table.find(file);
|
LoadTable::const_iterator i = _load_table.find(file);
|
||||||
if (i != _load_table.end()) {
|
if (i != _load_table.end()) {
|
||||||
return i->second;
|
return i->second;
|
||||||
@ -1518,10 +1545,15 @@ load(const Filename &file) {
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: Shader::make
|
// Function: Shader::make
|
||||||
// Access: Published, Static
|
// Access: Published, Static
|
||||||
// Description:
|
// Description: Loads the shader, using the string as shader body.
|
||||||
|
// If the optional vshader or fshader parameters
|
||||||
|
// are set and non-empty, it will be used to override
|
||||||
|
// all other profile settings (it even overrides
|
||||||
|
// the basic-shaders-only flag) and forces the shader
|
||||||
|
// to use the given profile.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
PT(Shader) Shader::
|
PT(Shader) Shader::
|
||||||
make(const string &body) {
|
make(const string &body, const string &vprofile, const string &fprofile) {
|
||||||
MakeTable::const_iterator i = _make_table.find(body);
|
MakeTable::const_iterator i = _make_table.find(body);
|
||||||
if (i != _make_table.end()) {
|
if (i != _make_table.end()) {
|
||||||
return i->second;
|
return i->second;
|
||||||
@ -1642,52 +1674,6 @@ parse_eof() {
|
|||||||
return (int)_text.size() == _parse;
|
return (int)_text.size() == _parse;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_CG
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: Shader::set_vertex_profile
|
|
||||||
// Access: Published
|
|
||||||
// Description: Sets the profile for the vertex shader. This
|
|
||||||
// overrides all other profile settings (it even
|
|
||||||
// overrides basic-shaders-only) and forces the shader
|
|
||||||
// to use the given profile. If that fails, it will
|
|
||||||
// throw an error.
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
void Shader::
|
|
||||||
set_vertex_profile(const string &profile) {
|
|
||||||
if (profile.empty()) {
|
|
||||||
_cg_vprofile = CG_PROFILE_UNKNOWN;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
CGprofile p = cgGetProfile(profile.c_str());
|
|
||||||
if (p == CG_PROFILE_UNKNOWN) {
|
|
||||||
gobj_cat.error() << "Invalid vertex profile: " << profile << "\n";
|
|
||||||
}
|
|
||||||
_cg_vprofile = p;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: Shader::set_fragment_profile
|
|
||||||
// Access: Published
|
|
||||||
// Description: Sets the profile for the vertex shader. This
|
|
||||||
// overrides all other profile settings (it even
|
|
||||||
// overrides basic-shaders-only) and forces the shader
|
|
||||||
// to use the given profile. If that fails, it will
|
|
||||||
// throw an error.
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
void Shader::
|
|
||||||
set_fragment_profile(const string &profile) {
|
|
||||||
if (profile.empty()) {
|
|
||||||
_cg_fprofile = CG_PROFILE_UNKNOWN;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
CGprofile p = cgGetProfile(profile.c_str());
|
|
||||||
if (p == CG_PROFILE_UNKNOWN) {
|
|
||||||
gobj_cat.error() << "Invalid fragment profile: " << profile << "\n";
|
|
||||||
}
|
|
||||||
_cg_fprofile = p;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: Shader::prepare
|
// Function: Shader::prepare
|
||||||
// Access: Published
|
// Access: Published
|
||||||
|
@ -38,9 +38,9 @@ class EXPCL_PANDA_GOBJ Shader: public TypedReferenceCount {
|
|||||||
|
|
||||||
PUBLISHED:
|
PUBLISHED:
|
||||||
|
|
||||||
static PT(Shader) load(const Filename &file);
|
static PT(Shader) load(const Filename &file, const string &vprofile = "", const string &fprofile = "");
|
||||||
static PT(Shader) load(const string &file);
|
static PT(Shader) load(const string &file, const string &vprofile = "", const string &fprofile = "");
|
||||||
static PT(Shader) make(const string &body);
|
static PT(Shader) make(const string &body, const string &vprofile = "", const string &fprofile = "");
|
||||||
|
|
||||||
INLINE const Filename &get_filename() const;
|
INLINE const Filename &get_filename() const;
|
||||||
INLINE const string &get_text() const;
|
INLINE const string &get_text() const;
|
||||||
@ -50,12 +50,7 @@ PUBLISHED:
|
|||||||
INLINE static ShaderUtilization get_shader_utilization();
|
INLINE static ShaderUtilization get_shader_utilization();
|
||||||
INLINE static void set_shader_utilization(ShaderUtilization utl);
|
INLINE static void set_shader_utilization(ShaderUtilization utl);
|
||||||
INLINE static bool have_shader_utilization();
|
INLINE static bool have_shader_utilization();
|
||||||
|
|
||||||
#ifdef HAVE_CG
|
|
||||||
void set_vertex_profile(const string &profile);
|
|
||||||
void set_fragment_profile(const string &profile);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void prepare(PreparedGraphicsObjects *prepared_objects);
|
void prepare(PreparedGraphicsObjects *prepared_objects);
|
||||||
bool is_prepared(PreparedGraphicsObjects *prepared_objects) const;
|
bool is_prepared(PreparedGraphicsObjects *prepared_objects) const;
|
||||||
bool release(PreparedGraphicsObjects *prepared_objects);
|
bool release(PreparedGraphicsObjects *prepared_objects);
|
||||||
@ -316,12 +311,11 @@ public:
|
|||||||
Contexts _contexts;
|
Contexts _contexts;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Shader(const Filename &name, const string &text);
|
Shader(const Filename &name, const string &text, const string &vprofile = "", const string &fprofile = "");
|
||||||
void clear_prepared(PreparedGraphicsObjects *prepared_objects);
|
void clear_prepared(PreparedGraphicsObjects *prepared_objects);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static void register_with_read_factory();
|
static void register_with_read_factory();
|
||||||
static PT(Shader) make(const string &name, const string &body);
|
|
||||||
|
|
||||||
~Shader();
|
~Shader();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user