summaryrefslogtreecommitdiffstats
path: root/o3d/converter
diff options
context:
space:
mode:
Diffstat (limited to 'o3d/converter')
-rw-r--r--o3d/converter/cross/converter.cc72
-rw-r--r--o3d/converter/cross/converter.h12
-rw-r--r--o3d/converter/cross/converter_main.cc21
3 files changed, 101 insertions, 4 deletions
diff --git a/o3d/converter/cross/converter.cc b/o3d/converter/cross/converter.cc
index 981b129..6f50787 100644
--- a/o3d/converter/cross/converter.cc
+++ b/o3d/converter/cross/converter.cc
@@ -132,6 +132,78 @@ bool Convert(const FilePath& in_filename,
pack->RemoveObject(param_object);
}
+ // Mark all Samplers to use tri-linear filtering
+ if (!options.keep_filters) {
+ std::vector<Sampler*> samplers = pack->GetByClass<Sampler>();
+ for (unsigned ii = 0; ii < samplers.size(); ++ii) {
+ Sampler* sampler = samplers[ii];
+ sampler->set_mag_filter(Sampler::LINEAR);
+ sampler->set_min_filter(Sampler::LINEAR);
+ sampler->set_mip_filter(Sampler::LINEAR);
+ }
+ }
+
+ // Mark all Materials that are on Primitives that have no normals as constant.
+ if (!options.keep_materials) {
+ std::vector<Primitive*> primitives = pack->GetByClass<Primitive>();
+ for (unsigned ii = 0; ii < primitives.size(); ++ii) {
+ Primitive* primitive = primitives[ii];
+ StreamBank* stream_bank = primitive->stream_bank();
+ if (stream_bank && !stream_bank->GetVertexStream(Stream::NORMAL, 0)) {
+ Material* material = primitive->material();
+ if (material) {
+ ParamString* lighting_param = material->GetParam<ParamString>(
+ Collada::kLightingTypeParamName);
+ if (lighting_param) {
+ // If the lighting type is lambert, blinn, or phong
+ // copy the diffuse color to the emissive since that's most likely
+ // what the user wants to see.
+ if (lighting_param->value().compare(
+ Collada::kLightingTypeLambert) == 0 ||
+ lighting_param->value().compare(
+ Collada::kLightingTypeBlinn) == 0 ||
+ lighting_param->value().compare(
+ Collada::kLightingTypePhong) == 0) {
+ // There's 4 cases: (to bad they are not the same names)
+ // 1) Diffuse -> Emissive
+ // 2) DiffuseSampler -> Emissive
+ // 3) Diffuse -> EmissiveSampler
+ // 4) DiffuseSampler -> EmissiveSampler
+ ParamFloat4* diffuse_param = material->GetParam<ParamFloat4>(
+ Collada::kMaterialParamNameDiffuse);
+ ParamFloat4* emissive_param = material->GetParam<ParamFloat4>(
+ Collada::kMaterialParamNameEmissive);
+ ParamSampler* diffuse_sampler_param =
+ material->GetParam<ParamSampler>(
+ Collada::kMaterialParamNameDiffuseSampler);
+ ParamSampler* emissive_sampler_param =
+ material->GetParam<ParamSampler>(
+ Collada::kMaterialParamNameEmissive);
+ Param* source_param = diffuse_param ?
+ static_cast<Param*>(diffuse_param) :
+ static_cast<Param*>(diffuse_sampler_param);
+ Param* destination_param = emissive_param ?
+ static_cast<Param*>(emissive_param) :
+ static_cast<Param*>(emissive_sampler_param);
+ if (!source_param->IsA(destination_param->GetClass())) {
+ // The params do not match type so we need to make the emissive
+ // Param the same as the diffuse Param.
+ material->RemoveParam(destination_param);
+ destination_param = material->CreateParamByClass(
+ diffuse_param ? Collada::kMaterialParamNameEmissive :
+ Collada::kMaterialParamNameEmissiveSampler,
+ source_param->GetClass());
+ DCHECK(destination_param);
+ }
+ destination_param->CopyDataFromParam(source_param);
+ }
+ lighting_param->set_value(Collada::kLightingTypeConstant);
+ }
+ }
+ }
+ }
+ }
+
// Attempt to open the output file.
FILE* out_file = file_util::OpenFile(out_filename, "wb");
if (out_file == NULL) {
diff --git a/o3d/converter/cross/converter.h b/o3d/converter/cross/converter.h
index 1524493..dd0141c 100644
--- a/o3d/converter/cross/converter.h
+++ b/o3d/converter/cross/converter.h
@@ -50,7 +50,10 @@ struct Options {
: base_path(FilePath::kCurrentDirectory),
condition(true),
up_axis(0, 0, 0),
- pretty_print(false) {}
+ pretty_print(false),
+ keep_filters(false),
+ keep_materials(false) {
+ }
// The path to the "base" of the model path, from which all paths
// are made relative. Defaults to the current directory.
@@ -68,6 +71,13 @@ struct Options {
// pretty-printed (formatted with spaces and newlines) or just
// emitted as one huge one-line string. Defaults to false.
bool pretty_print;
+
+ // Tells the converter not to set all filters to tri-linear.
+ bool keep_filters;
+
+ // Tells the converter not to change materials to constant if they are used by
+ // a mesh that has no normals.
+ bool keep_materials;
};
// Converts the given file for use in O3D. This is done by
diff --git a/o3d/converter/cross/converter_main.cc b/o3d/converter/cross/converter_main.cc
index 85cc594..650e0b7 100644
--- a/o3d/converter/cross/converter_main.cc
+++ b/o3d/converter/cross/converter_main.cc
@@ -80,9 +80,24 @@ int CrossMain(int argc, char**argv) {
in_filename = o3d::WideToFilePath(values[0]);
out_filename = o3d::WideToFilePath(values[1]);
} else {
- std::cerr << "Usage: " << argv[0]
- << " [--no-condition] [--base-path=<path>] [--up-axis=x,y,z]"
- << " [--pretty-print] <infile.dae> [ <outfile> ]\n";
+ std::cerr << "Usage: " << argv[0]
+ << " [ options ] <infile.dae> [ <outfile> ]\n";
+ std::cerr
+ << "--no-condition\n"
+ << " Stops the converter from conditioning shaders.\n"
+ << "--base-path=<path>\n"
+ << " Sets the base path for finding textures and other external\n"
+ << " files.\n"
+ << "--up-axis=x,y,z\n"
+ << " Converts the file to have this up axis.\n"
+ << "--pretty-print\n"
+ << " Makes the exported JSON easier to read.\n"
+ << "--keep-filters\n"
+ << " Stops the converter from forcing all texture samplers to use\n"
+ << " tri-linear filtering.\n"
+ << "--keep-materials\n"
+ << " Stops the converter from changing materials to <constant> if\n"
+ << " they are used by a mesh that has no normals.\n";
return EXIT_FAILURE;
}