Metadata-Version: 2.1
Name: panda3d-simplepbr
Version: 0.7
Summary: A simple, lightweight PBR render pipeline for Panda3D
Home-page: https://github.com/Moguri/panda3d-simplepbr
Author: Mitchell Stokes
License: BSD
Keywords: panda3d
Platform: UNKNOWN
Classifier: Development Status :: 4 - Beta
Classifier: License :: OSI Approved :: BSD License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Requires-Python: >=3.6.0
Description-Content-Type: text/markdown
Requires-Dist: panda3d

![Build Status](https://github.com/Moguri/panda3d-simplepbr/workflows/Pipeline/badge.svg)
[![](https://img.shields.io/pypi/pyversions/panda3d_simplepbr.svg)](https://pypi.org/project/panda3d_simplepbr/)
[![Panda3D Versions](https://img.shields.io/badge/panda3d-1.10%20%7C%201.11-blue.svg)](https://www.panda3d.org/)
[![](https://img.shields.io/github/license/Moguri/panda3d-simplepbr.svg)](https://choosealicense.com/licenses/bsd-3-clause/)

# panda3d-simplepbr

This is a simple, basic, lightweight, no-frills PBR render pipeline for [Panda3D](https://www.panda3d.org/).
It is currently intended to be used with [panda3d-gltf](https://github.com/Moguri/panda3d-gltf), which will output textures in the right order.
The PBR shader is heavily inspired by the [Khronos glTF Sample Viewer](https://github.com/KhronosGroup/glTF-Sample-Viewer).
*Note:* this project does not make an attempt to match a reference renderer.

## Features
* Supports running on a wide range of hardware with an easy OpenGL 2.1+ requirement
* Forward rendered metal-rough PBR
* All Panda3D light types (point, directional, spot, and ambient)
* Filmic tonemapping 
* Normal maps
* Emission maps
* Occlusion maps
* Basic shadow mapping for DirectionalLight and Spotlight

## Notable Todos
There are a few big things still missing and are planned to be implemented:

* Shadow mapping for PointLight
* IBL Diffuse
* IBL Specular

## Other missing features
The goal is to keep this simple and lightweight.
As such, the following missing features are *not* currently on the roadmap:

* Something to deal with many lights (e.g., deferred, forward+, tiling, clustering, etc.)
* Fancy post-process effects (temporal anti-aliasing, ambient occlusion, screen-space reflections)
* Environment probes

## Installation

Use pip to install the `panda3d-simplepbr` package:

```bash
pip install panda3d-simplepbr
```

To grab the latest development build, use:

```bash
pip install git+https://github.com/Moguri/panda3d-simplepbr.git

```

## Usage

Just add `simplepbr.init()` to your `ShowBase` instance:

```python
from direct.showbase.ShowBase import ShowBase

import simplepbr

class App(ShowBase):
    def __init__(self):
        super().__init__()

        simplepbr.init()
```

The `init()` function will choose typical defaults, but the following can be modified via keyword arguments:

`render_node`
: The node to attach the shader too, defaults to `base.render` if `None`

`window`
: The window to attach the framebuffer too, defaults to `base.win` if `None`

`camera_node`
: The NodePath of the camera to use when rendering the scene, defaults to `base.cam` if `None`

`msaa_samples`
: The number of samples to use for multisample anti-aliasing, defaults to 4

`max_lights`
: The maximum number of lights to render, defaults to 8

`use_normal_maps`
: Use normal maps to modify fragment normals, defaults to `False` (NOTE: Requires models with appropriate tangents defined)

 `use_emission_maps`
 Use emission maps, defaults to `True`

`use_occlusion_maps`
Use occlusion maps, defaults to `False` (NOTE: Requires occlusion channel in metal-roughness map)

`enable_shadows`
: Enable shadow map support (breaks with point lights), defaults to False

`enable_fog`
: Enable exponential fog, defaults to False

`exposure`
: a value used to multiply the screen-space color value prior to tonemapping, defaults to 1.0

Those parameters can also be modified later on by setting the related attribute of the simplepbr pipeline returned by the init() function:

```python
        pipeline = simplepbr.init()

        ...

        pipeline.use_normals_map = True
```

### Textures

The shader currently assumes that the following textures are in these slots:

0. BaseColor
1. MetalRoughness
2. Normals
3. Emission

## Example

For an example application using `panda3d-simplepbr` check out the [viewer](https://github.com/Moguri/panda3d-gltf/blob/master/gltf/viewer.py) in the [panda3d-gltf repo](https://github.com/Moguri/panda3d-gltf).

## Distributing

When using Panda3D's `build_apps` the data files (i.e., shader files) will not be copied by default.
Options are being explored to make this more automatic, but for the time being, add the following to `setup.py`:

```python
setup(
    # ...
    'package_data_dirs': {
        'simplepbr': [
            ('simplepbr/shaders*', '', {}),
         ],
     }
     # ...
)
```

## Running tests
```bash
python setup.py test
```

## License
[B3D 3-Clause](https://choosealicense.com/licenses/bsd-3-clause/)


