omz:forum

    • Register
    • Login
    • Search
    • Recent
    • Popular

    Welcome!

    This is the community forum for my apps Pythonista and Editorial.

    For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.


    For the fun, a Photos cube

    Pythonista
    5
    35
    18758
    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.
    • JonB
      JonB last edited by

      Actually, verts must be a ctypes array, not a python list.

      1 Reply Last reply Reply Quote 0
      • momorprods
        momorprods last edited by

        oh ok thanks, going to try that and keep you posted!

        1 Reply Last reply Reply Quote 0
        • momorprods
          momorprods last edited by momorprods

          Made this, but still crashing. Am I making another noob mistake?

          verts=[0.0,0.0,0.0 , 1.0,0.0,0.0 , 0.0,1.0,0.0]
          arr = (ctypes.c_float * len(verts))(*verts)
          src = SCNGeometrySource.geometrySourceWithVertices_count_(byref(arr),3)
          cvp 1 Reply Last reply Reply Quote 0
          • cvp
            cvp @momorprods last edited by cvp

            @momorprods Perhaps this (at least, no crash 😀)

            class SCNVector3(Structure):
            	_fields_ = [('x', c_double), ('y', c_double), ('z', c_double)]
            

            And

                verts=[SCNVector3(0, 0, 0), SCNVector3(1, 0, 0), SCNVector3(0, 1, 0)]
                verts_array = (SCNVector3 * len(verts))(*verts)
                SCNGeometrySource = ObjCClass('SCNGeometrySource').geometrySourceWithVertices_count_(
                verts_array,len(verts),
                restype=c_void_p,
                argtypes=[POINTER(SCNVector3), c_ulong],)
            
            1 Reply Last reply Reply Quote 0
            • momorprods
              momorprods last edited by

              wooohoooo thanks!!

              cvp 1 Reply Last reply Reply Quote 0
              • momorprods
                momorprods last edited by momorprods

                Making some good progress thanks to your help. But I’m getting a last crash on the very last instruction - any idea?

                #triangle generation
                verts=[SCNVector3(0, 0, 0), SCNVector3(1, 0, 0), SCNVector3(0, 1, 0)]
                verts_array = (SCNVector3 * len(verts))(*verts)
                
                src = ObjCClass('SCNGeometrySource').geometrySourceWithVertices_count_(
                    verts_array,len(verts),
                    restype=c_void_p,
                    argtypes=[POINTER(SCNVector3), c_ulong],)
                    
                indexes=[0,1,2]
                indexes_array = (c_ulong*len(indexes))(*indexes)
                datIndexes = ObjCClass('NSData').dataWithBytes_length_(indexes_array,len(indexes_array))
                 
                ele=ObjCClass('SCNGeometryElement').geometryElementWithData_primitiveType_primitiveCount_bytesPerIndex_(datIndexes,SCNGeometryPrimitiveTypeTriangles,1,4)
                   
                # CRASH Here: 
                geo = ObjCClass('SCNGeometry').geometryWithSources_elements_(src,ele)
                cvp 2 Replies Last reply Reply Quote 0
                • cvp
                  cvp @momorprods last edited by cvp

                  @momorprods I've read that indices must contain a first element with the number of points but I don't know if it is true.
                  sources and elements must be arrays
                  But I have also a crash with my code
                  See faultlog below but I can't solve the problem, sorry

                      verts = [SCNVector3(0, 0, 0), SCNVector3(1, 0, 0), SCNVector3(0, 1, 0)]
                      verts_array = (SCNVector3 * len(verts))(*verts)
                      SCNGeometrySource = ObjCClass('SCNGeometrySource').geometrySourceWithVertices_count_(
                      verts_array,len(verts),
                      restype=c_void_p,
                      argtypes=[POINTER(SCNVector3), c_ulong],)
                      sources = NSArray([SCNGeometrySource])
                      
                      indices = [3,0,1,2]	# number points and their indices
                      indices_data = ns(indices)
                      # primitiveType = 0 for triangle
                      # primitiveCount = 1
                      SCNGeometryElement = ObjCClass('SCNGeometryElement').geometryElementWithData_primitiveType_primitiveCount_bytesPerIndex_(indices_data,0,1,4)
                      elements = NSArray([SCNGeometryElement])
                      
                      geometry = ObjCClass('SCNGeometry').geometryWithSources_elements_(sources, elements)    	
                  

                  Fatal Python error: Aborted

                  Current thread 0x0000000100d62b80 (most recent call first):
                  File "/var/containers/Bundle/Application/E4751F4F-64A4-4BE6-AB9D-9C9564715002/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/site-packages/objc_util.py", line 773 in call
                  File "/private/var/mobile/Containers/Shared/AppGroup/668A7D98-7216-47ED-917D-AA0B6173167E/Pythonista3/Documents/test6.py", line 51 in demo
                  File "/var/containers/Bundle/Application/E4751F4F-64A4-4BE6-AB9D-9C9564715002/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/site-packages/objc_util.py", line 1066 in OMMainThreadDispatcher_invoke_imp

                  Thread 0x000000016fa5f000 (most recent call first):
                  File "/var/containers/Bundle/Application/E4751F4F-64A4-4BE6-AB9D-9C9564715002/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/site-packages/objc_util.py", line 898 in call
                  File "/var/containers/Bundle/Application/E4751F4F-64A4-4BE6-AB9D-9C9564715002/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/site-packages/objc_util.py", line 1095 in new_func
                  File "/private/var/mobile/Containers/Shared/AppGroup/668A7D98-7216-47ED-917D-AA0B6173167E/Pythonista3/Documents/test6.py", line 76 in <module>


                  Objective-C exception details:

                  NSInvalidArgumentException: -[SCNGeometrySource count]: unrecognized selector sent to instance 0x283276100

                  1 Reply Last reply Reply Quote 0
                  • JonB
                    JonB last edited by JonB

                    this works

                    from ctypes import *
                    from objc_util import *
                    
                    class SCNVector3(Structure):
                        _fields_ = [('x', c_double), ('y', c_double), ('z', c_double)]
                    
                    verts=[SCNVector3(0, 0, 0), SCNVector3(1, 0, 0), SCNVector3(0, 1, 0)]
                    
                    SCNVector3Array3=SCNVector3 * len(verts)
                    verts_array=SCNVector3Array3(*verts)
                    SCNGeometrySource = ObjCClass('SCNGeometrySource')
                    
                    s=SCNGeometrySource.geometrySourceWithVertices_count_(byref(verts_array),len(verts),restype=c_void_p,argtypes=[POINTER(SCNVector3Array3), c_ulong],)
                    
                    cvp 1 Reply Last reply Reply Quote 0
                    • cvp
                      cvp @JonB last edited by

                      @JonB Yes, but in my code,,the crash was in

                          geometry = ObjCClass('SCNGeometry').geometryWithSources_elements_(sources, elements)    	
                      
                      1 Reply Last reply Reply Quote 0
                      • cvp
                        cvp @momorprods last edited by cvp

                        @momorprods @JonB No crash with

                            verts = [SCNVector3(0, 0, 0), SCNVector3(1, 0, 0), SCNVector3(0, 1, 0)]     
                            SCNVector3Array3=SCNVector3 * len(verts)
                            verts_array=SCNVector3Array3(*verts)
                            SCNGeometrySource = ObjCClass('SCNGeometrySource')
                            s = SCNGeometrySource.geometrySourceWithVertices_count_(byref(verts_array),len(verts),restype=c_void_p,argtypes=[POINTER(SCNVector3Array3), c_ulong],)
                           
                            indexes=[0,1,2]
                            indexes_array = (c_ulong*len(indexes))(*indexes)
                            datIndexes = ObjCClass('NSData').dataWithBytes_length_(indexes_array,len(indexes_array))
                            # primitiveType = 0 for triangle
                            # primitiveCount = 1  
                            e = ObjCClass('SCNGeometryElement').geometryElementWithData_primitiveType_primitiveCount_bytesPerIndex_(datIndexes,0,1,4)
                            
                            geometry = ObjCClass('SCNGeometry').geometryWithSources_elements_([s],[e])
                        	```
                        
                        Edit: but nothing visible
                        1 Reply Last reply Reply Quote 0
                        • cvp
                          cvp @momorprods last edited by

                          @momorprods I'm not sure if you should take in account the length of c_ulong
                          Just an idea, rally not sure.
                          Anyway, Scene stays blank 😢

                              #indexes=[0,1,2]
                              indexes = [c_ulong(0),c_ulong(1),c_ulong(2)]
                              indexes_array = (c_ulong*len(indexes))(*indexes)
                              #datIndexes = ObjCClass('NSData').dataWithBytes_length_(indexes_array, len(indexes_array))
                              datIndexes = ObjCClass('NSData').dataWithBytes_length_(indexes_array, len(indexes_array)*sizeof(c_ulong))
                              # primitiveType = 0 for triangle
                              # primitiveCount = 1  
                              #e = ObjCClass('SCNGeometryElement').geometryElementWithData_primitiveType_primitiveCount_bytesPerIndex_(datIndexes,0,1,4)
                              e = ObjCClass('SCNGeometryElement').geometryElementWithData_primitiveType_primitiveCount_bytesPerIndex_(datIndexes,0,1,sizeof(c_ulong))
                          
                          1 Reply Last reply Reply Quote 0
                          • momorprods
                            momorprods last edited by

                            @cvp @JonB thanks for your help, I am going to investigate that empty scene stuff.

                            1 Reply Last reply Reply Quote 0
                            • JonB
                              JonB last edited by JonB

                              dataWithBytes_length_ expects sizeof(verts_array)

                              datIndexes = ObjCClass('NSData').dataWithBytes_length_(indexes_array,sizeof(indexes_array))
                              

                              as a check:

                              geometry.geometryElements()[0].data()
                              
                              cvp 1 Reply Last reply Reply Quote 0
                              • cvp
                                cvp @JonB last edited by

                                @JonB Thanks for the correction but obviously not the only error because still blank Scene...

                                1 Reply Last reply Reply Quote 0
                                • cvp
                                  cvp @momorprods last edited by cvp

                                  @momorprods Eureka, same code but with other vertices shows a triangle

                                  One more time, thanks to @JonB without whom we would never solve these problems.

                                      verts = [SCNVector3(0, 0, 1), SCNVector3(1, 0, 0), SCNVector3(0, 1, 0)]
                                  
                                  1 Reply Last reply Reply Quote 0
                                  • momorprods
                                    momorprods last edited by

                                    guys you are genius. Not sure why the vertex order did change something, probably it needs to be defined clockwise or something like that.

                                    Thanks for all of your help, you are awesome!

                                    cvp 3 Replies Last reply Reply Quote 0
                                    • cvp
                                      cvp @momorprods last edited by cvp

                                      @momorprods Be careful, indexes need to be 32 bits long, thus use c_int
                                      In a previous post, I said the first index must be the number of points, that's true but for polygons, not for triangles, sorry for that

                                          indexes = [3,0,1,2]
                                          indexes_array = (c_int*len(indexes))(*indexes)
                                          datIndexes = ObjCClass('NSData').dataWithBytes_length_(indexes_array,sizeof(indexes_array))
                                          # primitiveType = 0 for SCNGeometryPrimitiveTypeTriangles
                                          #									4 for SCNGeometryPrimitiveTypePolygon
                                          # primitiveCount = 1
                                          e = ObjCClass('SCNGeometryElement').geometryElementWithData_primitiveType_primitiveCount_bytesPerIndex_(datIndexes,4,1,sizeof(c_int))
                                      
                                      1 Reply Last reply Reply Quote 0
                                      • cvp
                                        cvp @momorprods last edited by

                                        @momorprods I don't think we need a particular order for vertices but if the plane of the triangle contains the camera, you don't see the element, try by turning the triangle with one finger

                                        1 Reply Last reply Reply Quote 0
                                        • cvp
                                          cvp @momorprods last edited by

                                          @momorprods Sorry, you were right about vertices sequence, see here

                                          1 Reply Last reply Reply Quote 0
                                          • momorprods
                                            momorprods last edited by

                                            @cvp I think there is still something weird, as the coordinates of the vertices really don’t match what’s expected. The triangle totally disappear if I just scale the Z value of the 1st vertice, which is not normal.

                                            And overall the size of the triangle is not what it should be (confirmed this by overlapping a cube box and also by estimating through the ARKit rendering).

                                            Since it shows the triangle, the indexing part of the code must be ok - it probably deals with the SCNVector3 array. Perhaps I’m wrong, but SCNVector3 looks like an ObjC class, not a C record?

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post
                                            Powered by NodeBB Forums | Contributors