mirror of
https://github.com/Sneed-Group/Poodletooth-iLand
synced 2024-12-25 12:42:41 -06:00
150 lines
5.8 KiB
Python
150 lines
5.8 KiB
Python
|
from panda3d.core import NodePath, DecalEffect
|
||
|
import DNANode
|
||
|
import DNAWall
|
||
|
|
||
|
import random
|
||
|
|
||
|
class DNAFlatBuilding(DNANode.DNANode):
|
||
|
COMPONENT_CODE = 9
|
||
|
currentWallHeight = 0
|
||
|
|
||
|
def __init__(self, name):
|
||
|
DNANode.DNANode.__init__(self, name)
|
||
|
self.width = 0
|
||
|
self.hasDoor = False
|
||
|
|
||
|
def setWidth(self, width):
|
||
|
self.width = width
|
||
|
|
||
|
def getWidth(self):
|
||
|
return self.width
|
||
|
|
||
|
def setCurrentWallHeight(self, currentWallHeight):
|
||
|
DNAFlatBuilding.currentWallHeight = currentWallHeight
|
||
|
|
||
|
def getCurrentWallHeight(self):
|
||
|
return DNAFlatBuilding.currentWallHeight
|
||
|
|
||
|
def setHasDoor(self, hasDoor):
|
||
|
self.hasDoor = hasDoor
|
||
|
|
||
|
def getHasDoor(self):
|
||
|
return self.hasDoor
|
||
|
|
||
|
def makeFromDGI(self, dgi):
|
||
|
DNANode.DNANode.makeFromDGI(self, dgi)
|
||
|
self.width = dgi.getInt16() / 100.0
|
||
|
self.hasDoor = dgi.getBool()
|
||
|
|
||
|
def setupSuitFlatBuilding(self, nodePath, dnaStorage):
|
||
|
name = self.getName()
|
||
|
if name[:2] != 'tb':
|
||
|
return
|
||
|
name = 'sb' + name[2:]
|
||
|
node = nodePath.attachNewNode(name)
|
||
|
node.setPosHpr(self.getPos(), self.getHpr())
|
||
|
numCodes = dnaStorage.getNumCatalogCodes('suit_wall')
|
||
|
if numCodes < 1:
|
||
|
return
|
||
|
code = dnaStorage.getCatalogCode(
|
||
|
'suit_wall', random.randint(0, numCodes - 1))
|
||
|
wallNode = dnaStorage.findNode(code)
|
||
|
if not wallNode:
|
||
|
return
|
||
|
wallNode = wallNode.copyTo(node, 0)
|
||
|
wallScale = wallNode.getScale()
|
||
|
wallScale.setX(self.width)
|
||
|
wallScale.setZ(DNAFlatBuilding.currentWallHeight)
|
||
|
wallNode.setScale(wallScale)
|
||
|
if self.getHasDoor():
|
||
|
wallNodePath = node.find('wall_*')
|
||
|
doorNode = dnaStorage.findNode('suit_door')
|
||
|
doorNode = doorNode.copyTo(wallNodePath, 0)
|
||
|
doorNode.setScale(NodePath(), (1, 1, 1))
|
||
|
doorNode.setPosHpr(0.5, 0, 0, 0, 0, 0)
|
||
|
wallNodePath.setEffect(DecalEffect.make())
|
||
|
node.flattenMedium()
|
||
|
node.stash()
|
||
|
|
||
|
def setupCogdoFlatBuilding(self, nodePath, dnaStorage):
|
||
|
name = self.getName()
|
||
|
if name[:2] != 'tb':
|
||
|
return
|
||
|
name = 'cb' + name[2:]
|
||
|
node = nodePath.attachNewNode(name)
|
||
|
node.setPosHpr(self.getPos(), self.getHpr())
|
||
|
numCodes = dnaStorage.getNumCatalogCodes('cogdo_wall')
|
||
|
if numCodes < 1:
|
||
|
return
|
||
|
code = dnaStorage.getCatalogCode(
|
||
|
'cogdo_wall', random.randint(0, numCodes - 1))
|
||
|
wallNode = dnaStorage.findNode(code)
|
||
|
if not wallNode:
|
||
|
return
|
||
|
wallNode = wallNode.copyTo(node, 0)
|
||
|
wallScale = wallNode.getScale()
|
||
|
wallScale.setX(self.width)
|
||
|
wallScale.setZ(DNAFlatBuilding.currentWallHeight)
|
||
|
wallNode.setScale(wallScale)
|
||
|
if self.getHasDoor():
|
||
|
wallNodePath = node.find('wall_*')
|
||
|
doorNode = dnaStorage.findNode('suit_door')
|
||
|
doorNode = doorNode.copyTo(wallNodePath, 0)
|
||
|
doorNode.setScale(NodePath(), (1, 1, 1))
|
||
|
doorNode.setPosHpr(0.5, 0, 0, 0, 0, 0)
|
||
|
wallNodePath.setEffect(DecalEffect.make())
|
||
|
node.flattenMedium()
|
||
|
node.stash()
|
||
|
|
||
|
def traverse(self, nodePath, dnaStorage):
|
||
|
DNAFlatBuilding.currentWallHeight = 0
|
||
|
node = nodePath.attachNewNode(self.getName())
|
||
|
internalNode = node.attachNewNode(self.getName() + '-internal')
|
||
|
scale = self.getScale()
|
||
|
scale.setX(self.width)
|
||
|
internalNode.setScale(scale)
|
||
|
node.setPosHpr(self.getPos(), self.getHpr())
|
||
|
for child in self.children:
|
||
|
if isinstance(child, DNAWall.DNAWall):
|
||
|
child.traverse(internalNode, dnaStorage)
|
||
|
else:
|
||
|
child.traverse(node, dnaStorage)
|
||
|
if DNAFlatBuilding.currentWallHeight == 0:
|
||
|
print 'empty flat building with no walls'
|
||
|
else:
|
||
|
cameraBarrier = dnaStorage.findNode('wall_camera_barrier')
|
||
|
if cameraBarrier is None:
|
||
|
raise DNAError.DNAError('DNAFlatBuilding requires that there is a wall_camera_barrier in storage')
|
||
|
cameraBarrier = cameraBarrier.copyTo(internalNode, 0)
|
||
|
cameraBarrier.setScale((1, 1, DNAFlatBuilding.currentWallHeight))
|
||
|
internalNode.flattenStrong()
|
||
|
collisionNode = node.find('**/door_*/+CollisionNode')
|
||
|
if not collisionNode.isEmpty():
|
||
|
collisionNode.setName('KnockKnockDoorSphere_' + dnaStorage.getBlock(self.getName()))
|
||
|
cameraBarrier.wrtReparentTo(nodePath, 0)
|
||
|
wallCollection = internalNode.findAllMatches('wall*')
|
||
|
wallHolder = node.attachNewNode('wall_holder')
|
||
|
wallDecal = node.attachNewNode('wall_decal')
|
||
|
windowCollection = internalNode.findAllMatches('**/window*')
|
||
|
doorCollection = internalNode.findAllMatches('**/door*')
|
||
|
corniceCollection = internalNode.findAllMatches('**/cornice*_d')
|
||
|
wallCollection.reparentTo(wallHolder)
|
||
|
windowCollection.reparentTo(wallDecal)
|
||
|
doorCollection.reparentTo(wallDecal)
|
||
|
corniceCollection.reparentTo(wallDecal)
|
||
|
for i in xrange(wallHolder.getNumChildren()):
|
||
|
iNode = wallHolder.getChild(i)
|
||
|
iNode.clearTag('DNACode')
|
||
|
iNode.clearTag('DNARoot')
|
||
|
wallHolder.flattenStrong()
|
||
|
wallDecal.flattenStrong()
|
||
|
holderChild0 = wallHolder.getChild(0)
|
||
|
wallDecal.getChildren().reparentTo(holderChild0)
|
||
|
holderChild0.reparentTo(internalNode)
|
||
|
holderChild0.setEffect(DecalEffect.make())
|
||
|
wallHolder.removeNode()
|
||
|
wallDecal.removeNode()
|
||
|
self.setupSuitFlatBuilding(nodePath, dnaStorage)
|
||
|
self.setupCogdoFlatBuilding(nodePath, dnaStorage)
|
||
|
node.flattenStrong()
|