This allows users to implement arbitrary camera models using OSL by writing shaders that take an image position as input and compute ray origin and direction. The obvious applications for this are e.g. panorama modes, lens distortion models and realistic lens simulation, but the possibilities are endless. Currently, this is only supported on devices with OSL support, so CPU and OptiX. However, it is independent from the shading model used, so custom cameras can be used without getting the performance hit of OSL shading. A few samples are provided as Text Editor templates. One notable current limitation (in addition to the limited device support) is that inverse mapping is not supported, so Window texture coordinates and the Vector pass will not work with custom cameras. Pull Request: https://projects.blender.org/blender/blender/pulls/129495
107 lines
2.3 KiB
C++
107 lines
2.3 KiB
C++
/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0 */
|
|
|
|
#pragma once
|
|
|
|
#ifdef WITH_OSL
|
|
|
|
# include <OSL/oslexec.h>
|
|
|
|
# include "util/map.h"
|
|
# include "util/param.h"
|
|
# include "util/vector.h"
|
|
|
|
# include "kernel/types.h"
|
|
|
|
# include "kernel/osl/compat.h"
|
|
# include "kernel/osl/types.h"
|
|
|
|
# ifndef WIN32
|
|
using std::isfinite;
|
|
# endif
|
|
|
|
CCL_NAMESPACE_BEGIN
|
|
|
|
class OSLRenderServices;
|
|
class ColorSpaceProcessor;
|
|
struct ThreadKernelGlobalsCPU;
|
|
|
|
/* OSL Globals
|
|
*
|
|
* Data needed by OSL render services, that is global to a rendering session.
|
|
* This includes all OSL shaders, name to attribute mapping and texture handles.
|
|
*/
|
|
|
|
struct OSLGlobals {
|
|
OSLGlobals()
|
|
{
|
|
ss = nullptr;
|
|
ts = nullptr;
|
|
services = nullptr;
|
|
use_shading = false;
|
|
use_camera = false;
|
|
}
|
|
|
|
bool use_shading;
|
|
bool use_camera;
|
|
|
|
/* shading system */
|
|
OSL::ShadingSystem *ss;
|
|
OSL::TextureSystem *ts;
|
|
OSLRenderServices *services;
|
|
|
|
/* shader states */
|
|
vector<OSL::ShaderGroupRef> surface_state;
|
|
vector<OSL::ShaderGroupRef> volume_state;
|
|
vector<OSL::ShaderGroupRef> displacement_state;
|
|
vector<OSL::ShaderGroupRef> bump_state;
|
|
OSL::ShaderGroupRef background_state;
|
|
OSL::ShaderGroupRef camera_state;
|
|
|
|
/* attributes */
|
|
using ObjectNameMap = unordered_map<OSLUStringHash, int>;
|
|
|
|
ObjectNameMap object_name_map;
|
|
vector<ustring> object_names;
|
|
};
|
|
|
|
/* trace() call result */
|
|
struct OSLTraceData {
|
|
Ray ray;
|
|
Intersection isect;
|
|
ShaderData sd;
|
|
bool setup;
|
|
bool init;
|
|
bool hit;
|
|
};
|
|
|
|
/* thread key for thread specific data lookup */
|
|
struct OSLThreadData {
|
|
/* Global Data */
|
|
OSLGlobals *globals = nullptr;
|
|
OSL::ShadingSystem *ss = nullptr;
|
|
|
|
/* Per-thread data. */
|
|
int thread_index = -1;
|
|
|
|
mutable ShaderGlobals shader_globals;
|
|
mutable OSLTraceData tracedata;
|
|
|
|
OSL::PerThreadInfo *osl_thread_info = nullptr;
|
|
OSL::ShadingContext *context = nullptr;
|
|
OIIO::TextureSystem::Perthread *oiio_thread_info = nullptr;
|
|
|
|
OSLThreadData(OSLGlobals *globals, const int thread_index);
|
|
~OSLThreadData();
|
|
|
|
OSLThreadData(OSLThreadData &other) = delete;
|
|
OSLThreadData(OSLThreadData &&other) noexcept;
|
|
OSLThreadData &operator=(const OSLThreadData &other) = delete;
|
|
OSLThreadData &operator=(OSLThreadData &&other) = delete;
|
|
};
|
|
|
|
CCL_NAMESPACE_END
|
|
|
|
#endif
|