示例#1
0
 def __init__(self, name):
     NodePath.__init__(self, name)
     self.cm = CardMaker(name)
     self.cm.setFrame(-0.5, 0.5, -0.5, 0.5)
     self._Flag__model = NodePath(self.cm.generate())
     self._Flag__setBaseModelColor(Vec4(1))
     self.assign(NodePath(GeomNode('flag')))
     self.setTransparency(1)
     self.shapeNode = loader.loadModel('models/flags/flag_shape')
     self.bgNode = loader.loadModel('models/flags/flag_bg')
     self.emblemNode = loader.loadModel('models/flags/flag_emblem')
     self.guiNode = loader.loadModel('models/flags/flag_gui')
     self.dna = FlagDNA()
示例#2
0
 def __init__(self, name):
     NodePath.__init__(self, name)
     self.cm = CardMaker(name)
     self.cm.setFrame(-0.5, 0.5, -0.5, 0.5)
     self._Flag__model = NodePath(self.cm.generate())
     self._Flag__setBaseModelColor(Vec4(1))
     self.assign(NodePath(GeomNode("flag")))
     self.setTransparency(1)
     self.shapeNode = loader.loadModel("models/flags/flag_shape")
     self.bgNode = loader.loadModel("models/flags/flag_bg")
     self.emblemNode = loader.loadModel("models/flags/flag_emblem")
     self.guiNode = loader.loadModel("models/flags/flag_gui")
     self.dna = FlagDNA()
