docs: public static Vector3i load(InputStream in, TFloatList positions, TFloatList normals, TFloatList textureCoords, TIntList indices) {
          try {
              // load the doc into memory
              final DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
              final DocumentBuilder builder = builderFactory.newDocumentBuilder();
              final Document doc = builder.parse(in);
              doc.getDocumentElement().normalize();
  
              // find where everything is stored in the document by id
              // NOTE: Blender's Collada exporter has a bug that doesn't change 'polylist' to 'triangles'
              // even if the mesh is triangulated.
              final Element meshTag = (Element) doc.getElementsByTagName(ELEMENT_MESH).item(0);
              final Map<String, String> semanticMap = new HashMap<>();
  
              final TObjectIntMap<String> offsetMap = new TObjectIntHashMap<>();
              offsetMap.put(SEMANTIC_NORMAL, -1);
              offsetMap.put(SEMANTIC_TEXCOORD, -1);
              offsetMap.put(SEMANTIC_VERTEX, -1);
  
              final Element triTag = (Element) meshTag.getElementsByTagName(ELEMENT_TRIANGLES).item(0);
              loadInput(triTag, semanticMap, offsetMap);
              // find positions now
              final Element vertTag = getElementById(doc, semanticMap.get(SEMANTIC_VERTEX).substring(1));
              loadInput(vertTag, semanticMap);
              // We should now have IDs for the semantics: 'POSITION', 'VERTEX', 'NORMAL', and 'TEXCOORD' if they exist.
              // 'POSITION' and 'VERTEX' are synonymous but the difference here is that 'POSITION' supplies the id for
              // the position sources and 'VERTEX' supplies the offset within the indices array.
  
              final TFloatList rawTextureCoords = new TFloatArrayList();
              final TFloatList rawNormals = new TFloatArrayList();
  
              // load the position data
              if (!semanticMap.containsKey(SEMANTIC_POSITION)) {
                  throw new MalformedColladaFileException("Collada file is missing position data.");
              }
              loadSources(getElementById(doc, semanticMap.get(SEMANTIC_POSITION).substring(1)), positions);
              // make sure we got some positions
              if (positions.isEmpty()) {
                  throw new MalformedColladaFileException("Positions source cannot be empty.");
              }
  
              // load the texture coords
              if (textureCoords != null && semanticMap.containsKey(SEMANTIC_TEXCOORD)) {
                  loadSources(getElementById(doc, semanticMap.get(SEMANTIC_TEXCOORD).substring(1)), rawTextureCoords);
              }
  
              // load the normals
              if (normals != null && semanticMap.containsKey(SEMANTIC_NORMAL)) {
                  loadSources(getElementById(doc, semanticMap.get(SEMANTIC_NORMAL).substring(1)), rawNormals);
              }
  
              // load the indices
              loadIndices(parseIndices(triTag), offsetMap, indices, rawTextureCoords, textureCoords, rawNormals, normals);
          } catch (IOException e) {
              throw new MalformedColladaFileException("Error reading from input stream.", e);
          } catch (ParserConfigurationException | SAXException | MalformedColladaFileException e) {
              throw new MalformedColladaFileException("The specified Collada file is not valid.", e);
          } finally {
              try {
                  in.close();
              } catch (IOException e) {
                  logger.log(Level.SEVERE, "Couldn't close input stream", e);
              }
          }
  
          final int vertSize = 3;
          final int texCoordsSize = textureCoords == null || textureCoords.isEmpty() ? 0 : STEP_TEXCOORD;
          final int normalSize = normals == null || normals.isEmpty() ? 0 : STEP_NORMAL;
  
          return new Vector3i(vertSize, normalSize, texCoordsSize);
      }