예제 #1
0
    def startEffects(self):
        if not self.fireflies:
            self.fireflies = Fireflies()
        if self.fireflies:
            if hasattr(base, 'cr'):
                self.fireflies.reparentTo(base.localAvatar)
                self.fireflies.startLoop()
            base.ambientMgr.requestFadeIn(SoundGlobals.AMBIENT_JUNGLE, duration=10, finalVolume=PiratesGlobals.DEFAULT_AMBIENT_VOLUME, priority=1)
            self.swamp_water = None
            reflection = Reflection.getGlobalReflection()
            if 'jungle_a' in self.modelPrefix:
                water_color = base.config.GetBool('want-shaders', 1) and base.win and base.win.getGsg() and base.win.getGsg().getShaderModel() >= GraphicsStateGuardian.SM20 and Vec4(13, 15, 21, 255.0)
                self.water = Swamp(self.modelPrefix + 'water', self.parent, reflection, None, None, water_color)
                self.water.reflection_factor = 0.3
                self.water.set_reflection_parameters_np()
            else:
                water = loader.loadModel(self.modelPrefix + 'water')
                water.reparentTo(self.parent)
                color = Vec4(0)
                water.setColorScale(color)
                mask = 4294967295L
                stencil = StencilAttrib.make(1, StencilAttrib.SCFAlways, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOReplace, 1, mask, mask)
                water.setAttrib(stencil)
                water.setBin('water', 0)
                self.reflection = reflection
                taskMgr.add(self.camTask, 'jungleEffectsCamTask-' + str(id(self)), priority=49)
                water.setFogOff()
        for file in self.randomAnimalSoundFiles:
            sfx = loadSfx(file)
            self.randomSfx.append(sfx)

        taskMgr.doMethodLater(self.RANDOM_SOUND_PERIOD, self.checkForRandomSound, name='checkForRandomSound-' + str(id(self)))
        return
예제 #2
0
 def startEffects(self):
     if not self.fireflies:
         self.fireflies = Fireflies()
     
     if self.fireflies and hasattr(base, 'cr'):
         self.fireflies.reparentTo(base.localAvatar)
         self.fireflies.startLoop()
     
     base.ambientMgr.requestFadeIn(SoundGlobals.AMBIENT_JUNGLE, duration = 10, finalVolume = PiratesGlobals.DEFAULT_AMBIENT_VOLUME, priority = 1)
     self.swamp_water = None
     reflection = Reflection.getGlobalReflection()
     if 'jungle_a' in self.modelPrefix:
         if base.config.GetBool('want-shaders', 1) and base.win and base.win.getGsg() and base.win.getGsg().getShaderModel() >= GraphicsStateGuardian.SM20:
             water_color = Vec4(13, 15, 21, 255.0)
             self.water = Swamp(self.modelPrefix + 'water', self.parent, reflection, None, None, water_color)
             self.water.reflection_factor = 0.29999999999999999
             self.water.set_reflection_parameters_np()
         else:
             water = loader.loadModel(self.modelPrefix + 'water')
             water.reparentTo(self.parent)
             color = Vec4(0)
             water.setColorScale(color)
             mask = 0xFFFFFFFFL
             stencil = StencilAttrib.make(1, StencilAttrib.SCFAlways, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOReplace, 1, mask, mask)
             water.setAttrib(stencil)
             water.setBin('water', 0)
             self.reflection = reflection
             taskMgr.add(self.camTask, 'jungleEffectsCamTask-' + str(id(self)), priority = 49)
             water.setFogOff()
     
     for file in self.randomAnimalSoundFiles:
         sfx = loadSfx(file)
         self.randomSfx.append(sfx)
     
     taskMgr.doMethodLater(self.RANDOM_SOUND_PERIOD, self.checkForRandomSound, name = 'checkForRandomSound-' + str(id(self)))
    def startEffects(self):
        self.swamp_water = None
        if base.config.GetBool(
                'want-shaders',
                1) and base.win and base.win.getGsg() and base.win.getGsg(
                ).getShaderModel() >= GraphicsStateGuardian.SM20:
            reflection = Reflection.getGlobalReflection()
            self.swamp_water = Swamp(self.modelPath + '_water', self.parent,
                                     reflection)
        else:
            self.water = loader.loadModel(self.modelPath + '_water')
            self.water.reparentTo(self.parent)
            self.water.setTransparency(TransparencyAttrib.MNone, 100)
            alpha_test_attrib = AlphaTestAttrib.make(RenderAttrib.MAlways, 0)
            self.water.setAttrib(alpha_test_attrib, 100)
        if not self.fireflies:
            self.fireflies = Fireflies()

        if self.fireflies and hasattr(base, 'cr'):
            self.fireflies.reparentTo(base.localAvatar)
            self.fireflies.startLoop()

        if not self.groundFog:
            self.groundFog = GroundFog()

        if self.groundFog and hasattr(base, 'options'):
            if base.options.getSpecialEffectsSetting(
            ) >= base.options.SpecialEffectsMedium:
                self.groundFog.reparentTo(base.localAvatar)
                self.groundFog.startLoop(
                    base.options.getSpecialEffectsSetting())

        if hasattr(base, 'cr') and not hasattr(base.cr, 'isFake'):
            taskMgr.add(self.adjustGroundFogZ,
                        self.parent.uniqueName('groundFogZTask'))

        base.ambientMgr.requestFadeIn(
            SoundGlobals.AMBIENT_SWAMP,
            duration=10,
            finalVolume=PiratesGlobals.DEFAULT_AMBIENT_VOLUME,
            priority=1)
        for file in self.randomAnimalSoundFiles:
            sfx = loadSfx(file)
            self.randomSfx.append(sfx)

        taskMgr.doMethodLater(self.RANDOM_SOUND_PERIOD,
                              self.checkForRandomSound,
                              name='checkForRandomSound-' + str(id(self)))
 def startEffects(self):
     reflection = Reflection.getGlobalReflection()
     non_shader_water_color = Vec4(0.0, 1.0 / 255.0, 4.0 / 255.0, 1.0)
     shader_water_color = Vec4(0.0, 1.0, 4.0, 255.0)
     if self.parent.uniqueId in self.WaterCaves:
         if base.config.GetBool('want-shaders', 1) and base.win and base.win.getGsg() and base.win.getGsg().getShaderModel() >= GraphicsStateGuardian.SM20:
             self.water = Swamp('models/caves/cave_a_water', self.parent, reflection, None, None, shader_water_color)
             self.water.reflection_factor = 0.29999999999999999
             self.water.set_reflection_parameters_np()
         else:
             water = loader.loadModel('models/caves/cave_a_water')
             water.reparentTo(self.parent)
             color = non_shader_water_color
             water.setColorScale(color)
             water.setTextureOff(1)
             mask = 0xFFFFFFFFL
             stencil = StencilAttrib.make(1, StencilAttrib.SCFAlways, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOReplace, 1, mask, mask)
             water.setAttrib(stencil)
             water.setBin('water', 0)
             self.reflection = reflection
             taskMgr.add(self.camTask, 'caveEffectsCamTask-' + str(id(self)), priority = 49)
             water.setFogOff()
     elif self.parent.uniqueId in self.LavaCaves:
         if base.config.GetBool('want-shaders', 1) and base.win and base.win.getGsg() and base.win.getGsg().getShaderModel() >= GraphicsStateGuardian.SM20:
             self.water = Swamp(self.modelPrefix + 'lava', self.parent, reflection, None, None, shader_water_color)
             l1 = LerpScaleInterval(self.water.seamodel, 2, Vec3(1.006, 1.006, 1.0), Vec3(1.0, 1.0, 1.0), blendType = 'easeInOut')
             l2 = LerpScaleInterval(self.water.seamodel, 2, Vec3(1.0, 1.0, 1.0), Vec3(1.006, 1.006, 1.0), blendType = 'easeInOut')
             seq = Sequence(l1, l2)
             seq.loop()
             self.water.reflection_factor = 0.29999999999999999
             self.water.set_reflection_parameters_np()
         else:
             water = loader.loadModel(self.modelPrefix + 'lava')
             water.reparentTo(self.parent)
             water.setFogOff()
     
     base.ambientMgr.requestFadeIn(SoundGlobals.AMBIENT_CAVE, duration = 10, finalVolume = PiratesGlobals.DEFAULT_AMBIENT_VOLUME, priority = 1)
     if self.water:
         self.water.supports_sky_only = self.supports_sky_only
     
     if reflection:
         if base.options.reflection >= 1:
             reflection.reflectShowThroughOnly(False)
             reflection.enable(True)
예제 #5
0
 def startEffects(self):
     reflection = Reflection.getGlobalReflection()
     non_shader_water_color = Vec4(0.0, 1.0 / 255.0, 4.0 / 255.0, 1.0)
     shader_water_color = Vec4(0.0, 1.0, 4.0, 255.0)
     if self.parent.uniqueId in self.WaterCaves:
         if base.config.GetBool('want-shaders', 1) and base.win and base.win.getGsg() and base.win.getGsg().getShaderModel() >= GraphicsStateGuardian.SM20:
             self.water = Swamp('models/caves/cave_a_water', self.parent, reflection, None, None, shader_water_color)
             self.water.reflection_factor = 0.3
             self.water.set_reflection_parameters_np()
         else:
             water = loader.loadModel('models/caves/cave_a_water')
             water.reparentTo(self.parent)
             color = non_shader_water_color
             water.setColorScale(color)
             water.setTextureOff(1)
             mask = 4294967295L
             stencil = StencilAttrib.make(1, StencilAttrib.SCFAlways, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOReplace, 1, mask, mask)
             water.setAttrib(stencil)
             water.setBin('water', 0)
             self.reflection = reflection
             taskMgr.add(self.camTask, 'caveEffectsCamTask-' + str(id(self)), priority=49)
             water.setFogOff()
     elif self.parent.uniqueId in self.LavaCaves:
         if base.config.GetBool('want-shaders', 1) and base.win and base.win.getGsg() and base.win.getGsg().getShaderModel() >= GraphicsStateGuardian.SM20:
             self.water = Swamp(self.modelPrefix + 'lava', self.parent, reflection, None, None, shader_water_color)
             l1 = LerpScaleInterval(self.water.seamodel, 2, Vec3(1.006, 1.006, 1.0), Vec3(1.0, 1.0, 1.0), blendType='easeInOut')
             l2 = LerpScaleInterval(self.water.seamodel, 2, Vec3(1.0, 1.0, 1.0), Vec3(1.006, 1.006, 1.0), blendType='easeInOut')
             seq = Sequence(l1, l2)
             seq.loop()
             self.water.reflection_factor = 0.3
             self.water.set_reflection_parameters_np()
         else:
             water = loader.loadModel(self.modelPrefix + 'lava')
             water.reparentTo(self.parent)
             water.setFogOff()
     base.ambientMgr.requestFadeIn(SoundGlobals.AMBIENT_CAVE, duration=10, finalVolume=PiratesGlobals.DEFAULT_AMBIENT_VOLUME, priority=1)
     if self.water:
         self.water.supports_sky_only = self.supports_sky_only
     if reflection:
         if base.options.reflection >= 1:
             reflection.reflectShowThroughOnly(False)
             reflection.enable(True)
     return
예제 #6
0
 def startEffects(self):
     self.swamp_water = None
     if base.config.GetBool('want-shaders', 1) and base.win and base.win.getGsg() and base.win.getGsg().getShaderModel() >= GraphicsStateGuardian.SM20:
         reflection = Reflection.getGlobalReflection()
         self.swamp_water = Swamp(self.modelPath + '_water', self.parent, reflection)
     else:
         self.water = loader.loadModel(self.modelPath + '_water')
         self.water.reparentTo(self.parent)
         self.water.setTransparency(TransparencyAttrib.MNone, 100)
         alpha_test_attrib = AlphaTestAttrib.make(RenderAttrib.MAlways, 0)
         self.water.setAttrib(alpha_test_attrib, 100)
     if not self.fireflies:
         self.fireflies = Fireflies()
     
     if self.fireflies and hasattr(base, 'cr'):
         self.fireflies.reparentTo(base.localAvatar)
         self.fireflies.startLoop()
     
     if not self.groundFog:
         self.groundFog = GroundFog()
     
     if self.groundFog and hasattr(base, 'options'):
         if base.options.getSpecialEffectsSetting() >= base.options.SpecialEffectsMedium:
             self.groundFog.reparentTo(base.localAvatar)
             self.groundFog.startLoop(base.options.getSpecialEffectsSetting())
         
     
     if hasattr(base, 'cr') and not hasattr(base.cr, 'isFake'):
         taskMgr.add(self.adjustGroundFogZ, self.parent.uniqueName('groundFogZTask'))
     
     base.ambientMgr.requestFadeIn(SoundGlobals.AMBIENT_SWAMP, duration = 10, finalVolume = PiratesGlobals.DEFAULT_AMBIENT_VOLUME, priority = 1)
     for file in self.randomAnimalSoundFiles:
         sfx = loadSfx(file)
         self.randomSfx.append(sfx)
     
     taskMgr.doMethodLater(self.RANDOM_SOUND_PERIOD, self.checkForRandomSound, name = 'checkForRandomSound-' + str(id(self)))
launcher.setPandaErrorCode(0)
launcher.setPandaWindowOpen()
base.sfxPlayer.setCutoffDistance(500.0)
from pirates.audio import SoundGlobals
from pirates.audio.SoundGlobals import loadSfx
rolloverSound = loadSfx(SoundGlobals.SFX_GUI_ROLLOVER_01)
rolloverSound.setVolume(0.5)
DirectGuiGlobals.setDefaultRolloverSound(rolloverSound)
clickSound = loadSfx(SoundGlobals.SFX_GUI_CLICK_01)
DirectGuiGlobals.setDefaultClickSound(clickSound)
clearColor = Vec4(0.0, 0.0, 0.0, 1.0)
base.win.setClearColor(clearColor)
from pirates.shader.Hdr import *
hdr = Hdr()
from pirates.seapatch.Reflection import Reflection
Reflection.initialize(render)
serverVersion = base.config.GetString('server-version', 'no_version_set')
print 'serverVersion:', serverVersion
from pirates.distributed import PiratesClientRepository
cr = PiratesClientRepository.PiratesClientRepository(serverVersion, launcher)
base.initNametagGlobals()
base.startShow(cr)
from otp.distributed import OtpDoGlobals
from pirates.piratesbase import UserFunnel
UserFunnel.logSubmit(1, 'CLIENT_OPENS')
UserFunnel.logSubmit(0, 'CLIENT_OPENS')
if base.config.GetBool('want-portal-cull', 0):
    base.cam.node().setCullCenter(base.camera)
    base.graphicsEngine.setPortalCull(1)