示例#3
0
class Flag(NodePath):
    notify = directNotify.newCategory("Flag")
    BgSortOffset = 10
    EmblemSortOffset = 20

    def __init__(self, name):
        NodePath.__init__(self, name)
        self.cm = CardMaker(name)
        self.cm.setFrame(-0.5, 0.5, -0.5, 0.5)
        self._Flag__model = NodePath(self.cm.generate())
        self._Flag__setBaseModelColor(Vec4(1))
        self.assign(NodePath(GeomNode("flag")))
        self.setTransparency(1)
        self.shapeNode = loader.loadModel("models/flags/flag_shape")
        self.bgNode = loader.loadModel("models/flags/flag_bg")
        self.emblemNode = loader.loadModel("models/flags/flag_emblem")
        self.guiNode = loader.loadModel("models/flags/flag_gui")
        self.dna = FlagDNA()

    def __repr__(self):
        return NodePath.__repr__(self)

    def __str__(self):
        outStr = str(self.dna)
        outStr += "\n"
        outStr += NodePath.__str__(self)
        return outStr

    def getDNAString(self):
        return self.dna.getDNAString()

    def setDNAString(self, dnaStr):
        self.dna.setDNAString(dnaStr)
        self.activate()

    def _Flag__setBaseModelColor(self, color):
        geom = self._Flag__model.node().modifyGeom(0)
        vertexData = geom.modifyVertexData()
        colorWriter = GeomVertexWriter(vertexData, "color")
        for rowNum in range(vertexData.getNumRows()):
            colorWriter.setData4f(color)

    def activate(self):
        self._Flag__activate()

    def _Flag__activate(self):
        self.clearColor()
        self.clearTexture()
        self.removeChildren()
        if self.node().getNumGeoms() > 0:
            self.node().removeGeom(0)

        self._Flag__setBaseModelColor(Vec4(1, 1, 1, 0))
        np = self._Flag__model.copyTo(NodePath("blank"))
        self.node().addGeomsFrom(np.node())
        self.node().setEffect(DecalEffect.make())
        self._Flag__setBaseModelColor(Vec4(1, 1, 1, 1))
        del np
        self.texTex = self.bgNode.findTexture("flag_bg_tex*")
        self.texTex.setWrapU(Texture.WMClamp)
        self.texTex.setWrapV(Texture.WMClamp)
        self.texTs = TextureStage("tex")
        self.texTs.setSort(5)
        self.shapeTs = TextureStage("shape")
        self.shapeTs.setSort(10)
        self._Flag__setShapeStyle()
        self._Flag__setBgStyle()
        for x in range(4):
            self._Flag__setBgColor(x)

        self._Flag__setBgHFlip()
        self._Flag__setBgVFlip()
        self._Flag__setLayoutStyle()
        self._Flag__setLayoutXPos()
        self._Flag__setLayoutYPos()
        self._Flag__setLayoutRVal()
        self._Flag__setLayoutScale()
        self._Flag__activateEmblems()

    def _Flag__activateEmblems(self):
        oldEmblemNps = self.findAllMatches("**/emblem-*")
        for np in oldEmblemNps:
            np.detachNode()
            np.remove()
            np.removeNode()

        del oldEmblemNps
        for enum in self.getEmblemIndices():
            self._Flag__activateEmblem(enum)

    def _Flag__activateEmblem(self, index):
        self._Flag__setEmblemStyle(index)
        self._Flag__updateEmblem(index)

    def flatten(self, callback=None):
        portraitSceneGraph = NodePath("PortraitSceneGraph")
        portraitSceneGraph.setTransparency(1)
        flagCopy = self.copyTo(portraitSceneGraph)
        flagCopy.setY(10)
        par = base.win.makeTextureBuffer("par", 256, 256)
        par.setOneShot(True)
        parcam = base.makeCamera(win=par, scene=portraitSceneGraph, clearColor=Vec4(0), lens=OrthographicLens())
        parcam.reparentTo(portraitSceneGraph)
        tex = par.getTexture()
        tex.setWrapU(Texture.WMClamp)
        tex.setWrapV(Texture.WMClamp)
        self.setTexture(tex, 1)
        self.setColor(Vec4(1))

        def completeFlatten(par=par, tex=tex):
            if not par.isActive():
                self.removeChildren()
                self.clearEffect(DecalEffect.make().getType())
                if callback:
                    callback()

            else:
                taskMgr.doMethodLater(0, completeFlatten, "cleanUp", extraArgs=[])

        completeFlatten()
        return tex

    def getShapeStyle(self):
        return self.dna.getShapeStyle()

    def setShapeStyle(self, val):
        self.dna.setShapeStyle(val)
        self._Flag__activate()

    def _Flag__setShapeStyle(self):
        val = self.getShapeStyle()
        self.shapeTex = self.shapeNode.findTexture("*_%02d" % val)
        self.shapeTex.setWrapU(Texture.WMClamp)
        self.shapeTex.setWrapV(Texture.WMClamp)
        self.setName("flag (style: %02d)" % val)

    def getBgStyle(self):
        return self.dna.getBackgroundStyle()

    def setBgStyle(self, val):
        self.dna.setBackground(style=val)
        self._Flag__setBgStyle()
        for x in range(4):
            self._Flag__setBgColor(x)

        self._Flag__setBgHFlip()
        self._Flag__setBgVFlip()

    def _Flag__setBgStyle(self):
        oldBgNps = self.findAllMatches("**/bg-*")
        for np in oldBgNps:
            np.detachNode()
            np.remove()
            np.removeNode()

        del oldBgNps
        val = self.dna.bgData[0]
        bgTexCol = self.bgNode.findAllTextures("*_%02d_*" % val)

        bgTexCol = [bgTexCol[x] for x in range(bgTexCol.getNumTextures())]

        sortDict = [](_[1]([` x ` for x in bgTexCol], bgTexCol))
        keys = sortDict.keys()
        keys.sort()

        bgTexCol = [sortDict[name] for name in keys]
        for bgnum in range(0, len(bgTexCol) + 1):
            bgNp = self._Flag__model.copyTo(self, sort=self.BgSortOffset + bgnum)
            bgNp.setName("bg-%d (style: %02d)" % (bgnum, val))
            if bgnum > 0:
                tex = bgTexCol[bgnum - 1]
                tex.setWrapU(Texture.WMClamp)
                tex.setWrapV(Texture.WMClamp)
                bgNp.setTexture(TextureStage.getDefault(), tex)

            bgNp.setTexture(self.texTs, self.texTex)
            bgNp.setTexture(self.shapeTs, self.shapeTex)
            bgNp.setTexTransform(self.shapeTs, TransformState.makeScale2d(Vec2(0.995, 1.0)))

    def getBgColor(self, index):
        return self.dna.getBackgroundColor(index)

    def setBgColor(self, index, val):
        if 0 <= index:
            pass
        index < 4
        if 1 and val < len(FlagGlobals.Colors):
            eval("self.dna.setBackground(color_%d = val)" % index)
            self._Flag__setBgColor(index)

    def _Flag__setBgColor(self, index):
        val = self.getBgColor(index)
        bgNp = self.find("**/bg-%d*" % index)
        if not bgNp.isEmpty():
            bgNp.setColorScale(FlagGlobals.Colors[val])

    def getBgHFlip(self):
        return self.dna.getBackgroundHorizontalFlip()

    def setBgHFlip(self, val):
        self.dna.setBackground(hFlip=val)
        self._Flag__setBgHFlip()

    def _Flag__setBgHFlip(self):
        val = self.getBgHFlip()
        bgNpCol = self.findAllMatches("**/bg-*")
        scale = [1.0, 1.0]
        if val:
            scale[0] *= -1

        bgTexTransform = bgNpCol[0].getTexTransform(TextureStage.getDefault())
        if bgTexTransform.getPos()[1]:
            scale[1] *= -1

        for bgNp in bgNpCol:
            self._Flag__updateBackgroundStageRaw(bgNp, TextureStage.getDefault(), scale)

    def getBgVFlip(self):
        return self.dna.getBackgroundVerticalFlip()

    def setBgVFlip(self, val):
        self.dna.setBackground(vFlip=val)
        self._Flag__setBgVFlip()

    def _Flag__setBgVFlip(self):
        val = self.getBgVFlip()
        bgNpCol = self.findAllMatches("**/bg-*")
        scale = [1.0, 1.0]
        bgTexTransform = bgNpCol[0].getTexTransform(TextureStage.getDefault())
        if bgTexTransform.getPos()[0]:
            scale[0] *= -1

        if val:
            scale[1] *= -1

        for bgNp in bgNpCol:
            self._Flag__updateBackgroundStageRaw(bgNp, TextureStage.getDefault(), scale)

    def getLayoutStyle(self):
        return self.dna.getLayoutStyle()

    def setLayoutStyle(self, val):
        self.dna.setLayout(style=val)
        self._Flag__setLayoutStyle()

    def _Flag__setLayoutStyle(self):
        val = self.getLayoutStyle()
        ePosMax = len(FlagGlobals.LayoutOffsets[val]) - 1
        for x in self.getEmblemIndices():
            newPos = PythonUtil.clampScalar(self.getEmblemPos(x), 0, ePosMax)
            self.setEmblemPos(x, newPos)

    def getLayoutXPos(self):
        return self.dna.getLayoutXPos()

    def setLayoutXPos(self, val):
        self.dna.setLayout(xpos=val)
        self._Flag__setLayoutXPos()

    def _Flag__setLayoutXPos(self):
        for x in self.getEmblemIndices():
            self._Flag__updateEmblem(x)

    def getLayoutYPos(self):
        return self.dna.getLayoutYPos()

    def setLayoutYPos(self, val):
        self.dna.setLayout(ypos=val)
        self._Flag__setLayoutYPos()

    def _Flag__setLayoutYPos(self):
        for x in self.getEmblemIndices():
            self._Flag__updateEmblem(x)

    def getLayoutRVal(self):
        return self.dna.getLayoutRVal()

    def setLayoutRVal(self, val):
        self.dna.setLayout(rval=val)
        self._Flag__setLayoutRVal()

    def _Flag__setLayoutRVal(self):
        for x in self.getEmblemIndices():
            self._Flag__updateEmblem(x)

    def getLayoutScale(self):
        return self.dna.getLayoutScale()

    def setLayoutScale(self, val):
        self.dna.setLayout(scale=val)
        self._Flag__setLayoutScale()

    def _Flag__setLayoutScale(self):
        for x in self.getEmblemIndices():
            self._Flag__updateEmblem(x)

    def addEmblem(self, index=-1, location=-1):
        takenIndices = self.getEmblemIndices()
        if index not in takenIndices:
            if index < 0:

                availableIndices = _[1]
                index = availableIndices[0]

            if location < 0:
                self.dna.setEmblem(index, pos=self.dna.getRandomEmblemPos(index))

            self.dna.setEmblem(index, pos=location)
            self._Flag__activateEmblem(index)
            return index

    def getEmblemStyle(self, index):
        return self.dna.getEmblemStyle(index)

    def setEmblemStyle(self, index, styleVal):
        self.dna.setEmblem(index, style=styleVal)
        self._Flag__activateEmblem(index)

    def _Flag__setEmblemStyle(self, index):
        val = self.getEmblemStyle(index)
        eTex = self.emblemNode.findTexture("*_%02d" % val)
        eTex.setWrapU(Texture.WMClamp)
        eTex.setWrapV(Texture.WMClamp)
        oldNp = self.find("**/emblem-%02d*" % index)
        if not oldNp.isEmpty():
            oldNp.detachNode()
            oldNp.remove()
            oldNp.removeNode()

        del oldNp
        eNp = self._Flag__model.copyTo(self, sort=self.EmblemSortOffset + index)
        eNp.setName("emblem-%02d (style: %02d)" % (index, val))
        eNp.setTexture(eTex, 1)
        eNp.setTexture(self.texTs, self.texTex)
        eNp.setTexture(self.shapeTs, self.shapeTex)
        eNp.setTexTransform(self.shapeTs, TransformState.makeScale2d(Vec2(0.995, 1.0)))
        self._Flag__setEmblemColor(index)

    def getEmblemColor(self, index):
        return self.dna.getEmblemColor(index)

    def setEmblemColor(self, index, val):
        self.dna.setEmblem(index, color=val)
        self._Flag__setEmblemColor(index)

    def _Flag__setEmblemColor(self, index):
        val = self.getEmblemColor(index)
        if index in self.getEmblemIndices():
            eNp = self.find("**/emblem-%02d*" % index)
            eNp.setColorScale(FlagGlobals.Colors[val])

    def getEmblemPos(self, index):
        return self.dna.getEmblemPos(index)

    def setEmblemPos(self, index, val):
        self.dna.setEmblem(index, pos=val)
        self._Flag__setEmblemPos(index)

    def _Flag__setEmblemPos(self, index):
        if index in self.getEmblemIndices():
            self._Flag__updateEmblem(index)

    def getEmblemRVal(self, index):
        return self.dna.getEmblemRVal(index)

    def setEmblemRVal(self, index, val):
        self.dna.setEmblem(index, rval=val)
        self._Flag__setEmblemRVal(index)

    def _Flag__setEmblemRVal(self, index):
        if index in self.getEmblemIndices():
            self._Flag__updateEmblem(index)

    def getEmblemScale(self, index):
        return self.dna.getEmblemScale(index)

    def setEmblemScale(self, index, val):
        self.dna.setEmblem(index, scale=val)
        self._Flag__setEmblemScale(index)

    def _Flag__setEmblemScale(self, index):
        if index in self.getEmblemIndices():
            self._Flag__updateEmblem(index)

    def clearEmblem(self, index):
        self.dna.clearEmblem(index)
        self._Flag__activateEmblems()

    def getNumBgColorsUsed(self):
        return self.bgNode.findAllMatches("**/*_%02d_*" % self.dna.getBackgroundStyle()).getNumPaths() + 1

    def getNumEmblems(self):
        return self.dna.getNumEmblems()

    def getEmblemIndices(self):
        return self.dna.getEmblemIndices()

    def _Flag__updateBackgroundStageRaw(self, np, stage, bgData):
        bgPos = Vec2(0.5, 0.5)
        bgRot = 0
        bgScl = Vec2(*bgData)
        corner = TransformState.makePos2d(Vec2(-0.5, -0.5))
        bgXForm = TransformState.makePosRotateScale2d(bgPos, bgRot, bgScl).compose(corner)
        iBgXForm = bgXForm.invertCompose(TransformState.makeIdentity())
        np.setTexTransform(stage, iBgXForm)

    def _Flag__updateEmblem(self, index):
        eNp = self.find("**/emblem-%02d (style: *)" % index)
        self._Flag__updateEmblemStage(
            eNp,
            TextureStage.getDefault(),
            [self.getEmblemPos(index), self.getEmblemRVal(index), self.getEmblemScale(index)],
        )

    def _Flag__updateEmblemStage(self, np, stage, eData):
        if not np.isEmpty():
            ePos = FlagGlobals.LayoutOffsets[self.getLayoutStyle()][eData[0]]
            eRot = eData[1] * 360 / FlagGlobals.RotationCount
            eScl = FlagGlobals.EmblemScales[eData[2]]
            self._Flag__updateEmblemStageRaw(np, stage, ePos, eRot, eScl)

    def _Flag__updateEmblemStageRaw(self, np, stage, position, rotation, scale, relToLayout=True):
        if not np.isEmpty():
            ePos = Vec2(*position)
            eRot = rotation
            eScl = PythonUtil.clampScalar(scale, FlagGlobals.EmblemScales[0], FlagGlobals.EmblemScales[-1])
            corner = TransformState.makePos2d(Vec2(-0.5, -0.5))
            if relToLayout:
                lPos = Vec2(self.getLayoutXPos(), self.getLayoutYPos()) / 255.0
                lRot = self.getLayoutRVal() * 360 / FlagGlobals.RotationCount
                lScl = FlagGlobals.LayoutScales[self.getLayoutScale()]
                lXForm = TransformState.makePosRotateScale2d(lPos, lRot, Vec2(lScl)).compose(corner)
                eXForm = TransformState.makePosRotateScale2d(ePos, eRot, Vec2(eScl)).compose(corner)
                final = lXForm.compose(eXForm).invertCompose(TransformState.makeIdentity())
            else:
                eXForm = TransformState.makePosRotateScale2d(ePos, eRot, Vec2(eScl)).compose(corner)
                final = eXForm.invertCompose(TransformState.makeIdentity())
            np.setTexTransform(stage, final)

    def getEmblemPosRaw(self, posIndex):
        corner = TransformState.makePos2d(Vec2(-0.5, -0.5))
        lPos = Vec2(self.getLayoutXPos(), self.getLayoutYPos()) / 255.0
        lRot = self.getLayoutRVal() * 360 / FlagGlobals.RotationCount
        lScl = FlagGlobals.LayoutScales[self.getLayoutScale()]
        pt = Vec2(*FlagGlobals.LayoutOffsets[self.getLayoutStyle()][posIndex])
        lXForm = TransformState.makePosRotateScale2d(lPos, lRot, Vec2(lScl)).compose(corner)
        return lXForm.getMat3().xformPoint(pt)

    def modifyStageRaw(self, np, stage, position, rotation, scale):
        if not np.isEmpty():
            pos = position
            rot = rotation
            scl = scale
            corner = TransformState.makePos2d(Vec2(-0.5, -0.5))
            xForm = TransformState.makePosRotateScale2d(pos, rot, Vec2(scl)).compose(corner)
            final = xForm.invertCompose(TransformState.makeIdentity())
            np.setTexTransform(stage, final)

    def randomize(self, shape=False, bg=False, emblems=False):
        self.dna.randomize(shape, bg, emblems)
        self.activate()

    def flattenEmblemIndices(self):
        self.dna.flattenEmblemIndices()
        self.activate()
