152 lines
3.4 KiB
Text
152 lines
3.4 KiB
Text
backport of
|
|
https://github.com/bulletphysics/bullet3/commit/4f0673810cab0eee67ea314a3243952afd150cb4
|
|
|
|
Index: src/BulletSoftBody/btSoftBodyHelpers.cpp
|
|
--- src/BulletSoftBody/btSoftBodyHelpers.cpp.orig
|
|
+++ src/BulletSoftBody/btSoftBodyHelpers.cpp
|
|
@@ -1488,30 +1488,6 @@ void btSoftBodyHelpers::writeObj(const char* filename,
|
|
fs.close();
|
|
}
|
|
|
|
-static inline bool isSpace(const char c)
|
|
-{
|
|
- return (c == ' ') || (c == '\t');
|
|
-}
|
|
-static inline bool isNewLine(const char c)
|
|
-{
|
|
- return (c == '\r') || (c == '\n') || (c == '\0');
|
|
-}
|
|
-static inline float parseFloat(const char*& token)
|
|
-{
|
|
- token += strspn(token, " \t");
|
|
- float f = (float)atof(token);
|
|
- token += strcspn(token, " \t\r");
|
|
- return f;
|
|
-}
|
|
-static inline void parseFloat3(
|
|
- float& x, float& y, float& z,
|
|
- const char*& token)
|
|
-{
|
|
- x = parseFloat(token);
|
|
- y = parseFloat(token);
|
|
- z = parseFloat(token);
|
|
-}
|
|
-
|
|
void btSoftBodyHelpers::writeState(const char* file, const btSoftBody* psb)
|
|
{
|
|
std::ofstream fs;
|
|
@@ -1540,114 +1516,6 @@ void btSoftBodyHelpers::writeState(const char* file, c
|
|
fs << "\n";
|
|
}
|
|
fs.close();
|
|
-}
|
|
-
|
|
-std::string btSoftBodyHelpers::loadDeformableState(btAlignedObjectArray<btVector3>& qs, btAlignedObjectArray<btVector3>& vs, const char* filename, CommonFileIOInterface* fileIO)
|
|
-{
|
|
- {
|
|
- qs.clear();
|
|
- vs.clear();
|
|
- std::string tmp = filename;
|
|
- std::stringstream err;
|
|
-#ifdef USE_STREAM
|
|
- std::ifstream ifs(filename);
|
|
- if (!ifs)
|
|
- {
|
|
- err << "Cannot open file [" << filename << "]" << std::endl;
|
|
- return err.str();
|
|
- }
|
|
-#else
|
|
- int fileHandle = fileIO->fileOpen(filename, "r");
|
|
- if (fileHandle < 0)
|
|
- {
|
|
- err << "Cannot open file [" << filename << "]" << std::endl;
|
|
- return err.str();
|
|
- }
|
|
-#endif
|
|
-
|
|
- std::string name;
|
|
-
|
|
- int maxchars = 8192; // Alloc enough size.
|
|
- std::vector<char> buf(maxchars); // Alloc enough size.
|
|
- std::string linebuf;
|
|
- linebuf.reserve(maxchars);
|
|
-
|
|
-#ifdef USE_STREAM
|
|
- while (ifs.peek() != -1)
|
|
-#else
|
|
- char* line = 0;
|
|
- do
|
|
-#endif
|
|
- {
|
|
- linebuf.resize(0);
|
|
-#ifdef USE_STREAM
|
|
- safeGetline(ifs, linebuf);
|
|
-#else
|
|
- char tmpBuf[1024];
|
|
- line = fileIO->readLine(fileHandle, tmpBuf, 1024);
|
|
- if (line)
|
|
- {
|
|
- linebuf = line;
|
|
- }
|
|
-#endif
|
|
- // Trim newline '\r\n' or '\r'
|
|
- if (linebuf.size() > 0)
|
|
- {
|
|
- if (linebuf[linebuf.size() - 1] == '\n') linebuf.erase(linebuf.size() - 1);
|
|
- }
|
|
- if (linebuf.size() > 0)
|
|
- {
|
|
- if (linebuf[linebuf.size() - 1] == '\n') linebuf.erase(linebuf.size() - 1);
|
|
- }
|
|
-
|
|
- // Skip if empty line.
|
|
- if (linebuf.empty())
|
|
- {
|
|
- continue;
|
|
- }
|
|
-
|
|
- // Skip leading space.
|
|
- const char* token = linebuf.c_str();
|
|
- token += strspn(token, " \t");
|
|
-
|
|
- btAssert(token);
|
|
- if (token[0] == '\0') continue; // empty line
|
|
-
|
|
- if (token[0] == '#') continue; // comment line
|
|
-
|
|
- // q
|
|
- if (token[0] == 'q' && isSpace((token[1])))
|
|
- {
|
|
- token += 2;
|
|
- float x, y, z;
|
|
- parseFloat3(x, y, z, token);
|
|
- qs.push_back(btVector3(x, y, z));
|
|
- continue;
|
|
- }
|
|
-
|
|
- // v
|
|
- if (token[0] == 'v' && isSpace((token[1])))
|
|
- {
|
|
- token += 3;
|
|
- float x, y, z;
|
|
- parseFloat3(x, y, z, token);
|
|
- vs.push_back(btVector3(x, y, z));
|
|
- continue;
|
|
- }
|
|
-
|
|
- // Ignore unknown command.
|
|
- }
|
|
-#ifndef USE_STREAM
|
|
- while (line)
|
|
- ;
|
|
-#endif
|
|
-
|
|
- if (fileHandle >= 0)
|
|
- {
|
|
- fileIO->fileClose(fileHandle);
|
|
- }
|
|
- return err.str();
|
|
- }
|
|
}
|
|
|
|
void btSoftBodyHelpers::duplicateFaces(const char* filename, const btSoftBody* psb)
|