예제 #1
0
class PlanetView(View):
    ready = False

    @classmethod
    def setup(cls, loader):
        cls.noisetex = loader.load3DTexture("texture/noise/fbm_###.tif")
        cls.noisestage = TextureStage('noise')
        cls.layer1stage = TextureStage('layer1')
        cls.layer2stage = TextureStage('layer2')
        cls.layer3stage = TextureStage('layer3')
        cls.layer4stage = TextureStage('layer4')
        cls.texture_sets = {}

        layernames = ["layer1", "layer2", "layer3", "layer4"]
        stages = [
            cls.layer1stage, cls.layer2stage, cls.layer3stage, cls.layer4stage
        ]
        texture_files = os.listdir("texture/planet/layers/")
        for filename in texture_files:
            name, ext = os.path.splitext(filename)
            if name.endswith("layer1"):
                paths = [
                    "texture/planet/layers/" +
                    filename.replace("layer1", layer) for layer in layernames
                ]
                if all(os.path.exists(path) for path in paths):
                    setname = name.replace("layer1", "").strip("_")
                    texture_set = [(cls.noisestage, cls.noisetex)]
                    for stage, path in zip(stages, paths):
                        tex = loader.loadTexture(path)
                        tex.setWrapU(Texture.WMClamp)
                        tex.setWrapV(Texture.WMClamp)
                        texture_set.append((stage, tex))
                    cls.texture_sets[setname] = texture_set

        cls.ready = True

    def __init__(self, parent, planet, **kwargs):
        super(PlanetView, self).__init__(parent, planet, **kwargs)
        if not PlanetView.ready: PlanetView.setup(self.base.loader)
        self.node = NodePath(SphereNode(subdivides=4))
        self.node.setShader(Shader.load("shader/planet.cg"))
        self.cloudtime = 0.0
        self.seed = hash("fish")
        self.param_set = ParamSet(self.seed)

        self.compute_seed_param()
        for stage, tex in PlanetView.texture_sets['terrestrial_big']:
            self.node.setTexture(stage, tex)

        self.setup_shader_inputs()
        self.node.setScale(1 / self.node.getBounds().getRadius())
        self.node.reparentTo(self.parent.node)

    def set_light(self, light):
        self.node.setShaderInput("light", light)
        self.node.setShaderInput("lightcolor", Vec4(light.getColor()))

    def compute_seed_param(self):
        rng = random.Random()
        rng.seed(self.seed)
        self.param_set.vectors["seed"] = Vec4(rng.random(), rng.random(),
                                              rng.random(), self.cloudtime)
        self.setup_shader_inputs()

    def setup_shader_inputs(self):
        for k, v in self.param_set.vectors.iteritems():
            self.node.setShaderInput(k, v)
        self.node.setShaderInput("eye", self.base.camera)

    def tick(self, elapsed):
        self.cloudtime += elapsed * 0.02
        self.compute_seed_param()
        self.setup_shader_inputs()