if base.options:
예제 #8
0
    def __init__(self, parentNP=render, reflection=None, todMgr=None):
        Water.__init__(self, 'Sea')
        if base.win.getFbProperties().getStencilBits() == 0:
            self.use_water_bin = False
        self.p3 = Point3()
        self.parentNP = parentNP
        self.followWater = base.config.GetBool('ships-follow-water', 1)
        self.damper = 0.2 * 180.0 / math.pi
        self.floats = {}
        self.floatmasses = {}
        self.patch = SeaPatchRoot()
        self.patch.setSeaLevel(0)
        self.hidden = False
        self.usingFlatWater = False
        if base.camera:
            self.setCenter(base.camera)
            self.setAnchor(render)
        patchNode = SeaPatchNode('seapatch', self.patch)
        patchNode.setWantReflect(0)
        self.patchNP = NodePath(patchNode)
        self.patchNP.setColorScale(0.15, 0.4, 0.5, 1.0)
        self.patchNP.setTwoSided(True)
        self.patchNP.hide()
        shader_file_path = None
        if base.config.GetBool('want-shaders', 1):
            if base.win:
                if base.win.getGsg():
                    if base.win.getGsg().getShaderModel() >= GraphicsStateGuardian.SM20:
                        patchNode.setWantColor(0)
                        shader_directory = 'models/sea/'
                        shader_file_name_array = [
                         '', 'water008_11.cg', 'water008_20.cg', 'water008_2X.cg']
                        shader_model = base.win.getGsg().getShaderModel()
                        maximum_shader_model = len(shader_file_name_array) - 1
                        if shader_model > maximum_shader_model:
                            shader_model = maximum_shader_model
                        file_name = shader_file_name_array[shader_model]
                        shader_file_path = shader_directory + file_name
                        self.shader = loader.loadShader(shader_file_path)
                        if self.shader:
                            pass
                    if self.shader:
                        if base.win.getGsg().getShaderModel() == GraphicsStateGuardian.SM20:
                            self.seamodel = loader.loadModel('models/sea/SeaPatch34')
                        else:
                            self.seamodel = loader.loadModel('models/sea/SeaPatch31')
                    else:
                        if base.options.getTerrainDetailSetting() == 0:
                            self.seamodel = loader.loadModel('models/sea/pir_m_are_wld_seaPatch_low')
                        else:
                            self.seamodel = loader.loadModel('models/sea/SeaPatch31')
                    self.seamodel.setScale(2, 1, 1)
                    self.seamodel.flattenMedium()
                    mask = 4294967295L
                    if self.use_water_bin:
                        self.seamodel.setBin('water', 0)
                        stencil = StencilAttrib.makeWithClear(1, StencilAttrib.SCFAlways, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOReplace, 1, mask, mask, 1, 0)
                        self.seamodel.setAttrib(stencil)
                    else:
                        self.seamodel.setBin('background', 200)
                    self.seamodel.hide(OTPRender.MainCameraBitmask)
                    self.seamodel.showThrough(OTPRender.EnviroCameraBitmask)
                    self.reflectStage = None
                    if False:
                        self.model = loader.loadModel('models/misc/smiley')
                        self.model.reparentTo(render)
                        self.model.setPos(0.0, 50.0, 10.0)
                        self.model.setHpr(0.0, 180.0, 0.0)
                        self.model.setBin('water', 100)
                        self.model2 = loader.loadModel('models/misc/smiley')
                        self.model2.reparentTo(render)
                        self.model2.setPos(10.0, 50.0, 15.0)
                        self.model2.setHpr(180.0, 0.0, 0.0)
                        self.model2.setBin('water', 50)
                        self.model3 = loader.loadModel('models/misc/smiley')
                        self.model3.reparentTo(render)
                        self.model3.setPos(-10.0, 50.0, 15.0)
                        self.model3.setHpr(0.0, 0.0, 0.0)
                        self.model3.setBin('water', 50)
                        stencil = StencilAttrib.make(1, StencilAttrib.SCFEqual, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOKeep, 1, mask, mask)
                        self.model.setAttrib(stencil)
                        stencil = StencilAttrib.make(1, StencilAttrib.SCFEqual, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOKeep, 0, mask, mask)
                        self.model3.setAttrib(stencil)
                    self.flatSea = self.seamodel.find('**/flatsea')
                    flat2 = self.flatSea.copyTo(self.flatSea)
                    flat2.setScale(2, 2, 1)
                    flat2.setZ(-4)
                    flat4 = self.flatSea.copyTo(self.flatSea)
                    flat4.setScale(4, 4, 1)
                    flat4.setZ(-8)
                    if not self.flatSea.isEmpty():
                        self.flatSea.setTag('flat_sea', 'true')
                        self.flatSea.setPos(0, 0, -1)
                        if False:
                            self.flatSea.setScale(1.3)
                        if self.use_water_bin:
                            self.flatSea.setDepthWrite(0)
                    self.flatSea.flattenStrong()
                    if self.use_water_bin:
                        self.patchNP.setBin('water', 10)
                    else:
                        self.patchNP.setBin('ground', -10)
                    self.todMgr = todMgr
                    if self.getTodMgr():
                        self.patchNP.setLightOff()
                        self.patchNP.setLight(self.getTodMgr().alight)
                    seaMin, seaMax = self.seamodel.getTightBounds()
                    seaDelta = seaMax - seaMin
                    cp = CollisionPolygon(Point3(-1.0, -1.0, 0), Point3(1.0, -1.0, 0), Point3(1.0, 1.0, 0), Point3(-1.0, 1.0, 0))
                    cNode = CollisionNode('seaCollision')
                    cNode.setCollideMask(PiratesGlobals.TargetBitmask)
                    cNode.addSolid(cp)
                    cNodePath = NodePath(cNode)
                    cNodePath.reparentTo(self.seamodel)
                    cNodePath.setScale(Vec3(seaDelta).length())
                    cNodePath.setZ(-3)
                    cNodePath.setTag('objType', str(PiratesGlobals.COLL_SEA))
                    cNodePath.reparentTo(self.parentNP)
                    self.cNodePath = cNodePath
                    ccPlane = CollisionPlane(Plane(Vec3(0, 0, 1), Point3(0, 0, 0)))
                    ccNode = CollisionNode('seaCamCollision')
                    ccNode.setCollideMask(PiratesGlobals.CameraBitmask)
                    ccNode.addSolid(ccPlane)
                    ccNodePath = NodePath(ccNode)
                    ccNodePath.reparentTo(self.seamodel)
                    self.ccNodePath = ccNodePath
                    self.seamodel.reparentTo(self.patchNP)
                    self.patchNP.flattenLight()
                    patchNode.collectGeometry()
                    self.enabled = False
                    self.enable()
                    if self.use_alpha_map:
                        if self.enable_alpha_map:
                            self.patchNP.setTransparency(1)
                            alpha_test_attrib = AlphaTestAttrib.make(RenderAttrib.MAlways, 0)
                            self.patchNP.setAttrib(alpha_test_attrib, 100)
                    if self.water_panel != None:
                        self.water_panel.setSeaPatch(self)
                    if self.enable_parameter_keys:

                        def showSeaPatchPanel():
                            from pirates.seapatch import SeaPatchPanel
                            self.spp = SeaPatchPanel.SeaPatchPanel()
                            self.spp.setPatch(self)

                        self.accept('shift-5', showSeaPatchPanel)
                    self.setting_0()
                    self.patchNP.setTransparency(0)
                    buffer_width = 512
                    buffer_height = 512
                    self.texture_extension = '.jpg'
                    if self.shader:
                        self.seamodel.setShader(self.shader)
                        self.seamodel.setFogOff()
                        if self.use_alpha_map:
                            self.patchNP.setTransparency(1)
                        self.base_texture = loader.loadTexture('maps/oceanWater2' + self.texture_extension)
                        self.texture_d = self.base_texture.loadRelated(InternalName.make('-d'))
                        self.texture_n = self.base_texture.loadRelated(InternalName.make('-n'))
                        self.texture_bb = self.base_texture.loadRelated(InternalName.make('-bb'))
                        self.setting_0()
                        self.water_r = 77
                        self.water_g = 128
                        self.water_b = 179
                        self.water_a = 255
                        self.set_water_color()
                        default_water_color_texture_filename = 'maps/ocean_color_1' + self.texture_extension
                        default_water_alpha_texture_filename = 'maps/default_inv_alpha' + self.texture_extension
                        self.set_water_color_texture(default_water_color_texture_filename)
                        self.set_water_alpha_texture(default_water_alpha_texture_filename)
                        if self.enable_water_panel:
                            self.water_panel.set_texture(default_water_color_texture_filename)
                            self.water_panel.set_shader(shader_file_path)
                    self.reflection = True and reflection and reflection
                else:
                    self.reflection = Reflection('seapatch', buffer_width, buffer_height, render, Plane(Vec3(0, 0, 1), Point3(0, 0, 0)))
                self.reflection_enabled() and self.reflection_on()
            else:
                self.reflection_off()
            self.reflection.reflectShowThroughOnly(self.reflect_show_through_only)
            self.seamodel.setShaderInput(self.reflectiontexture_name, self.reflection.reflection_texture)
            OTPRender.renderReflection(False, self.patchNP, 'p_ocean_water', None)
        else:
            self.reflection_factor = 0.0
            self.set_reflection_parameters_np()
        if not self.shader:
            self.accept('timeOfDayChange', self._timeChange)
            if self.reflection:
                self.reflection.createCard('water', 6)
            self.setting_0()
            self.reflection_factor = 0.2
            self.set_reflection_parameters_np()
            if False:
                default_water_color_texture_filename = 'maps/ocean_color_1' + self.texture_extension
                self.set_water_color_texture(default_water_color_texture_filename)
                self.setup_color_map()
        self.create_interface()
        self.patchNP.reparentTo(self.parentNP)
        self.accept('grid-detail-changed', self.updateWater)
        return
