Esempio n. 1
0
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
Esempio n. 2
0
 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
Esempio n. 3
0
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
Esempio n. 4
0
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
Esempio n. 5
0
    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