summaryrefslogtreecommitdiffstats
path: root/o3d/import/cross/collada.cc
diff options
context:
space:
mode:
Diffstat (limited to 'o3d/import/cross/collada.cc')
-rw-r--r--o3d/import/cross/collada.cc86
1 files changed, 54 insertions, 32 deletions
diff --git a/o3d/import/cross/collada.cc b/o3d/import/cross/collada.cc
index 64d39fc..e2041e86 100644
--- a/o3d/import/cross/collada.cc
+++ b/o3d/import/cross/collada.cc
@@ -66,6 +66,27 @@
namespace o3d {
+const char* Collada::kLightingTypeParamName =
+ COLLADA_STRING_CONSTANT("lightingType");
+
+const char* Collada::kLightingTypeConstant = "constant";
+const char* Collada::kLightingTypePhong = "phong";
+const char* Collada::kLightingTypeBlinn = "blinn";
+const char* Collada::kLightingTypeLambert = "lambert";
+const char* Collada::kLightingTypeUnknown = "unknown";
+
+const char* Collada::kMaterialParamNameEmissive = "emissive";
+const char* Collada::kMaterialParamNameAmbient = "ambient";
+const char* Collada::kMaterialParamNameDiffuse = "diffuse";
+const char* Collada::kMaterialParamNameSpecular = "specular";
+const char* Collada::kMaterialParamNameShininess = "shininess";
+const char* Collada::kMaterialParamNameSpecularFactor = "specularFactor";
+const char* Collada::kMaterialParamNameEmissiveSampler = "emissiveSampler";
+const char* Collada::kMaterialParamNameAmbientSampler = "ambientSampler";
+const char* Collada::kMaterialParamNameDiffuseSampler = "diffuseSampler";
+const char* Collada::kMaterialParamNameSpecularSampler = "specularSampler";
+const char* Collada::kMaterialParamNameBumpSampler = "bumpSampler";
+
class TranslationMap : public FCDGeometryIndexTranslationMap {
};
@@ -213,7 +234,7 @@ bool Collada::ImportFile(const FilePath& filename, Transform* parent,
}
if (!status) {
- // TODO: this could probably be the original URI instead of some
+ // TODO(o3d): this could probably be the original URI instead of some
// filename in the temp folder.
O3D_ERROR(service_locator_) << "Unable to import: "
<< FilePathToUTF8(filename).c_str();
@@ -341,7 +362,7 @@ bool Collada::ImportDAEDocument(FCDocument* doc,
// materials or models the user put them in the file and might need them
// at runtime.
//
- // TODO: Add option to skip this step if user just wants what's
+ // TODO(o3d): Add option to skip this step if user just wants what's
// actually used by models. The rest of the code already deals with this.
FCDImageLibrary* image_library = doc->GetImageLibrary();
for (uint32 i = 0; i < image_library->GetEntityCount(); i++) {
@@ -355,7 +376,7 @@ bool Collada::ImportDAEDocument(FCDocument* doc,
// Import all the materials in the file. Even if they are not used by
// models the user put them in the file and might need them at runtime.
//
- // TODO: Add option to skip this step if user just wants what's
+ // TODO(o3d): Add option to skip this step if user just wants what's
// actually used by models. The rest of the code already deals with this.
FCDMaterialLibrary* material_library = doc->GetMaterialLibrary();
for (uint32 i = 0; i < material_library->GetEntityCount(); i++) {
@@ -807,7 +828,7 @@ void Collada::ImportTreeInstances(FCDocument* doc,
LOG_ASSERT(instance != 0);
// Import each node based on what kind of entity it is
- // TODO: add more entity types as they are supported
+ // TODO(o3d): add more entity types as they are supported
switch (instance->GetEntityType()) {
case FCDEntity::CAMERA:
// camera entity
@@ -1021,7 +1042,6 @@ void Collada::BuildCamera(FCDocument* doc,
break;
}
}
-
}
Shape* Collada::GetShape(FCDocument* doc,
@@ -1248,7 +1268,7 @@ Shape* Collada::BuildShape(FCDocument* doc,
Shape* Collada::BuildSkinnedShape(FCDocument* doc,
FCDControllerInstance* instance,
NodeInstance *parent_node_instance) {
- // TODO: Handle chained controllers. Morph->Skin->...
+ // TODO(o3d): Handle chained controllers. Morph->Skin->...
Shape* shape = NULL;
LOG_ASSERT(doc && instance);
FCDController* controller =
@@ -1460,7 +1480,7 @@ Shape* Collada::BuildSkinnedShape(FCDocument* doc,
std::vector<float> data(num_vertices * num_source_components);
field.GetAsFloats(0, &data[0], num_source_components,
num_vertices);
- // TODO: Remove this matrix multiply. I don't think it is
+ // TODO(o3d): Remove this matrix multiply. I don't think it is
// needed.
for (unsigned vv = 0; vv < num_vertices; ++vv) {
float* values = &data[vv * num_source_components];
@@ -1685,7 +1705,7 @@ bool Collada::SetParamFromFCEffectParam(ParamObject* param_object,
SetSamplerStates(sampler, o3d_sampler);
}
} else if (type == FCDEffectParameter::SURFACE) {
- // TODO: This code is here to handle the NV_import profile
+ // TODO(o3d): This code is here to handle the NV_import profile
// exported by Max's DirectX Shader materials, which references
// only references texture params (not samplers). Once we move
// completely to using samplers and add sampler blocks to our
@@ -1740,15 +1760,15 @@ static const char* GetLightingType(FCDEffectStandard* std_profile) {
FCDEffectStandard::LightingType type = std_profile->GetLightingType();
switch (type) {
case FCDEffectStandard::CONSTANT:
- return "constant";
+ return Collada::kLightingTypeConstant;
case FCDEffectStandard::PHONG:
- return "phong";
+ return Collada::kLightingTypePhong;
case FCDEffectStandard::BLINN:
- return "blinn";
+ return Collada::kLightingTypeBlinn;
case FCDEffectStandard::LAMBERT:
- return "lambert";
+ return Collada::kLightingTypeLambert;
default:
- return "unknown";
+ return Collada::kLightingTypeUnknown;
}
}
@@ -1807,7 +1827,7 @@ Material* Collada::BuildMaterial(FCDocument* doc,
collada_effect->FindProfile(FUDaeProfileType::COMMON));
if (std_profile) {
ParamString* type_tag = material->CreateParam<ParamString>(
- COLLADA_STRING_CONSTANT("lightingType"));
+ kLightingTypeParamName);
type_tag->set_value(GetLightingType(std_profile));
}
}
@@ -1838,7 +1858,7 @@ Effect* Collada::GetEffect(FCDocument* doc, FCDEffect* collada_effect) {
// the newly-created effect, or NULL or error.
Effect* Collada::BuildEffect(FCDocument* doc, FCDEffect* collada_effect) {
if (!doc || !collada_effect) return NULL;
- // TODO: Remove all of this to be replaced by parsing Collada-FX
+ // TODO(o3d): Remove all of this to be replaced by parsing Collada-FX
// and profile_O3D only.
Effect* effect = NULL;
FCDEffectProfileFX* profile_fx = FindProfileFX(collada_effect);
@@ -1877,7 +1897,9 @@ Effect* Collada::BuildEffect(FCDocument* doc, FCDEffect* collada_effect) {
return NULL;
}
} else {
- file_util::ReadFileToString(file_path, &effect_string);
+ FilePath temp_path = file_path;
+ GetRelativePathIfPossible(base_path_, temp_path, &temp_path);
+ file_util::ReadFileToString(temp_path, &effect_string);
}
}
String collada_effect_name = WideToUTF8(
@@ -2540,7 +2562,7 @@ static Sampler::FilterType ConvertFilterType(
case FUDaeTextureFilterFunction::LINEAR_MIPMAP_NEAREST:
case FUDaeTextureFilterFunction::LINEAR_MIPMAP_LINEAR:
return Sampler::LINEAR;
- // TODO: Once FCollada supports COLLADA v1.5, turn this on:
+ // TODO(o3d): Once FCollada supports COLLADA v1.5, turn this on:
// case FUDaeTextureFilterFunction::ANISOTROPIC:
// return Sampler::ANISOTROPIC;
case FUDaeTextureFilterFunction::NONE:
@@ -2593,7 +2615,7 @@ void Collada::SetSamplerStates(FCDEffectParameterSampler* effect_sampler,
FUDaeTextureFilterFunction::FilterFunction mip_filter =
effect_sampler->GetMipFilter();
- // TODO: Once FCollada supports COLLADA v1.5, turn this on:
+ // TODO(o3d): Once FCollada supports COLLADA v1.5, turn this on:
// int max_anisotropy = effect_sampler->GetMaxAnisotropy();
o3d_sampler->set_address_mode_u(ConvertSamplerAddressMode(wrap_s));
@@ -2627,7 +2649,7 @@ void Collada::SetSamplerStates(FCDEffectParameterSampler* effect_sampler,
o3d_sampler->set_mip_filter(ConvertFilterType(mip_filter, true));
}
- // TODO: Once FCollada supports COLLADA v1.5, turn this on:
+ // TODO(o3d): Once FCollada supports COLLADA v1.5, turn this on:
// o3d_sampler->set_max_anisotropy(max_anisotropy);
}
@@ -2664,7 +2686,7 @@ void Collada::SetParamFromStandardEffectParam(
// Sets the values of a ParamObject parameters from a given FCollada material
// node. If a corresponding ParamObject parameter is not found, the FCollada
// parameter is ignored.
-// TODO: Should we ignore params not found? Maybe the user wants those for
+// TODO(o3d): Should we ignore params not found? Maybe the user wants those for
// things other than rendering.
// Parameters:
// material: The FCollada material node from which to retrieve values.
@@ -2672,7 +2694,7 @@ void Collada::SetParamFromStandardEffectParam(
void Collada::SetParamsFromMaterial(FCDMaterial* material,
ParamObject* param_object) {
size_t pcount = material->GetEffectParameterCount();
- // TODO: This test (for determining if we used the
+ // TODO(o3d): This test (for determining if we used the
// programmable profile or the fixed-func profile) is not very robust.
// Remove this once the Material changes are in.
if (pcount > 0) {
@@ -2707,39 +2729,39 @@ void Collada::SetParamsFromMaterial(FCDMaterial* material,
effect->FindProfile(FUDaeProfileType::COMMON))) != NULL) {
SetParamFromStandardEffectParam(effect_standard,
param_object,
- "emissive",
- "emissiveSampler",
+ kMaterialParamNameEmissive,
+ kMaterialParamNameEmissiveSampler,
effect_standard->GetEmissionColorParam(),
FUDaeTextureChannel::EMISSION);
SetParamFromStandardEffectParam(effect_standard,
param_object,
- "ambient",
- "ambientSampler",
+ kMaterialParamNameAmbient,
+ kMaterialParamNameAmbientSampler,
effect_standard->GetAmbientColorParam(),
FUDaeTextureChannel::AMBIENT);
SetParamFromStandardEffectParam(effect_standard,
param_object,
- "diffuse",
- "diffuseSampler",
+ kMaterialParamNameDiffuse,
+ kMaterialParamNameDiffuseSampler,
effect_standard->GetDiffuseColorParam(),
FUDaeTextureChannel::DIFFUSE);
SetParamFromStandardEffectParam(effect_standard,
param_object,
- "specular",
- "specularSampler",
+ kMaterialParamNameSpecular,
+ kMaterialParamNameSpecularSampler,
effect_standard->GetSpecularColorParam(),
FUDaeTextureChannel::SPECULAR);
SetParamFromStandardEffectParam(effect_standard,
param_object,
NULL,
- "bumpSampler",
+ kMaterialParamNameBumpSampler,
NULL,
FUDaeTextureChannel::BUMP);
SetParamFromFCEffectParam(param_object,
- "shininess",
+ kMaterialParamNameShininess,
effect_standard->GetShininessParam());
SetParamFromFCEffectParam(param_object,
- "specularFactor",
+ kMaterialParamNameSpecularFactor,
effect_standard->GetSpecularFactorParam());
}
}