00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "LampBasic.h"
00026 #include "Collision/InputOutput/TextCollisionSaver.h"
00027 #include "Core/InputOutput/TextFileWriter.h"
00028 #include "Collision/System/CollisionScene.h"
00029 #include "Collision/System/CollisionNode.h"
00030 #include "Collision/Leaf/StaticSphereCollision.h"
00031 #include "Collision/Leaf/StaticDeformedMeshCollision.h"
00032
00033 namespace Lamp{
00034
00035
00036
00037 TextCollisionSaver::TextCollisionSaver(){
00038 }
00039
00040
00041 TextCollisionSaver::~TextCollisionSaver(){
00042 }
00043
00044
00045 void TextCollisionSaver::save(const String& filePath, CollisionScene* scene){
00046 TextFileWriter* textFileWriter = new TextFileWriter(filePath);
00047 save(textFileWriter, scene);
00048 delete textFileWriter;
00049 }
00050
00051
00052 void TextCollisionSaver::save(TextWriter* textWriter, CollisionScene* scene){
00053 writer_ = textWriter;
00054 scene_ = scene;
00055
00056
00057 writeHeader();
00058
00059
00060 int nodeCount = scene_->getNodeCount();
00061
00062 if(nodeCount > 1){
00063 writeBlockComment("CollisionNode");
00064 writer_->writeText("CollisionNode {\n");
00065 for(int i = 1; i < nodeCount; i++){
00066 CollisionNode* node = scene_->getNode(i);
00067 writeCollisionNode(node);
00068 }
00069 writer_->writeText("}\n\n");
00070 }
00071
00072
00073 int leafCount = scene_->getLeafCount();
00074 if(leafCount > 0){
00075 writeBlockComment("CollisionLeaf");
00076 writer_->writeText("CollisionLeaf {\n");
00077 for(int i = 0; i < leafCount; i++){
00078 CollisionLeaf* leaf = scene_->getLeaf(i);
00079 if(leaf->isStaticSphereCollision()){
00080 writeStaticSphereCollision(leaf->castStaticSphereCollision());
00081 }else if(leaf->isStaticDeformedMeshCollision()){
00082 writeStaticDeformedMeshCollision(
00083 leaf->castStaticDeformedMeshCollision());
00084 }else{
00085 ErrorOut("TextCollisionSaver::save() "
00086 "対応していないコリジョンリーフです %s",
00087 leaf->getName().getBytes());
00088 }
00089 }
00090 writer_->writeText("}\n\n");
00091 }
00092
00093
00094 if((nodeCount + leafCount) > 1){
00095 writeBlockComment("CollisionNodeLink");
00096 writer_->writeText("CollisionNodeLink {\n");
00097 for(int i = 0; i < nodeCount; i++){
00098 CollisionNode* node = scene_->getNode(i);
00099 writeCollisionNodeLink(node);
00100 }
00101 writer_->writeText("}\n\n");
00102 }
00103 writeLineComment();
00104 }
00105
00106
00107 void TextCollisionSaver::writeHeader(){
00108 writeBlockComment("Header");
00109 writer_->writeText("Header {\n");
00110 writer_->writeText("\ttype LampTextCollisionFormat\n");
00111 writer_->writeText("\tversion 0_1_0\n");
00112 writer_->writeText("}\n\n");
00113 }
00114
00115
00116 void TextCollisionSaver::writeCollisionNode(CollisionNode* node){
00117
00118 writer_->writeFormat("\t%s {\n", node->getName().getBytes());
00119
00120
00121 const Vector3& scale = node->getScale();
00122 writer_->writeFormat("\t\tscale { %.8f %.8f %.8f }\n",
00123 scale.x, scale.y, scale.z);
00124
00125
00126 const Vector3& rotation = node->getRotationXYZ();
00127 writer_->writeFormat("\t\trotation { %.8f %.8f %.8f }\n",
00128 rotation.x, rotation.y, rotation.z);
00129
00130
00131 const Vector3& translation = node->getTranslation();
00132 writer_->writeFormat("\t\ttranslation { %.8f %.8f %.8f }\n",
00133 translation.x, translation.y, translation.z);
00134
00135
00136 writer_->writeText("\t\tenabled ");
00137 writeBool(node->isEnabled());
00138 writer_->writeText("\n\t}\n\n");
00139 }
00140
00141
00142
00143
00144 void TextCollisionSaver::writeCollisionLeaf(
00145 CollisionLeaf* leaf, const String& type){
00146
00147 writer_->writeFormat("\t%s {\n", leaf->getName().getBytes());
00148
00149
00150 writer_->writeText("\t\ttype ");
00151 writer_->writeText(type);
00152
00153
00154 writer_->writeFormat("\n\t\tcollisionMask %u\n", leaf->getCollisionMask());
00155
00156
00157 writer_->writeText("\t\tenabled ");
00158 writeBool(leaf->isEnabled());
00159 writer_->writeText("\n");
00160 }
00161
00162
00163 void TextCollisionSaver::writeStaticSphereCollision(
00164 StaticSphereCollision* sphere){
00165
00166 writeCollisionLeaf(sphere, "StaticSphere");
00167 writer_->writeFormat("\t\tsphere { %.8f %.8f %.8f %.8f }\n",
00168 sphere->getCenter().x, sphere->getCenter().y, sphere->getCenter().z,
00169 sphere->getRadius());
00170 writer_->writeText("\t}\n\n");
00171 }
00172
00173
00174 void TextCollisionSaver::writeStaticDeformedMeshCollision(
00175 StaticDeformedMeshCollision* mesh){
00176
00177 writeCollisionLeaf(mesh, "StaticDeformedMesh");
00178
00179
00180 const AxisAlignedBox& box = mesh->getBoundingBox();
00181 writer_->writeFormat(
00182 "\t\tboundingBox { %.8f %.8f %.8f } { %.8f %.8f %.8f }\n",
00183 box.getMinimum().x, box.getMinimum().y, box.getMinimum().z,
00184 box.getMaximum().x, box.getMaximum().y, box.getMaximum().z);
00185
00186
00187 const Sphere& sphere = mesh->getBoundingSphere();
00188 writer_->writeFormat(
00189 "\t\tboundingSphere { %.8f %.8f %.8f %.8f }\n",
00190 sphere.getCenter().x, sphere.getCenter().y, sphere.getCenter().z,
00191 sphere.getRadius());
00192
00193
00194 int triangleCount = mesh->getTriangleCount();
00195 writer_->writeFormat("\t\ttriangleCount %d {\n", triangleCount);
00196 for(int i = 0; i < triangleCount; i++){
00197 const Triangle& triangle = mesh->getTriangle(i);
00198 const Vector3& vertex0 = triangle.getVertex(0);
00199 const Vector3& vertex1 = triangle.getVertex(1);
00200 const Vector3& vertex2 = triangle.getVertex(2);
00201 writer_->writeFormat(
00202 "\t\t\t{ %.8f %.8f %.8f } { %.8f %.8f %.8f } { %.8f %.8f %.8f }\n",
00203 vertex0.x, vertex0.y, vertex0.z, vertex1.x, vertex1.y, vertex1.z,
00204 vertex2.x, vertex2.y, vertex2.z);
00205 }
00206 writer_->writeText("\t\t}\n");
00207 writer_->writeText("\t}\n\n");
00208 }
00209
00210
00211
00212
00213 void TextCollisionSaver::writeCollisionNodeLink(CollisionNode* node){
00214 int childCount = node->getChildCount();
00215 if(childCount == 0){ return; }
00216 writer_->writeFormat("\t%s {\n", node->getName().getBytes());
00217 for(int i = 0; i < childCount; i++){
00218 CollisionObject* object = node->getChild(i);
00219 if(object->isCollisionNode()){
00220 writer_->writeFormat("\t\tnode %s\n", object->getName().getBytes());
00221 }else{
00222 writer_->writeFormat("\t\tleaf %s\n", object->getName().getBytes());
00223 }
00224 }
00225 writer_->writeText("\t}\n\n");
00226 }
00227
00228
00229
00230
00231 void TextCollisionSaver::writeBool(bool flag){
00232 if(flag){
00233 writer_->writeText("true");
00234 }else{
00235 writer_->writeText("false");
00236 }
00237 }
00238
00239
00240 void TextCollisionSaver::writeLineComment(){
00241 writer_->writeText("//----------------------------"
00242 "--------------------------------------------------\n");
00243 }
00244
00245
00246 void TextCollisionSaver::writeBlockComment(const String& blockName){
00247 writeLineComment();
00248 writer_->writeText("// ");
00249 writer_->writeText(blockName);
00250 writer_->writeText(" Block\n");
00251 writeLineComment();
00252 }
00253
00254 }
00255