Browse Source

Support for newer versions of FCollada

rdb 17 years ago
parent
commit
a1a1bf69b7

+ 2 - 2
pandatool/src/daeegg/Sources.pp

@@ -17,11 +17,11 @@
     daeToEggConverter.cxx daeToEggConverter.h \
     daeCharacter.cxx daeCharacter.h \
     daeMaterials.cxx daeMaterials.h \
-    pre_fcollada_include.h
+    pre_fcollada_include.h fcollada_utils.h
 
   #define INSTALL_HEADERS \
     config_daeegg.h daeToEggConverter.h \
     daeCharacter.h daeMaterials.h \
-    pre_fcollada_include.h
+    pre_fcollada_include.h fcollada_utils.h
 
 #end lib_target

+ 6 - 9
pandatool/src/daeegg/daeCharacter.cxx

@@ -14,6 +14,7 @@
 
 #include "daeCharacter.h"
 #include "config_daeegg.h"
+#include "fcollada_utils.h"
 #include "pt_EggVertex.h"
 #include "eggXfmSAnim.h"
 
@@ -23,15 +24,6 @@
 
 TypeHandle DaeCharacter::_type_handle;
 
-// Useful conversion stuff
-#define TO_VEC3(v) (LVecBase3d(v[0], v[1], v[2]))
-#define TO_VEC4(v) (LVecBase4d(v[0], v[1], v[2], v[3]))
-#define TO_COLOR(v) (Colorf(v[0], v[1], v[2], v[3]))
-#define FROM_VEC3(v) (FMVector3(v[0], v[1], v[2]))
-#define FROM_VEC4(v) (FMVector4(v[0], v[1], v[2], v[3]))
-#define FROM_MAT4(v) (FMMatrix44(v.getData()))
-#define FROM_FSTRING(fs) (string(fs.c_str()))
-
 ////////////////////////////////////////////////////////////////////
 //     Function: DaeCharacter::Constructor
 //       Access: Public
