Source code for raytraverse.formatter.radianceformatter
# -*- coding: utf-8 -*-
# Copyright (c) 2020 Stephen Wasilewski, HSLU and EPFL
# =======================================================================
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# =======================================================================
import re
import os
import numpy as np
from clasp import script_tools as cst
from clasp.click_callbacks import parse_file_list
from clasp.script_tools import pipeline
from raytraverse.formatter.formatter import Formatter
[docs]
class RadianceFormatter(Formatter):
"""scene formatter readies scene files for simulation, must be compatible
with desired renderer.
"""
#: line comment character
comment = "#"
#: extension for renderer scene file
scene_ext = ".oct"
[docs]
@staticmethod
def make_scene(scene_files, out, frozen=True):
"""compile scene"""
dims = cst.pipeline([f'getinfo -d {scene_files}', ])
try:
m = re.match(scene_files + r'.*: [\d.-]+ [\d.-]+ [\d.-]+ [\d.-]+',
dims.strip())
except TypeError:
raise ValueError(f'{scene_files} does not exist, Scene() must be '
'invoked with a scene= argument')
if not frozen and m:
out = scene_files
else:
if m:
oconv = f'oconv -i {scene_files}'
else:
scene = " ".join(parse_file_list(None, scene_files))
if frozen:
oconv = f'oconv -f {scene}'
else:
oconv = f'oconv {scene}'
result, err = cst.pipeline([oconv, ], outfile=out, close=True,
caperr=True, writemode='wb')
if b'fatal' in err:
os.remove(out)
raise ChildProcessError(err.decode(cst.encoding))
return out
[docs]
@staticmethod
def get_scene(scene):
"""recover scene file paths from compiled octree
Parameters
----------
scene: octree file
Returns
-------
files: string to use in new octree generation. -i prepended before
each actree
frozen: if result will be a frozen octree
"""
if not os.path.isfile(scene):
raise FileNotFoundError(scene)
hdr = pipeline([f"getinfo {scene}"])
oconvf = re.findall(r"\s*oconv (.+)", hdr)[-1]
files = oconvf.replace("-f ", "")
frozen = "-i" in files
filel = [i for i in files.split() if re.match(r".+\..+", i)]
if not np.all([os.path.isfile(i) for i in filel]):
files = f"-i {scene}"
return files, frozen
[docs]
@staticmethod
def get_skydef(color=(.96, 1.004, 1.118), ground=True, name='skyglow',
mod="void", groundname=None, groundcolor=(1, 1, 1)):
"""assemble sky definition"""
if groundname is None:
groundname = name
groundmod = ""
else:
groundmod = (f"{mod} glow {groundname} 0 0 4 {groundcolor[0]} "
f"{groundcolor[1]} {groundcolor[2]} 0\n")
skydeg = (f"{mod} glow {name} 0 0 4 {color[0]} {color[1]} {color[2]} 0"
f"\n{name} source sky 0 0 4 0 0 1 180\n")
if ground:
skydeg += f"{groundmod}{groundname} source ground 0 0 4 0 0 -1 180"
return skydeg
[docs]
@staticmethod
def get_sundef(vec, color, size=0.5333, mat_name='solar', mat_id='sun'):
"""assemble sun definition"""
d = f"{vec[0]} {vec[1]} {vec[2]}"
dec = (f"void light {mat_name} 0 0 3 {color[0]} {color[1]} {color[2]}\n"
f"{mat_name} source {mat_id} 0 0 4 {d} {size}\n")
return dec