[#26476] <specular> and <shininess> missing from Colada
authorNathan Letwory <nathan@letworyinteractive.com>
Tue, 22 Mar 2011 15:28:56 +0000 (15:28 +0000)
committerNathan Letwory <nathan@letworyinteractive.com>
Tue, 22 Mar 2011 15:28:56 +0000 (15:28 +0000)
reported by Juan Linietsky

Export <specular> for <phong> and <blinn> shaders, <shininess> was already being written for these.
<lambert> shader doesn't have <shininess>.

Right now we write <phong> when blender spec is phong, <blinn> when blender spec is blinn. When spec is
any other shader, and diffuse shader set to lambert, we export as <lambert>. Any other combination defaults
right now to <phong>. This will change when Blender specific profiles have been created for the shader
combinations in Blender.

source/blender/collada/EffectExporter.cpp
source/blender/collada/EffectExporter.h

index 323b90fe1cca07733318a1ab9a1bff7941bab3f4..085ee7356ab164bbdccd0ed9008808e83cea7362 100644 (file)
@@ -89,6 +89,34 @@ void EffectsExporter::exportEffects(Scene *sce)
        }
 }
 
+void EffectsExporter::writeBlinn(COLLADASW::EffectProfile &ep, Material *ma)
+{
+       COLLADASW::ColorOrTexture cot;
+       ep.setShaderType(COLLADASW::EffectProfile::BLINN);
+       // shininess
+       ep.setShininess(ma->har);
+       // specular
+       cot = getcol(ma->specr, ma->specg, ma->specb, 1.0f);
+       ep.setSpecular(cot);
+}
+
+void EffectsExporter::writeLambert(COLLADASW::EffectProfile &ep, Material *ma)
+{
+       COLLADASW::ColorOrTexture cot;
+       ep.setShaderType(COLLADASW::EffectProfile::LAMBERT);
+}
+
+void EffectsExporter::writePhong(COLLADASW::EffectProfile &ep, Material *ma)
+{
+       COLLADASW::ColorOrTexture cot;
+       ep.setShaderType(COLLADASW::EffectProfile::PHONG);
+       // shininess
+       ep.setShininess(ma->har);
+       // specular
+       cot = getcol(ma->specr, ma->specg, ma->specb, 1.0f);
+       ep.setSpecular(cot);
+}
+
 void EffectsExporter::operator()(Material *ma, Object *ob)
 {
        // create a list of indices to textures of type TEX_IMAGE
@@ -102,18 +130,17 @@ void EffectsExporter::operator()(Material *ma, Object *ob)
        ep.openProfile();
        // set shader type - one of three blinn, phong or lambert
        if (ma->spec_shader == MA_SPEC_BLINN) {
-               ep.setShaderType(COLLADASW::EffectProfile::BLINN);
-               // shininess
-               ep.setShininess(ma->har);
+               writeBlinn(ep, ma);
        }
        else if (ma->spec_shader == MA_SPEC_PHONG) {
-               ep.setShaderType(COLLADASW::EffectProfile::PHONG);
-               // shininess
-               ep.setShininess(ma->har);
+               writePhong(ep, ma);
+       }
+       else if(ma->diff_shader == MA_DIFF_LAMBERT) {
+               writeLambert(ep, ma);
        }
        else {
-               // XXX write warning "Current shader type is not supported" 
-               ep.setShaderType(COLLADASW::EffectProfile::LAMBERT);
+               // \todo figure out handling of all spec+diff shader combos blender has, for now write phong
+               writePhong(ep, ma);
        }
        // index of refraction
        if (ma->mode & MA_RAYTRANSP) {
index 8fe7ef31da4fff7cdd93d0c542c9fd08941f559a..2b25d1b889f10e69e119ccdd35282d65a10ad5c3 100644 (file)
@@ -61,6 +61,10 @@ private:
        /** Fills the array of mtex indices which have image. Used for exporting images. */
        void createTextureIndices(Material *ma, std::vector<int> &indices);
        
+       void writeBlinn(COLLADASW::EffectProfile &ep, Material *ma);
+       void writeLambert(COLLADASW::EffectProfile &ep, Material *ma);
+       void writePhong(COLLADASW::EffectProfile &ep, Material *ma);
+       
        bool hasEffects(Scene *sce);
 };