def getGeomData(geom=None): """ returns a dict : data = {"prims":[], "vertices" : [], "normals" : [], "texcoords" : []} with the data found inside the Geom's GeomPrimitive """ if not geom: return None data = {"vertices" : [], "normals" : [], "texcoords" : [], "colors" : [], "tangents":[], "binormals":[], "lines":[], "triangles":[], "tristrips":[], "trifans":[]} #prim = geom.getPrimitive(0) #prims = {} #print "before decompose : prim = %s" % (prim) #prim = prim.decompose() #print "after decompose : prim = %s" % (prim) for gPrim in geom.getPrimitives(): for p in range(gPrim.getNumPrimitives()): s = gPrim.getPrimitiveStart(p) e = gPrim.getPrimitiveEnd(p) vertexList = [] for i in range(s, e): vi = gPrim.getVertex(i) vertexList.append(vi) if type(gPrim) is GeomLinestrips: data["lines"].append(vertexList) elif type(gPrim) is GeomTriangles: data["triangles"].append(vertexList) elif type(gPrim) is GeomTristrips: data["tristrips"].append(vertexList) elif type(gPrim) is GeomTrifans: data["trifans"].append(vertexList) #print "appended primitive number %s, type is %s" % (p, type(gPrim)) vdata = geom.getVertexData() vreader = GeomVertexReader(vdata, 'vertex') nreader = GeomVertexReader(vdata, 'normal') treader = GeomVertexReader(vdata, 'texcoord') creader = GeomVertexReader(vdata, 'color') tanReader = GeomVertexReader(vdata, 'tangent') binReader = GeomVertexReader(vdata, 'binormal') while not vreader.isAtEnd(): v = vreader.getData3f() n = nreader.getData3f() t = treader.getData2f() c = creader.getData4f() tangent = tanReader.getData3f() binormal = binReader.getData3f() data["vertices"].append(v) data["normals"].append(n) data["texcoords"].append(t) data["colors"].append(c) data["tangents"].append(tangent) data["binormals"].append(binormal) return data
def vertex_colors(self): try: vcol_reader = GeomVertexReader(self.model.findAllMatches('**/+GeomNode')[0].node().getGeom(0).getVertexData(), 'color') vcols = list() while not vcol_reader.isAtEnd(): vcols.append([e for e in vcol_reader.getData4f()]) return vcols except: print(f'{self.name}.model has no vertex colors') return None
def getColorAttributesFromVertexData(geom, transform=None): colorsTotalAreas = dict() for k in range(geom.getNumPrimitives()): prim = geom.getPrimitive(k) vdata = geom.getVertexData() assert isinstance(prim, (GeomTristrips, GeomTriangles)) # Check if color is defined for vertex isColorDefined = False for i, geomVertexCol in enumerate(vdata.getFormat().getColumns()): if geomVertexCol.getContents() == GeomEnums.CColor: isColorDefined = True break assert isColorDefined vertex = GeomVertexReader(vdata, 'vertex') vertexColor = GeomVertexReader(vdata, 'color') # Decompose into triangles prim = prim.decompose() for p in range(prim.getNumPrimitives()): s = prim.getPrimitiveStart(p) e = prim.getPrimitiveEnd(p) color = None triPts = [] for i in range(s, e): vi = prim.getVertex(i) vertex.setRow(vi) vertexColor.setRow(vi) v = vertex.getData3f() # NOTE: all vertex of the same polygon (triangles) should have the same color, # so only grab it once. if color is None: color = vertexColor.getData4f() color = (color[0], color[1], color[2], color[3]) triPts.append([v.x, v.y, v.z]) triPts = np.array(triPts) # Apply transformation if transform is not None: v = transform.xformPoint(v) # calculate the semi-perimeter and area a = np.linalg.norm(triPts[0] - triPts[1], 2) b = np.linalg.norm(triPts[1] - triPts[2], 2) c = np.linalg.norm(triPts[2] - triPts[0], 2) s = (a + b + c) / 2 area = (s*(s-a)*(s-b)*(s-c)) ** 0.5 if color in colorsTotalAreas: colorsTotalAreas[color] += area else: colorsTotalAreas[color] = area areas = [] rgbColors = [] transparencies = [] for color, area in colorsTotalAreas.iteritems(): areas.append(area) rgbColors.append(list(color[:3])) # Check transparency isTransparent = color[3] < 1.0 transparencies.append(isTransparent) return areas, rgbColors, transparencies
def getGeomData(geom=None): """ returns a dict : data = {"prims":[], "vertices" : [], "normals" : [], "texcoords" : []} with the data found inside the Geom's GeomPrimitive """ if not geom: return None data = { "vertices": [], "normals": [], "texcoords": [], "colors": [], "tangents": [], "binormals": [], "lines": [], "triangles": [], "tristrips": [], "trifans": [] } #prim = geom.getPrimitive(0) #prims = {} #print "before decompose : prim = %s" % (prim) #prim = prim.decompose() #print "after decompose : prim = %s" % (prim) for gPrim in geom.getPrimitives(): for p in range(gPrim.getNumPrimitives()): s = gPrim.getPrimitiveStart(p) e = gPrim.getPrimitiveEnd(p) vertexList = [] for i in range(s, e): vi = gPrim.getVertex(i) vertexList.append(vi) if type(gPrim) is GeomLinestrips: data["lines"].append(vertexList) elif type(gPrim) is GeomTriangles: data["triangles"].append(vertexList) elif type(gPrim) is GeomTristrips: data["tristrips"].append(vertexList) elif type(gPrim) is GeomTrifans: data["trifans"].append(vertexList) #print "appended primitive number %s, type is %s" % (p, type(gPrim)) vdata = geom.getVertexData() vreader = GeomVertexReader(vdata, 'vertex') nreader = GeomVertexReader(vdata, 'normal') treader = GeomVertexReader(vdata, 'texcoord') creader = GeomVertexReader(vdata, 'color') tanReader = GeomVertexReader(vdata, 'tangent') binReader = GeomVertexReader(vdata, 'binormal') while not vreader.isAtEnd(): v = vreader.getData3f() n = nreader.getData3f() t = treader.getData2f() c = creader.getData4f() tangent = tanReader.getData3f() binormal = binReader.getData3f() data["vertices"].append(v) data["normals"].append(n) data["texcoords"].append(t) data["colors"].append(c) data["tangents"].append(tangent) data["binormals"].append(binormal) return data
def __init__(self): super().__init__() self.model = 'radiosity_test' # self.texture = 'project_browser_bg' self.scale *= 4 player = FirstPersonController() # self.vertices_colored = 0 # geomNodeCollection = self.model.findAllMatches('**/+GeomNode') for nodePath in geomNodeCollection: geomNode = nodePath.node() for i in range(geomNode.getNumGeoms()): # geom = geomNode.getGeom(i) # read geom = geomNode.modifyGeom(i) # vdata = geom.getVertexData() vdata = geom.modifyVertexData() vertex = GeomVertexReader(vdata, 'vertex') vert_color = GeomVertexReader(vdata, 'color') print(vert_color) normal = GeomVertexReader(vdata, 'normal') new_color = GeomVertexWriter(vdata, 'color') verts = list() while not vertex.isAtEnd(): v = vertex.getData3f() verts.append(v) n = normal.getData3f() try: c = vert_color.getData4f() if c == color.yellow: light_position = v # light_normal = n except: pass print(len(verts)) vertex = GeomVertexReader(vdata, 'vertex') # print(vertex) while not vertex.isAtEnd(): v = vertex.getData3f() n = normal.getData3f() try: c = vert_color.getData4f() if c != color.yellow: # if n[0] > .5: dist = distance(light_position, v) new_color.setData4f(color.color(0, 0, 1-dist/2)) # new_color.setData4f(color.rgba(n[0], n[1], n[2])) # break_outer = False # temp_point = v # for i in range(1): # if break_outer: # break # # temp_point = (temp_point[0] + n[0], temp_point[1] + n[1], temp_point[2] + n[2]) # # if distance(temp_point, light_position) < i * i * .2: # # new_color.setData4f(color.color(60, 1, i/10 , 1)) # # break # for p in verts: # dist = distance(temp_point, p) # if dist < .01: # print('hit self') # continue # elif dist < .5: # print('hit after', i) # break # break_outer = True # print('ignore') except: pass