예제 #2
0
파일: planet.py 프로젝트: mispy/strudel
class PlanetView(View):
    ready = False

    @classmethod
    def setup(cls, loader):
        cls.noisetex = loader.load3DTexture("texture/noise/fbm_###.tif")
        cls.noisestage = TextureStage('noise')
        cls.layer1stage = TextureStage('layer1')
        cls.layer2stage = TextureStage('layer2')
        cls.layer3stage = TextureStage('layer3')
        cls.layer4stage = TextureStage('layer4')
        cls.texture_sets = {}

        layernames = ["layer1", "layer2", "layer3", "layer4"]
        stages = [cls.layer1stage, cls.layer2stage, cls.layer3stage, cls.layer4stage]
        texture_files = os.listdir("texture/planet/layers/")
        for filename in texture_files:
            name,ext = os.path.splitext(filename)
            if name.endswith( "layer1" ):
                paths = [ "texture/planet/layers/" + filename.replace("layer1",layer) for layer in layernames ]
                if all( os.path.exists( path ) for path in paths ):
                    setname = name.replace("layer1","").strip("_")
                    texture_set = [ (cls.noisestage,cls.noisetex) ]
                    for stage,path in zip(stages,paths):
                        tex = loader.loadTexture( path )
                        tex.setWrapU( Texture.WMClamp )
                        tex.setWrapV( Texture.WMClamp )
                        texture_set.append( (stage, tex) )
                    cls.texture_sets[setname] = texture_set

        cls.ready = True

    def __init__(self, parent, planet, **kwargs):
        super(PlanetView, self).__init__(parent, planet, **kwargs)
        if not PlanetView.ready: PlanetView.setup(self.base.loader)
        self.node = NodePath(SphereNode(subdivides=4))
        self.node.setShader(Shader.load("shader/planet.cg"))
        self.cloudtime = 0.0
        self.seed = hash("fish")
        self.param_set = ParamSet(self.seed)

        self.compute_seed_param()
        for stage, tex in PlanetView.texture_sets['terrestrial_big']:
            self.node.setTexture(stage, tex)

        self.setup_shader_inputs()
        self.node.setScale(1/self.node.getBounds().getRadius())
        self.node.reparentTo(self.parent.node)

    def set_light(self, light):
        self.node.setShaderInput("light", light)
        self.node.setShaderInput("lightcolor", Vec4(light.getColor()))

    def compute_seed_param(self):
        rng = random.Random()
        rng.seed(self.seed)
        self.param_set.vectors["seed"] = Vec4(rng.random(), rng.random(), rng.random(), self.cloudtime)
        self.setup_shader_inputs()

    def setup_shader_inputs(self):
        for k, v in self.param_set.vectors.iteritems():
            self.node.setShaderInput(k, v)
        self.node.setShaderInput("eye", self.base.camera)

    def tick(self, elapsed):
        self.cloudtime += elapsed * 0.02
        self.compute_seed_param()
        self.setup_shader_inputs()
예제 #3
0
class StarView(View):
    ready = False

    @classmethod
    def setup(cls, loader):
        cls.noisetex = loader.load3DTexture("texture/noise/fbm_###.tif")
        cls.noisestage = TextureStage('noise')
        cls.layer1stage = TextureStage('layer1')
        cls.layer2stage = TextureStage('layer2')
        cls.layer3stage = TextureStage('layer3')
        cls.layer4stage = TextureStage('layer4')

        stages = [
            cls.layer1stage, cls.layer2stage, cls.layer3stage, cls.layer4stage
        ]
        texture_files = os.listdir("texture/")

        paths = glob.glob("texture/star/layers/*.tif")
        paths.sort()
        cls.texture_set = [(cls.noisestage, cls.noisetex)]
        for stage, path in zip(stages, paths):
            tex = loader.loadTexture(path)
            tex.setWrapU(Texture.WMClamp)
            tex.setWrapV(Texture.WMClamp)
            cls.texture_set.append((stage, tex))

        cls.ready = True

    def __init__(self, parent, star, **kwargs):
        super(StarView, self).__init__(parent, star, **kwargs)
        if not StarView.ready: StarView.setup(self.base.loader)
        self.seed = random.random()

        self.node = NodePath('star')

        plight = PointLight("starlight")
        self.light = self.node.attachNewNode(plight)
        self.light.setColor(self.obj.color)

        self.model = self.light.attachNewNode(SphereNode(subdivides=4))
        self.model.setShader(Shader.load("shader/star.cg"))
        self.cloudtime = 0.0
        #self.seed = hash("fish")
        self.param_set = ParamSet(self.seed)

        min_scale = Vec4(0.5, 0.5, 0.5, 0.5)
        max_scale = Vec4(1, 1, 1, 1)
        max_radius = StellarClass.highest_radius
        min_radius = StellarClass.lowest_radius
        radius_factor = log(self.obj.radius * (1 / min_radius), 100) / log(
            max_radius * (1 / min_radius), 100)
        self.param_set.vectors['scale'] = min_scale + (
            max_scale - min_scale) * radius_factor

        self.compute_seed_param()

        for stage, tex in StarView.texture_set:
            self.model.setTexture(stage, tex)

        self.speed = 0.00000001
        self.setup_shader_inputs()

        self.node.setScale(1 / self.node.getBounds().getRadius())
        self.node.reparentTo(self.parent.node)

    def compute_seed_param(self):
        rng = random.Random()
        rng.seed(self.seed)
        self.param_set.vectors["seed"] = Vec4(rng.random(), rng.random(),
                                              rng.random(), self.cloudtime)
        self.setup_shader_inputs()

    def setup_shader_inputs(self):
        for k, v in self.param_set.vectors.iteritems():
            self.model.setShaderInput(k, v)
        self.model.setShaderInput("starcolor", self.obj.color)
        self.model.setShaderInput("eye", self.base.camera)

    def tick(self, elapsed):
        self.cloudtime += elapsed * 0.05
        self.compute_seed_param()
        self.setup_shader_inputs()