@@ -69,7 +61,12 @@ as_egg_bundle() {
   skeleton->set_table_type(EggTable::TT_table);
   bundle->add_child(skeleton);
   // Loop through the joint hierarchy
+#if FCOLLADA_VERSION < 0x00030005
   FCDSceneNodeList roots = _controller_instance->FindSkeletonNodes();
+#else
+  FCDSceneNodeList roots;
+  _controller_instance->FindSkeletonNodes(roots);
+#endif
   for (FCDSceneNodeList::iterator it = roots.begin(); it != roots.end(); ++it) {
     process_joint(skeleton, *it);
   }

+ 11 - 14
pandatool/src/daeegg/daeMaterials.cxx

@@ -14,6 +14,7 @@
 
 #include "daeMaterials.h"
 #include "config_daeegg.h"
+#include "fcollada_utils.h"
 
 #include "FCDocument/FCDocument.h"
 #include "FCDocument/FCDMaterial.h"
@@ -27,12 +28,6 @@
 
 TypeHandle DaeMaterials::_type_handle;
 
-// Useful conversion stuff
-#define CONV_VEC3(v) (LVecBase3d(v[0], v[1], v[2]))
-#define CONV_VEC4(v) (LVecBase4d(v[0], v[1], v[2], v[3]))
-#define CONV_COLOR(v) (Colorf(v[0], v[1], v[2], v[3]))
-#define FROM_FSTRING(fs) (string(fs.c_str()))
-
 // luminance function, based on the ISO/CIE color standards
 // see ITU-R Recommendation BT.709-4
 #define luminance(c) ((c[0] * 0.212671 + c[1] * 0.715160 + c[2] * 0.072169))
@@ -68,7 +63,7 @@ void DaeMaterials::add_material_instance(const FCDMaterialInstance* instance) {
   for (size_t vib = 0; vib < instance->GetVertexInputBindingCount(); ++vib) {
     const FCDMaterialInstanceBindVertexInput* mivib = instance->GetVertexInputBinding(vib);
     assert(mivib != NULL);
-    _materials[semantic]->_uvsets[mivib->inputSet] = FROM_FSTRING(mivib->semantic);
+    _materials[semantic]->_uvsets[mivib->inputSet] = *mivib->semantic;
   }
   
   // Handle the material stuff
@@ -87,26 +82,28 @@ void DaeMaterials::add_material_instance(const FCDMaterialInstance* instance) {
     } else {
       daeegg_cat.spam() << "Processing effect, material semantic is " << semantic << endl;
       // Set the material parameters
-      egg_material->set_amb(CONV_COLOR(effect_common->GetAmbientColor()));
+      egg_material->set_amb(TO_COLOR(effect_common->GetAmbientColor()));
       ////TODO: find a better way for transparency
-      //LVecBase4f diffuse = CONV_COLOR(effect_common->GetDiffuseColor());
+      //LVecBase4f diffuse = TO_COLOR(effect_common->GetDiffuseColor());
       //diffuse.set_w(diffuse.get_w() * (1.0f - effect_common->GetOpacity()));
       //egg_material->set_diff(diffuse);
-      egg_material->set_diff(CONV_COLOR(effect_common->GetDiffuseColor()));
-      egg_material->set_emit(CONV_COLOR(effect_common->GetEmissionColor()) * effect_common->GetEmissionFactor());
+      egg_material->set_diff(TO_COLOR(effect_common->GetDiffuseColor()));
+      egg_material->set_emit(TO_COLOR(effect_common->GetEmissionColor()) * effect_common->GetEmissionFactor());
       egg_material->set_shininess(effect_common->GetShininess());
-      egg_material->set_spec(CONV_COLOR(effect_common->GetSpecularColor()));
+      egg_material->set_spec(TO_COLOR(effect_common->GetSpecularColor()));
       // Now try to load in the textures
       process_texture_bucket(semantic, effect_common, FUDaeTextureChannel::DIFFUSE, EggTexture::ET_modulate);
       process_texture_bucket(semantic, effect_common, FUDaeTextureChannel::BUMP, EggTexture::ET_normal);
       process_texture_bucket(semantic, effect_common, FUDaeTextureChannel::SPECULAR, EggTexture::ET_modulate_gloss);
       process_texture_bucket(semantic, effect_common, FUDaeTextureChannel::SPECULAR_LEVEL, EggTexture::ET_gloss);
-      process_texture_bucket(semantic, effect_common, FUDaeTextureChannel::OPACITY, EggTexture::ET_unspecified, EggTexture::F_alpha);
       process_texture_bucket(semantic, effect_common, FUDaeTextureChannel::TRANSPARENT, EggTexture::ET_unspecified, EggTexture::F_alpha);
       process_texture_bucket(semantic, effect_common, FUDaeTextureChannel::EMISSION, EggTexture::ET_add);
+#if FCOLLADA_VERSION < 0x00030005
+      process_texture_bucket(semantic, effect_common, FUDaeTextureChannel::OPACITY, EggTexture::ET_unspecified, EggTexture::F_alpha);
+#endif
       // Now, calculate the color blend stuff.
       _materials[semantic]->_blend = convert_blend(effect_common->GetTransparencyMode(),
-                                        CONV_COLOR(effect_common->GetTranslucencyColor()),
+                                          TO_COLOR(effect_common->GetTranslucencyColor()),
                                                    effect_common->GetTranslucencyFactor());
     }
     // Find an <extra> tag to support some extra stuff from extensions

+ 12 - 9
pandatool/src/daeegg/daeToEggConverter.cxx

@@ -13,6 +13,7 @@
 ////////////////////////////////////////////////////////////////////
 
 #include "daeToEggConverter.h"
+#include "fcollada_utils.h"
 #include "config_daeegg.h"
 #include "daeCharacter.h"
 #include "dcast.h"
@@ -35,6 +36,7 @@
 #include "FCDocument/FCDGeometry.h"
 #include "FCDocument/FCDGeometryInstance.h"
 #include "FCDocument/FCDGeometryPolygons.h"
+#include "FCDocument/FCDGeometryPolygonsInput.h"
 #include "FCDocument/FCDGeometrySource.h"
 #include "FCDocument/FCDSkinController.h"
 #include "FCDocument/FCDController.h"
@@ -45,15 +47,6 @@
 #include "FCDocument/FCDEffect.h"
 #include "FCDocument/FCDEffectStandard.h"
 
-// Useful conversion stuff
-#define TO_VEC3(v) (LVecBase3d(v[0], v[1], v[2]))
-#define TO_VEC4(v) (LVecBase4d(v[0], v[1], v[2], v[3]))
-#define TO_COLOR(v) (Colorf(v[0], v[1], v[2], v[3]))
-#define FROM_VEC3(v) (FMVector3(v[0], v[1], v[2]))
-#define FROM_VEC4(v) (FMVector4(v[0], v[1], v[2], v[3]))
-#define FROM_MAT4(v) (FMMatrix44(v.getData()))
-#define FROM_FSTRING(fs) (string(fs.c_str()))
-
 ////////////////////////////////////////////////////////////////////
 //     Function: DAEToEggConverter::Constructor
 //       Access: Public
@@ -216,7 +209,12 @@ void DAEToEggConverter::preprocess(const FCDSceneNode* node) {
   for (size_t in = 0; in < node->GetInstanceCount(); ++in) {
     if (node->GetInstance(in)->GetType() == FCDEntityInstance::CONTROLLER) {
       // Loop through the skeleton roots now.
+#if FCOLLADA_VERSION < 0x00030005
       FCDSceneNodeList roots = ((FCDControllerInstance*) node->GetInstance(in))->FindSkeletonNodes();
+#else
+      FCDSceneNodeList roots;
+      ((FCDControllerInstance*) node->GetInstance(in))->FindSkeletonNodes(roots);
+#endif
       for (FCDSceneNodeList::iterator it = roots.begin(); it != roots.end(); ++it) {
         daeegg_cat.spam() << "Found referenced skeleton root " << FROM_FSTRING((*it)->GetDaeId()) << endl;
         _skeletons.push_back(FROM_FSTRING((*it)->GetDaeId()));
@@ -515,7 +513,12 @@ void DAEToEggConverter::process_controller(PT(EggGroup) parent, const FCDControl
     }
   }
   // Add the joint hierarchy
+#if FCOLLADA_VERSION < 0x00030005
   FCDSceneNodeList roots = (const_cast<FCDControllerInstance*> (instance))->FindSkeletonNodes();
+#else
+  FCDSceneNodeList roots;
+  (const_cast<FCDControllerInstance*> (instance))->FindSkeletonNodes(roots);
+#endif
   for (FCDSceneNodeList::iterator it = roots.begin(); it != roots.end(); ++it) {
     process_node(DCAST(EggGroupNode, parent), *it, true);
   }

+ 39 - 0
pandatool/src/daeegg/fcollada_utils.h

@@ -0,0 +1,39 @@
+// Filename: fcollada_utils.h
+// Created by:  pro-rsoft (22Dec08)
+//
+////////////////////////////////////////////////////////////////////
+//
+// PANDA 3D SOFTWARE
+// Copyright (c) Carnegie Mellon University.  All rights reserved.
+//
+// All use of this software is subject to the terms of the revised BSD
+// license.  You should have received a copy of this license along
+// with this source code in a file named "LICENSE."
+//
+////////////////////////////////////////////////////////////////////
+
+// This file defines some conversion tools for conversion between
+// FCollada and Panda3D
+
+#ifndef FCOLLADA_UTILS_H
+#define FCOLLADA_UTILS_H
+
+#include "pre_fcollada_include.h"
+#include "FCollada.h"
+
+// Useful conversion stuff
+inline LVecBase3d TO_VEC3(FMVector3 v) {
+  return LVecBase3d(v.x, v.y, v.z);
+}
+inline LVecBase4d TO_VEC4(FMVector4 v) {
+  return LVecBase4d(v.x, v.y, v.z, v.w);
+}
+inline Colorf TO_COLOR(FMVector4 v) {
+  return Colorf(v.x, v.y, v.z, v.w);
+}
+#define FROM_VEC3(v) (FMVector3(v[0], v[1], v[2]))
+#define FROM_VEC4(v) (FMVector4(v[0], v[1], v[2], v[3]))
+#define FROM_MAT4(v) (FMMatrix44(v.getData()))
+#define FROM_FSTRING(fs) (string(fs.c_str()))
+
+#endif

+ 9 - 0
pandatool/src/daeegg/pre_fcollada_include.h

@@ -15,6 +15,13 @@
 // This file defines some stuff that need to be defined before
 // one includes FCollada.h
 
+#ifndef PRE_FCOLLADA_INCLUDE_H
+#define PRE_FCOLLADA_INCLUDE_H
+
+#ifdef FCOLLADA_VERSION
+  #error You must include pre_fcollada_include.h before including FCollada.h!
+#endif
+
 // FCollada expects LINUX to be defined on linux
 #ifdef IS_LINUX
   #ifndef LINUX
@@ -24,3 +31,5 @@
 
 #define NO_LIBXML
 #define FCOLLADA_NOMINMAX
+
+#endif