| 286 | } |
| 287 | |
| 288 | inline std::string makeThreeJSViewer(std::vector<glm::dvec3> input, std::vector<uint32_t> indices) |
| 289 | { |
| 290 | std::stringstream obj; |
| 291 | if (input.size() > 0) |
| 292 | { |
| 293 | // Generate OBJ data for lines |
| 294 | for (size_t i = 0; i < input.size(); i++) |
| 295 | { |
| 296 | obj << "v " << input[i].x << " " << input[i].y << " " << input[i].z << "\n"; |
| 297 | } |
| 298 | |
| 299 | if (indices.size() > 0) |
| 300 | { |
| 301 | for (size_t i = 0; i < indices.size() - 1; i += 2) |
| 302 | { |
| 303 | obj << "l " << (indices[i] + 1) << " " << (indices[i + 1] + 1) << "\n"; |
| 304 | } |
| 305 | } |
| 306 | else |
| 307 | { |
| 308 | for (size_t i = 0; i < input.size() - 1; ++i) |
| 309 | { |
| 310 | obj << "l " << (i + 1) << " " << (i + 2) << "\n"; |
| 311 | } |
| 312 | } |
| 313 | } |
| 314 | |
| 315 | // Escape OBJ data for embedding in JavaScript |
| 316 | std::string objData = obj.str(); |
| 317 | std::string escapedObjData; |
| 318 | for (char c : objData) |
| 319 | { |
| 320 | if (c == '\n') escapedObjData += "\\n"; |
| 321 | else if (c == '"') escapedObjData += "\\\""; |
| 322 | else escapedObjData += c; |
| 323 | } |
| 324 | |
| 325 | // Replace placeholder with escaped OBJ data |
| 326 | std::string html = THREE_JS_VIEWER_TEMPLATE; |
| 327 | size_t pos = html.find(R"({})"); |
| 328 | if (pos != std::string::npos) |
| 329 | { |
| 330 | html.replace(pos, 2, escapedObjData); |
| 331 | } |
| 332 | |
| 333 | return html; |
| 334 | } |
| 335 | |
| 336 | inline std::string makeThreeJSViewer(std::vector<std::vector<glm::dvec2>> lines) |
| 337 | { |
no test coverage detected