예제 #9
0
class SeaPatch(Water):
    __module__ = __name__
    notify = directNotify.newCategory('SeaPatch')

    def __init__(self, parentNP=render, reflection=None, todMgr=None):
        Water.__init__(self, 'Sea')
        if base.win.getFbProperties().getStencilBits() == 0:
            self.use_water_bin = False
        self.p3 = Point3()
        self.parentNP = parentNP
        self.followWater = base.config.GetBool('ships-follow-water', 1)
        self.damper = 0.2 * 180.0 / math.pi
        self.floats = {}
        self.floatmasses = {}
        self.patch = SeaPatchRoot()
        self.patch.setSeaLevel(0)
        self.hidden = False
        self.usingFlatWater = False
        if base.camera:
            self.setCenter(base.camera)
            self.setAnchor(render)
        patchNode = SeaPatchNode('seapatch', self.patch)
        patchNode.setWantReflect(0)
        self.patchNP = NodePath(patchNode)
        self.patchNP.setColorScale(0.15, 0.4, 0.5, 1.0)
        self.patchNP.setTwoSided(True)
        self.patchNP.hide()
        shader_file_path = None
        if base.config.GetBool('want-shaders', 1):
            if base.win:
                if base.win.getGsg():
                    if base.win.getGsg().getShaderModel() >= GraphicsStateGuardian.SM20:
                        patchNode.setWantColor(0)
                        shader_directory = 'models/sea/'
                        shader_file_name_array = [
                         '', 'water008_11.cg', 'water008_20.cg', 'water008_2X.cg']
                        shader_model = base.win.getGsg().getShaderModel()
                        maximum_shader_model = len(shader_file_name_array) - 1
                        if shader_model > maximum_shader_model:
                            shader_model = maximum_shader_model
                        file_name = shader_file_name_array[shader_model]
                        shader_file_path = shader_directory + file_name
                        self.shader = loader.loadShader(shader_file_path)
                        if self.shader:
                            pass
                    if self.shader:
                        if base.win.getGsg().getShaderModel() == GraphicsStateGuardian.SM20:
                            self.seamodel = loader.loadModel('models/sea/SeaPatch34')
                        else:
                            self.seamodel = loader.loadModel('models/sea/SeaPatch31')
                    else:
                        if base.options.getTerrainDetailSetting() == 0:
                            self.seamodel = loader.loadModel('models/sea/pir_m_are_wld_seaPatch_low')
                        else:
                            self.seamodel = loader.loadModel('models/sea/SeaPatch31')
                    self.seamodel.setScale(2, 1, 1)
                    self.seamodel.flattenMedium()
                    mask = 4294967295L
                    if self.use_water_bin:
                        self.seamodel.setBin('water', 0)
                        stencil = StencilAttrib.makeWithClear(1, StencilAttrib.SCFAlways, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOReplace, 1, mask, mask, 1, 0)
                        self.seamodel.setAttrib(stencil)
                    else:
                        self.seamodel.setBin('background', 200)
                    self.seamodel.hide(OTPRender.MainCameraBitmask)
                    self.seamodel.showThrough(OTPRender.EnviroCameraBitmask)
                    self.reflectStage = None
                    if False:
                        self.model = loader.loadModel('models/misc/smiley')
                        self.model.reparentTo(render)
                        self.model.setPos(0.0, 50.0, 10.0)
                        self.model.setHpr(0.0, 180.0, 0.0)
                        self.model.setBin('water', 100)
                        self.model2 = loader.loadModel('models/misc/smiley')
                        self.model2.reparentTo(render)
                        self.model2.setPos(10.0, 50.0, 15.0)
                        self.model2.setHpr(180.0, 0.0, 0.0)
                        self.model2.setBin('water', 50)
                        self.model3 = loader.loadModel('models/misc/smiley')
                        self.model3.reparentTo(render)
                        self.model3.setPos(-10.0, 50.0, 15.0)
                        self.model3.setHpr(0.0, 0.0, 0.0)
                        self.model3.setBin('water', 50)
                        stencil = StencilAttrib.make(1, StencilAttrib.SCFEqual, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOKeep, 1, mask, mask)
                        self.model.setAttrib(stencil)
                        stencil = StencilAttrib.make(1, StencilAttrib.SCFEqual, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOKeep, 0, mask, mask)
                        self.model3.setAttrib(stencil)
                    self.flatSea = self.seamodel.find('**/flatsea')
                    flat2 = self.flatSea.copyTo(self.flatSea)
                    flat2.setScale(2, 2, 1)
                    flat2.setZ(-4)
                    flat4 = self.flatSea.copyTo(self.flatSea)
                    flat4.setScale(4, 4, 1)
                    flat4.setZ(-8)
                    if not self.flatSea.isEmpty():
                        self.flatSea.setTag('flat_sea', 'true')
                        self.flatSea.setPos(0, 0, -1)
                        if False:
                            self.flatSea.setScale(1.3)
                        if self.use_water_bin:
                            self.flatSea.setDepthWrite(0)
                    self.flatSea.flattenStrong()
                    if self.use_water_bin:
                        self.patchNP.setBin('water', 10)
                    else:
                        self.patchNP.setBin('ground', -10)
                    self.todMgr = todMgr
                    if self.getTodMgr():
                        self.patchNP.setLightOff()
                        self.patchNP.setLight(self.getTodMgr().alight)
                    seaMin, seaMax = self.seamodel.getTightBounds()
                    seaDelta = seaMax - seaMin
                    cp = CollisionPolygon(Point3(-1.0, -1.0, 0), Point3(1.0, -1.0, 0), Point3(1.0, 1.0, 0), Point3(-1.0, 1.0, 0))
                    cNode = CollisionNode('seaCollision')
                    cNode.setCollideMask(PiratesGlobals.TargetBitmask)
                    cNode.addSolid(cp)
                    cNodePath = NodePath(cNode)
                    cNodePath.reparentTo(self.seamodel)
                    cNodePath.setScale(Vec3(seaDelta).length())
                    cNodePath.setZ(-3)
                    cNodePath.setTag('objType', str(PiratesGlobals.COLL_SEA))
                    cNodePath.reparentTo(self.parentNP)
                    self.cNodePath = cNodePath
                    ccPlane = CollisionPlane(Plane(Vec3(0, 0, 1), Point3(0, 0, 0)))
                    ccNode = CollisionNode('seaCamCollision')
                    ccNode.setCollideMask(PiratesGlobals.CameraBitmask)
                    ccNode.addSolid(ccPlane)
                    ccNodePath = NodePath(ccNode)
                    ccNodePath.reparentTo(self.seamodel)
                    self.ccNodePath = ccNodePath
                    self.seamodel.reparentTo(self.patchNP)
                    self.patchNP.flattenLight()
                    patchNode.collectGeometry()
                    self.enabled = False
                    self.enable()
                    if self.use_alpha_map:
                        if self.enable_alpha_map:
                            self.patchNP.setTransparency(1)
                            alpha_test_attrib = AlphaTestAttrib.make(RenderAttrib.MAlways, 0)
                            self.patchNP.setAttrib(alpha_test_attrib, 100)
                    if self.water_panel != None:
                        self.water_panel.setSeaPatch(self)
                    if self.enable_parameter_keys:

                        def showSeaPatchPanel():
                            from pirates.seapatch import SeaPatchPanel
                            self.spp = SeaPatchPanel.SeaPatchPanel()
                            self.spp.setPatch(self)

                        self.accept('shift-5', showSeaPatchPanel)
                    self.setting_0()
                    self.patchNP.setTransparency(0)
                    buffer_width = 512
                    buffer_height = 512
                    self.texture_extension = '.jpg'
                    if self.shader:
                        self.seamodel.setShader(self.shader)
                        self.seamodel.setFogOff()
                        if self.use_alpha_map:
                            self.patchNP.setTransparency(1)
                        self.base_texture = loader.loadTexture('maps/oceanWater2' + self.texture_extension)
                        self.texture_d = self.base_texture.loadRelated(InternalName.make('-d'))
                        self.texture_n = self.base_texture.loadRelated(InternalName.make('-n'))
                        self.texture_bb = self.base_texture.loadRelated(InternalName.make('-bb'))
                        self.setting_0()
                        self.water_r = 77
                        self.water_g = 128
                        self.water_b = 179
                        self.water_a = 255
                        self.set_water_color()
                        default_water_color_texture_filename = 'maps/ocean_color_1' + self.texture_extension
                        default_water_alpha_texture_filename = 'maps/default_inv_alpha' + self.texture_extension
                        self.set_water_color_texture(default_water_color_texture_filename)
                        self.set_water_alpha_texture(default_water_alpha_texture_filename)
                        if self.enable_water_panel:
                            self.water_panel.set_texture(default_water_color_texture_filename)
                            self.water_panel.set_shader(shader_file_path)
                    self.reflection = True and reflection and reflection
                else:
                    self.reflection = Reflection('seapatch', buffer_width, buffer_height, render, Plane(Vec3(0, 0, 1), Point3(0, 0, 0)))
                self.reflection_enabled() and self.reflection_on()
            else:
                self.reflection_off()
            self.reflection.reflectShowThroughOnly(self.reflect_show_through_only)
            self.seamodel.setShaderInput(self.reflectiontexture_name, self.reflection.reflection_texture)
            OTPRender.renderReflection(False, self.patchNP, 'p_ocean_water', None)
        else:
            self.reflection_factor = 0.0
            self.set_reflection_parameters_np()
        if not self.shader:
            self.accept('timeOfDayChange', self._timeChange)
            if self.reflection:
                self.reflection.createCard('water', 6)
            self.setting_0()
            self.reflection_factor = 0.2
            self.set_reflection_parameters_np()
            if False:
                default_water_color_texture_filename = 'maps/ocean_color_1' + self.texture_extension
                self.set_water_color_texture(default_water_color_texture_filename)
                self.setup_color_map()
        self.create_interface()
        self.patchNP.reparentTo(self.parentNP)
        self.accept('grid-detail-changed', self.updateWater)
        return

    def updateWater(self, level):
        if level == 0:
            self.patch.animateHeight(False)
            self.patch.animateUv(False)
        else:
            self.patch.animateHeight(True)
            self.patch.animateUv(True)

    def hide(self):
        self.patchNP.hide()
        self.hidden = True

    def show(self):
        self.patchNP.show()
        self.hidden = False

    def toggle_display(self):
        if self.hidden:
            self.show()
        else:
            self.hide()

    def getTodMgr(self):
        if self.todMgr:
            return self.todMgr
        try:
            return base.cr.timeOfDayManager
        except:
            return

        return

    def delete(self):
        self.ccNodePath.removeNode()
        self.cNodePath.removeNode()
        self.seamodel.removeNode()
        self.patchNP.removeNode()
        self.parentNP = None
        self.todMgr = None
        taskMgr.remove('seaFloatTask-' + str(id(self)))
        taskMgr.remove('seaPatchCamTask-' + str(id(self)))
        self.delete_water()
        if len(self.floats):
            self.notify.error('All floating objects not removed from seapatch. You must call removeFloatable')
            self.floats.clear()
            self.floatmasses.clear()
        self.ignoreAll()
        return

    def disable(self):
        if self.enabled:
            self.enabled = False
            self.patch.disable()
            self.patchNP.hide()
            taskMgr.remove('seaPatchCamTask-' + str(id(self)))
            taskMgr.remove('seaFloatTask-' + str(id(self)))

    def enable(self):
        if not self.enabled:
            self.enabled = True
            self.patch.enable()
            self.patchNP.show()
            taskMgr.add(self.camTask, 'seaPatchCamTask-' + str(id(self)), priority=49)
            if self.followWater:
                taskMgr.add(self.floatTask, 'seaFloatTask-' + str(id(self)), priority=35)

    def setAnchor(self, anchor):
        self.anchor = anchor
        self.patch.setAnchor(anchor)

    def setCenter(self, center):
        self.center = center
        self.patch.setCenter(center)

    def camTask(self, task):
        refNode = base.cam
        if not refNode:
            return Task.cont
        p = refNode.getPos(render)
        r = refNode.getHpr(render)
        if not self.usingFlatWater:
            self.patchNP.setPos(p.getX(), p.getY(), 0.0)
            self.patchNP.setH(r.getX())
        todMgr = self.getTodMgr()
        if self.shader:
            if todMgr:
                self.clear_color = todMgr.fog.getColor()
                fog_color = todMgr.fog.getColor()
                self.fog_r = fog_color.getX()
                self.fog_g = fog_color.getY()
                self.fog_b = fog_color.getZ()
                self.fog_exp_density = todMgr.fog.getExpDensity()
                ambient_color = todMgr.alight.node().getColor()
                if todMgr.dlight is None:
                    diffuse_color = VBase3(1.0, 1.0, 1.0)
                else:
                    diffuse_color = todMgr.dlight.node().getColor()
                self.ar = ambient_color.getX() * 255.0
                self.ag = ambient_color.getY() * 255.0
                self.ab = ambient_color.getZ() * 255.0
                self.dr = diffuse_color.getX() * 255.0
                self.dg = diffuse_color.getY() * 255.0
                self.db = diffuse_color.getZ() * 255.0
                self.r = diffuse_color.getX() * 255.0
                self.g = diffuse_color.getY() * 255.0
                self.b = diffuse_color.getZ() * 255.0
                camera_position = p
                self.camera_x = camera_position.getX()
                self.camera_y = camera_position.getY()
                self.camera_z = camera_position.getZ()
                fakeDistance = 10000.0
                heading = 360.0 - todMgr.skyGroup.sunWheelRoll.getR()
                camera_heading = r.getX()
                adjusted_camera_heading = -camera_heading
                sunPos = todMgr.skyGroup.sunLight.getPos(todMgr.skyGroup)
                trueDistance = todMgr.skyGroup.sunLight.getDistance(todMgr.skyGroup)
                light_distance = fakeDistance
                distanceScalar = fakeDistance / trueDistance
                x1 = sunPos[0] * distanceScalar
                y1 = x1 - sunPos[1] * distanceScalar
                z1 = sunPos[2] * distanceScalar
                x2 = math.cos(math.radians(heading)) * fakeDistance
                y2 = math.cos(math.radians(heading)) * fakeDistance
                z2 = math.sin(math.radians(heading)) * fakeDistance
                x = x1
                y = y1
                z = z1
                self.x = math.cos(math.radians(adjusted_camera_heading)) * x
                self.y = math.sin(math.radians(adjusted_camera_heading)) * y
                self.z = z
                x = z > 0.0 and z / light_distance * 3.0 + 0.05
                mu = 0.0
                sigma = 0.5
                a = math.log(x) - mu
                a = a * a
                self.s = 2.0 * (1.0 / (x * sigma * math.sqrt(2.0 * math.pi))) * math.exp(-a / (2 * sigma * sigma))
                if self.s < 0.0:
                    self.s = 0.0
                self.p = 80.0
            else:
                self.s = 0.0
                self.p = 80.0
            self.d = 1.0
        self.update_water(task.time)
        return Task.cont

    def addFloatable(self, name, transNode, rotNode=None, mass=1):
        if rotNode == None:
            rotNode = transNode
        self.floats[name] = [
         transNode, rotNode]
        self.floatmasses[name] = mass
        return

    def removeFloatable(self, name):
        if self.floats.has_key(name):
            del self.floats[name]
            del self.floatmasses[name]

    def showFrustum(self):
        base.cam.node().setCullCenter(base.camera)
        base.graphicsEngine.setPortalCull(1)

    def toggleRes(self):
        if self.seamodel == self.lowres:
            self.seamodel = self.highres
        else:
            if self.seamodel == self.highres:
                self.seamodel = self.lowres

    def floatTask(self, task):
        mass = -6.0
        area = 1
        k = self.damper
        for name, floater in self.floats.items():
            transNode = floater[0]
            rotNode = floater[1]
            height, normal = self.calcHeightAndNormalForMass(node=transNode, mass=mass, area=area)
            height = height - self.floatmasses[name]
            transNode.setZ(render, height)
            r = -k * normal[0]
            p = -k * normal[1]
            rotNode.setR(r)
            rotNode.setP(p)

        return Task.cont

    def setReflection(self, tex, factor):
        if self.reflectStage == None:
            self.reflectStage = TextureStage('reflect')
            self.reflectStage.setTexcoordName('reflect')
            self.reflectStage.setSort(10)
        if factor == None:
            self.reflectStage.setCombineRgb(TextureStage.CMAdd, TextureStage.CSTexture, TextureStage.COSrcColor, TextureStage.CSPrevious, TextureStage.COSrcColor)
        else:
            self.reflectStage.setCombineRgb(TextureStage.CMInterpolate, TextureStage.CSTexture, TextureStage.COSrcColor, TextureStage.CSPrevious, TextureStage.COSrcColor, TextureStage.CSConstant, TextureStage.COSrcAlpha)
            self.reflectStage.setColor(VBase4(1, 1, 1, factor))
        self.seamodel.setTexture(self.reflectStage, tex)
        return

    def clearReflection(self):
        if self.reflectStage != None:
            self.seamodel.clearTexture(self.reflectStage)
        return

    def saveSeaPatchFile(self, filename):
        if not isinstance(filename, Filename):
            filename = Filename.fromOsSpecific(filename)
        speed = self.patch.getOverallSpeed()
        radius = self.patch.getRadius()
        threshold = self.patch.getThreshold()
        hcolor = self.patch.getHighColor()
        lcolor = self.patch.getLowColor()
        uvscale = self.patch.getUvScale()
        pas = self.patch.getUvSpeed()
        mamplitude = []
        mlength = []
        mspeed = []
        mdir = []
        mchoppy = []
        for i in range(self.patch.getNumWaves()):
            mamplitude.append(self.patch.getWaveAmplitude(i))
            mlength.append(self.patch.getWaveLength(i))
            mspeed.append(self.patch.getWaveSpeed(i))
            mdir.append(self.patch.getWaveDirection(i))
            mchoppy.append(self.patch.getChoppyK(i))

        i1 = '    '
        i2 = i1 + i1
        i3 = i2 + i1
        out_file = open(filename.toOsSpecific(), 'wb')
        i2 = ''
        out_file.write(i2 + 'patch.setOverallSpeed(%.4f)\n' % speed)
        out_file.write(i2 + 'patch.setUvSpeed(Vec2(%.5f, %.5f))\n' % (pas[0], pas[1]))
        out_file.write(i2 + 'patch.setThreshold(%.2f)\n' % threshold)
        out_file.write(i2 + 'patch.setRadius(%.2f)\n' % radius)
        out_file.write(i2 + 'patch.setUvScale(VBase2(%.4f, %.4f))\n' % (uvscale[0], uvscale[1]))
        out_file.write(i2 + 'patch.setHighColor(Vec4(%.4f, %.4f, %.4f, %.4f))\n' % (hcolor[0], hcolor[1], hcolor[2], hcolor[3]))
        out_file.write(i2 + 'patch.setLowColor(Vec4(%.4f, %.4f, %.4f, %.4f))\n' % (lcolor[0], lcolor[1], lcolor[2], lcolor[3]))
        for i in range(self.patch.getNumWaves()):
            if self.patch.isWaveEnabled(i):
                out_file.write(i2 + 'patch.enableWave(' + str(i) + ')\n')
            else:
                out_file.write(i2 + 'patch.disableWave(' + str(i) + ')\n')
            out_file.write(i2 + 'patch.setWaveTarget(%s, %s)\n' % (i, self.__formatWaveTarget(self.patch.getWaveTarget(i))))
            out_file.write(i2 + 'patch.setWaveFunc(%s, %s)\n' % (i, self.__formatWaveFunc(self.patch.getWaveFunc(i))))
            if self.patch.getWaveFunc(i) == SeaPatchRoot.WFSin:
                out_file.write(i2 + 'patch.setWaveDirection(' + str(i) + ', Vec2(%.4f, %.4f))\n' % (mdir[i][0], mdir[i][1]))
            out_file.write(i2 + 'patch.setChoppyK(' + str(i) + ', %d)\n' % mchoppy[i])
            out_file.write(i2 + 'patch.setWaveAmplitude(%s, %.4f)\n' % (i, mamplitude[i]))
            out_file.write(i2 + 'patch.setWaveLength(%s, %.4f)\n' % (i, mlength[i]))
            out_file.write(i2 + 'patch.setWaveSpeed(%s, %.4f)\n' % (i, mspeed[i]))

    def __formatWaveTarget(self, target):
        if target == SeaPatchRoot.WTZ:
            return 'SeaPatchRoot.WTZ'
        else:
            if target == SeaPatchRoot.WTU:
                return 'SeaPatchRoot.WTU'
            else:
                if target == SeaPatchRoot.WTV:
                    return 'SeaPatchRoot.WTV'

    def __formatWaveFunc(self, func):
        if func == SeaPatchRoot.WFSin:
            return 'SeaPatchRoot.WFSin'
        else:
            if func == SeaPatchRoot.WFNoise:
                return 'SeaPatchRoot.WFNoise'

    def loadSeaPatchFileExt(self, filename, patch=None):
        if patch == None:
            patch = SeaPatchRoot()
            patch.assignEnvironmentFrom(self.patch)
        patch.resetProperties()
        if not isinstance(filename, Filename):
            filename = Filename.fromOsSpecific(filename)
        searchPath = DSearchPath()
        if AppRunnerGlobal.appRunner:
            searchPath.appendDirectory(Filename.expandFrom('$POTCO_2_ROOT/etc'))
        else:
            searchPath.appendDirectory(Filename.fromOsSpecific(os.path.expandvars('$PIRATES/src/seapatch')))
            searchPath.appendDirectory(Filename.fromOsSpecific(os.path.expandvars('pirates/src/seapatch')))
            searchPath.appendDirectory(Filename('etc'))
            searchPath.appendDirectory(Filename('.'))
        found = vfs.resolveFilename(filename, searchPath)
        if not found:
            print 'seapatch file not found: %s' % filename
        else:
            data = vfs.readFile(filename, 1)
            data = data.replace('\r', '')
            exec data
        return patch

    def loadSeaPatchFile(self, filename):
        self.loadSeaPatchFileExt(filename, patch=self.patch)
        self.updateWater(base.options.getTerrainDetailSetting())

    def lerpToSeaPatchFile(self, filename, duration, name=None, blendType='easeInOut'):
        newpatch = self.loadSeaPatchFileExt(filename)
        newpatch.setCenter(self.center)
        newpatch.setAnchor(self.anchor)
        sealerp = LerpSeaPatchInterval(name, duration, blendType, self.patch, self.patch, newpatch)
        return sealerp

    def calcFlatWellScale(self, x=0, y=0, node=None):
        p3 = self.p3
        p3.set(x, y, 0)
        if node == None:
            node = self.anchor
        ap = self.anchor.getRelativePoint(node, p3)
        return self.patch.calcFlatWellScale(ap.getX(), ap.getY())

    def calcHeight(self, x=0, y=0, z=0, node=None):
        p3 = self.p3
        p3.set(x, y, z)
        if node == None:
            node = self.anchor
        ap = self.anchor.getRelativePoint(node, p3)
        cp = self.center.getRelativePoint(node, p3)
        x = cp.getX()
        y = cp.getY()
        dist2 = x * x + y * y
        return self.patch.calcHeight(ap.getX(), ap.getY(), dist2)

    def calcFilteredHeight(self, x=0, y=0, z=0, minWaveLength=0, node=None):
        p3 = self.p3
        p3.set(x, y, z)
        if node == None:
            node = self.anchor
        ap = self.anchor.getRelativePoint(node, p3)
        cp = self.center.getRelativePoint(node, p3)
        x = cp.getX()
        y = cp.getY()
        dist2 = x * x + y * y
        return self.patch.calcFilteredHeight(ap.getX(), ap.getY(), minWaveLength, dist2)

    def calcHeightForMass(self, x=0, y=0, z=0, node=None, mass=1, area=1):
        p3 = self.p3
        p3.set(x, y, z)
        if node == None:
            node = self.anchor
        ap = self.anchor.getRelativePoint(node, p3)
        cp = self.center.getRelativePoint(node, p3)
        x = cp.getX()
        y = cp.getY()
        dist2 = x * x + y * y
        return self.patch.calcHeightForMass(ap.getX(), ap.getY(), dist2, mass, area)

    def calcHeightAndNormal(self, x=0, y=0, z=0, node=None):
        p3 = self.p3
        p3.set(x, y, z)
        if node == None:
            node = self.anchor
        ap = self.anchor.getRelativePoint(node, p3)
        ax = ap.getX()
        ay = ap.getY()
        cp = self.center.getRelativePoint(node, p3)
        x = cp.getX()
        y = cp.getY()
        dist2 = x * x + y * y
        height = self.patch.calcHeight(ax, ay, dist2)
        normal = self.patch.calcNormal(height, ax, ay, dist2)
        normal = node.getRelativeVector(self.anchor, normal)
        return (
         height, normal)

    def calcHeightAndNormalForMass(self, x=0, y=0, z=0, node=None, mass=1, area=1):
        p3 = self.p3
        p3.set(x, y, z)
        if node == None:
            node = self.anchor
        ap = self.anchor.getRelativePoint(node, p3)
        ax = ap.getX()
        ay = ap.getY()
        cp = self.center.getRelativePoint(node, p3)
        x = cp.getX()
        y = cp.getY()
        dist2 = x * x + y * y
        height = self.patch.calcHeightForMass(ax, ay, dist2, mass, area)
        normal = self.patch.calcNormalForMass(height, ax, ay, dist2, mass, area)
        normal = node.getRelativeVector(self.anchor, normal)
        return (
         height, normal)

    def setSeaWeights(self, weight_map):
        pass

    def _timeChange(self, stateId, stateDuration, elapsedTime, transitionTime):
        transTime = 2.0
        if stateId == PiratesGlobals.TOD_DAWN:
            highColor = Vec4(1.0, 1.0, 1.0, 0.5)
            lowColor = Vec4(0.5, 0.3, 0.3, 0.8)
        else:
            if stateId == PiratesGlobals.TOD_DAY:
                highColor = Vec4(1.0, 1.0, 1.0, 0.5)
                lowColor = Vec4(0.2, 0.2, 0.2, 0.8)
            else:
                if stateId == PiratesGlobals.TOD_DUSK:
                    highColor = Vec4(1.0, 1.0, 1.0, 0.5)
                    lowColor = Vec4(0.7, 0.2, 0.2, 0.8)
                else:
                    if stateId == PiratesGlobals.TOD_NIGHT:
                        highColor = Vec4(1.0, 1.0, 1.0, 0.5)
                        lowColor = Vec4(0.2, 0.2, 0.8, 0.8)
                    else:
                        if stateId == PiratesGlobals.TOD_STARS:
                            highColor = Vec4(1.0, 1.0, 1.0, 0.5)
                            lowColor = Vec4(0.2, 0.2, 0.4, 0.8)
                        else:
                            if stateId in [PiratesGlobals.TOD_HALLOWEEN, PiratesGlobals.TOD_FULLMOON, PiratesGlobals.TOD_HALFMOON2, PiratesGlobals.TOD_HALFMOON]:
                                highColor = Vec4(1.0, 1.0, 1.0, 0.5)
                                lowColor = Vec4(0.5, 0.25, 0.6, 0.8)
                            else:
                                highColor = Vec4(1.0, 1.0, 1.0, 0.5)
                                lowColor = Vec4(0.2, 0.2, 0.2, 0.8)
        self.patch.setHighColor(highColor)
        self.patch.setLowColor(lowColor)

    maintenanceTaskName = 'maintenanceTask'

    def initialize(self):
        self.time = 0.0
        self.cacheTime = 0.0
        self.updateTimeInSeconds = 10.0
        self.cacheUpdateTimeInSeconds = 60.0 * 5.0

    def cleanup(self):
        taskMgr.remove(self.maintenanceTaskName)

    def setup(self, updateTimeInSeconds, cacheUpdateTimeInSeconds, taskPriority):
        self.updateTimeInSeconds = updateTimeInSeconds
        self.cacheUpdateTimeInSeconds = cacheUpdateTimeInSeconds
        taskMgr.add(self.maintenanceTask, self.maintenanceTaskName, priority=taskPriority)

    def maintenanceFunction(self):
        models_freed = 1
        textures_freed = 1
        while models_freed > 0 or textures_freed > 0:
            models_freed = ModelPool.garbageCollect()
            textures_freed = TexturePool.garbageCollect()
            if models_freed > 0 or textures_freed > 0:
                pass

    def clearCachesFunction(self):
        RenderState.clearCache()
        TransformState.clearCache()

    def maintenanceTask(self, task):
        if task.time - self.time >= self.updateTimeInSeconds:
            self.maintenanceFunction()
            self.time = task.time
        if task.time - self.cacheTime >= self.cacheUpdateTimeInSeconds:
            self.clearCachesFunction()
            self.cacheTime = task.time
        return Task.cont

    def getSpecialEffectsLevel(self):
        try:
            level = base.options.getSpecialEffectsSetting()
        except:
            level = Options.SpecialEffectsHigh

        return level

    def addMotionTrail(self, parent):
        if self.motion_trail == None:
            motion_trail = MotionTrail('sword_motion_trail', parent)
            if False:
                axis = loader.loadModel('models/misc/xyzAxis')
                axis.reparentTo(parent)
            test_vertex_list = [Vec4(0.0, 0.4, 0.0, 1.0), Vec4(0.0, 2.0, 0.0, 1.0), Vec4(-0.55, 2.95, 0.0, 1.0)]

            def test_vertex_function(motion_trail_vertex, vertex_id, context):
                return test_vertex_list[vertex_id]

            index = 0
            total_test_vertices = len(test_vertex_list)
            while index < total_test_vertices:
                motion_trail_vertex = motion_trail.add_vertex(index, test_vertex_function, None)
                if True:
                    if index == 0:
                        motion_trail_vertex.start_color = Vec4(0.0, 0.25, 0.0, 1.0)
                        motion_trail_vertex.end_color = Vec4(0.0, 0.0, 0.0, 1.0)
                    if index == 1:
                        motion_trail_vertex.start_color = Vec4(0.25, 0.0, 0.0, 1.0)
                        motion_trail_vertex.end_color = Vec4(0.0, 0.0, 0.0, 1.0)
                    if index == 2:
                        motion_trail_vertex.start_color = Vec4(0.0, 0.0, 1.0, 1.0)
                        motion_trail_vertex.end_color = Vec4(0.0, 0.0, 0.0, 1.0)
                    if index == 3:
                        motion_trail_vertex.start_color = Vec4(0.0, 1.0, 1.0, 1.0)
                        motion_trail_vertex.end_color = Vec4(0.0, 0.0, 0.0, 1.0)
                    if index == 4:
                        motion_trail_vertex.start_color = Vec4(1.0, 1.0, 0.0, 1.0)
                        motion_trail_vertex.end_color = Vec4(0.0, 0.0, 0.0, 1.0)
                    if index == 0:
                        motion_trail_vertex.start_color = Vec4(0.0, 0.1, 0.0, 1.0)
                        motion_trail_vertex.end_color = Vec4(0.0, 0.0, 0.0, 1.0)
                    if index == 1:
                        motion_trail_vertex.start_color = Vec4(0.25, 0.0, 0.0, 1.0)
                        motion_trail_vertex.end_color = Vec4(0.0, 0.0, 0.0, 1.0)
                index += 1

            motion_trail.update_vertices()
            motion_trail.register_motion_trail()
            motion_trail.calculate_relative_matrix = True
            motion_trail.root_node_path = parent
            motion_trail.time_window = 0.25
            motion_trail.continuous_motion_trail = False
            motion_trail.end_motion_trail()
            self.motion_trail = motion_trail
            if not False:
                print 'ADD MOTION TRAIL'
                axis = Vec3(0.0, 0.0, 1.0)
                time = 0.0
                angle = (1.0 - time) * 90.0
                matrix = Mat4.rotateMat(angle, axis)
                self.motion_trail.update_motion_trail(time, matrix)
                time = 0.2
                angle = (1.0 - time) * 90.0
                matrix = Mat4.rotateMat(angle, axis)
                self.motion_trail.update_motion_trail(time, matrix)
                time = 0.4
                angle = (1.0 - time) * 90.0
                matrix = Mat4.rotateMat(angle, axis)
                self.motion_trail.update_motion_trail(time, matrix)
                time = 0.6
                angle = (1.0 - time) * 90.0
                matrix = Mat4.rotateMat(angle, axis)
                self.motion_trail.update_motion_trail(time, matrix)
                time = 0.8
                angle = (1.0 - time) * 90.0
                matrix = Mat4.rotateMat(angle, axis)
                self.motion_trail.update_motion_trail(time, matrix)
                time = 1.0
                angle = (1.0 - time) * 90.0
                matrix = Mat4.rotateMat(angle, axis)
                self.motion_trail.update_motion_trail(time, matrix)
        return
