diff options
Diffstat (limited to 'o3d/import/cross/collada_conditioner.h')
-rw-r--r-- | o3d/import/cross/collada_conditioner.h | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/o3d/import/cross/collada_conditioner.h b/o3d/import/cross/collada_conditioner.h new file mode 100644 index 0000000..72df84d --- /dev/null +++ b/o3d/import/cross/collada_conditioner.h @@ -0,0 +1,136 @@ +/* + * Copyright 2009, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +// This file contains the declarations for the functions in the +// O3D COLLADA conditioner namespace. These functions do most of +// the actual work of conditioning and packagaging a DAE file for use +// in O3D. + +#ifndef O3D_IMPORT_CROSS_COLLADA_CONDITIONER_H_ +#define O3D_IMPORT_CROSS_COLLADA_CONDITIONER_H_ + +#include "core/cross/types.h" +#include "compiler/technique/technique_structures.h" + +class FCDEffect; +class FCDEffectProfileFX; +class FCDocument; +class FUUri; +class FilePath; + +namespace o3d { + +class ColladaZipArchive; +class ServiceLocator; + +class ColladaConditioner { + public: + explicit ColladaConditioner(ServiceLocator* service_locator); + ~ColladaConditioner(); + + // This function conditions the given document for use in O3D. This + // mainly includes checking that the referenced shaders compile + // against both the Cg (all platforms) and D3D (windows only) + // runtimes, and converting the shaders to the common shader + // language used by O3D. The converts all the shaders to inline + // "code" shaders instead of "included" shaders. It also handles + // converting "NV_Import" shaders produced by 3dsMax to something + // o3d can read. Returns false on failure. If archive is non-NULL, + // then it attempts to read shader files from the give zip archive + // instead of from the disk. + bool ConditionDocument(FCDocument* doc, ColladaZipArchive* archive); + + // This takes the given shader file and rewrites it to have the + // proper form for O3D. If the archive parameter is non-NULL, then + // the input file is read from the archive instead of from the + // regular filesystem. + bool RewriteShaderFile(ColladaZipArchive* archive, + const FilePath& in_filename, + const FilePath& out_filename, + SamplerStateList* sampler_list, + String* vs_entry, + String* ps_entry); + + // This test-compiles the given shader source with the HLSL + // compiler, if there is one available on the platform. This + // function is implemented separately for each platform. If there + // is no HLSL compiler available on this platform, this function + // returns 'true'. + bool CompileHLSL(const String& shader_source, + const String& vs_entry, + const String& ps_entry); + + // This test-compiles the given shader source with the Cg compiler, + // if there is one available on the platform. This function is + // implemented separately for each platform. If there is no Cg + // compiler available on this platform, this function returns + // 'true'. + bool CompileCg(const FilePath& filename, + const String& shader_source, + const String& vs_entry, + const String& ps_entry); + + protected: + // This preprocesses the given file using the Cgc compiler. It + // doesn't compile the shader, it just preprocesses it. This is + // implemented separately for each platform, since it invokes the + // compiler as a separate process. + bool PreprocessShaderFile(const FilePath& in_filename, + const FilePath& out_filename); + + // This takes the given COLLADA shader source code and rewrites it + // to have the proper form for O3D. It finds the entry points and + // sets vs_entry and ps_entry to what it finds. + bool RewriteShader(const String& shader_source_in, + String* shader_source_out, + const FilePath& in_filename, + SamplerStateList* sampler_list, + String* vs_entry, + String* ps_entry); + + // Handle all the embedded shaders in the document. + bool HandleEmbeddedShaders(FCDEffect* collada_effect, + FCDEffectProfileFX* profile_fx, + ColladaZipArchive* archive); + + bool HandleNVImport(FCDocument* doc, + FCDEffect* collada_effect, + const FUUri& original_uri, + ColladaZipArchive* archive); + private: + ServiceLocator* service_locator_; + + DISALLOW_COPY_AND_ASSIGN(ColladaConditioner); +}; +} // namespace o3d + +#endif // O3D_IMPORT_CROSS_COLLADA_CONDITIONER_H_ |