Checking consistency of OBJ loaderΒΆ

[1]:
%load_ext autoreload
%autoreload 2
[2]:
import os
import imageio
import pandas as pd
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
import lmfunctest as ft
import lmscene
import lightmetrica as lm
[3]:
%load_ext lightmetrica_jupyter
[4]:
lm.init('user::default', {})
lm.parallel.init('parallel::openmp', {
    'numThreads': -1
})
lm.log.init('logger::jupyter', {})
lm.info()
[I|0.000|114@user  ] Lightmetrica -- Version 3.0.0 (rev. fe30e7c) Linux x64
[5]:
lm.comp.loadPlugin(os.path.join(ft.env.bin_path, 'accel_nanort'))
lm.comp.loadPlugin(os.path.join(ft.env.bin_path, 'objloader_tinyobjloader'))
[I|0.020|179@compon] Loading plugin [name='accel_nanort']
[I|0.020|197@compon]   Successfully loaded
[I|0.020|179@compon] Loading plugin [name='objloader_tinyobjloader']
[I|0.020|197@compon]   Successfully loaded
[5]:
True
[6]:
def build_and_render(scene):
    lm.reset()
    lmscene.load(ft.env.scene_path, scene)
    lm.build('accel::nanort', {})
    lm.asset('film_output', 'film::bitmap', {
        'w': 1920,
        'h': 1080
    })
    lm.render('renderer::raycast', {
        'output': lm.asset('film_output')
    })
    return np.copy(lm.buffer(lm.asset('film_output')))
[7]:
objloaders = ['objloader::tinyobjloader']
scenes = lmscene.scenes_small()
[8]:
for scene in scenes:
    # Reference
    lm.objloader.init('objloader::simple', {})
    ref = build_and_render(scene)

    # Visualize reference
    f = plt.figure(figsize=(15,15))
    ax = f.add_subplot(111)
    ax.imshow(np.clip(np.power(ref,1/2.2),0,1), origin='lower')
    ax.set_title('{}, objloader::simple'.format(scene))
    plt.show()

    # Check consistency with other loaders
    for objloader in objloaders:
        # Render
        lm.objloader.init(objloader, {})
        img = build_and_render(scene)
        diff = ft.rmse_pixelwised(ref, img)

        # Visualize
        f = plt.figure(figsize=(15,15))
        ax = f.add_subplot(111)
        ax.imshow(np.clip(np.power(img,1/2.2),0,1), origin='lower')
        ax.set_title('{}, {}'.format(scene, objloader))
        plt.show()

        # Visualize the difference image
        f = plt.figure(figsize=(15,15))
        ax = f.add_subplot(111)
        im = ax.imshow(diff, origin='lower')
        divider = make_axes_locatable(ax)
        cax = divider.append_axes("right", size="5%", pad=0.05)
        plt.colorbar(im, cax=cax)
        ax.set_title('{}, objloader::simple vs. {}'.format(scene, objloader))
        plt.show()