예제 #10
0
launcher.setPandaErrorCode(0)
launcher.setPandaWindowOpen()
base.sfxPlayer.setCutoffDistance(500.0)
from pirates.audio import SoundGlobals
from pirates.audio.SoundGlobals import loadSfx
rolloverSound = loadSfx(SoundGlobals.SFX_GUI_ROLLOVER_01)
rolloverSound.setVolume(0.5)
DirectGuiGlobals.setDefaultRolloverSound(rolloverSound)
clickSound = loadSfx(SoundGlobals.SFX_GUI_CLICK_01)
DirectGuiGlobals.setDefaultClickSound(clickSound)
clearColor = Vec4(0.0, 0.0, 0.0, 1.0)
base.win.setClearColor(clearColor)
from pirates.shader.Hdr import *
hdr = Hdr()
from pirates.seapatch.Reflection import Reflection
Reflection.initialize(render)
serverVersion = base.config.GetString('server-version', 'no_version_set')
print 'serverVersion: ', serverVersion
from pirates.distributed import PiratesClientRepository
cr = PiratesClientRepository.PiratesClientRepository(serverVersion, launcher)
base.initNametagGlobals()
base.startShow(cr)
from otp.distributed import OtpDoGlobals
from pirates.piratesbase import UserFunnel
UserFunnel.logSubmit(1, 'CLIENT_OPENS')
UserFunnel.logSubmit(0, 'CLIENT_OPENS')
if base.config.GetBool('want-portal-cull', 0):
    base.cam.node().setCullCenter(base.camera)
    base.graphicsEngine.setPortalCull(1)

if base.options:
예제 #11
0
    def __init__(self,
                 swamp_model_file_path,
                 parentNP=render,
                 reflection=None,
                 input_swamp_model=None,
                 input_shader_file_path=None,
                 input_water_color=None):
        if input_swamp_model:
            swamp_name = 'Swamp I'
        else:
            swamp_name = 'Swamp'
        Water.__init__(self, swamp_name)
        self.parentNP = parentNP
        self.swamp_model = input_swamp_model
        if input_swamp_model:
            self.seamodel = input_swamp_model
            self.parentNP = input_swamp_model.getParent()
            self.patchNP = NodePath(self.seamodel)
        elif swamp_model_file_path:
            self.seamodel = loader.loadModel(swamp_model_file_path)
        else:
            self.swampmodel = loader.loadModel('models/swamp/SwampA')
            self.swampmodel.reparentTo(self.parentNP)
            self.swampmodel.setPos(0.0, 0.0, -1.0)
            self.seamodel = loader.loadModel('models/swamp/swampA_water')
        self.patchNP = NodePath(self.seamodel)
        self.patchNP.reparentTo(self.parentNP)
        self.hidden = False
        mask = 0xFFFFFFFFL
        if self.use_water_bin:
            self.seamodel.setBin('water', 1)
            stencil = StencilAttrib.make(1, StencilAttrib.SCFAlways,
                                         StencilAttrib.SOKeep,
                                         StencilAttrib.SOKeep,
                                         StencilAttrib.SOReplace, 1, mask,
                                         mask)
            self.seamodel.setAttrib(stencil)
        else:
            self.seamodel.setBin('background', 200)
        self.reflectStage = None
        if False:
            self.model = loader.loadModel('models/misc/smiley')
            self.model.reparentTo(render)
            self.model.setPos(0.0, 50.0, 10.0)
            self.model.setHpr(0.0, 180.0, 0.0)
            self.model.setBin('water', 100)
            self.model2 = loader.loadModel('models/misc/smiley')
            self.model2.reparentTo(render)
            self.model2.setPos(10.0, 50.0, 15.0)
            self.model2.setHpr(180.0, 0.0, 0.0)
            self.model2.setBin('water', 50)
            self.model3 = loader.loadModel('models/misc/smiley')
            self.model3.reparentTo(render)
            self.model3.setPos(-10.0, 50.0, 15.0)
            self.model3.setHpr(0.0, 0.0, 0.0)
            self.model3.setBin('water', 50)
            stencil = StencilAttrib.make(1, StencilAttrib.SCFEqual,
                                         StencilAttrib.SOKeep,
                                         StencilAttrib.SOKeep,
                                         StencilAttrib.SOKeep, 1, mask, mask)
            self.model.setAttrib(stencil)
            stencil = StencilAttrib.make(1, StencilAttrib.SCFEqual,
                                         StencilAttrib.SOKeep,
                                         StencilAttrib.SOKeep,
                                         StencilAttrib.SOKeep, 0, mask, mask)
            self.model3.setAttrib(stencil)

        if self.use_water_bin:
            self.patchNP.setBin('water', 10)
        else:
            self.patchNP.setBin('ground', -10)

        try:
            self.todMgr = base.cr.timeOfDayManager
        except:
            self.todMgr = None

        if self.todMgr:
            self.patchNP.setLightOff()
            self.patchNP.setLight(self.todMgr.alight)

        (seaMin, seaMax) = self.seamodel.getTightBounds()
        seaDelta = seaMax - seaMin
        cp = CollisionPolygon(Point3(-1.0, -1.0, 0), Point3(1.0, -1.0, 0),
                              Point3(1.0, 1.0, 0), Point3(-1.0, 1.0, 0))
        cNode = CollisionNode('seaCollision')
        cNode.setCollideMask(PiratesGlobals.TargetBitmask)
        cNode.addSolid(cp)
        cNodePath = self.parentNP.attachNewNode(cNode)
        cNodePath.reparentTo(self.seamodel)
        cNodePath.setScale(Vec3(seaDelta).length())
        cNodePath.setZ(3)
        cNodePath.setTag('objType', str(PiratesGlobals.COLL_SEA))
        self.cNodePath = cNodePath
        ccPlane = CollisionPlane(Plane(Vec3(0, 0, 1), Point3(0, 0, 0)))
        ccNode = CollisionNode('seaCamCollision')
        ccNode.setCollideMask(PiratesGlobals.CameraBitmask)
        ccNode.addSolid(ccPlane)
        ccNodePath = self.parentNP.attachNewNode(ccNode)
        ccNodePath.reparentTo(self.seamodel)
        self.ccNodePath = ccNodePath
        self.enabled = False
        self.enable()
        self.setting_0()
        if input_water_color:
            self.water_r = input_water_color[0]
            self.water_g = input_water_color[1]
            self.water_b = input_water_color[2]
            self.water_a = input_water_color[3]
        else:
            self.water_r = 33
            self.water_g = 43
            self.water_b = 38
            self.water_a = 255
        self.set_water_color()
        self.reflection_factor = 0.34000000000000002
        self.set_reflection_parameters_np()
        if self.use_alpha_map:
            if self.enable_alpha_map:
                self.patchNP.setTransparency(1)

        if self.water_panel != None:
            self.water_panel.setSeaPatch(self)

        if input_shader_file_path == None:
            shader_file_path = 'models/swamps/swamp002_2X.cg'
        else:
            shader_file_path = input_shader_file_path
        if base.config.GetBool(
                'want-shaders',
                1) and base.win and base.win.getGsg() and base.win.getGsg(
                ).getShaderModel() >= GraphicsStateGuardian.SM20:
            self.shader = loader.loadShader(shader_file_path)
            if self.shader != None:
                self.seamodel.setShader(self.shader)
                self.seamodel.setFogOff()
                self.setting_0()
                if input_water_color:
                    self.water_r = input_water_color[0]
                    self.water_g = input_water_color[1]
                    self.water_b = input_water_color[2]
                    self.water_a = input_water_color[3]
                else:
                    self.water_r = 33
                    self.water_g = 43
                    self.water_b = 38
                    self.water_a = 255
                self.set_water_color()
                self.reflection_factor = 0.34000000000000002
                self.set_reflection_parameters_np()
                if self.use_alpha_map:
                    self.patchNP.setTransparency(1)

                self.texture_extension = '.jpg'
                default_water_color_texture_filename = 'maps/ocean_color_1' + self.texture_extension
                default_water_alpha_texture_filename = 'maps/default_inv_alpha' + self.texture_extension
                if swamp_model_file_path:
                    if False:
                        self.base_texture = loader.loadTexture(
                            'maps/oceanWater2' + self.texture_extension)
                        self.texture_d = self.base_texture.loadRelated(
                            InternalName.make('-d'))
                        self.texture_n = self.base_texture.loadRelated(
                            InternalName.make('-n'))
                        self.texture_bb = self.base_texture.loadRelated(
                            InternalName.make('-bb'))
                    else:
                        swamp_texture = self.seamodel.findTexture('*')
                        self.set_water_color_texture(
                            default_water_color_texture_filename, True,
                            swamp_texture)
                        if False:
                            card_x_size = 0.5
                            card_y_size = 0.5
                            card = CardMaker('test_texture_card')
                            card.setFrame(-card_x_size, card_x_size,
                                          -card_y_size, card_y_size)
                            card_node_path = NodePath(card.generate())
                            card_node_path.setTexture(swamp_texture, 1)
                            card_node_path.node().setBounds(
                                OmniBoundingVolume())
                            card_node_path.node().setFinal(1)
                            card_node_path.reparentTo(render2d)

                        self.texture_d = loader.loadTexture(
                            'maps/oceanWater2-d' + self.texture_extension)
                        self.texture_n = loader.loadTexture(
                            'maps/oceanWater2-n' + self.texture_extension)
                        self.texture_bb = loader.loadTexture(
                            'maps/oceanWater2-bb' + self.texture_extension)
                        self.texture_low2 = loader.loadTexture(
                            'maps/oceanWater2-low2' + self.texture_extension)
                        self.seamodel.setShaderInput('d', self.texture_d)
                        self.seamodel.setShaderInput('n', self.texture_n)
                        self.seamodel.setShaderInput('bb', self.texture_bb)
                        self.seamodel.setShaderInput('low2', self.texture_low2)
                    self.set_water_alpha_texture(
                        default_water_alpha_texture_filename)
                else:
                    self.texture_d = loader.loadTexture('maps/oceanWater2-d' +
                                                        self.texture_extension)
                    self.texture_n = loader.loadTexture('maps/oceanWater2-n' +
                                                        self.texture_extension)
                    self.texture_bb = loader.loadTexture(
                        'maps/oceanWater2-bb' + self.texture_extension)
                    self.texture_low2 = loader.loadTexture(
                        'maps/oceanWater2-low2' + self.texture_extension)
                    self.seamodel.setShaderInput('d', self.texture_d)
                    self.seamodel.setShaderInput('n', self.texture_n)
                    self.seamodel.setShaderInput('bb', self.texture_bb)
                    self.seamodel.setShaderInput('low2', self.texture_low2)
                    self.set_water_color_texture(
                        default_water_color_texture_filename)
                    self.set_water_alpha_texture(
                        default_water_alpha_texture_filename)
                if self.enable_water_panel:
                    self.water_panel.set_texture(
                        default_water_color_texture_filename)
                    self.water_panel.set_shader(shader_file_path)

        buffer_width = 512
        buffer_height = 512
        if True:
            if reflection:
                self.reflection = reflection
            else:
                self.reflection = Reflection(
                    'swamp', buffer_width, buffer_height, render,
                    Plane(Vec3(0, 0, 1), Point3(0, 0, 0)))
            if self.reflection_enabled():
                self.reflection_on()
            else:
                self.reflection_off()
            self.seamodel.setShaderInput('reflectiontexture',
                                         self.reflection.reflection_texture)
            OTPRender.renderReflection(False, self.patchNP, 'p_swamp_water',
                                       None)
        else:
            self.reflection_factor = 0.0
            self.set_reflection_parameters()
        if not self.shader:
            if True:
                self.reflection.createCard('water', 6)

            self.setting_0()
            self.reflection_factor = 0.34000000000000002
            self.set_reflection_parameters_np()

        self.create_interface()
