pxmlw6n2f/Gazebo_Distributed_MPI/gazebo/common/ColladaExporter_TEST.cc

192 lines
6.8 KiB
C++

/*
* Copyright (C) 2012 Open Source Robotics Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#include <gtest/gtest.h>
#include <tinyxml.h>
#include "test_config.h"
#include "gazebo/common/Mesh.hh"
#include "gazebo/common/ColladaLoader.hh"
#include "gazebo/common/ColladaExporter.hh"
#include "test/util.hh"
using namespace gazebo;
class ColladaExporter : public gazebo::testing::AutoLogFixture { };
/////////////////////////////////////////////////
TEST_F(ColladaExporter, ExportBox)
{
std::string filenameIn = std::string(PROJECT_SOURCE_PATH) +
"/test/data/box.dae";
boost::filesystem::path pathOut(boost::filesystem::current_path());
boost::filesystem::create_directories(pathOut /
boost::filesystem::path("tmp"));
std::string filenameOut = pathOut.string() +
"/tmp/box_exported";
common::ColladaLoader loader;
const common::Mesh *meshOriginal = loader.Load(
filenameIn);
// Export with extension
common::ColladaExporter exporter;
exporter.Export(meshOriginal, filenameOut, false);
// Check .dae file
TiXmlDocument xmlDoc;
filenameOut = filenameOut + ".dae";
EXPECT_TRUE(xmlDoc.LoadFile(filenameOut));
const char *countDae = xmlDoc.FirstChildElement("COLLADA")
->FirstChildElement("library_geometries")
->FirstChildElement("geometry")
->FirstChildElement("mesh")
->FirstChildElement("source")
->FirstChildElement("float_array")
->Attribute("count");
unsigned int countMeshInt = meshOriginal->GetSubMesh(0)->GetVertexCount()*3;
char countMesh[100];
snprintf(countMesh, sizeof(countMesh), "%u", countMeshInt);
EXPECT_STREQ(countDae, countMesh);
// Reload mesh and compare
const common::Mesh *meshReloaded = loader.Load(filenameOut);
EXPECT_EQ(meshOriginal->GetName(), meshReloaded->GetName());
EXPECT_EQ(meshOriginal->Max(), meshReloaded->Max());
EXPECT_EQ(meshOriginal->Min(), meshReloaded->Min());
EXPECT_EQ(meshOriginal->GetSubMeshCount(), meshReloaded->GetSubMeshCount());
EXPECT_EQ(meshOriginal->GetMaterialCount(),
meshReloaded->GetMaterialCount());
EXPECT_EQ(meshOriginal->GetIndexCount(), meshReloaded->GetIndexCount());
EXPECT_EQ(meshOriginal->GetVertexCount(), meshReloaded->GetVertexCount());
EXPECT_EQ(meshOriginal->GetNormalCount(), meshReloaded->GetNormalCount());
EXPECT_EQ(meshOriginal->GetTexCoordCount(),
meshReloaded->GetTexCoordCount());
for (unsigned int i = 0; i < meshOriginal->GetSubMeshCount(); ++i)
{
for (unsigned int j = 0; j < meshOriginal->GetVertexCount(); ++j)
{
EXPECT_EQ(meshOriginal->GetSubMesh(i)->Vertex(j),
meshReloaded->GetSubMesh(i)->Vertex(j));
}
for (unsigned int j = 0; j < meshOriginal->GetNormalCount(); ++j)
{
EXPECT_EQ(meshOriginal->GetSubMesh(i)->Normal(j),
meshReloaded->GetSubMesh(i)->Normal(j));
}
for (unsigned int j = 0; j < meshOriginal->GetTexCoordCount(); ++j)
{
EXPECT_EQ(meshOriginal->GetSubMesh(i)->TexCoord(j),
meshReloaded->GetSubMesh(i)->TexCoord(j));
}
}
// Remove temp directory
boost::filesystem::remove_all(pathOut.string() + "/tmp");
}
/////////////////////////////////////////////////
TEST_F(ColladaExporter, ExportCordlessDrill)
{
common::ColladaLoader loader;
const common::Mesh *meshOriginal = loader.Load(
std::string(PROJECT_SOURCE_PATH) +
"/test/data/cordless_drill/meshes/cordless_drill.dae");
boost::filesystem::path pathOut(boost::filesystem::current_path());
boost::filesystem::create_directories(pathOut /
boost::filesystem::path("tmp"));
common::ColladaExporter exporter;
exporter.Export(meshOriginal, pathOut.string() +
"/tmp/cordless_drill_exported", true);
// Check .dae file
TiXmlDocument xmlDoc;
EXPECT_TRUE(xmlDoc.LoadFile(pathOut.string() +
"/tmp/cordless_drill_exported/meshes/cordless_drill_exported.dae"));
TiXmlElement *geometryXml = xmlDoc.FirstChildElement("COLLADA")
->FirstChildElement("library_geometries")
->FirstChildElement("geometry");
for (unsigned int i = 0; i < meshOriginal->GetSubMeshCount(); ++i)
{
unsigned int countMeshInt = meshOriginal->GetSubMesh(i)->
GetVertexCount()*3;
char countMesh[100];
snprintf(countMesh, sizeof(countMesh), "%u", countMeshInt);
const char *countDae = geometryXml
->FirstChildElement("mesh")
->FirstChildElement("source")
->FirstChildElement("float_array")
->Attribute("count");
EXPECT_STREQ(countDae, countMesh);
geometryXml = geometryXml->NextSiblingElement("geometry");
}
// Reload mesh and compare
const common::Mesh *meshReloaded = loader.Load(pathOut.string() +
"/tmp/cordless_drill_exported/meshes/cordless_drill_exported.dae");
EXPECT_EQ(meshOriginal->GetName(), meshReloaded->GetName());
EXPECT_EQ(meshOriginal->Max(), meshReloaded->Max());
EXPECT_EQ(meshOriginal->Min(), meshReloaded->Min());
EXPECT_EQ(meshOriginal->GetSubMeshCount(), meshReloaded->GetSubMeshCount());
EXPECT_EQ(meshOriginal->GetMaterialCount(),
meshReloaded->GetMaterialCount());
EXPECT_EQ(meshOriginal->GetIndexCount(), meshReloaded->GetIndexCount());
EXPECT_EQ(meshOriginal->GetVertexCount(), meshReloaded->GetVertexCount());
EXPECT_EQ(meshOriginal->GetNormalCount(), meshReloaded->GetNormalCount());
EXPECT_EQ(meshOriginal->GetTexCoordCount(),
meshReloaded->GetTexCoordCount());
for (unsigned int i = 0; i < meshOriginal->GetSubMeshCount(); ++i)
{
for (unsigned int j = 0; j < meshOriginal->GetVertexCount(); ++j)
{
EXPECT_EQ(meshOriginal->GetSubMesh(i)->Vertex(j),
meshReloaded->GetSubMesh(i)->Vertex(j));
}
for (unsigned int j = 0; j < meshOriginal->GetNormalCount(); ++j)
{
EXPECT_EQ(meshOriginal->GetSubMesh(i)->Normal(j),
meshReloaded->GetSubMesh(i)->Normal(j));
}
for (unsigned int j = 0; j < meshOriginal->GetTexCoordCount(); ++j)
{
EXPECT_EQ(meshOriginal->GetSubMesh(i)->TexCoord(j),
meshReloaded->GetSubMesh(i)->TexCoord(j));
}
}
// Remove temp directory
boost::filesystem::remove_all(pathOut.string() + "/tmp");
}
/////////////////////////////////////////////////
int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}