mirror of
https://github.com/kuhyx/WUT_Computer_Science.git
synced 2026-07-04 18:03:14 +02:00
* works for cornell now, will be extended to import others * works for all scenes * can load environments and blur them * minor cleanup * Example commands added to README.md
58 lines
2.6 KiB
Python
58 lines
2.6 KiB
Python
from ..geometry import Cuboid_Collider, Primitive
|
|
from ..materials import Material
|
|
from ..utils.vector3 import vec3
|
|
from ..utils.constants import SKYBOX_DISTANCE
|
|
from ..utils.image_functions import load_image, load_image_as_linear_sRGB
|
|
from .util.blur_background import blur_skybox
|
|
|
|
class SkyBox(Primitive):
|
|
def __init__(self, cubemap, center = vec3(0.,0.,0.), light_intensity = 0.0, blur = 0.0):
|
|
super().__init__(center, SkyBox_Material(cubemap, light_intensity, blur), shadow = False)
|
|
l = SKYBOX_DISTANCE
|
|
self.light_intensity = light_intensity
|
|
#BOTTOM
|
|
self.collider_list += [Cuboid_Collider(assigned_primitive = self, center = center, width = 2*l, height =2*l ,length =2*l )]
|
|
|
|
|
|
def get_uv(self, hit):
|
|
u,v = hit.collider.get_uv(hit)
|
|
u,v = u/4,v/3
|
|
return u,v
|
|
|
|
|
|
class SkyBox_Material(Material):
|
|
def __init__(self, cubemap, light_intensity, blur):
|
|
self.texture = load_image_as_linear_sRGB("sightpy/backgrounds/" + cubemap)
|
|
|
|
if light_intensity != 0.0:
|
|
self.lightmap = load_image("sightpy/backgrounds/lightmaps/" + cubemap)
|
|
|
|
if blur != 0.0:
|
|
self.blur_image = blur_skybox(load_image("sightpy/backgrounds/" + cubemap), blur, cubemap)
|
|
|
|
self.blur = blur
|
|
self.light_intensity = light_intensity
|
|
self.repeat = 1.0
|
|
|
|
def get_texture_color(self, hit, ray):
|
|
u,v = hit.get_uv()
|
|
|
|
if (self.blur != 0.0) :
|
|
im = self.blur_image[-((v * self.blur_image.shape[0]*self.repeat ).astype(int)% self.blur_image.shape[0]) , (u * self.blur_image.shape[1]*self.repeat).astype(int) % self.blur_image.shape[1] ].T
|
|
else:
|
|
im = self.texture[-((v * self.texture.shape[0]*self.repeat ).astype(int)% self.texture.shape[0]) , (u * self.texture.shape[1]*self.repeat).astype(int) % self.texture.shape[1] ].T
|
|
|
|
if (ray.depth != 0) and (self.light_intensity != 0.0):
|
|
ls = self.lightmap[-((v * self.texture.shape[0]*self.repeat ).astype(int)% self.texture.shape[0]) , (u * self.texture.shape[1]*self.repeat).astype(int) % self.texture.shape[1] ].T
|
|
color = vec3(im[0] + self.light_intensity * ls[0], im[1] + self.light_intensity * ls[1], im[2] + self.light_intensity * ls[2])
|
|
|
|
else:
|
|
color = vec3(im[0] , im[1] , im[2] )
|
|
return color
|
|
|
|
|
|
def get_color(self, scene, ray, hit):
|
|
hit.point = (ray.origin + ray.dir * hit.distance)
|
|
return hit.material.get_texture_color(hit,ray)
|
|
|