예제 #12
0
 def initializeIslandWaterParameters(self, reference):
     debug = False
     island_water_parameters = IslandWaterParameters()
     world_position = self.getPos(render)
     world_x_offset = world_position[0]
     world_y_offset = world_position[1]
     world_z_offset = world_position[2]
     if debug:
         print self, '=', self.getName()
         print 'GAME AREA X OFF, Y OFF, Z OFF = ', world_x_offset, world_y_offset, world_z_offset
     
     self.swampAreaNode = reference.find('**/ocean')
     model = reference.find('**/water_color')
     if model:
         if debug:
             print 'WATER COLOR X OFF, Y OFF, Z OFF = ', world_x_offset, world_y_offset, world_z_offset
         
         model.hide()
         min_point = Point3(0)
         max_point = Point3(0)
         model.calcTightBounds(min_point, max_point)
         size = max_point - min_point
         if self.getH() == 180 or self.getH() == -180:
             x = -min_point[0] + world_x_offset
             y = -min_point[1] + world_y_offset
             x_size = -size[0]
             y_size = -size[1]
         else:
             x = min_point[0] + world_x_offset
             y = min_point[1] + world_y_offset
             x_size = size[0]
             y_size = size[1]
         island_water_parameters.map_x_origin = x
         island_water_parameters.map_y_origin = y
         island_water_parameters.map_x_scale = x_size
         island_water_parameters.map_y_scale = y_size
         if debug:
             print 'X, Y, X SIZE, Y SIZE = ', min_point[0], min_point[1], x_size, y_size
         
         texture = model.findTexture('*')
         if texture:
             island_water_parameters.water_color_texture = texture
             if debug:
                 print 'WATER COLOR TEXTURE', texture
             
         
     elif debug:
         print '*** water_color NODE NOT FOUND'
     
     model = reference.find('**/water_alpha')
     if model:
         if debug:
             print 'WATER ALPHA X OFF, Y OFF, Z OFF = ', world_x_offset, world_y_offset, world_z_offset
         
         model.hide()
         min_point = Point3(0)
         max_point = Point3(0)
         model.calcTightBounds(min_point, max_point)
         size = max_point - min_point
         if self.getH() == 180 or self.getH() == -180:
             x = -min_point[0] + world_x_offset
             y = -min_point[1] + world_y_offset
             x_size = -size[0]
             y_size = -size[1]
         else:
             x = min_point[0] + world_x_offset
             y = min_point[1] + world_y_offset
             x_size = size[0]
             y_size = size[1]
         island_water_parameters.alpha_map_x_origin = x
         island_water_parameters.alpha_map_y_origin = y
         island_water_parameters.alpha_map_x_scale = x_size
         island_water_parameters.alpha_map_y_scale = y_size
         if debug:
             print 'ALPHA X, Y, X SIZE, Y SIZE = ', min_point[0], min_point[1], x_size, y_size
         
         texture = model.findTexture('*')
         if texture:
             island_water_parameters.water_alpha_texture = texture
             if debug:
                 print 'WATER ALPHA TEXTURE', texture
             
         
     elif debug:
         print '*** water_alpha NODE NOT FOUND'
     
     use_shader = False
     if base.config.GetBool('want-shaders', 1) and base.win and base.win.getGsg() and base.win.getGsg().getShaderModel() >= GraphicsStateGuardian.SM20:
         use_shader = True
     
     model_ns = reference.find('**/water_swamp_ns')
     if model_ns:
         if use_shader:
             model_ns.hide()
         else:
             model_ns.show()
             model = model_ns
             model.setBin('water', 1)
             parent = model.getParent()
             model.detachNode()
             stencil_one_node_path = NodePath('stencil_one')
             stencil_one_node_path.reparentTo(parent)
             model.instanceTo(stencil_one_node_path)
             mask = 0xFFFFFFFFL
             stencil_one = StencilAttrib.make(1, StencilAttrib.SCFEqual, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOKeep, 1, mask, mask)
             stencil_one_node_path.setAttrib(stencil_one, 100)
             stencil_one_node_path.setDepthTest(0)
             if not base.useStencils:
                 stencil_one_node_path.hide()
             
     
     model_alpha_texture = None
     model_alpha = reference.find('**/water_alpha_swamp')
     if model_alpha:
         model_alpha_texture = model_alpha.findTexture('*')
         model_alpha.hide()
         if debug:
             print 'model_alpha_texture', model_alpha_texture
         
         if False:
             texture = model_alpha_texture
             card_x_size = 0.5
             card_y_size = 0.5
             card = CardMaker('test_texture_card')
             card.setFrame(-card_x_size, card_x_size, -card_y_size, card_y_size)
             card_node_path = NodePath(card.generate())
             card_node_path.setTexture(texture, 1)
             card_node_path.node().setBounds(OmniBoundingVolume())
             card_node_path.node().setFinal(1)
             card_node_path.reparentTo(render2d)
         
     else:
         model_alpha = None
     model = reference.find('**/water_color_swamp')
     if model:
         if use_shader:
             model.show()
             model_texture = model.findTexture('*')
             if debug:
                 print 'WATER COLOR SWAMP X OFF, Y OFF, Z OFF = ', world_x_offset, world_y_offset, world_z_offset
             
             parent = model.getParent()
             model.detachNode()
             stencil_one_node_path = NodePath('stencil_one')
             stencil_one_node_path.reparentTo(parent)
             model.instanceTo(stencil_one_node_path)
             mask = 0xFFFFFFFFL
             stencil_one = StencilAttrib.make(1, StencilAttrib.SCFEqual, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOKeep, 1, mask, mask)
             stencil_one_node_path.setAttrib(stencil_one, 100)
             stencil_one_node_path.setDepthTest(0)
             if not base.useStencils:
                 stencil_one_node_path.hide()
             
             min_point = Point3(0)
             max_point = Point3(0)
             model.calcTightBounds(min_point, max_point)
             size = max_point - min_point
             if self.getH() == 180 or self.getH() == -180:
                 x = -min_point[0] + world_x_offset
                 y = -min_point[1] + world_y_offset
                 x_size = -size[0]
                 y_size = -size[1]
             else:
                 x = min_point[0] + world_x_offset
                 y = min_point[1] + world_y_offset
                 x_size = size[0]
                 y_size = size[1]
             if debug:
                 print 'min_point', min_point
                 print 'max_point', max_point
                 print 'size', size
                 print 'x y', x, y
             
             island_water_parameters.swamp_map_x_origin = x
             island_water_parameters.swamp_map_y_origin = y
             island_water_parameters.swamp_map_x_scale = x_size
             island_water_parameters.swamp_map_y_scale = y_size
             if debug:
                 print 'X, Y, X SIZE, Y SIZE = ', min_point[0], min_point[1], x_size, y_size
             
             texture = model.findTexture('*')
             if texture:
                 island_water_parameters.swamp_water_color_texture = texture
                 if debug:
                     print 'SWAMP WATER COLOR TEXTURE', texture
                 
             
             water_color_file_path = island_water_parameters.default_water_color_file_path
             alpha_texture_file_path = island_water_parameters.default_water_alpha_file_path
             opacity_texture_file_path = None
             shader_file_path = 'models/swamps/cuba_swamp001_2X.cg'
             reflection = Reflection.getGlobalReflection()
             self.swamp_water = Swamp(None, None, reflection, model, shader_file_path)
             island_water_parameters.swamp_water = self.swamp_water
             unload_previous_texture = True
             self.swamp_water.set_water_color_texture(water_color_file_path, unload_previous_texture, model_texture)
             self.swamp_water.set_water_alpha_texture(alpha_texture_file_path, unload_previous_texture, model_alpha_texture)
             self.swamp_water.set_wrap_or_clamp(True)
             r = 37.0
             g = 62.0
             b = 40.0
             self.swamp_water.water_r = r
             self.swamp_water.water_g = g
             self.swamp_water.water_b = b
             island_water_parameters.swamp_color_r = r
             island_water_parameters.swamp_color_g = g
             island_water_parameters.swamp_color_b = b
             x = 0.0
             y = 1.0
             speed = 3.2000000000000002
             island_water_parameters.swamp_direction_x = x
             island_water_parameters.swamp_direction_y = y
             island_water_parameters.swamp_speed = speed
             self.swamp_water.update_water_direction_and_speed(x, y, speed)
         else:
             model.hide()
     elif debug:
         print '*** water_color_swamp NODE NOT FOUND'
     
     self.islandWaterParameters = island_water_parameters
 def initializeIslandWaterParameters(self, reference):
     debug = False
     island_water_parameters = IslandWaterParameters()
     world_position = self.getPos(render)
     world_x_offset = world_position[0]
     world_y_offset = world_position[1]
     world_z_offset = world_position[2]
     if debug:
         print self, '=', self.getName()
         print 'GAME AREA X OFF, Y OFF, Z OFF = ', world_x_offset, world_y_offset, world_z_offset
     self.swampAreaNode = reference.find('**/ocean')
     model = reference.find('**/water_color')
     if model:
         if debug:
             print 'WATER COLOR X OFF, Y OFF, Z OFF = ', world_x_offset, world_y_offset, world_z_offset
         model.hide()
         min_point = Point3(0)
         max_point = Point3(0)
         model.calcTightBounds(min_point, max_point)
         size = max_point - min_point
         if self.getH() == 180 or self.getH() == -180:
             x = -min_point[0] + world_x_offset
             y = -min_point[1] + world_y_offset
             x_size = -size[0]
             y_size = -size[1]
         else:
             x = min_point[0] + world_x_offset
             y = min_point[1] + world_y_offset
             x_size = size[0]
             y_size = size[1]
         island_water_parameters.map_x_origin = x
         island_water_parameters.map_y_origin = y
         island_water_parameters.map_x_scale = x_size
         island_water_parameters.map_y_scale = y_size
         if debug:
             print 'X, Y, X SIZE, Y SIZE = ', min_point[0], min_point[
                 1], x_size, y_size
         texture = model.findTexture('*')
         if texture:
             island_water_parameters.water_color_texture = texture
             if debug:
                 print 'WATER COLOR TEXTURE', texture
     elif debug:
         print '*** water_color NODE NOT FOUND'
     model = reference.find('**/water_alpha')
     if model:
         if debug:
             print 'WATER ALPHA X OFF, Y OFF, Z OFF = ', world_x_offset, world_y_offset, world_z_offset
         model.hide()
         min_point = Point3(0)
         max_point = Point3(0)
         model.calcTightBounds(min_point, max_point)
         size = max_point - min_point
         if self.getH() == 180 or self.getH() == -180:
             x = -min_point[0] + world_x_offset
             y = -min_point[1] + world_y_offset
             x_size = -size[0]
             y_size = -size[1]
         else:
             x = min_point[0] + world_x_offset
             y = min_point[1] + world_y_offset
             x_size = size[0]
             y_size = size[1]
         island_water_parameters.alpha_map_x_origin = x
         island_water_parameters.alpha_map_y_origin = y
         island_water_parameters.alpha_map_x_scale = x_size
         island_water_parameters.alpha_map_y_scale = y_size
         if debug:
             print 'ALPHA X, Y, X SIZE, Y SIZE = ', min_point[0], min_point[
                 1], x_size, y_size
         texture = model.findTexture('*')
         if texture:
             island_water_parameters.water_alpha_texture = texture
             if debug:
                 print 'WATER ALPHA TEXTURE', texture
     elif debug:
         print '*** water_alpha NODE NOT FOUND'
     use_shader = False
     if base.config.GetBool(
             'want-shaders',
             1) and base.win and base.win.getGsg() and base.win.getGsg(
             ).getShaderModel() >= GraphicsStateGuardian.SM20:
         use_shader = True
     model_ns = reference.find('**/water_swamp_ns')
     if model_ns:
         if use_shader:
             model_ns.hide()
         else:
             model_ns.show()
             model = model_ns
             model.setBin('water', 1)
             parent = model.getParent()
             model.detachNode()
             stencil_one_node_path = NodePath('stencil_one')
             stencil_one_node_path.reparentTo(parent)
             model.instanceTo(stencil_one_node_path)
             mask = 4294967295L
             stencil_one = StencilAttrib.make(1, StencilAttrib.SCFEqual,
                                              StencilAttrib.SOKeep,
                                              StencilAttrib.SOKeep,
                                              StencilAttrib.SOKeep, 1, mask,
                                              mask)
             stencil_one_node_path.setAttrib(stencil_one, 100)
             stencil_one_node_path.setDepthTest(0)
             if not base.useStencils:
                 stencil_one_node_path.hide()
     model_alpha_texture = None
     model_alpha = reference.find('**/water_alpha_swamp')
     if model_alpha:
         model_alpha_texture = model_alpha.findTexture('*')
         model_alpha.hide()
         if debug:
             print 'model_alpha_texture', model_alpha_texture
         if False:
             texture = model_alpha_texture
             card_x_size = 0.5
             card_y_size = 0.5
             card = CardMaker('test_texture_card')
             card.setFrame(-card_x_size, card_x_size, -card_y_size,
                           card_y_size)
             card_node_path = NodePath(card.generate())
             card_node_path.setTexture(texture, 1)
             card_node_path.node().setBounds(OmniBoundingVolume())
             card_node_path.node().setFinal(1)
             card_node_path.reparentTo(render2d)
     else:
         model_alpha = None
     model = reference.find('**/water_color_swamp')
     if model:
         if use_shader:
             model.show()
             model_texture = model.findTexture('*')
             if debug:
                 print 'WATER COLOR SWAMP X OFF, Y OFF, Z OFF = ', world_x_offset, world_y_offset, world_z_offset
             parent = model.getParent()
             model.detachNode()
             stencil_one_node_path = NodePath('stencil_one')
             stencil_one_node_path.reparentTo(parent)
             model.instanceTo(stencil_one_node_path)
             mask = 4294967295L
             stencil_one = StencilAttrib.make(1, StencilAttrib.SCFEqual,
                                              StencilAttrib.SOKeep,
                                              StencilAttrib.SOKeep,
                                              StencilAttrib.SOKeep, 1, mask,
                                              mask)
             stencil_one_node_path.setAttrib(stencil_one, 100)
             stencil_one_node_path.setDepthTest(0)
             if not base.useStencils:
                 stencil_one_node_path.hide()
             min_point = Point3(0)
             max_point = Point3(0)
             model.calcTightBounds(min_point, max_point)
             size = max_point - min_point
             if self.getH() == 180 or self.getH() == -180:
                 x = -min_point[0] + world_x_offset
                 y = -min_point[1] + world_y_offset
                 x_size = -size[0]
                 y_size = -size[1]
             else:
                 x = min_point[0] + world_x_offset
                 y = min_point[1] + world_y_offset
                 x_size = size[0]
                 y_size = size[1]
             if debug:
                 print 'min_point', min_point
                 print 'max_point', max_point
                 print 'size', size
                 print 'x y', x, y
             island_water_parameters.swamp_map_x_origin = x
             island_water_parameters.swamp_map_y_origin = y
             island_water_parameters.swamp_map_x_scale = x_size
             island_water_parameters.swamp_map_y_scale = y_size
             if debug:
                 print 'X, Y, X SIZE, Y SIZE = ', min_point[0], min_point[
                     1], x_size, y_size
             texture = model.findTexture('*')
             if texture:
                 island_water_parameters.swamp_water_color_texture = texture
                 if debug:
                     print 'SWAMP WATER COLOR TEXTURE', texture
             water_color_file_path = island_water_parameters.default_water_color_file_path
             alpha_texture_file_path = island_water_parameters.default_water_alpha_file_path
             opacity_texture_file_path = None
             shader_file_path = 'models/swamps/cuba_swamp001_2X.cg'
             reflection = Reflection.getGlobalReflection()
             self.swamp_water = Swamp(None, None, reflection, model,
                                      shader_file_path)
             island_water_parameters.swamp_water = self.swamp_water
             unload_previous_texture = True
             self.swamp_water.set_water_color_texture(
                 water_color_file_path, unload_previous_texture,
                 model_texture)
             self.swamp_water.set_water_alpha_texture(
                 alpha_texture_file_path, unload_previous_texture,
                 model_alpha_texture)
             self.swamp_water.set_wrap_or_clamp(True)
             r = 37.0
             g = 62.0
             b = 40.0
             self.swamp_water.water_r = r
             self.swamp_water.water_g = g
             self.swamp_water.water_b = b
             island_water_parameters.swamp_color_r = r
             island_water_parameters.swamp_color_g = g
             island_water_parameters.swamp_color_b = b
             x = 0.0
             y = 1.0
             speed = 3.2
             island_water_parameters.swamp_direction_x = x
             island_water_parameters.swamp_direction_y = y
             island_water_parameters.swamp_speed = speed
             self.swamp_water.update_water_direction_and_speed(x, y, speed)
         else:
             model.hide()
     elif debug:
         print '*** water_color_swamp NODE NOT FOUND'
     self.islandWaterParameters = island_water_parameters
     return
    def startCustomEffects(self, interior=True, loadIslandMusic=False):
        if self.envEffects:
            self.envEffects.delete()
            self.envEffects = None
        if self.environment == 'Swamp':
            self.envEffects = SwampEffects.SwampEffects(self, self.modelPath)
            base.musicMgr.requestCurMusicFadeOut(removeFromPlaylist=False)
            base.musicMgr.request(SoundGlobals.MUSIC_SWAMP,
                                  priority=1,
                                  volume=0.6)
        elif self.environment == 'Jungle':
            self.envEffects = ForestEffects.ForestEffects(self, self.modelPath)
            base.musicMgr.requestCurMusicFadeOut(removeFromPlaylist=False)
            base.musicMgr.request(SoundGlobals.MUSIC_JUNGLE,
                                  priority=1,
                                  volume=0.6)
        elif self.environment == 'Cave':
            self.envEffects = CaveEffects.CaveEffects(self, self.modelPath)
            base.musicMgr.requestCurMusicFadeOut(removeFromPlaylist=False)
            if self.uniqueId == LocationIds.RAVENS_COVE_MINE:
                base.musicMgr.request(SoundGlobals.getMainMusic(self.uniqueId),
                                      priority=1,
                                      volume=0.6)
            else:
                base.musicMgr.request(SoundGlobals.MUSIC_CAVE,
                                      priority=1,
                                      volume=0.6)
        elif self.uniqueId in ('1189479168.0sdnaik0', '1150922126.8akelts'):
            r = Reflection.getGlobalReflection()
            water = SeaPatch(self, reflection=r)
            water.loadSeaPatchFile('out.spf')
            self.water = water
            self.initializeIslandWaterParameters(self.geom)
        else:
            self.envEffects = EnvironmentEffects(self, self.modelPath)
            if interior:
                pass
        if loadIslandMusic:
            if not base.localAvatar.isInInvasion():
                base.musicMgr.requestFadeOut(SoundGlobals.MUSIC_TORMENTA)
                base.musicMgr.requestFadeOut(
                    SoundGlobals.MUSIC_TORMENTA_COMBAT)

            def getCurrentIslandMusic():
                priZeros = []
                for music in base.musicMgr.playlist:
                    if music.priority == 0:
                        priZeros.append(music)

                return priZeros

            def changeMusic(music, pri):
                for priZero in getCurrentIslandMusic():
                    base.musicMgr.requestFadeOut(priZero.name,
                                                 removeFromPlaylist=True)

                base.musicMgr.request(music, priority=0, volume=0.6)

            mainMusic = SoundGlobals.getMainMusic(self.uniqueId)
            altMusic = SoundGlobals.getAltMusic(self.uniqueId)
            if mainMusic and altMusic:
                base.musicMgr.requestCurMusicFadeOut(removeFromPlaylist=True)
                todMgr = base.cr.timeOfDayManager
                todMgr.addTimeOfDayToggle('Day-Night Area Music', 6.0, 20.0,
                                          changeMusic, [mainMusic, 0],
                                          changeMusic, [altMusic, 0])
            elif mainMusic:
                base.musicMgr.requestCurMusicFadeOut(removeFromPlaylist=True)
                base.musicMgr.request(mainMusic, volume=0.6)
            elif altMusic:
                base.musicMgr.requestCurMusicFadeOut(removeFromPlaylist=True)
                base.musicMgr.request(altMusic, volume=0.6)
        self.builder.initEffects()
        return
예제 #15
0
 def setupWater(self):
     r = Reflection.getGlobalReflection()
     water = SeaPatch(self, reflection=r)
     water.loadSeaPatchFile('out.spf')
     self.water = water
예제 #16
0
    def startCustomEffects(self, interior = True, loadIslandMusic = False):
        if self.envEffects:
            self.envEffects.delete()
            self.envEffects = None
        
        if self.environment == 'Swamp':
            self.envEffects = SwampEffects.SwampEffects(self, self.modelPath)
            base.musicMgr.requestCurMusicFadeOut(removeFromPlaylist = False)
            base.musicMgr.request(SoundGlobals.MUSIC_SWAMP, priority = 1, volume = 0.59999999999999998)
        elif self.environment == 'Jungle':
            self.envEffects = ForestEffects.ForestEffects(self, self.modelPath)
            base.musicMgr.requestCurMusicFadeOut(removeFromPlaylist = False)
            base.musicMgr.request(SoundGlobals.MUSIC_JUNGLE, priority = 1, volume = 0.59999999999999998)
        elif self.environment == 'Cave':
            self.envEffects = CaveEffects.CaveEffects(self, self.modelPath)
            base.musicMgr.requestCurMusicFadeOut(removeFromPlaylist = False)
            if self.uniqueId == LocationIds.RAVENS_COVE_MINE:
                base.musicMgr.request(SoundGlobals.getMainMusic(self.uniqueId), priority = 1, volume = 0.59999999999999998)
            else:
                base.musicMgr.request(SoundGlobals.MUSIC_CAVE, priority = 1, volume = 0.59999999999999998)
        elif self.uniqueId in ('1189479168.0sdnaik0', '1150922126.8akelts'):
            r = Reflection.getGlobalReflection()
            water = SeaPatch(self, reflection = r)
            water.loadSeaPatchFile('out.spf')
            self.water = water
            self.initializeIslandWaterParameters(self.geom)
        else:
            self.envEffects = EnvironmentEffects(self, self.modelPath)
            if interior:
                pass
            
        if loadIslandMusic:
            if not base.localAvatar.isInInvasion():
                base.musicMgr.requestFadeOut(SoundGlobals.MUSIC_TORMENTA)
                base.musicMgr.requestFadeOut(SoundGlobals.MUSIC_TORMENTA_COMBAT)
            
            
            def getCurrentIslandMusic():
                priZeros = []
                for music in base.musicMgr.playlist:
                    if music.priority == 0:
                        priZeros.append(music)
                        continue
                
                return priZeros

            
            def changeMusic(music, pri):
                for priZero in getCurrentIslandMusic():
                    base.musicMgr.requestFadeOut(priZero.name, removeFromPlaylist = True)
                
                base.musicMgr.request(music, priority = 0, volume = 0.59999999999999998)

            mainMusic = SoundGlobals.getMainMusic(self.uniqueId)
            altMusic = SoundGlobals.getAltMusic(self.uniqueId)
            if mainMusic and altMusic:
                base.musicMgr.requestCurMusicFadeOut(removeFromPlaylist = True)
                todMgr = base.cr.timeOfDayManager
                todMgr.addTimeOfDayToggle('Day-Night Area Music', 6.0, 20.0, changeMusic, [
                    mainMusic,
                    0], changeMusic, [
                    altMusic,
                    0])
            elif mainMusic:
                base.musicMgr.requestCurMusicFadeOut(removeFromPlaylist = True)
                base.musicMgr.request(mainMusic, volume = 0.59999999999999998)
            elif altMusic:
                base.musicMgr.requestCurMusicFadeOut(removeFromPlaylist = True)
                base.musicMgr.request(altMusic, volume = 0.59999999999999998)
            
        
        self.builder.initEffects()