예제 #4
0
파일: star.py 프로젝트: mispy/strudel
class StarView(View):
    ready = False

    @classmethod
    def setup(cls, loader):
        cls.noisetex = loader.load3DTexture("texture/noise/fbm_###.tif")
        cls.noisestage = TextureStage('noise')
        cls.layer1stage = TextureStage('layer1')
        cls.layer2stage = TextureStage('layer2')
        cls.layer3stage = TextureStage('layer3')
        cls.layer4stage = TextureStage('layer4')

        stages = [cls.layer1stage, cls.layer2stage, cls.layer3stage, cls.layer4stage]
        texture_files = os.listdir("texture/")

        paths = glob.glob("texture/star/layers/*.tif")
        paths.sort()
        cls.texture_set = [ (cls.noisestage,cls.noisetex) ]
        for stage,path in zip(stages,paths):
            tex = loader.loadTexture( path )
            tex.setWrapU( Texture.WMClamp )
            tex.setWrapV( Texture.WMClamp )
            cls.texture_set.append( (stage, tex) )

        cls.ready = True

    def __init__(self, parent, star, **kwargs):
        super(StarView, self).__init__(parent, star, **kwargs)
        if not StarView.ready: StarView.setup(self.base.loader)
        self.seed = random.random()

        self.node = NodePath('star')

        plight = PointLight("starlight")
        self.light = self.node.attachNewNode(plight)
        self.light.setColor(self.obj.color)

        self.model = self.light.attachNewNode(SphereNode(subdivides=4))
        self.model.setShader(Shader.load("shader/star.cg"))
        self.cloudtime = 0.0
        #self.seed = hash("fish")
        self.param_set = ParamSet(self.seed)

        min_scale = Vec4(0.5, 0.5, 0.5, 0.5)
        max_scale = Vec4(1, 1, 1, 1)
        max_radius = StellarClass.highest_radius
        min_radius = StellarClass.lowest_radius
        radius_factor = log(self.obj.radius*(1/min_radius), 100) / log(max_radius*(1/min_radius), 100)
        self.param_set.vectors['scale'] = min_scale + (max_scale-min_scale)*radius_factor

        self.compute_seed_param()

        for stage, tex in StarView.texture_set:
            self.model.setTexture(stage, tex)

        self.speed = 0.00000001
        self.setup_shader_inputs()

        self.node.setScale(1/self.node.getBounds().getRadius())
        self.node.reparentTo(self.parent.node)

    def compute_seed_param(self):
        rng = random.Random()
        rng.seed(self.seed)
        self.param_set.vectors["seed"] = Vec4(rng.random(), rng.random(), rng.random(), self.cloudtime)
        self.setup_shader_inputs()

    def setup_shader_inputs(self):
        for k, v in self.param_set.vectors.iteritems():
            self.model.setShaderInput(k, v)
        self.model.setShaderInput("starcolor", self.obj.color)
        self.model.setShaderInput("eye", self.base.camera)

    def tick(self, elapsed):
        self.cloudtime += elapsed * 0.05
        self.compute_seed_param()
        self.setup_shader_inputs()