示例#1
0
def _parseSegmentNode(name, node, xmlStateGroups):
    """
    parses a segment node and creates a segment instance.
    """
    
    segmentParams = {}
    
    for child in list(node):
        # parse vertices
        if child.tag == "vertices":
            _parseSegmentVertices(child, segmentParams)
        # parse faces
        elif child.tag == "faces":
            _parseSegmentFaces(child, segmentParams, xmlStateGroups)
        # parse evaluators
        elif child.tag == "evaluators":
            _parseSegmentEvaluators(child, segmentParams, xmlStateGroups)
        # parse nurbs
        elif child.tag == "nurbs":
            _parseSegmentNurbs(child, segmentParams, xmlStateGroups)
        elif child.tag == "state":
            xmlParseStateParam( child, segmentParams )
        elif child.tag == "stateGroup":
            xmlParseStateGroupParam(child, segmentParams, xmlStateGroups)
        elif child.tag == "vertexParam":
            xmlParseVertexParam( child, segmentParams , xmlStateGroups)
        else:
            print "WARNING: XML: unknown tag '%s'" % child.tag
    
    try:
        segmentCls = segmentParams['cls']
    except:
        print "WARNING: no segment class sepecified!"
        return None
    
    return (name, segmentParams, segmentCls)
示例#2
0
from utils.util import unique
from xml_parser.xml_state import xmlParseStateParam, xmlParseVertexParam


def _parseModelSegmentNode(xmlMaterials, lights, (segmentName, segmentParams, segmentCls), node):
    """
    parse segment configuration specified by model.
    """
    
    baseImage = None
    
    for child in list(node):
        if child.tag == "state":
            xmlParseStateParam( child, segmentParams )
        elif child.tag == "vertexParam":
            xmlParseVertexParam( child, segmentParams )
        elif child.tag == "image":
            baseImage = str(child.get('val'))
        elif child.tag == "material":
            material = loadXMLMaterial(xmlMaterials, str(child.get('name')))
        else:
            print "WARNING: unknown model segment tag '%s'" % child.tag
    
    if material == None:
        # segment needs material
        material = GLMaterial()
    
    segmentParams['material'] = material
    
    segment = segmentCls(name=segmentName, params=segmentParams)
    if baseImage!=None:
示例#3
0
def _parseSegmentNurbs(node, segmentParams, xmlStateGroups):
    evaluators = []
    
    vertexEvaluator = None
    normalEvaluator = None
    needsNormals = False
        
    segmentParams['cls'] = EvaluatorSegment
    
    for child in list(node):
        if child.tag != "nurb":
            continue
        
        target = child.get('target', 'vertex')
        uKnot = [0.0]*4 + [1.0]*4
        vKnot = [0.0]*4 + [1.0]*4
        
        params = {}
        
        for n in list(child):
            if n.tag == "u":
                uKnot = xmlFloatListC(n.get('knot'), uKnot)
            elif n.tag == "v":
                vKnot = xmlFloatListC(n.get('knot'), vKnot)
            elif n.tag == "ctrls":
                params['ctrls'] = _parseEvaluatorCtrls(n)
            elif n.tag == "state":
                xmlParseStateParam(n, params)
            elif child.tag == "stateGroup":
                xmlParseStateGroupParam(n, params, xmlStateGroups)
            elif n.tag == "vertexParam":
                xmlParseVertexParam( n, params , xmlStateGroups)
        
        try:
            params['ctrls'][0][0][0]
            isCurve = False
        except:
            isCurve = True
        
        params['tolerance'] = xmlFloat(child.get('tolerance'), 25.0)
        
        if isCurve:
            params['target'] = _curveTargets()[target]
            params['knots'] = [uKnot]
            nurbCls = NURBCurveEvaluator
        else:
            params['target'] = _patchTargets()[target]
            params['knots'] = [uKnot, vKnot]
            nurbCls = NURBPatchEvaluator
        
        evaluator = nurbCls(params)
        
        if target=="vertex" or target=="vertex4":
            vertexEvaluator = evaluator
            # curves dont need normals
            needsNormals = not isCurve
        if target=="normal":
            normalEvaluator = evaluator
        
        evaluators.append(evaluator)
    
    if needsNormals and normalEvaluator==None and vertexEvaluator!=None:
        vertexEvaluator.generateNormals = True
    
    segmentParams['evaluators'] = evaluators
示例#4
0
def _parseSegmentEvaluators(node, segmentParams, xmlStateGroups):
    evaluators = []
    
    def _readParam(n, name, param):
        param.min = xmlFloat(n.get('min'), 0.0)
        param.max = xmlFloat(n.get('max'), 1.0)
        param.steps = xmlInt(n.get('steps'), 20)
    
    vertexEvaluator = None
    normalEvaluator = None
    needsNormals = False
    
    for child in list(node):
        if child.tag != "evaluator":
            continue
        
        segmentParams['cls'] = EvaluatorSegment
        evalParams = {}
        
        target = child.get('target', 'vertex')
        u = EvalParam("u")
        v = EvalParam("v")
        
        for n in list(child):
            if n.tag == "u":
                _readParam(n, n.tag, u)
            elif n.tag == "v":
                _readParam(n, n.tag, v)
            elif n.tag == "ctrls":
                evalParams['ctrls'] = _parseEvaluatorCtrls(n)
            elif n.tag == "state":
                xmlParseStateParam(n, evalParams)
            elif child.tag == "stateGroup":
                xmlParseStateGroupParam(n, evalParams, xmlStateGroups)
            elif n.tag == "vertexParam":
                xmlParseVertexParam( n, evalParams , xmlStateGroups)
        
        try:
            evalParams['ctrls'][0][0][0]
            isCurve = False
        except:
            isCurve = True
        
        if isCurve:
            evalParams['target'] = _curveTargets()[target]
            evalParams['params'] = [u]
            evaluatorCls = CurveEvaluator
        else:
            evalParams['target'] = _patchTargets()[target]
            evalParams['params'] = [u, v]
            evaluatorCls = PatchEvaluator
        
        evaluator = evaluatorCls(evalParams)
        
        if target=="vertex" or target=="vertex4":
            vertexEvaluator = evaluator
            # curves dont need normals
            needsNormals = not isCurve
        if target=="normal":
            normalEvaluator = evaluator
        
        evaluators.append(evaluator)
    
    if needsNormals and normalEvaluator==None and vertexEvaluator!=None:
        vertexEvaluator.generateNormals = True
    
    segmentParams['evaluators'] = evaluators