예제 #17
0
파일: Swamp.py 프로젝트: TTGhost/POTCOR-src
    def __init__(self, swamp_model_file_path, parentNP = render, reflection = None, input_swamp_model = None, input_shader_file_path = None, input_water_color = None):
        if input_swamp_model:
            swamp_name = 'Swamp I'
        else:
            swamp_name = 'Swamp'
        Water.__init__(self, swamp_name)
        self.parentNP = parentNP
        self.swamp_model = input_swamp_model
        if input_swamp_model:
            self.seamodel = input_swamp_model
            self.parentNP = input_swamp_model.getParent()
            self.patchNP = NodePath(self.seamodel)
        elif swamp_model_file_path:
            self.seamodel = loader.loadModel(swamp_model_file_path)
        else:
            self.swampmodel = loader.loadModel('models/swamp/SwampA')
            self.swampmodel.reparentTo(self.parentNP)
            self.swampmodel.setPos(0.0, 0.0, -1.0)
            self.seamodel = loader.loadModel('models/swamp/swampA_water')
        self.patchNP = NodePath(self.seamodel)
        self.patchNP.reparentTo(self.parentNP)
        self.hidden = False
        mask = 0xFFFFFFFFL
        if self.use_water_bin:
            self.seamodel.setBin('water', 1)
            stencil = StencilAttrib.make(1, StencilAttrib.SCFAlways, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOReplace, 1, mask, mask)
            self.seamodel.setAttrib(stencil)
        else:
            self.seamodel.setBin('background', 200)
        self.reflectStage = None
        if False:
            self.model = loader.loadModel('models/misc/smiley')
            self.model.reparentTo(render)
            self.model.setPos(0.0, 50.0, 10.0)
            self.model.setHpr(0.0, 180.0, 0.0)
            self.model.setBin('water', 100)
            self.model2 = loader.loadModel('models/misc/smiley')
            self.model2.reparentTo(render)
            self.model2.setPos(10.0, 50.0, 15.0)
            self.model2.setHpr(180.0, 0.0, 0.0)
            self.model2.setBin('water', 50)
            self.model3 = loader.loadModel('models/misc/smiley')
            self.model3.reparentTo(render)
            self.model3.setPos(-10.0, 50.0, 15.0)
            self.model3.setHpr(0.0, 0.0, 0.0)
            self.model3.setBin('water', 50)
            stencil = StencilAttrib.make(1, StencilAttrib.SCFEqual, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOKeep, 1, mask, mask)
            self.model.setAttrib(stencil)
            stencil = StencilAttrib.make(1, StencilAttrib.SCFEqual, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOKeep, 0, mask, mask)
            self.model3.setAttrib(stencil)
        
        if self.use_water_bin:
            self.patchNP.setBin('water', 10)
        else:
            self.patchNP.setBin('ground', -10)
        
        try:
            self.todMgr = base.cr.timeOfDayManager
        except:
            self.todMgr = None

        if self.todMgr:
            self.patchNP.setLightOff()
            self.patchNP.setLight(self.todMgr.alight)
        
        (seaMin, seaMax) = self.seamodel.getTightBounds()
        seaDelta = seaMax - seaMin
        cp = CollisionPolygon(Point3(-1.0, -1.0, 0), Point3(1.0, -1.0, 0), Point3(1.0, 1.0, 0), Point3(-1.0, 1.0, 0))
        cNode = CollisionNode('seaCollision')
        cNode.setCollideMask(PiratesGlobals.TargetBitmask)
        cNode.addSolid(cp)
        cNodePath = self.parentNP.attachNewNode(cNode)
        cNodePath.reparentTo(self.seamodel)
        cNodePath.setScale(Vec3(seaDelta).length())
        cNodePath.setZ(3)
        cNodePath.setTag('objType', str(PiratesGlobals.COLL_SEA))
        self.cNodePath = cNodePath
        ccPlane = CollisionPlane(Plane(Vec3(0, 0, 1), Point3(0, 0, 0)))
        ccNode = CollisionNode('seaCamCollision')
        ccNode.setCollideMask(PiratesGlobals.CameraBitmask)
        ccNode.addSolid(ccPlane)
        ccNodePath = self.parentNP.attachNewNode(ccNode)
        ccNodePath.reparentTo(self.seamodel)
        self.ccNodePath = ccNodePath
        self.enabled = False
        self.enable()
        self.setting_0()
        if input_water_color:
            self.water_r = input_water_color[0]
            self.water_g = input_water_color[1]
            self.water_b = input_water_color[2]
            self.water_a = input_water_color[3]
        else:
            self.water_r = 33
            self.water_g = 43
            self.water_b = 38
            self.water_a = 255
        self.set_water_color()
        self.reflection_factor = 0.34000000000000002
        self.set_reflection_parameters_np()
        if self.use_alpha_map:
            if self.enable_alpha_map:
                self.patchNP.setTransparency(1)
            
        
        if self.water_panel != None:
            self.water_panel.setSeaPatch(self)
        
        if input_shader_file_path == None:
            shader_file_path = 'models/swamps/swamp002_2X.cg'
        else:
            shader_file_path = input_shader_file_path
        if base.config.GetBool('want-shaders', 1) and base.win and base.win.getGsg() and base.win.getGsg().getShaderModel() >= GraphicsStateGuardian.SM20:
            self.shader = loader.loadShader(shader_file_path)
            if self.shader != None:
                self.seamodel.setShader(self.shader)
                self.seamodel.setFogOff()
                self.setting_0()
                if input_water_color:
                    self.water_r = input_water_color[0]
                    self.water_g = input_water_color[1]
                    self.water_b = input_water_color[2]
                    self.water_a = input_water_color[3]
                else:
                    self.water_r = 33
                    self.water_g = 43
                    self.water_b = 38
                    self.water_a = 255
                self.set_water_color()
                self.reflection_factor = 0.34000000000000002
                self.set_reflection_parameters_np()
                if self.use_alpha_map:
                    self.patchNP.setTransparency(1)
                
                self.texture_extension = '.jpg'
                default_water_color_texture_filename = 'maps/ocean_color_1' + self.texture_extension
                default_water_alpha_texture_filename = 'maps/default_inv_alpha' + self.texture_extension
                if swamp_model_file_path:
                    if False:
                        self.base_texture = loader.loadTexture('maps/oceanWater2' + self.texture_extension)
                        self.texture_d = self.base_texture.loadRelated(InternalName.make('-d'))
                        self.texture_n = self.base_texture.loadRelated(InternalName.make('-n'))
                        self.texture_bb = self.base_texture.loadRelated(InternalName.make('-bb'))
                    else:
                        swamp_texture = self.seamodel.findTexture('*')
                        self.set_water_color_texture(default_water_color_texture_filename, True, swamp_texture)
                        if False:
                            card_x_size = 0.5
                            card_y_size = 0.5
                            card = CardMaker('test_texture_card')
                            card.setFrame(-card_x_size, card_x_size, -card_y_size, card_y_size)
                            card_node_path = NodePath(card.generate())
                            card_node_path.setTexture(swamp_texture, 1)
                            card_node_path.node().setBounds(OmniBoundingVolume())
                            card_node_path.node().setFinal(1)
                            card_node_path.reparentTo(render2d)
                        
                        self.texture_d = loader.loadTexture('maps/oceanWater2-d' + self.texture_extension)
                        self.texture_n = loader.loadTexture('maps/oceanWater2-n' + self.texture_extension)
                        self.texture_bb = loader.loadTexture('maps/oceanWater2-bb' + self.texture_extension)
                        self.texture_low2 = loader.loadTexture('maps/oceanWater2-low2' + self.texture_extension)
                        self.seamodel.setShaderInput('d', self.texture_d)
                        self.seamodel.setShaderInput('n', self.texture_n)
                        self.seamodel.setShaderInput('bb', self.texture_bb)
                        self.seamodel.setShaderInput('low2', self.texture_low2)
                    self.set_water_alpha_texture(default_water_alpha_texture_filename)
                else:
                    self.texture_d = loader.loadTexture('maps/oceanWater2-d' + self.texture_extension)
                    self.texture_n = loader.loadTexture('maps/oceanWater2-n' + self.texture_extension)
                    self.texture_bb = loader.loadTexture('maps/oceanWater2-bb' + self.texture_extension)
                    self.texture_low2 = loader.loadTexture('maps/oceanWater2-low2' + self.texture_extension)
                    self.seamodel.setShaderInput('d', self.texture_d)
                    self.seamodel.setShaderInput('n', self.texture_n)
                    self.seamodel.setShaderInput('bb', self.texture_bb)
                    self.seamodel.setShaderInput('low2', self.texture_low2)
                    self.set_water_color_texture(default_water_color_texture_filename)
                    self.set_water_alpha_texture(default_water_alpha_texture_filename)
                if self.enable_water_panel:
                    self.water_panel.set_texture(default_water_color_texture_filename)
                    self.water_panel.set_shader(shader_file_path)
                
            
        
        buffer_width = 512
        buffer_height = 512
        if True:
            if reflection:
                self.reflection = reflection
            else:
                self.reflection = Reflection('swamp', buffer_width, buffer_height, render, Plane(Vec3(0, 0, 1), Point3(0, 0, 0)))
            if self.reflection_enabled():
                self.reflection_on()
            else:
                self.reflection_off()
            self.seamodel.setShaderInput('reflectiontexture', self.reflection.reflection_texture)
            OTPRender.renderReflection(False, self.patchNP, 'p_swamp_water', None)
        else:
            self.reflection_factor = 0.0
            self.set_reflection_parameters()
        if not self.shader:
            if True:
                self.reflection.createCard('water', 6)
            
            self.setting_0()
            self.reflection_factor = 0.34000000000000002
            self.set_reflection_parameters_np()
        
        self.create_interface()
 def setupWater(self):
     r = Reflection.getGlobalReflection()
     water = SeaPatch(self, reflection = r)
     water.loadSeaPatchFile('out.spf')
     self.water = water
예제 #19
0
    def __init__(self, parentNP = render, reflection = None, todMgr = None):
        Water.__init__(self, 'Sea')
        if base.win.getFbProperties().getStencilBits() == 0:
            self.use_water_bin = False
        
        self.p3 = Point3()
        self.parentNP = parentNP
        self.followWater = base.config.GetBool('ships-follow-water', 1)
        self.damper = 0.20000000000000001 * 180.0 / math.pi
        self.floats = { }
        self.floatmasses = { }
        self.patch = SeaPatchRoot()
        self.patch.setSeaLevel(0)
        self.hidden = False
        self.usingFlatWater = False
        if base.camera:
            self.setCenter(base.camera)
            self.setAnchor(render)
        
        patchNode = SeaPatchNode('seapatch', self.patch)
        patchNode.setWantReflect(0)
        self.patchNP = NodePath(patchNode)
        self.patchNP.setColorScale(0.14999999999999999, 0.40000000000000002, 0.5, 1.0)
        self.patchNP.setTwoSided(True)
        self.patchNP.hide()
        shader_file_path = None
        if base.config.GetBool('want-shaders', 1) and base.win and base.win.getGsg() and base.win.getGsg().getShaderModel() >= GraphicsStateGuardian.SM20:
            patchNode.setWantColor(0)
            shader_directory = 'models/sea/'
            shader_file_name_array = [
                '',
                'water008_11.cg',
                'water008_20.cg',
                'water008_2X.cg']
            shader_model = base.win.getGsg().getShaderModel()
            maximum_shader_model = len(shader_file_name_array) - 1
            if shader_model > maximum_shader_model:
                shader_model = maximum_shader_model
            
            file_name = shader_file_name_array[shader_model]
            shader_file_path = shader_directory + file_name
            self.shader = loader.loadShader(shader_file_path)
            if self.shader:
                pass
            
        
        if self.shader:
            if base.win.getGsg().getShaderModel() == GraphicsStateGuardian.SM20:
                seamodel = loader.loadModel('models/sea/SeaPatch34')
            else:
                seamodel = loader.loadModel('models/sea/SeaPatch31')
            self.patch.seamodel = seamodel
            self.seamodel = self.patch.seamodel
        elif base.options.getTerrainDetailSetting() == 0:
            self.seamodel = loader.loadModel('models/sea/pir_m_are_wld_seaPatch_low')
        else:
            self.seamodel = loader.loadModel('models/sea/SeaPatch31')
        self.seamodel.setScale(2, 1, 1)
        self.seamodel.flattenMedium()
        mask = 0xFFFFFFFFL
        if self.use_water_bin:
            self.seamodel.setBin('water', 0)
            stencil = StencilAttrib.makeWithClear(1, StencilAttrib.SCFAlways, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOReplace, 1, mask, mask, 1, 0)
            self.seamodel.setAttrib(stencil)
        else:
            self.seamodel.setBin('background', 200)
        self.seamodel.hide(OTPRender.MainCameraBitmask)
        self.seamodel.showThrough(OTPRender.EnviroCameraBitmask)
        self.reflectStage = None
        if False:
            self.model = loader.loadModel('models/misc/smiley')
            self.model.reparentTo(render)
            self.model.setPos(0.0, 50.0, 10.0)
            self.model.setHpr(0.0, 180.0, 0.0)
            self.model.setBin('water', 100)
            self.model2 = loader.loadModel('models/misc/smiley')
            self.model2.reparentTo(render)
            self.model2.setPos(10.0, 50.0, 15.0)
            self.model2.setHpr(180.0, 0.0, 0.0)
            self.model2.setBin('water', 50)
            self.model3 = loader.loadModel('models/misc/smiley')
            self.model3.reparentTo(render)
            self.model3.setPos(-10.0, 50.0, 15.0)
            self.model3.setHpr(0.0, 0.0, 0.0)
            self.model3.setBin('water', 50)
            stencil = StencilAttrib.make(1, StencilAttrib.SCFEqual, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOKeep, 1, mask, mask)
            self.model.setAttrib(stencil)
            stencil = StencilAttrib.make(1, StencilAttrib.SCFEqual, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOKeep, 0, mask, mask)
            self.model3.setAttrib(stencil)
        
        self.flatSea = self.seamodel.find('**/flatsea')
        flat2 = self.flatSea.copyTo(self.flatSea)
        flat2.setScale(2, 2, 1)
        flat2.setZ(-4)
        flat4 = self.flatSea.copyTo(self.flatSea)
        flat4.setScale(4, 4, 1)
        flat4.setZ(-8)
        if not self.flatSea.isEmpty():
            self.flatSea.setTag('flat_sea', 'true')
            self.flatSea.setPos(0, 0, -1)
            if False:
                self.flatSea.setScale(1.3)
            
            if self.use_water_bin:
                self.flatSea.setDepthWrite(0)
            
        
        self.flatSea.flattenStrong()
        if self.use_water_bin:
            self.patchNP.setBin('water', 10)
        else:
            self.patchNP.setBin('ground', -10)
        self.todMgr = todMgr
        if self.getTodMgr():
            self.patchNP.setLightOff()
            self.patchNP.setLight(self.getTodMgr().alight)
        
        (seaMin, seaMax) = self.seamodel.getTightBounds()
        seaDelta = seaMax - seaMin
        cp = CollisionPolygon(Point3(-1.0, -1.0, 0), Point3(1.0, -1.0, 0), Point3(1.0, 1.0, 0), Point3(-1.0, 1.0, 0))
        cNode = CollisionNode('seaCollision')
        cNode.setCollideMask(PiratesGlobals.TargetBitmask)
        cNode.addSolid(cp)
        cNodePath = NodePath(cNode)
        cNodePath.reparentTo(self.seamodel)
        cNodePath.setScale(Vec3(seaDelta).length())
        cNodePath.setZ(-3)
        cNodePath.setTag('objType', str(PiratesGlobals.COLL_SEA))
        cNodePath.reparentTo(self.parentNP)
        self.cNodePath = cNodePath
        ccPlane = CollisionPlane(Plane(Vec3(0, 0, 1), Point3(0, 0, 0)))
        ccNode = CollisionNode('seaCamCollision')
        ccNode.setCollideMask(PiratesGlobals.CameraBitmask)
        ccNode.addSolid(ccPlane)
        ccNodePath = NodePath(ccNode)
        ccNodePath.reparentTo(self.seamodel)
        self.ccNodePath = ccNodePath
        self.seamodel.reparentTo(self.patchNP)
        self.patchNP.flattenLight()
        patchNode.collectGeometry()
        self.enabled = False
        self.enable()
        if self.use_alpha_map:
            if self.enable_alpha_map:
                self.patchNP.setTransparency(1)
                alpha_test_attrib = AlphaTestAttrib.make(RenderAttrib.MAlways, 0)
                self.patchNP.setAttrib(alpha_test_attrib, 100)
            
        
        if self.water_panel != None:
            self.water_panel.setSeaPatch(self)
        
        if self.enable_parameter_keys:
            
            def showSeaPatchPanel():
                SeaPatchPanel = SeaPatchPanel
                import pirates.seapatch
                self.spp = SeaPatchPanel.SeaPatchPanel()
                self.spp.setPatch(self)

            self.accept('shift-5', showSeaPatchPanel)
        
        self.setting_0()
        self.patchNP.setTransparency(0)
        buffer_width = 512
        buffer_height = 512
        self.texture_extension = '.jpg'
        if self.shader:
            self.seamodel.setShader(self.shader)
            self.seamodel.setFogOff()
            if self.use_alpha_map:
                self.patchNP.setTransparency(1)
            
            self.base_texture = loader.loadTexture('maps/oceanWater2' + self.texture_extension)
            self.texture_d = self.base_texture.loadRelated(InternalName.make('-d'))
            self.texture_n = self.base_texture.loadRelated(InternalName.make('-n'))
            self.texture_bb = self.base_texture.loadRelated(InternalName.make('-bb'))
            self.setting_0()
            self.water_r = 77
            self.water_g = 128
            self.water_b = 179
            self.water_a = 255
            self.set_water_color()
            default_water_color_texture_filename = 'maps/ocean_color_1' + self.texture_extension
            default_water_alpha_texture_filename = 'maps/default_inv_alpha' + self.texture_extension
            self.set_water_color_texture(default_water_color_texture_filename)
            self.set_water_alpha_texture(default_water_alpha_texture_filename)
            if self.enable_water_panel:
                self.water_panel.set_texture(default_water_color_texture_filename)
                self.water_panel.set_shader(shader_file_path)
            
        
        if True:
            if reflection:
                self.reflection = reflection
            else:
                self.reflection = Reflection('seapatch', buffer_width, buffer_height, render, Plane(Vec3(0, 0, 1), Point3(0, 0, 0)))
            if self.reflection_enabled():
                self.reflection_on()
            else:
                self.reflection_off()
            self.reflection.reflectShowThroughOnly(self.reflect_show_through_only)
            self.seamodel.setShaderInput(self.reflectiontexture_name, self.reflection.reflection_texture)
            OTPRender.renderReflection(False, self.patchNP, 'p_ocean_water', None)
        else:
            self.reflection_factor = 0.0
            self.set_reflection_parameters_np()
        if not self.shader:
            self.accept('timeOfDayChange', self._timeChange)
            if self.reflection:
                self.reflection.createCard('water', 6)
            
            self.setting_0()
            self.reflection_factor = 0.20000000000000001
            self.set_reflection_parameters_np()
            if False:
                default_water_color_texture_filename = 'maps/ocean_color_1' + self.texture_extension
                self.set_water_color_texture(default_water_color_texture_filename)
                self.setup_color_map()
            
        
        self.create_interface()
        self.patchNP.reparentTo(self.parentNP)
        self.accept('grid-detail-changed', self.updateWater)