[I|0.085|48@assets ] Loading asset [name='camera_main']
[I|0.085|48@assets ] Loading asset [name='model_obj']
[I|0.085|29@objload]   Loading OBJ file [path='fireplace_room.obj']
[I|0.085|169@objloa]   Loading MTL file [path='fireplace_room.mtl']
[I|0.086|44@texture]   Loading texture [path='wood.ppm']
[I|0.189|44@texture]   Loading texture [path='leaf.ppm']
[I|0.193|44@texture]   Loading texture [path='picture8.ppm']
[I|0.233|44@texture]   Loading texture [path='wood5.ppm']
[I|0.674|246@scene ] Building acceleration structure [name='accel::nanort']
[I|0.674|38@accel_n]   Flattening scene
[I|0.690|68@accel_n]   Building
[I|0.946|48@assets ] Loading asset [name='film_output']
[I|1.036|151@user  ] Starting render [name='renderer::raycast']
[I|1.537|125@progre] Processing [iter=344000/2073600, progress=16.6%, ETA=2.5s]
[I|2.038|125@progre] Processing [iter=622700/2073600, progress=30.0%, ETA=2.3s]
[I|2.539|125@progre] Processing [iter=896600/2073600, progress=43.2%, ETA=2.0s]
[I|3.040|125@progre] Processing [iter=1246700/2073600, progress=60.1%, ETA=1.3s]
[I|3.541|125@progre] Processing [iter=1581700/2073600, progress=76.3%, ETA=0.8s]
[I|4.042|125@progre] Processing [iter=1885700/2073600, progress=90.9%, ETA=0.3s]
[I|4.310|132@progre] Processing [completed]
../_images/executed_functest_func_obj_loader_consistency_8_1.png
[I|5.431|48@assets ] Loading asset [name='camera_main']
[I|5.432|48@assets ] Loading asset [name='model_obj']
[I|5.692|44@texture]   Loading texture [path='wood.ppm']
[I|5.790|44@texture]   Loading texture [path='leaf.ppm']
[I|5.793|44@texture]   Loading texture [path='picture8.ppm']
[I|5.828|44@texture]   Loading texture [path='wood5.ppm']
[I|5.892|246@scene ] Building acceleration structure [name='accel::nanort']
[I|5.892|38@accel_n]   Flattening scene
[I|5.908|68@accel_n]   Building
[I|6.158|48@assets ] Loading asset [name='film_output']
[I|6.245|151@user  ] Starting render [name='renderer::raycast']
[I|6.746|125@progre] Processing [iter=354500/2073600, progress=17.1%, ETA=2.4s]
[I|7.247|125@progre] Processing [iter=632800/2073600, progress=30.5%, ETA=2.3s]
[I|7.748|125@progre] Processing [iter=922500/2073600, progress=44.5%, ETA=1.9s]
[I|8.249|125@progre] Processing [iter=1289000/2073600, progress=62.2%, ETA=1.2s]
[I|8.750|125@progre] Processing [iter=1631500/2073600, progress=78.7%, ETA=0.7s]
[I|9.251|125@progre] Processing [iter=1956600/2073600, progress=94.4%, ETA=0.2s]
[I|9.413|132@progre] Processing [completed]
../_images/executed_functest_func_obj_loader_consistency_8_3.png
../_images/executed_functest_func_obj_loader_consistency_8_4.png
[I|10.963|48@assets ] Loading asset [name='camera_main']
[I|10.963|48@assets ] Loading asset [name='model_obj']
[I|10.964|29@objload]   Loading OBJ file [path='CornellBox-Sphere.obj']
[I|10.964|169@objloa]   Loading MTL file [path='CornellBox-Sphere.mtl']
[I|10.967|246@scene ] Building acceleration structure [name='accel::nanort']
[I|10.967|38@accel_n]   Flattening scene
[I|10.967|68@accel_n]   Building
[I|10.970|48@assets ] Loading asset [name='film_output']
[I|11.056|151@user  ] Starting render [name='renderer::raycast']
[I|11.558|125@progre] Processing [iter=925900/2073600, progress=44.7%, ETA=0.6s]
[I|12.043|132@progre] Processing [completed]
../_images/executed_functest_func_obj_loader_consistency_8_6.png
[I|12.925|48@assets ] Loading asset [name='camera_main']
[I|12.926|48@assets ] Loading asset [name='model_obj']
[W|12.928|43@objload]   Both `d` and `Tr` parameters defined for "light". Use the value of `d` for dissolve (line 76 in .mtl.)

[I|12.929|246@scene ] Building acceleration structure [name='accel::nanort']
[I|12.929|38@accel_n]   Flattening scene
[I|12.929|68@accel_n]   Building
[I|12.932|48@assets ] Loading asset [name='film_output']
[I|13.019|151@user  ] Starting render [name='renderer::raycast']
[I|13.520|125@progre] Processing [iter=890600/2073600, progress=42.9%, ETA=0.7s]
[I|14.021|125@progre] Processing [iter=2021100/2073600, progress=97.5%, ETA=0.0s]
[I|14.039|132@progre] Processing [completed]
../_images/executed_functest_func_obj_loader_consistency_8_8.png
../_images/executed_functest_func_obj_loader_consistency_8_9.png
[I|15.342|48@assets ] Loading asset [name='camera_main']
[I|15.343|48@assets ] Loading asset [name='model_obj']
[I|15.343|29@objload]   Loading OBJ file [path='cube.obj']
[I|15.343|169@objloa]   Loading MTL file [path='default.mtl']
[I|15.343|44@texture]   Loading texture [path='default.png']
[I|15.357|246@scene ] Building acceleration structure [name='accel::nanort']
[I|15.357|38@accel_n]   Flattening scene
[I|15.357|68@accel_n]   Building
[I|15.357|48@assets ] Loading asset [name='film_output']
[I|15.444|151@user  ] Starting render [name='renderer::raycast']
[I|15.945|125@progre] Processing [iter=1250600/2073600, progress=60.3%, ETA=0.3s]
[I|16.264|132@progre] Processing [completed]
../_images/executed_functest_func_obj_loader_consistency_8_11.png
[I|17.071|48@assets ] Loading asset [name='camera_main']
[I|17.071|48@assets ] Loading asset [name='model_obj']
[I|17.072|44@texture]   Loading texture [path='default.png']
[I|17.086|246@scene ] Building acceleration structure [name='accel::nanort']
[I|17.086|38@accel_n]   Flattening scene
[I|17.086|68@accel_n]   Building
[I|17.086|48@assets ] Loading asset [name='film_output']
[I|17.173|151@user  ] Starting render [name='renderer::raycast']
[I|17.674|125@progre] Processing [iter=1233200/2073600, progress=59.5%, ETA=0.3s]
[I|18.004|132@progre] Processing [completed]
../_images/executed_functest_func_obj_loader_consistency_8_13.png
../_images/executed_functest_func_obj_loader_consistency_8_14.png