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
-
It wouldn't be POINTER here. Try byref.
-
Actually, verts must be a ctypes array, not a python list.
-
oh ok thanks, going to try that and keep you posted!
-
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)
-
@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],)
-
wooohoooo thanks!!
-
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)
-
@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, sorryverts = [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_impThread 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
-
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],)
-
@JonB Yes, but in my code,,the crash was in
geometry = ObjCClass('SCNGeometry').geometryWithSources_elements_(sources, elements)
-
@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
-
@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))
-
-
dataWithBytes_length_ expects sizeof(verts_array)
datIndexes = ObjCClass('NSData').dataWithBytes_length_(indexes_array,sizeof(indexes_array))
as a check:
geometry.geometryElements()[0].data()
-
@JonB Thanks for the correction but obviously not the only error because still blank Scene...
-
@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)]
-
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!
-
@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 thatindexes = [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))
-
@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
-
@momorprods Sorry, you were right about vertices sequence, see here