• Login
sketchucation logo sketchucation
  • Login
Oops, your profile's looking a bit empty! To help us tailor your experience, please fill in key details like your SketchUp version, skill level, operating system, and more. Update and save your info on your profile page today!
🫛 Lightbeans Update | Metallic and Roughness auto-applied in SketchUp 2025+ Download

Help with loading performance using Sketchup C SDK.

Scheduled Pinned Locked Moved Developers' Forum
2 Posts 2 Posters 508 Views 2 Watching
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • K Offline
    kian123
    last edited by 11 Aug 2015, 19:06

    Hello,

    Not sure if this is the right place to ask this but I'm seeing that SUMeshHelperCreateWithTextureWriter is quite expensive performance wise when loading/decoding an skp file.

    Previously, when encountering simple/complex faces I'm using the above function to get the vertex & index buffers. What I was seeing is that it took 13 secs to load a small 4 mb sketchup file ( not allow to post this file). Using naive simple face implementation below, I was seeing only 4 secs. I'm interested to get the simple face that is found in the WriteFace function of the skp_to_xml sample going using
    SUFaceGetOuterLoop, SULoopGetVertices. Was wondering if there is a reference implementation of converting the points to vertex/index buffers when the num_loops == 1.

    // This block of code would be the one based upon the WriteFace function found in skp_to_xml sample:

        SULoopRef outer_loop = SU_INVALID;
        SU_CALL(SUFaceGetOuterLoop(face, &outer_loop));
        size_t num_vertices;
        SU_CALL(SULoopGetNumVertices(outer_loop, &num_vertices));
        if (num_vertices > 0) {
    
          std;;vector<SUVertexRef> vertices(num_vertices);
          SU_CALL(SULoopGetVertices(outer_loop, num_vertices, &vertices[0],
                                    &num_vertices));
    
          for (size_t i = 0; i < num_vertices; i++) {
            XmlFaceVertex vertex_infoFront;
    		XmlFaceVertex vertex_infoBack;
    
            // vertex position
            SUPoint3D su_point;
            SUVertexRef vertex_ref = vertices[i];
            SU_CALL(SUVertexGetPosition(vertex_ref, &su_point));
            vertex_infoFront.vertex_ = CPoint3d(su_point);
    		vertex_infoBack.vertex_ = CPoint3d(su_point);
    
            // texture coordinates
    		if (pFrontMat->m_bHasTexture ) {
              SUUVQ uvq;
              if (SUUVHelperGetFrontUVQ(uv_helper, &su_point, &uvq) ==
                  SU_ERROR_NONE) {
                vertex_infoFront.front_texture_coord_ = CPoint3d(uvq.u, uvq.v, 0);
              }
            }
    
    		if (pBackMat->m_bHasTexture) {
              SUUVQ uvq;
              if (SUUVHelperGetBackUVQ(uv_helper, &su_point, &uvq) ==
                  SU_ERROR_NONE) { 
                vertex_infoBack.back_texture_coord_ = CPoint3d(uvq.u, uvq.v, 0);
              }
            }
            pFrontMat->vertices_.push_back(vertex_infoFront);
    		pBackMat->vertices_.push_back(vertex_infoBack);
          }
            
    	  // Here is my naive implementation using triangle fan based upon the return vertices.
    	  // Will need to figure out how to handle concave/convex polygon.
    	  
    	  	size_t dwNumTrisFan = num_vertices - 2;
    		num_indices = dwNumTrisFan * 3;
    		pvIndicesToUseFront = new std;;vector<size_t>(num_indices);
    		pvIndicesToUseBack = new std;;vector<size_t>(num_indices);
    		for ( size_t i = 0; i < dwNumTrisFan; i++ )
    		{
    			size_t dwIndexCurr = i * 3;
    
    			(*pvIndicesToUseFront)[dwIndexCurr] = 0;
    			(*pvIndicesToUseFront)[dwIndexCurr+1] = i + 1;
    			(*pvIndicesToUseFront)[dwIndexCurr+2] = i + 2;
    
    			(*pvIndicesToUseBack)[dwIndexCurr] = 0;
    			(*pvIndicesToUseBack)[dwIndexCurr+1] = i + 2;
    			(*pvIndicesToUseBack)[dwIndexCurr+2] = i + 1;
    
    			XmlFaceVertex &F0 = pFrontMat->vertices_[(*pvIndicesToUseFront)[dwIndexCurr]];
    			XmlFaceVertex &F1 = pFrontMat->vertices_[(*pvIndicesToUseFront)[dwIndexCurr+1]];
    			XmlFaceVertex &F2 = pFrontMat->vertices_[(*pvIndicesToUseFront)[dwIndexCurr+2]];
    			
    			
    			XmlGeomUtils;;CPoint3d & v0 = F0.vertex_;
    			XmlGeomUtils;;CPoint3d & v1 = F1.vertex_;
    			XmlGeomUtils;;CPoint3d & v2 = F2.vertex_;
    
    			Vector vV0 = { (f32)v0.x(), (f32)v0.y(), (f32)v0.z(), 0.f };
    			Vector vV1 = { (f32)v1.x(), (f32)v1.y(), (f32)v1.z(), 0.f };
    			Vector vV2 = { (f32)v2.x(), (f32)v2.y(), (f32)v2.z(), 0.f };
    			Vector vE0E1 = { vV1.x - vV0.x, vV1.y - vV0.y, vV1.z - vV0.z, 0.f };
    			Vector vE0E2 = { vV2.x - vV0.x, vV2.y - vV0.y, vV2.z - vV0.z, 0.f };
    			Vector vNorm;
    			Vector_Cross ( &vNorm, &vE0E1, &vE0E2 );
    			Vector_Normalize ( &vNorm, &vNorm );
    			F0.normal_.SetDirection ( vNorm.x, vNorm.y, vNorm.z );
    			F1.normal_.SetDirection ( vNorm.x, vNorm.y, vNorm.z );
    			F2.normal_.SetDirection ( vNorm.x, vNorm.y, vNorm.z );
    		
    			XmlFaceVertex &F0Back = pBackMat->vertices_[(*pvIndicesToUseBack)[dwIndexCurr]];
    			XmlFaceVertex &F1Back = pBackMat->vertices_[(*pvIndicesToUseBack)[dwIndexCurr+1]];
    			XmlFaceVertex &F2Back = pBackMat->vertices_[(*pvIndicesToUseBack)[dwIndexCurr+2]];
    			
    			Vector vNormNeg;
    			Vector_Scale ( &vNormNeg, -1.f, &vNorm );
    			F0Back.normal_.SetDirection ( vNormNeg.x, vNormNeg.y, vNormNeg.z );
    			F1Back.normal_.SetDirection ( vNormNeg.x, vNormNeg.y, vNormNeg.z );
    			F2Back.normal_.SetDirection ( vNormNeg.x, vNormNeg.y, vNormNeg.z );
    			
    		}
        }
    

    Thanks in advance,
    Ian

    1 Reply Last reply Reply Quote 0
    • D Offline
      Dan Rathbun
      last edited by 12 Aug 2015, 07:31

      You can also ask your question at:
      http://forums.sketchup.com/c/developers/sketchup-sdk

      The SketchUp Team members are more likely to answer, more quickly.

      I'm not here much anymore.

      1 Reply Last reply Reply Quote 0
      • 1 / 1
      1 / 1
      • First post
        1/2
        Last post
      Buy SketchPlus
      Buy SUbD
      Buy WrapR
      Buy eBook
      Buy Modelur
      Buy Vertex Tools
      Buy SketchCuisine
      Buy FormFonts

      Advertisement