예제 #20
0
class SeaPatch(Water):
    notify = directNotify.newCategory('SeaPatch')
    
    def __init__(self, parentNP = render, reflection = None, todMgr = None):
        Water.__init__(self, 'Sea')
        if base.win.getFbProperties().getStencilBits() == 0:
            self.use_water_bin = False
        
        self.p3 = Point3()
        self.parentNP = parentNP
        self.followWater = base.config.GetBool('ships-follow-water', 1)
        self.damper = 0.20000000000000001 * 180.0 / math.pi
        self.floats = { }
        self.floatmasses = { }
        self.patch = SeaPatchRoot()
        self.patch.setSeaLevel(0)
        self.hidden = False
        self.usingFlatWater = False
        if base.camera:
            self.setCenter(base.camera)
            self.setAnchor(render)
        
        patchNode = SeaPatchNode('seapatch', self.patch)
        patchNode.setWantReflect(0)
        self.patchNP = NodePath(patchNode)
        self.patchNP.setColorScale(0.14999999999999999, 0.40000000000000002, 0.5, 1.0)
        self.patchNP.setTwoSided(True)
        self.patchNP.hide()
        shader_file_path = None
        if base.config.GetBool('want-shaders', 1) and base.win and base.win.getGsg() and base.win.getGsg().getShaderModel() >= GraphicsStateGuardian.SM20:
            patchNode.setWantColor(0)
            shader_directory = 'models/sea/'
            shader_file_name_array = [
                '',
                'water008_11.cg',
                'water008_20.cg',
                'water008_2X.cg']
            shader_model = base.win.getGsg().getShaderModel()
            maximum_shader_model = len(shader_file_name_array) - 1
            if shader_model > maximum_shader_model:
                shader_model = maximum_shader_model
            
            file_name = shader_file_name_array[shader_model]
            shader_file_path = shader_directory + file_name
            self.shader = loader.loadShader(shader_file_path)
            if self.shader:
                pass
            
        
        if self.shader:
            if base.win.getGsg().getShaderModel() == GraphicsStateGuardian.SM20:
                seamodel = loader.loadModel('models/sea/SeaPatch34')
            else:
                seamodel = loader.loadModel('models/sea/SeaPatch31')
            self.patch.seamodel = seamodel
            self.seamodel = self.patch.seamodel
        elif base.options.getTerrainDetailSetting() == 0:
            self.seamodel = loader.loadModel('models/sea/pir_m_are_wld_seaPatch_low')
        else:
            self.seamodel = loader.loadModel('models/sea/SeaPatch31')
        self.seamodel.setScale(2, 1, 1)
        self.seamodel.flattenMedium()
        mask = 0xFFFFFFFFL
        if self.use_water_bin:
            self.seamodel.setBin('water', 0)
            stencil = StencilAttrib.makeWithClear(1, StencilAttrib.SCFAlways, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOReplace, 1, mask, mask, 1, 0)
            self.seamodel.setAttrib(stencil)
        else:
            self.seamodel.setBin('background', 200)
        self.seamodel.hide(OTPRender.MainCameraBitmask)
        self.seamodel.showThrough(OTPRender.EnviroCameraBitmask)
        self.reflectStage = None
        if False:
            self.model = loader.loadModel('models/misc/smiley')
            self.model.reparentTo(render)
            self.model.setPos(0.0, 50.0, 10.0)
            self.model.setHpr(0.0, 180.0, 0.0)
            self.model.setBin('water', 100)
            self.model2 = loader.loadModel('models/misc/smiley')
            self.model2.reparentTo(render)
            self.model2.setPos(10.0, 50.0, 15.0)
            self.model2.setHpr(180.0, 0.0, 0.0)
            self.model2.setBin('water', 50)
            self.model3 = loader.loadModel('models/misc/smiley')
            self.model3.reparentTo(render)
            self.model3.setPos(-10.0, 50.0, 15.0)
            self.model3.setHpr(0.0, 0.0, 0.0)
            self.model3.setBin('water', 50)
            stencil = StencilAttrib.make(1, StencilAttrib.SCFEqual, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOKeep, 1, mask, mask)
            self.model.setAttrib(stencil)
            stencil = StencilAttrib.make(1, StencilAttrib.SCFEqual, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOKeep, 0, mask, mask)
            self.model3.setAttrib(stencil)
        
        self.flatSea = self.seamodel.find('**/flatsea')
        flat2 = self.flatSea.copyTo(self.flatSea)
        flat2.setScale(2, 2, 1)
        flat2.setZ(-4)
        flat4 = self.flatSea.copyTo(self.flatSea)
        flat4.setScale(4, 4, 1)
        flat4.setZ(-8)
        if not self.flatSea.isEmpty():
            self.flatSea.setTag('flat_sea', 'true')
            self.flatSea.setPos(0, 0, -1)
            if False:
                self.flatSea.setScale(1.3)
            
            if self.use_water_bin:
                self.flatSea.setDepthWrite(0)
            
        
        self.flatSea.flattenStrong()
        if self.use_water_bin:
            self.patchNP.setBin('water', 10)
        else:
            self.patchNP.setBin('ground', -10)
        self.todMgr = todMgr
        if self.getTodMgr():
            self.patchNP.setLightOff()
            self.patchNP.setLight(self.getTodMgr().alight)
        
        (seaMin, seaMax) = self.seamodel.getTightBounds()
        seaDelta = seaMax - seaMin
        cp = CollisionPolygon(Point3(-1.0, -1.0, 0), Point3(1.0, -1.0, 0), Point3(1.0, 1.0, 0), Point3(-1.0, 1.0, 0))
        cNode = CollisionNode('seaCollision')
        cNode.setCollideMask(PiratesGlobals.TargetBitmask)
        cNode.addSolid(cp)
        cNodePath = NodePath(cNode)
        cNodePath.reparentTo(self.seamodel)
        cNodePath.setScale(Vec3(seaDelta).length())
        cNodePath.setZ(-3)
        cNodePath.setTag('objType', str(PiratesGlobals.COLL_SEA))
        cNodePath.reparentTo(self.parentNP)
        self.cNodePath = cNodePath
        ccPlane = CollisionPlane(Plane(Vec3(0, 0, 1), Point3(0, 0, 0)))
        ccNode = CollisionNode('seaCamCollision')
        ccNode.setCollideMask(PiratesGlobals.CameraBitmask)
        ccNode.addSolid(ccPlane)
        ccNodePath = NodePath(ccNode)
        ccNodePath.reparentTo(self.seamodel)
        self.ccNodePath = ccNodePath
        self.seamodel.reparentTo(self.patchNP)
        self.patchNP.flattenLight()
        patchNode.collectGeometry()
        self.enabled = False
        self.enable()
        if self.use_alpha_map:
            if self.enable_alpha_map:
                self.patchNP.setTransparency(1)
                alpha_test_attrib = AlphaTestAttrib.make(RenderAttrib.MAlways, 0)
                self.patchNP.setAttrib(alpha_test_attrib, 100)
            
        
        if self.water_panel != None:
            self.water_panel.setSeaPatch(self)
        
        if self.enable_parameter_keys:
            
            def showSeaPatchPanel():
                SeaPatchPanel = SeaPatchPanel
                import pirates.seapatch
                self.spp = SeaPatchPanel.SeaPatchPanel()
                self.spp.setPatch(self)

            self.accept('shift-5', showSeaPatchPanel)
        
        self.setting_0()
        self.patchNP.setTransparency(0)
        buffer_width = 512
        buffer_height = 512
        self.texture_extension = '.jpg'
        if self.shader:
            self.seamodel.setShader(self.shader)
            self.seamodel.setFogOff()
            if self.use_alpha_map:
                self.patchNP.setTransparency(1)
            
            self.base_texture = loader.loadTexture('maps/oceanWater2' + self.texture_extension)
            self.texture_d = self.base_texture.loadRelated(InternalName.make('-d'))
            self.texture_n = self.base_texture.loadRelated(InternalName.make('-n'))
            self.texture_bb = self.base_texture.loadRelated(InternalName.make('-bb'))
            self.setting_0()
            self.water_r = 77
            self.water_g = 128
            self.water_b = 179
            self.water_a = 255
            self.set_water_color()
            default_water_color_texture_filename = 'maps/ocean_color_1' + self.texture_extension
            default_water_alpha_texture_filename = 'maps/default_inv_alpha' + self.texture_extension
            self.set_water_color_texture(default_water_color_texture_filename)
            self.set_water_alpha_texture(default_water_alpha_texture_filename)
            if self.enable_water_panel:
                self.water_panel.set_texture(default_water_color_texture_filename)
                self.water_panel.set_shader(shader_file_path)
            
        
        if True:
            if reflection:
                self.reflection = reflection
            else:
                self.reflection = Reflection('seapatch', buffer_width, buffer_height, render, Plane(Vec3(0, 0, 1), Point3(0, 0, 0)))
            if self.reflection_enabled():
                self.reflection_on()
            else:
                self.reflection_off()
            self.reflection.reflectShowThroughOnly(self.reflect_show_through_only)
            self.seamodel.setShaderInput(self.reflectiontexture_name, self.reflection.reflection_texture)
            OTPRender.renderReflection(False, self.patchNP, 'p_ocean_water', None)
        else:
            self.reflection_factor = 0.0
            self.set_reflection_parameters_np()
        if not self.shader:
            self.accept('timeOfDayChange', self._timeChange)
            if self.reflection:
                self.reflection.createCard('water', 6)
            
            self.setting_0()
            self.reflection_factor = 0.20000000000000001
            self.set_reflection_parameters_np()
            if False:
                default_water_color_texture_filename = 'maps/ocean_color_1' + self.texture_extension
                self.set_water_color_texture(default_water_color_texture_filename)
                self.setup_color_map()
            
        
        self.create_interface()
        self.patchNP.reparentTo(self.parentNP)
        self.accept('grid-detail-changed', self.updateWater)

    
    def updateWater(self, level):
        if level == 0:
            self.patch.animateHeight(False)
            self.patch.animateUv(False)
        else:
            self.patch.animateHeight(True)
            self.patch.animateUv(True)

    
    def hide(self):
        self.patchNP.hide()
        self.hidden = True

    
    def show(self):
        self.patchNP.show()
        self.hidden = False

    
    def toggle_display(self):
        if self.hidden:
            self.show()
        else:
            self.hide()

    
    def getTodMgr(self):
        if self.todMgr:
            return self.todMgr
        
        
        try:
            return base.cr.timeOfDayManager
        except:
            return None


    
    def delete(self):
        self.ccNodePath.removeNode()
        self.cNodePath.removeNode()
        self.seamodel.removeNode()
        self.patchNP.removeNode()
        self.parentNP = None
        self.todMgr = None
        taskMgr.remove('seaFloatTask-' + str(id(self)))
        taskMgr.remove('seaPatchCamTask-' + str(id(self)))
        self.delete_water()
        if len(self.floats):
            self.notify.error('All floating objects not removed from seapatch. You must call removeFloatable')
            self.floats.clear()
            self.floatmasses.clear()
        
        self.ignoreAll()

    
    def disable(self):
        if self.enabled:
            self.enabled = False
            self.patch.disable()
            self.patchNP.hide()
            taskMgr.remove('seaPatchCamTask-' + str(id(self)))
            taskMgr.remove('seaFloatTask-' + str(id(self)))
        

    
    def enable(self):
        if not self.enabled:
            self.enabled = True
            self.patch.enable()
            self.patchNP.show()
            taskMgr.add(self.camTask, 'seaPatchCamTask-' + str(id(self)), priority = 49)
            if self.followWater:
                taskMgr.add(self.floatTask, 'seaFloatTask-' + str(id(self)), priority = 35)
            
        

    
    def setAnchor(self, anchor):
        self.anchor = anchor
        self.patch.setAnchor(anchor)

    
    def setCenter(self, center):
        self.center = center
        self.patch.setCenter(center)

    
    def camTask(self, task):
        refNode = base.cam
        if not refNode:
            return Task.cont
        
        p = refNode.getPos(render)
        r = refNode.getHpr(render)
        if not self.usingFlatWater:
            self.patchNP.setPos(p.getX(), p.getY(), 0.0)
            self.patchNP.setH(r.getX())
        
        todMgr = self.getTodMgr()
        if self.shader and todMgr:
            self.clear_color = todMgr.fog.getColor()
            fog_color = todMgr.fog.getColor()
            self.fog_r = fog_color.getX()
            self.fog_g = fog_color.getY()
            self.fog_b = fog_color.getZ()
            self.fog_exp_density = todMgr.fog.getExpDensity()
            ambient_color = todMgr.alight.node().getColor()
            if todMgr.dlight is None:
                diffuse_color = VBase3(1.0, 1.0, 1.0)
            else:
                diffuse_color = todMgr.dlight.node().getColor()
            self.ar = ambient_color.getX() * 255.0
            self.ag = ambient_color.getY() * 255.0
            self.ab = ambient_color.getZ() * 255.0
            self.dr = diffuse_color.getX() * 255.0
            self.dg = diffuse_color.getY() * 255.0
            self.db = diffuse_color.getZ() * 255.0
            self.r = diffuse_color.getX() * 255.0
            self.g = diffuse_color.getY() * 255.0
            self.b = diffuse_color.getZ() * 255.0
            camera_position = p
            self.camera_x = camera_position.getX()
            self.camera_y = camera_position.getY()
            self.camera_z = camera_position.getZ()
            fakeDistance = 10000.0
            heading = 360.0 - todMgr.skyGroup.sunWheelRoll.getR()
            camera_heading = r.getX()
            adjusted_camera_heading = -camera_heading
            sunPos = todMgr.skyGroup.sunLight.getPos(todMgr.skyGroup)
            trueDistance = todMgr.skyGroup.sunLight.getDistance(todMgr.skyGroup)
            light_distance = fakeDistance
            distanceScalar = fakeDistance / trueDistance
            x1 = sunPos[0] * distanceScalar
            y1 = x1 - sunPos[1] * distanceScalar
            z1 = sunPos[2] * distanceScalar
            x2 = math.cos(math.radians(heading)) * fakeDistance
            y2 = math.cos(math.radians(heading)) * fakeDistance
            z2 = math.sin(math.radians(heading)) * fakeDistance
            x = x1
            y = y1
            z = z1
            self.x = math.cos(math.radians(adjusted_camera_heading)) * x
            self.y = math.sin(math.radians(adjusted_camera_heading)) * y
            self.z = z
            if z > 0.0:
                x = (z / light_distance) * 3.0 + 0.050000000000000003
                mu = 0.0
                sigma = 0.5
                a = math.log(x) - mu
                a = a * a
                self.s = 2.0 * (1.0 / x * sigma * math.sqrt(2.0 * math.pi)) * math.exp(-a / 2 * sigma * sigma)
                if self.s < 0.0:
                    self.s = 0.0
                
                self.p = 80.0
            else:
                self.s = 0.0
                self.p = 80.0
            self.d = 1.0
        
        self.update_water(task.time)
        return Task.cont

    
    def addFloatable(self, name, transNode, rotNode = None, mass = 1):
        if rotNode == None:
            rotNode = transNode
        
        self.floats[name] = [
            transNode,
            rotNode]
        self.floatmasses[name] = mass

    
    def removeFloatable(self, name):
        if self.floats.has_key(name):
            del self.floats[name]
            del self.floatmasses[name]
        

    
    def showFrustum(self):
        base.cam.node().setCullCenter(base.camera)
        base.graphicsEngine.setPortalCull(1)

    
    def toggleRes(self):
        if self.seamodel == self.lowres:
            self.seamodel = self.highres
        elif self.seamodel == self.highres:
            self.seamodel = self.lowres
        

    
    def floatTask(self, task):
        mass = -6.0
        area = 1
        k = self.damper
        for (name, floater) in self.floats.items():
            transNode = floater[0]
            rotNode = floater[1]
            (height, normal) = self.calcHeightAndNormalForMass(node = transNode, mass = mass, area = area)
            height = height - self.floatmasses[name]
            transNode.setZ(render, height)
            r = -k * normal[0]
            p = -k * normal[1]
            rotNode.setR(r)
            rotNode.setP(p)
        
        return Task.cont

    
    def setReflection(self, tex, factor):
        if self.reflectStage == None:
            self.reflectStage = TextureStage('reflect')
            self.reflectStage.setTexcoordName('reflect')
            self.reflectStage.setSort(10)
        
        if factor == None:
            self.reflectStage.setCombineRgb(TextureStage.CMAdd, TextureStage.CSTexture, TextureStage.COSrcColor, TextureStage.CSPrevious, TextureStage.COSrcColor)
        else:
            self.reflectStage.setCombineRgb(TextureStage.CMInterpolate, TextureStage.CSTexture, TextureStage.COSrcColor, TextureStage.CSPrevious, TextureStage.COSrcColor, TextureStage.CSConstant, TextureStage.COSrcAlpha)
            self.reflectStage.setColor(VBase4(1, 1, 1, factor))
        self.seamodel.setTexture(self.reflectStage, tex)

    
    def clearReflection(self):
        if self.reflectStage != None:
            self.seamodel.clearTexture(self.reflectStage)
        

    
    def saveSeaPatchFile(self, filename):
        if not isinstance(filename, Filename):
            filename = Filename.fromOsSpecific(filename)
        
        speed = self.patch.getOverallSpeed()
        radius = self.patch.getRadius()
        threshold = self.patch.getThreshold()
        hcolor = self.patch.getHighColor()
        lcolor = self.patch.getLowColor()
        uvscale = self.patch.getUvScale()
        pas = self.patch.getUvSpeed()
        mamplitude = []
        mlength = []
        mspeed = []
        mdir = []
        mchoppy = []
        for i in range(self.patch.getNumWaves()):
            mamplitude.append(self.patch.getWaveAmplitude(i))
            mlength.append(self.patch.getWaveLength(i))
            mspeed.append(self.patch.getWaveSpeed(i))
            mdir.append(self.patch.getWaveDirection(i))
            mchoppy.append(self.patch.getChoppyK(i))
        
        i1 = '    '
        i2 = i1 + i1
        i3 = i2 + i1
        out_file = open(filename.toOsSpecific(), 'wb')
        i2 = ''
        out_file.write(i2 + 'patch.setOverallSpeed(%.4f)\n' % speed)
        out_file.write(i2 + 'patch.setUvSpeed(Vec2(%.5f, %.5f))\n' % (pas[0], pas[1]))
        out_file.write(i2 + 'patch.setThreshold(%.2f)\n' % threshold)
        out_file.write(i2 + 'patch.setRadius(%.2f)\n' % radius)
        out_file.write(i2 + 'patch.setUvScale(VBase2(%.4f, %.4f))\n' % (uvscale[0], uvscale[1]))
        out_file.write(i2 + 'patch.setHighColor(Vec4(%.4f, %.4f, %.4f, %.4f))\n' % (hcolor[0], hcolor[1], hcolor[2], hcolor[3]))
        out_file.write(i2 + 'patch.setLowColor(Vec4(%.4f, %.4f, %.4f, %.4f))\n' % (lcolor[0], lcolor[1], lcolor[2], lcolor[3]))
        for i in range(self.patch.getNumWaves()):
            if self.patch.isWaveEnabled(i):
                out_file.write(i2 + 'patch.enableWave(' + str(i) + ')\n')
            else:
                out_file.write(i2 + 'patch.disableWave(' + str(i) + ')\n')
            out_file.write(i2 + 'patch.setWaveTarget(%s, %s)\n' % (i, self._SeaPatch__formatWaveTarget(self.patch.getWaveTarget(i))))
            out_file.write(i2 + 'patch.setWaveFunc(%s, %s)\n' % (i, self._SeaPatch__formatWaveFunc(self.patch.getWaveFunc(i))))
            if self.patch.getWaveFunc(i) == SeaPatchRoot.WFSin:
                out_file.write(i2 + 'patch.setWaveDirection(' + str(i) + ', Vec2(%.4f, %.4f))\n' % (mdir[i][0], mdir[i][1]))
            
            out_file.write(i2 + 'patch.setChoppyK(' + str(i) + ', %d)\n' % mchoppy[i])
            out_file.write(i2 + 'patch.setWaveAmplitude(%s, %.4f)\n' % (i, mamplitude[i]))
            out_file.write(i2 + 'patch.setWaveLength(%s, %.4f)\n' % (i, mlength[i]))
            out_file.write(i2 + 'patch.setWaveSpeed(%s, %.4f)\n' % (i, mspeed[i]))
        

    
    def _SeaPatch__formatWaveTarget(self, target):
        if target == SeaPatchRoot.WTZ:
            return 'SeaPatchRoot.WTZ'
        elif target == SeaPatchRoot.WTU:
            return 'SeaPatchRoot.WTU'
        elif target == SeaPatchRoot.WTV:
            return 'SeaPatchRoot.WTV'
        

    
    def _SeaPatch__formatWaveFunc(self, func):
        if func == SeaPatchRoot.WFSin:
            return 'SeaPatchRoot.WFSin'
        elif func == SeaPatchRoot.WFNoise:
            return 'SeaPatchRoot.WFNoise'
        

    
    def loadSeaPatchFileExt(self, filename, patch = None):
        if patch == None:
            patch = SeaPatchRoot()
            patch.assignEnvironmentFrom(self.patch)
        
        patch.resetProperties()
        if not isinstance(filename, Filename):
            filename = Filename.fromOsSpecific(filename)
        
        searchPath = DSearchPath()
        if AppRunnerGlobal.appRunner:
            searchPath.appendDirectory(Filename.expandFrom('$POTCO_2_ROOT/etc'))
        else:
            searchPath.appendDirectory(Filename.fromOsSpecific(os.path.expandvars('$PIRATES/src/seapatch')))
            searchPath.appendDirectory(Filename.fromOsSpecific(os.path.expandvars('pirates/src/seapatch')))
            searchPath.appendDirectory(Filename('etc'))
            searchPath.appendDirectory(Filename('.'))
        found = vfs.resolveFilename(filename, searchPath)
        if not found:
            print 'seapatch file not found: %s' % filename
        else:
            data = vfs.readFile(filename, 1)
            data = data.replace('\r', '')
            exec data
        return patch

    
    def loadSeaPatchFile(self, filename):
        self.loadSeaPatchFileExt(filename, patch = self.patch)
        self.updateWater(base.options.getTerrainDetailSetting())

    
    def lerpToSeaPatchFile(self, filename, duration, name = None, blendType = 'easeInOut'):
        newpatch = self.loadSeaPatchFileExt(filename)
        newpatch.setCenter(self.center)
        newpatch.setAnchor(self.anchor)
        sealerp = LerpSeaPatchInterval(name, duration, blendType, self.patch, self.patch, newpatch)
        return sealerp

    
    def calcFlatWellScale(self, x = 0, y = 0, node = None):
        p3 = self.p3
        p3.set(x, y, 0)
        if node == None:
            node = self.anchor
        
        ap = self.anchor.getRelativePoint(node, p3)
        return self.patch.calcFlatWellScale(ap.getX(), ap.getY())

    
    def calcHeight(self, x = 0, y = 0, z = 0, node = None):
        p3 = self.p3
        p3.set(x, y, z)
        if node == None:
            node = self.anchor
        
        ap = self.anchor.getRelativePoint(node, p3)
        cp = self.center.getRelativePoint(node, p3)
        x = cp.getX()
        y = cp.getY()
        dist2 = x * x + y * y
        return self.patch.calcHeight(ap.getX(), ap.getY(), dist2)

    
    def calcFilteredHeight(self, x = 0, y = 0, z = 0, minWaveLength = 0, node = None):
        p3 = self.p3
        p3.set(x, y, z)
        if node == None:
            node = self.anchor
        
        ap = self.anchor.getRelativePoint(node, p3)
        cp = self.center.getRelativePoint(node, p3)
        x = cp.getX()
        y = cp.getY()
        dist2 = x * x + y * y
        return self.patch.calcFilteredHeight(ap.getX(), ap.getY(), minWaveLength, dist2)

    
    def calcHeightForMass(self, x = 0, y = 0, z = 0, node = None, mass = 1, area = 1):
        p3 = self.p3
        p3.set(x, y, z)
        if node == None:
            node = self.anchor
        
        ap = self.anchor.getRelativePoint(node, p3)
        cp = self.center.getRelativePoint(node, p3)
        x = cp.getX()
        y = cp.getY()
        dist2 = x * x + y * y
        return self.patch.calcHeightForMass(ap.getX(), ap.getY(), dist2, mass, area)

    
    def calcHeightAndNormal(self, x = 0, y = 0, z = 0, node = None):
        p3 = self.p3
        p3.set(x, y, z)
        if node == None:
            node = self.anchor
        
        ap = self.anchor.getRelativePoint(node, p3)
        ax = ap.getX()
        ay = ap.getY()
        cp = self.center.getRelativePoint(node, p3)
        x = cp.getX()
        y = cp.getY()
        dist2 = x * x + y * y
        height = self.patch.calcHeight(ax, ay, dist2)
        normal = self.patch.calcNormal(height, ax, ay, dist2)
        normal = node.getRelativeVector(self.anchor, normal)
        return (height, normal)

    
    def calcHeightAndNormalForMass(self, x = 0, y = 0, z = 0, node = None, mass = 1, area = 1):
        p3 = self.p3
        p3.set(x, y, z)
        if node == None:
            node = self.anchor
        
        ap = self.anchor.getRelativePoint(node, p3)
        ax = ap.getX()
        ay = ap.getY()
        cp = self.center.getRelativePoint(node, p3)
        x = cp.getX()
        y = cp.getY()
        dist2 = x * x + y * y
        height = self.patch.calcHeightForMass(ax, ay, dist2, mass, area)
        normal = self.patch.calcNormalForMass(height, ax, ay, dist2, mass, area)
        normal = node.getRelativeVector(self.anchor, normal)
        return (height, normal)

    
    def setSeaWeights(self, weight_map):
        pass

    
    def _timeChange(self, stateId, stateDuration, elapsedTime, transitionTime):
        transTime = 2.0
        if stateId == PiratesGlobals.TOD_DAWN:
            highColor = Vec4(1.0, 1.0, 1.0, 0.5)
            lowColor = Vec4(0.5, 0.29999999999999999, 0.29999999999999999, 0.80000000000000004)
        elif stateId == PiratesGlobals.TOD_DAY:
            highColor = Vec4(1.0, 1.0, 1.0, 0.5)
            lowColor = Vec4(0.20000000000000001, 0.20000000000000001, 0.20000000000000001, 0.80000000000000004)
        elif stateId == PiratesGlobals.TOD_DUSK:
            highColor = Vec4(1.0, 1.0, 1.0, 0.5)
            lowColor = Vec4(0.69999999999999996, 0.20000000000000001, 0.20000000000000001, 0.80000000000000004)
        elif stateId == PiratesGlobals.TOD_NIGHT:
            highColor = Vec4(1.0, 1.0, 1.0, 0.5)
            lowColor = Vec4(0.20000000000000001, 0.20000000000000001, 0.80000000000000004, 0.80000000000000004)
        elif stateId == PiratesGlobals.TOD_STARS:
            highColor = Vec4(1.0, 1.0, 1.0, 0.5)
            lowColor = Vec4(0.20000000000000001, 0.20000000000000001, 0.40000000000000002, 0.80000000000000004)
        elif stateId in [
            PiratesGlobals.TOD_HALLOWEEN,
            PiratesGlobals.TOD_FULLMOON,
            PiratesGlobals.TOD_HALFMOON2,
            PiratesGlobals.TOD_HALFMOON]:
            highColor = Vec4(1.0, 1.0, 1.0, 0.5)
            lowColor = Vec4(0.5, 0.25, 0.59999999999999998, 0.80000000000000004)
        else:
            highColor = Vec4(1.0, 1.0, 1.0, 0.5)
            lowColor = Vec4(0.20000000000000001, 0.20000000000000001, 0.20000000000000001, 0.80000000000000004)
        self.patch.setHighColor(highColor)
        self.patch.setLowColor(lowColor)

    maintenanceTaskName = 'maintenanceTask'
    
    def initialize(self):
        self.time = 0.0
        self.cacheTime = 0.0
        self.updateTimeInSeconds = 10.0
        self.cacheUpdateTimeInSeconds = 60.0 * 5.0

    
    def cleanup(self):
        taskMgr.remove(self.maintenanceTaskName)

    
    def setup(self, updateTimeInSeconds, cacheUpdateTimeInSeconds, taskPriority):
        self.updateTimeInSeconds = updateTimeInSeconds
        self.cacheUpdateTimeInSeconds = cacheUpdateTimeInSeconds
        taskMgr.add(self.maintenanceTask, self.maintenanceTaskName, priority = taskPriority)

    
    def maintenanceFunction(self):
        models_freed = 1
        textures_freed = 1
        while models_freed > 0 or textures_freed > 0:
            models_freed = ModelPool.garbageCollect()
            textures_freed = TexturePool.garbageCollect()
            if models_freed > 0 or textures_freed > 0:
                continue

    
    def clearCachesFunction(self):
        RenderState.clearCache()
        TransformState.clearCache()

    
    def maintenanceTask(self, task):
        if task.time - self.time >= self.updateTimeInSeconds:
            self.maintenanceFunction()
            self.time = task.time
        
        if task.time - self.cacheTime >= self.cacheUpdateTimeInSeconds:
            self.clearCachesFunction()
            self.cacheTime = task.time
        
        return Task.cont

    
    def getSpecialEffectsLevel(self):
        
        try:
            level = base.options.getSpecialEffectsSetting()
        except:
            level = Options.SpecialEffectsHigh

        return level

    
    def addMotionTrail(self, parent):
        if self.motion_trail == None:
            motion_trail = MotionTrail('sword_motion_trail', parent)
            if False:
                axis = loader.loadModel('models/misc/xyzAxis')
                axis.reparentTo(parent)
            
            test_vertex_list = [
                Vec4(0.0, 0.40000000000000002, 0.0, 1.0),
                Vec4(0.0, 2.0, 0.0, 1.0),
                Vec4(-0.55000000000000004, 2.9500000000000002, 0.0, 1.0)]
            
            def test_vertex_function(motion_trail_vertex, vertex_id, context):
                return test_vertex_list[vertex_id]

            index = 0
            total_test_vertices = len(test_vertex_list)
            while index < total_test_vertices:
                motion_trail_vertex = motion_trail.add_vertex(index, test_vertex_function, None)
                if True:
                    if index == 0:
                        motion_trail_vertex.start_color = Vec4(0.0, 0.25, 0.0, 1.0)
                        motion_trail_vertex.end_color = Vec4(0.0, 0.0, 0.0, 1.0)
                    
                    if index == 1:
                        motion_trail_vertex.start_color = Vec4(0.25, 0.0, 0.0, 1.0)
                        motion_trail_vertex.end_color = Vec4(0.0, 0.0, 0.0, 1.0)
                    
                    if index == 2:
                        motion_trail_vertex.start_color = Vec4(0.0, 0.0, 1.0, 1.0)
                        motion_trail_vertex.end_color = Vec4(0.0, 0.0, 0.0, 1.0)
                    
                    if index == 3:
                        motion_trail_vertex.start_color = Vec4(0.0, 1.0, 1.0, 1.0)
                        motion_trail_vertex.end_color = Vec4(0.0, 0.0, 0.0, 1.0)
                    
                    if index == 4:
                        motion_trail_vertex.start_color = Vec4(1.0, 1.0, 0.0, 1.0)
                        motion_trail_vertex.end_color = Vec4(0.0, 0.0, 0.0, 1.0)
                    
                    if index == 0:
                        motion_trail_vertex.start_color = Vec4(0.0, 0.10000000000000001, 0.0, 1.0)
                        motion_trail_vertex.end_color = Vec4(0.0, 0.0, 0.0, 1.0)
                    
                    if index == 1:
                        motion_trail_vertex.start_color = Vec4(0.25, 0.0, 0.0, 1.0)
                        motion_trail_vertex.end_color = Vec4(0.0, 0.0, 0.0, 1.0)
                    
                
                index += 1
            motion_trail.update_vertices()
            motion_trail.register_motion_trail()
            motion_trail.calculate_relative_matrix = True
            motion_trail.root_node_path = parent
            motion_trail.time_window = 0.25
            motion_trail.continuous_motion_trail = False
            motion_trail.end_motion_trail()
            self.motion_trail = motion_trail
            if not False:
                print 'ADD MOTION TRAIL'
                axis = Vec3(0.0, 0.0, 1.0)
                time = 0.0
                angle = (1.0 - time) * 90.0
                matrix = Mat4.rotateMat(angle, axis)
                self.motion_trail.update_motion_trail(time, matrix)
                time = 0.20000000000000001
                angle = (1.0 - time) * 90.0
                matrix = Mat4.rotateMat(angle, axis)
                self.motion_trail.update_motion_trail(time, matrix)
                time = 0.40000000000000002
                angle = (1.0 - time) * 90.0
                matrix = Mat4.rotateMat(angle, axis)
                self.motion_trail.update_motion_trail(time, matrix)
                time = 0.59999999999999998
                angle = (1.0 - time) * 90.0
                matrix = Mat4.rotateMat(angle, axis)
                self.motion_trail.update_motion_trail(time, matrix)
                time = 0.80000000000000004
                angle = (1.0 - time) * 90.0
                matrix = Mat4.rotateMat(angle, axis)
                self.motion_trail.update_motion_trail(time, matrix)
                time = 1.0
                angle = (1.0 - time) * 90.0
                matrix = Mat4.rotateMat(angle, axis)
                self.motion_trail.update_motion_trail(time, matrix)