示例#4
0
            pos = position
            rot = rotation
            scl = scale
            corner = TransformState.makePos2d(Vec2(-0.5, -0.5))
            xForm = TransformState.makePosRotateScale2d(pos, rot, Vec2(scl)).compose(corner)
            final = xForm.invertCompose(TransformState.makeIdentity())
            np.setTexTransform(stage, final)

    def randomize(self, shape=False, bg=False, emblems=False):
        self.dna.randomize(shape, bg, emblems)
        self.activate()

    def flattenEmblemIndices(self):
        self.dna.flattenEmblemIndices()
        self.activate()


if __name__ == "__main__":
    p = FlagDNA()
    p.setShapeStyle(0)
    p.setBackground(0, 1, 6, 5, 7, 0, 0)
    p.setLayout(0, 128, 128, 0, 2)
    p.setEmblem(0, 8, 4, 4, 0, 4)
    f = Flag("testflag")
    f.setDNAString(p.getDNAString())
    f.reparentTo(render)
    print f
    print ` f `
    base.mouseInterface.node().setPos(0, 3, 0)
    run()
示例#5
0
class Flag(NodePath):
    notify = directNotify.newCategory('Flag')
    BgSortOffset = 10
    EmblemSortOffset = 20

    def __init__(self, name):
        NodePath.__init__(self, name)
        self.cm = CardMaker(name)
        self.cm.setFrame(-0.5, 0.5, -0.5, 0.5)
        self._Flag__model = NodePath(self.cm.generate())
        self._Flag__setBaseModelColor(Vec4(1))
        self.assign(NodePath(GeomNode('flag')))
        self.setTransparency(1)
        self.shapeNode = loader.loadModel('models/flags/flag_shape')
        self.bgNode = loader.loadModel('models/flags/flag_bg')
        self.emblemNode = loader.loadModel('models/flags/flag_emblem')
        self.guiNode = loader.loadModel('models/flags/flag_gui')
        self.dna = FlagDNA()

    def __repr__(self):
        return NodePath.__repr__(self)

    def __str__(self):
        outStr = str(self.dna)
        outStr += '\n'
        outStr += NodePath.__str__(self)
        return outStr

    def getDNAString(self):
        return self.dna.getDNAString()

    def setDNAString(self, dnaStr):
        self.dna.setDNAString(dnaStr)
        self.activate()

    def _Flag__setBaseModelColor(self, color):
        geom = self._Flag__model.node().modifyGeom(0)
        vertexData = geom.modifyVertexData()
        colorWriter = GeomVertexWriter(vertexData, 'color')
        for rowNum in range(vertexData.getNumRows()):
            colorWriter.setData4f(color)

    def activate(self):
        self._Flag__activate()

    def _Flag__activate(self):
        self.clearColor()
        self.clearTexture()
        self.removeChildren()
        if self.node().getNumGeoms() > 0:
            self.node().removeGeom(0)

        self._Flag__setBaseModelColor(Vec4(1, 1, 1, 0))
        np = self._Flag__model.copyTo(NodePath('blank'))
        self.node().addGeomsFrom(np.node())
        self.node().setEffect(DecalEffect.make())
        self._Flag__setBaseModelColor(Vec4(1, 1, 1, 1))
        del np
        self.texTex = self.bgNode.findTexture('flag_bg_tex*')
        self.texTex.setWrapU(Texture.WMClamp)
        self.texTex.setWrapV(Texture.WMClamp)
        self.texTs = TextureStage('tex')
        self.texTs.setSort(5)
        self.shapeTs = TextureStage('shape')
        self.shapeTs.setSort(10)
        self._Flag__setShapeStyle()
        self._Flag__setBgStyle()
        for x in range(4):
            self._Flag__setBgColor(x)

        self._Flag__setBgHFlip()
        self._Flag__setBgVFlip()
        self._Flag__setLayoutStyle()
        self._Flag__setLayoutXPos()
        self._Flag__setLayoutYPos()
        self._Flag__setLayoutRVal()
        self._Flag__setLayoutScale()
        self._Flag__activateEmblems()

    def _Flag__activateEmblems(self):
        oldEmblemNps = self.findAllMatches('**/emblem-*')
        for np in oldEmblemNps:
            np.detachNode()
            np.remove()
            np.removeNode()

        del oldEmblemNps
        for enum in self.getEmblemIndices():
            self._Flag__activateEmblem(enum)

    def _Flag__activateEmblem(self, index):
        self._Flag__setEmblemStyle(index)
        self._Flag__updateEmblem(index)

    def flatten(self, callback=None):
        portraitSceneGraph = NodePath('PortraitSceneGraph')
        portraitSceneGraph.setTransparency(1)
        flagCopy = self.copyTo(portraitSceneGraph)
        flagCopy.setY(10)
        par = base.win.makeTextureBuffer('par', 256, 256)
        par.setOneShot(True)
        parcam = base.makeCamera(win=par,
                                 scene=portraitSceneGraph,
                                 clearColor=Vec4(0),
                                 lens=OrthographicLens())
        parcam.reparentTo(portraitSceneGraph)
        tex = par.getTexture()
        tex.setWrapU(Texture.WMClamp)
        tex.setWrapV(Texture.WMClamp)
        self.setTexture(tex, 1)
        self.setColor(Vec4(1))

        def completeFlatten(par=par, tex=tex):
            if not par.isActive():
                self.removeChildren()
                self.clearEffect(DecalEffect.make().getType())
                if callback:
                    callback()

            else:
                taskMgr.doMethodLater(0,
                                      completeFlatten,
                                      'cleanUp',
                                      extraArgs=[])

        completeFlatten()
        return tex

    def getShapeStyle(self):
        return self.dna.getShapeStyle()

    def setShapeStyle(self, val):
        self.dna.setShapeStyle(val)
        self._Flag__activate()

    def _Flag__setShapeStyle(self):
        val = self.getShapeStyle()
        self.shapeTex = self.shapeNode.findTexture('*_%02d' % val)
        self.shapeTex.setWrapU(Texture.WMClamp)
        self.shapeTex.setWrapV(Texture.WMClamp)
        self.setName('flag (style: %02d)' % val)

    def getBgStyle(self):
        return self.dna.getBackgroundStyle()

    def setBgStyle(self, val):
        self.dna.setBackground(style=val)
        self._Flag__setBgStyle()
        for x in range(4):
            self._Flag__setBgColor(x)

        self._Flag__setBgHFlip()
        self._Flag__setBgVFlip()

    def _Flag__setBgStyle(self):
        oldBgNps = self.findAllMatches('**/bg-*')
        for np in oldBgNps:
            np.detachNode()
            np.remove()
            np.removeNode()

        del oldBgNps
        val = self.dna.bgData[0]
        bgTexCol = self.bgNode.findAllTextures('*_%02d_*' % val)
        bgTexCol = [bgTexCol[x] for x in range(bgTexCol.getNumTextures())]
        sortDict = [](_[1]([ ` x ` for x in bgTexCol], bgTexCol))
        keys = sortDict.keys()
        keys.sort()
        bgTexCol = [sortDict[name] for name in keys]
        for bgnum in range(0, len(bgTexCol) + 1):
            bgNp = self._Flag__model.copyTo(self,
                                            sort=self.BgSortOffset + bgnum)
            bgNp.setName('bg-%d (style: %02d)' % (bgnum, val))
            if bgnum > 0:
                tex = bgTexCol[bgnum - 1]
                tex.setWrapU(Texture.WMClamp)
                tex.setWrapV(Texture.WMClamp)
                bgNp.setTexture(TextureStage.getDefault(), tex)

            bgNp.setTexture(self.texTs, self.texTex)
            bgNp.setTexture(self.shapeTs, self.shapeTex)
            bgNp.setTexTransform(self.shapeTs,
                                 TransformState.makeScale2d(Vec2(0.995, 1.0)))
            continue

    def getBgColor(self, index):
        return self.dna.getBackgroundColor(index)

    def setBgColor(self, index, val):
        if 0 <= index:
            pass
        index < 4
        if 1 and val < len(FlagGlobals.Colors):
            eval('self.dna.setBackground(color_%d = val)' % index)
            self._Flag__setBgColor(index)

    def _Flag__setBgColor(self, index):
        val = self.getBgColor(index)
        bgNp = self.find('**/bg-%d*' % index)
        if not bgNp.isEmpty():
            bgNp.setColorScale(FlagGlobals.Colors[val])

    def getBgHFlip(self):
        return self.dna.getBackgroundHorizontalFlip()

    def setBgHFlip(self, val):
        self.dna.setBackground(hFlip=val)
        self._Flag__setBgHFlip()

    def _Flag__setBgHFlip(self):
        val = self.getBgHFlip()
        bgNpCol = self.findAllMatches('**/bg-*')
        scale = [1.0, 1.0]
        if val:
            scale[0] *= -1

        bgTexTransform = bgNpCol[0].getTexTransform(TextureStage.getDefault())
        if bgTexTransform.getPos()[1]:
            scale[1] *= -1

        for bgNp in bgNpCol:
            self._Flag__updateBackgroundStageRaw(bgNp,
                                                 TextureStage.getDefault(),
                                                 scale)

    def getBgVFlip(self):
        return self.dna.getBackgroundVerticalFlip()

    def setBgVFlip(self, val):
        self.dna.setBackground(vFlip=val)
        self._Flag__setBgVFlip()

    def _Flag__setBgVFlip(self):
        val = self.getBgVFlip()
        bgNpCol = self.findAllMatches('**/bg-*')
        scale = [1.0, 1.0]
        bgTexTransform = bgNpCol[0].getTexTransform(TextureStage.getDefault())
        if bgTexTransform.getPos()[0]:
            scale[0] *= -1

        if val:
            scale[1] *= -1

        for bgNp in bgNpCol:
            self._Flag__updateBackgroundStageRaw(bgNp,
                                                 TextureStage.getDefault(),
                                                 scale)

    def getLayoutStyle(self):
        return self.dna.getLayoutStyle()

    def setLayoutStyle(self, val):
        self.dna.setLayout(style=val)
        self._Flag__setLayoutStyle()

    def _Flag__setLayoutStyle(self):
        val = self.getLayoutStyle()
        ePosMax = len(FlagGlobals.LayoutOffsets[val]) - 1
        for x in self.getEmblemIndices():
            newPos = PythonUtil.clampScalar(self.getEmblemPos(x), 0, ePosMax)
            self.setEmblemPos(x, newPos)

    def getLayoutXPos(self):
        return self.dna.getLayoutXPos()

    def setLayoutXPos(self, val):
        self.dna.setLayout(xpos=val)
        self._Flag__setLayoutXPos()

    def _Flag__setLayoutXPos(self):
        for x in self.getEmblemIndices():
            self._Flag__updateEmblem(x)

    def getLayoutYPos(self):
        return self.dna.getLayoutYPos()

    def setLayoutYPos(self, val):
        self.dna.setLayout(ypos=val)
        self._Flag__setLayoutYPos()

    def _Flag__setLayoutYPos(self):
        for x in self.getEmblemIndices():
            self._Flag__updateEmblem(x)

    def getLayoutRVal(self):
        return self.dna.getLayoutRVal()

    def setLayoutRVal(self, val):
        self.dna.setLayout(rval=val)
        self._Flag__setLayoutRVal()

    def _Flag__setLayoutRVal(self):
        for x in self.getEmblemIndices():
            self._Flag__updateEmblem(x)

    def getLayoutScale(self):
        return self.dna.getLayoutScale()

    def setLayoutScale(self, val):
        self.dna.setLayout(scale=val)
        self._Flag__setLayoutScale()

    def _Flag__setLayoutScale(self):
        for x in self.getEmblemIndices():
            self._Flag__updateEmblem(x)

    def addEmblem(self, index=-1, location=-1):
        takenIndices = self.getEmblemIndices()
        if index not in takenIndices:
            if index < 0:
                availableIndices = _[1]
                index = availableIndices[0]

            if location < 0:
                self.dna.setEmblem(index,
                                   pos=self.dna.getRandomEmblemPos(index))

            self.dna.setEmblem(index, pos=location)
            self._Flag__activateEmblem(index)
            return index

    def getEmblemStyle(self, index):
        return self.dna.getEmblemStyle(index)

    def setEmblemStyle(self, index, styleVal):
        self.dna.setEmblem(index, style=styleVal)
        self._Flag__activateEmblem(index)

    def _Flag__setEmblemStyle(self, index):
        val = self.getEmblemStyle(index)
        eTex = self.emblemNode.findTexture('*_%02d' % val)
        eTex.setWrapU(Texture.WMClamp)
        eTex.setWrapV(Texture.WMClamp)
        oldNp = self.find('**/emblem-%02d*' % index)
        if not oldNp.isEmpty():
            oldNp.detachNode()
            oldNp.remove()
            oldNp.removeNode()

        del oldNp
        eNp = self._Flag__model.copyTo(self,
                                       sort=self.EmblemSortOffset + index)
        eNp.setName('emblem-%02d (style: %02d)' % (index, val))
        eNp.setTexture(eTex, 1)
        eNp.setTexture(self.texTs, self.texTex)
        eNp.setTexture(self.shapeTs, self.shapeTex)
        eNp.setTexTransform(self.shapeTs,
                            TransformState.makeScale2d(Vec2(0.995, 1.0)))
        self._Flag__setEmblemColor(index)

    def getEmblemColor(self, index):
        return self.dna.getEmblemColor(index)

    def setEmblemColor(self, index, val):
        self.dna.setEmblem(index, color=val)
        self._Flag__setEmblemColor(index)

    def _Flag__setEmblemColor(self, index):
        val = self.getEmblemColor(index)
        if index in self.getEmblemIndices():
            eNp = self.find('**/emblem-%02d*' % index)
            eNp.setColorScale(FlagGlobals.Colors[val])

    def getEmblemPos(self, index):
        return self.dna.getEmblemPos(index)

    def setEmblemPos(self, index, val):
        self.dna.setEmblem(index, pos=val)
        self._Flag__setEmblemPos(index)

    def _Flag__setEmblemPos(self, index):
        if index in self.getEmblemIndices():
            self._Flag__updateEmblem(index)

    def getEmblemRVal(self, index):
        return self.dna.getEmblemRVal(index)

    def setEmblemRVal(self, index, val):
        self.dna.setEmblem(index, rval=val)
        self._Flag__setEmblemRVal(index)

    def _Flag__setEmblemRVal(self, index):
        if index in self.getEmblemIndices():
            self._Flag__updateEmblem(index)

    def getEmblemScale(self, index):
        return self.dna.getEmblemScale(index)

    def setEmblemScale(self, index, val):
        self.dna.setEmblem(index, scale=val)
        self._Flag__setEmblemScale(index)

    def _Flag__setEmblemScale(self, index):
        if index in self.getEmblemIndices():
            self._Flag__updateEmblem(index)

    def clearEmblem(self, index):
        self.dna.clearEmblem(index)
        self._Flag__activateEmblems()

    def getNumBgColorsUsed(self):
        return self.bgNode.findAllMatches(
            '**/*_%02d_*' % self.dna.getBackgroundStyle()).getNumPaths() + 1

    def getNumEmblems(self):
        return self.dna.getNumEmblems()

    def getEmblemIndices(self):
        return self.dna.getEmblemIndices()

    def _Flag__updateBackgroundStageRaw(self, np, stage, bgData):
        bgPos = Vec2(0.5, 0.5)
        bgRot = 0
        bgScl = Vec2(*bgData)
        corner = TransformState.makePos2d(Vec2(-0.5, -0.5))
        bgXForm = TransformState.makePosRotateScale2d(bgPos, bgRot,
                                                      bgScl).compose(corner)
        iBgXForm = bgXForm.invertCompose(TransformState.makeIdentity())
        np.setTexTransform(stage, iBgXForm)

    def _Flag__updateEmblem(self, index):
        eNp = self.find('**/emblem-%02d (style: *)' % index)
        self._Flag__updateEmblemStage(eNp, TextureStage.getDefault(), [
            self.getEmblemPos(index),
            self.getEmblemRVal(index),
            self.getEmblemScale(index)
        ])

    def _Flag__updateEmblemStage(self, np, stage, eData):
        if not np.isEmpty():
            ePos = FlagGlobals.LayoutOffsets[self.getLayoutStyle()][eData[0]]
            eRot = eData[1] * 360 / FlagGlobals.RotationCount
            eScl = FlagGlobals.EmblemScales[eData[2]]
            self._Flag__updateEmblemStageRaw(np, stage, ePos, eRot, eScl)

    def _Flag__updateEmblemStageRaw(self,
                                    np,
                                    stage,
                                    position,
                                    rotation,
                                    scale,
                                    relToLayout=True):
        if not np.isEmpty():
            ePos = Vec2(*position)
            eRot = rotation
            eScl = PythonUtil.clampScalar(scale, FlagGlobals.EmblemScales[0],
                                          FlagGlobals.EmblemScales[-1])
            corner = TransformState.makePos2d(Vec2(-0.5, -0.5))
            if relToLayout:
                lPos = Vec2(self.getLayoutXPos(), self.getLayoutYPos()) / 255.0
                lRot = self.getLayoutRVal() * 360 / FlagGlobals.RotationCount
                lScl = FlagGlobals.LayoutScales[self.getLayoutScale()]
                lXForm = TransformState.makePosRotateScale2d(
                    lPos, lRot, Vec2(lScl)).compose(corner)
                eXForm = TransformState.makePosRotateScale2d(
                    ePos, eRot, Vec2(eScl)).compose(corner)
                final = lXForm.compose(eXForm).invertCompose(
                    TransformState.makeIdentity())
            else:
                eXForm = TransformState.makePosRotateScale2d(
                    ePos, eRot, Vec2(eScl)).compose(corner)
                final = eXForm.invertCompose(TransformState.makeIdentity())
            np.setTexTransform(stage, final)

    def getEmblemPosRaw(self, posIndex):
        corner = TransformState.makePos2d(Vec2(-0.5, -0.5))
        lPos = Vec2(self.getLayoutXPos(), self.getLayoutYPos()) / 255.0
        lRot = self.getLayoutRVal() * 360 / FlagGlobals.RotationCount
        lScl = FlagGlobals.LayoutScales[self.getLayoutScale()]
        pt = Vec2(*FlagGlobals.LayoutOffsets[self.getLayoutStyle()][posIndex])
        lXForm = TransformState.makePosRotateScale2d(
            lPos, lRot, Vec2(lScl)).compose(corner)
        return lXForm.getMat3().xformPoint(pt)

    def modifyStageRaw(self, np, stage, position, rotation, scale):
        if not np.isEmpty():
            pos = position
            rot = rotation
            scl = scale
            corner = TransformState.makePos2d(Vec2(-0.5, -0.5))
            xForm = TransformState.makePosRotateScale2d(
                pos, rot, Vec2(scl)).compose(corner)
            final = xForm.invertCompose(TransformState.makeIdentity())
            np.setTexTransform(stage, final)

    def randomize(self, shape=False, bg=False, emblems=False):
        self.dna.randomize(shape, bg, emblems)
        self.activate()

    def flattenEmblemIndices(self):
        self.dna.flattenEmblemIndices()
        self.activate()
示例#6
0
            rot = rotation
            scl = scale
            corner = TransformState.makePos2d(Vec2(-0.5, -0.5))
            xForm = TransformState.makePosRotateScale2d(
                pos, rot, Vec2(scl)).compose(corner)
            final = xForm.invertCompose(TransformState.makeIdentity())
            np.setTexTransform(stage, final)

    def randomize(self, shape=False, bg=False, emblems=False):
        self.dna.randomize(shape, bg, emblems)
        self.activate()

    def flattenEmblemIndices(self):
        self.dna.flattenEmblemIndices()
        self.activate()


if __name__ == '__main__':
    p = FlagDNA()
    p.setShapeStyle(0)
    p.setBackground(0, 1, 6, 5, 7, 0, 0)
    p.setLayout(0, 128, 128, 0, 2)
    p.setEmblem(0, 8, 4, 4, 0, 4)
    f = Flag('testflag')
    f.setDNAString(p.getDNAString())
    f.reparentTo(render)
    print f
    print ` f `
    base.mouseInterface.node().setPos(0, 3, 0)
    run()