mirror of
https://github.com/godotengine/godot.git
synced 2026-01-03 18:11:19 +03:00
Merge pull request #44628 from JFonS/new_cpu_lightmapper_3.2
[3.2] New CPU lightmapper
This commit is contained in:
118
modules/denoise/SCsub
Normal file
118
modules/denoise/SCsub
Normal file
@@ -0,0 +1,118 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import resource_to_cpp
|
||||
|
||||
Import("env")
|
||||
Import("env_modules")
|
||||
|
||||
env_oidn = env_modules.Clone()
|
||||
|
||||
# Thirdparty source files
|
||||
thirdparty_dir = "#thirdparty/oidn/"
|
||||
thirdparty_sources = [
|
||||
"core/api.cpp",
|
||||
"core/device.cpp",
|
||||
"core/filter.cpp",
|
||||
"core/network.cpp",
|
||||
"core/autoencoder.cpp",
|
||||
"core/transfer_function.cpp",
|
||||
"weights/rtlightmap_hdr.gen.cpp",
|
||||
"mkl-dnn/src/common/batch_normalization.cpp",
|
||||
"mkl-dnn/src/common/concat.cpp",
|
||||
"mkl-dnn/src/common/convolution.cpp",
|
||||
"mkl-dnn/src/common/convolution_pd.cpp",
|
||||
"mkl-dnn/src/common/deconvolution.cpp",
|
||||
"mkl-dnn/src/common/eltwise.cpp",
|
||||
"mkl-dnn/src/common/engine.cpp",
|
||||
"mkl-dnn/src/common/inner_product.cpp",
|
||||
"mkl-dnn/src/common/inner_product_pd.cpp",
|
||||
"mkl-dnn/src/common/lrn.cpp",
|
||||
"mkl-dnn/src/common/memory.cpp",
|
||||
"mkl-dnn/src/common/memory_desc_wrapper.cpp",
|
||||
"mkl-dnn/src/common/mkldnn_debug.cpp",
|
||||
"mkl-dnn/src/common/mkldnn_debug_autogenerated.cpp",
|
||||
"mkl-dnn/src/common/pooling.cpp",
|
||||
"mkl-dnn/src/common/primitive.cpp",
|
||||
"mkl-dnn/src/common/primitive_attr.cpp",
|
||||
"mkl-dnn/src/common/primitive_desc.cpp",
|
||||
"mkl-dnn/src/common/primitive_exec_types.cpp",
|
||||
"mkl-dnn/src/common/primitive_iterator.cpp",
|
||||
"mkl-dnn/src/common/query.cpp",
|
||||
"mkl-dnn/src/common/reorder.cpp",
|
||||
"mkl-dnn/src/common/rnn.cpp",
|
||||
"mkl-dnn/src/common/scratchpad.cpp",
|
||||
"mkl-dnn/src/common/shuffle.cpp",
|
||||
"mkl-dnn/src/common/softmax.cpp",
|
||||
"mkl-dnn/src/common/stream.cpp",
|
||||
"mkl-dnn/src/common/sum.cpp",
|
||||
"mkl-dnn/src/common/utils.cpp",
|
||||
"mkl-dnn/src/common/verbose.cpp",
|
||||
"mkl-dnn/src/cpu/cpu_barrier.cpp",
|
||||
"mkl-dnn/src/cpu/cpu_concat.cpp",
|
||||
"mkl-dnn/src/cpu/cpu_engine.cpp",
|
||||
"mkl-dnn/src/cpu/cpu_memory.cpp",
|
||||
"mkl-dnn/src/cpu/cpu_reducer.cpp",
|
||||
"mkl-dnn/src/cpu/cpu_reorder.cpp",
|
||||
"mkl-dnn/src/cpu/cpu_sum.cpp",
|
||||
"mkl-dnn/src/cpu/jit_avx2_conv_kernel_f32.cpp",
|
||||
"mkl-dnn/src/cpu/jit_avx2_convolution.cpp",
|
||||
"mkl-dnn/src/cpu/jit_avx512_common_conv_kernel.cpp",
|
||||
"mkl-dnn/src/cpu/jit_avx512_common_conv_winograd_kernel_f32.cpp",
|
||||
"mkl-dnn/src/cpu/jit_avx512_common_convolution.cpp",
|
||||
"mkl-dnn/src/cpu/jit_avx512_common_convolution_winograd.cpp",
|
||||
"mkl-dnn/src/cpu/jit_avx512_core_fp32_wino_conv_2x3.cpp",
|
||||
"mkl-dnn/src/cpu/jit_avx512_core_fp32_wino_conv_4x3.cpp",
|
||||
"mkl-dnn/src/cpu/jit_avx512_core_fp32_wino_conv_4x3_kernel.cpp",
|
||||
"mkl-dnn/src/cpu/jit_sse42_conv_kernel_f32.cpp",
|
||||
"mkl-dnn/src/cpu/jit_sse42_convolution.cpp",
|
||||
"mkl-dnn/src/cpu/jit_transpose_src_utils.cpp",
|
||||
"mkl-dnn/src/cpu/jit_uni_eltwise.cpp",
|
||||
"mkl-dnn/src/cpu/jit_uni_pool_kernel_f32.cpp",
|
||||
"mkl-dnn/src/cpu/jit_uni_pooling.cpp",
|
||||
"mkl-dnn/src/cpu/jit_uni_reorder.cpp",
|
||||
"mkl-dnn/src/cpu/jit_uni_reorder_utils.cpp",
|
||||
"mkl-dnn/src/cpu/jit_utils/jit_utils.cpp",
|
||||
"mkl-dnn/src/cpu/jit_utils/jitprofiling/jitprofiling.c",
|
||||
"common/platform.cpp",
|
||||
"common/thread.cpp",
|
||||
"common/tensor.cpp",
|
||||
]
|
||||
thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources]
|
||||
|
||||
thirdparty_include_dirs = [
|
||||
"",
|
||||
"include",
|
||||
"mkl-dnn/include",
|
||||
"mkl-dnn/src",
|
||||
"mkl-dnn/src/common",
|
||||
"mkl-dnn/src/cpu/xbyak",
|
||||
"mkl-dnn/src/cpu",
|
||||
]
|
||||
thirdparty_include_dirs = [thirdparty_dir + file for file in thirdparty_include_dirs]
|
||||
|
||||
|
||||
env_oidn.Prepend(CPPPATH=thirdparty_include_dirs)
|
||||
env_oidn.Append(
|
||||
CPPDEFINES=[
|
||||
"MKLDNN_THR=MKLDNN_THR_SEQ",
|
||||
"OIDN_STATIC_LIB",
|
||||
"__STDC_CONSTANT_MACROS",
|
||||
"__STDC_LIMIT_MACROS",
|
||||
"DISABLE_VERBOSE",
|
||||
"MKLDNN_ENABLE_CONCURRENT_EXEC",
|
||||
"NDEBUG",
|
||||
]
|
||||
)
|
||||
|
||||
env_thirdparty = env_oidn.Clone()
|
||||
env_thirdparty.disable_warnings()
|
||||
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources)
|
||||
|
||||
weights_in_path = thirdparty_dir + "weights/rtlightmap_hdr.tza"
|
||||
weights_out_path = thirdparty_dir + "weights/rtlightmap_hdr.gen.cpp"
|
||||
|
||||
env_thirdparty.Depends(weights_out_path, weights_in_path)
|
||||
env_thirdparty.CommandNoCache(weights_out_path, weights_in_path, resource_to_cpp.tza_to_cpp)
|
||||
|
||||
env_oidn.add_source_files(env.modules_sources, "denoise_wrapper.cpp")
|
||||
env_modules.add_source_files(env.modules_sources, ["register_types.cpp", "lightmap_denoiser.cpp"])
|
||||
15
modules/denoise/config.py
Normal file
15
modules/denoise/config.py
Normal file
@@ -0,0 +1,15 @@
|
||||
def can_build(env, platform):
|
||||
# Thirdparty dependency OpenImage Denoise includes oneDNN library
|
||||
# which only supports 64-bit architectures.
|
||||
# It's also only relevant for tools build and desktop platforms,
|
||||
# as doing lightmap generation and denoising on Android or HTML5
|
||||
# would be a bit far-fetched.
|
||||
# Note: oneDNN doesn't support ARM64, OIDN needs updating to the latest version
|
||||
supported_platform = platform in ["x11", "osx", "windows", "server"]
|
||||
supported_bits = env["bits"] == "64"
|
||||
supported_arch = env["arch"] != "arm64"
|
||||
return env["tools"] and supported_platform and supported_bits and supported_arch
|
||||
|
||||
|
||||
def configure(env):
|
||||
pass
|
||||
67
modules/denoise/denoise_wrapper.cpp
Normal file
67
modules/denoise/denoise_wrapper.cpp
Normal file
@@ -0,0 +1,67 @@
|
||||
/*************************************************************************/
|
||||
/* denoise_wrapper.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#include "denoise_wrapper.h"
|
||||
#include "core/os/copymem.h"
|
||||
#include "core/os/memory.h"
|
||||
#include "thirdparty/oidn/include/OpenImageDenoise/oidn.h"
|
||||
#include <stdio.h>
|
||||
|
||||
void *oidn_denoiser_init() {
|
||||
OIDNDeviceImpl *device = oidnNewDevice(OIDN_DEVICE_TYPE_CPU);
|
||||
oidnCommitDevice(device);
|
||||
return device;
|
||||
}
|
||||
|
||||
bool oidn_denoise(void *deviceptr, float *p_floats, int p_width, int p_height) {
|
||||
OIDNDeviceImpl *device = (OIDNDeviceImpl *)deviceptr;
|
||||
OIDNFilter filter = oidnNewFilter(device, "RTLightmap");
|
||||
void *input_buffer = memalloc(p_width * p_height * 3 * sizeof(float));
|
||||
copymem(input_buffer, p_floats, p_width * p_height * 3 * sizeof(float));
|
||||
oidnSetSharedFilterImage(filter, "color", input_buffer, OIDN_FORMAT_FLOAT3, p_width, p_height, 0, 0, 0);
|
||||
oidnSetSharedFilterImage(filter, "output", (void *)p_floats, OIDN_FORMAT_FLOAT3, p_width, p_height, 0, 0, 0);
|
||||
oidnSetFilter1b(filter, "hdr", true);
|
||||
oidnCommitFilter(filter);
|
||||
oidnExecuteFilter(filter);
|
||||
|
||||
const char *msg;
|
||||
bool success = true;
|
||||
if (oidnGetDeviceError(device, &msg) != OIDN_ERROR_NONE) {
|
||||
printf("LightmapDenoiser: %s\n", msg);
|
||||
success = false;
|
||||
}
|
||||
|
||||
oidnReleaseFilter(filter);
|
||||
return success;
|
||||
}
|
||||
|
||||
void oidn_denoiser_finish(void *device) {
|
||||
oidnReleaseDevice((OIDNDeviceImpl *)device);
|
||||
}
|
||||
38
modules/denoise/denoise_wrapper.h
Normal file
38
modules/denoise/denoise_wrapper.h
Normal file
@@ -0,0 +1,38 @@
|
||||
/*************************************************************************/
|
||||
/* denoise_wrapper.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#ifndef DENOISE_WRAPPER_H
|
||||
#define DENOISE_WRAPPER_H
|
||||
|
||||
void *oidn_denoiser_init();
|
||||
bool oidn_denoise(void *device, float *p_floats, int p_width, int p_height);
|
||||
void oidn_denoiser_finish(void *device);
|
||||
|
||||
#endif // DENOISE_WRAPPER_H
|
||||
66
modules/denoise/lightmap_denoiser.cpp
Normal file
66
modules/denoise/lightmap_denoiser.cpp
Normal file
@@ -0,0 +1,66 @@
|
||||
/*************************************************************************/
|
||||
/* lightmap_denoiser.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#include "lightmap_denoiser.h"
|
||||
|
||||
#include "denoise_wrapper.h"
|
||||
|
||||
LightmapDenoiser *LightmapDenoiserOIDN::create_oidn_denoiser() {
|
||||
return memnew(LightmapDenoiserOIDN);
|
||||
}
|
||||
|
||||
void LightmapDenoiserOIDN::make_default_denoiser() {
|
||||
create_function = create_oidn_denoiser;
|
||||
}
|
||||
|
||||
Ref<Image> LightmapDenoiserOIDN::denoise_image(const Ref<Image> &p_image) {
|
||||
Ref<Image> img = p_image->duplicate();
|
||||
|
||||
img->convert(Image::FORMAT_RGBF);
|
||||
|
||||
PoolByteArray data = img->get_data();
|
||||
{
|
||||
PoolByteArray::Write w = data.write();
|
||||
if (!oidn_denoise(device, (float *)w.ptr(), img->get_width(), img->get_height())) {
|
||||
return p_image;
|
||||
}
|
||||
}
|
||||
|
||||
img->create(img->get_width(), img->get_height(), false, img->get_format(), data);
|
||||
return img;
|
||||
}
|
||||
|
||||
LightmapDenoiserOIDN::LightmapDenoiserOIDN() {
|
||||
device = oidn_denoiser_init();
|
||||
}
|
||||
|
||||
LightmapDenoiserOIDN::~LightmapDenoiserOIDN() {
|
||||
oidn_denoiser_finish(device);
|
||||
}
|
||||
56
modules/denoise/lightmap_denoiser.h
Normal file
56
modules/denoise/lightmap_denoiser.h
Normal file
@@ -0,0 +1,56 @@
|
||||
/*************************************************************************/
|
||||
/* lightmap_denoiser.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#ifndef LIGHTMAP_DENOISER_H
|
||||
#define LIGHTMAP_DENOISER_H
|
||||
|
||||
#include "core/class_db.h"
|
||||
#include "scene/3d/lightmapper.h"
|
||||
|
||||
struct OIDNDeviceImpl;
|
||||
|
||||
class LightmapDenoiserOIDN : public LightmapDenoiser {
|
||||
GDCLASS(LightmapDenoiserOIDN, LightmapDenoiser);
|
||||
|
||||
protected:
|
||||
void *device = nullptr;
|
||||
|
||||
public:
|
||||
static LightmapDenoiser *create_oidn_denoiser();
|
||||
|
||||
Ref<Image> denoise_image(const Ref<Image> &p_image);
|
||||
|
||||
static void make_default_denoiser();
|
||||
|
||||
LightmapDenoiserOIDN();
|
||||
~LightmapDenoiserOIDN();
|
||||
};
|
||||
|
||||
#endif // LIGHTMAP_DENOISER_H
|
||||
41
modules/denoise/register_types.cpp
Normal file
41
modules/denoise/register_types.cpp
Normal file
@@ -0,0 +1,41 @@
|
||||
/*************************************************************************/
|
||||
/* register_types.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#include "register_types.h"
|
||||
|
||||
#include "core/engine.h"
|
||||
#include "lightmap_denoiser.h"
|
||||
|
||||
void register_denoise_types() {
|
||||
LightmapDenoiserOIDN::make_default_denoiser();
|
||||
}
|
||||
|
||||
void unregister_denoise_types() {
|
||||
}
|
||||
37
modules/denoise/register_types.h
Normal file
37
modules/denoise/register_types.h
Normal file
@@ -0,0 +1,37 @@
|
||||
/*************************************************************************/
|
||||
/* register_types.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#ifndef DENOISE_REGISTER_TYPES_H
|
||||
#define DENOISE_REGISTER_TYPES_H
|
||||
|
||||
void register_denoise_types();
|
||||
void unregister_denoise_types();
|
||||
|
||||
#endif // DENOISE_REGISTER_TYPES_H
|
||||
68
modules/denoise/resource_to_cpp.py
Normal file
68
modules/denoise/resource_to_cpp.py
Normal file
@@ -0,0 +1,68 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
## ======================================================================== ##
|
||||
## Copyright 2009-2019 Intel Corporation ##
|
||||
## ##
|
||||
## Licensed under the Apache License, Version 2.0 (the "License"); ##
|
||||
## you may not use this file except in compliance with the License. ##
|
||||
## You may obtain a copy of the License at ##
|
||||
## ##
|
||||
## http://www.apache.org/licenses/LICENSE-2.0 ##
|
||||
## ##
|
||||
## Unless required by applicable law or agreed to in writing, software ##
|
||||
## distributed under the License is distributed on an "AS IS" BASIS, ##
|
||||
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ##
|
||||
## See the License for the specific language governing permissions and ##
|
||||
## limitations under the License. ##
|
||||
## ======================================================================== ##
|
||||
|
||||
import os
|
||||
from array import array
|
||||
|
||||
# Generates a C++ file from the specified binary resource file
|
||||
def generate(in_path, out_path):
|
||||
|
||||
namespace = "oidn::weights"
|
||||
scopes = namespace.split("::")
|
||||
|
||||
file_name = os.path.basename(in_path)
|
||||
var_name = os.path.splitext(file_name)[0]
|
||||
|
||||
with open(in_path, "rb") as in_file, open(out_path, "w") as out_file:
|
||||
# Header
|
||||
out_file.write("// Generated from: %s\n" % file_name)
|
||||
out_file.write("#include <cstddef>\n\n")
|
||||
|
||||
# Open the namespaces
|
||||
for s in scopes:
|
||||
out_file.write("namespace %s {\n" % s)
|
||||
if scopes:
|
||||
out_file.write("\n")
|
||||
|
||||
# Read the file
|
||||
in_data = array("B", in_file.read())
|
||||
|
||||
# Write the size
|
||||
out_file.write("//const size_t %s_size = %d;\n\n" % (var_name, len(in_data)))
|
||||
|
||||
# Write the data
|
||||
out_file.write("unsigned char %s[] = {" % var_name)
|
||||
for i in range(len(in_data)):
|
||||
c = in_data[i]
|
||||
if i > 0:
|
||||
out_file.write(",")
|
||||
if (i + 1) % 20 == 1:
|
||||
out_file.write("\n")
|
||||
out_file.write("%d" % c)
|
||||
out_file.write("\n};\n")
|
||||
|
||||
# Close the namespaces
|
||||
if scopes:
|
||||
out_file.write("\n")
|
||||
for scope in reversed(scopes):
|
||||
out_file.write("} // namespace %s\n" % scope)
|
||||
|
||||
|
||||
def tza_to_cpp(target, source, env):
|
||||
for x in zip(source, target):
|
||||
generate(str(x[0]), str(x[1]))
|
||||
9
modules/lightmapper_cpu/SCsub
Normal file
9
modules/lightmapper_cpu/SCsub
Normal file
@@ -0,0 +1,9 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
Import("env")
|
||||
Import("env_modules")
|
||||
|
||||
env_lightmapper_rd = env_modules.Clone()
|
||||
# Godot source files
|
||||
env_lightmapper_rd.Prepend(CPPPATH=["#thirdparty/embree/include"])
|
||||
env_lightmapper_rd.add_source_files(env.modules_sources, "*.cpp")
|
||||
6
modules/lightmapper_cpu/config.py
Normal file
6
modules/lightmapper_cpu/config.py
Normal file
@@ -0,0 +1,6 @@
|
||||
def can_build(env, platform):
|
||||
return env["tools"] and env["module_raycast_enabled"]
|
||||
|
||||
|
||||
def configure(env):
|
||||
pass
|
||||
1622
modules/lightmapper_cpu/lightmapper_cpu.cpp
Normal file
1622
modules/lightmapper_cpu/lightmapper_cpu.cpp
Normal file
File diff suppressed because it is too large
Load Diff
183
modules/lightmapper_cpu/lightmapper_cpu.h
Normal file
183
modules/lightmapper_cpu/lightmapper_cpu.h
Normal file
@@ -0,0 +1,183 @@
|
||||
/*************************************************************************/
|
||||
/* lightmapper_cpu.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#ifndef LIGHTMAPPER_CPU_H
|
||||
#define LIGHTMAPPER_CPU_H
|
||||
|
||||
#include "core/local_vector.h"
|
||||
#include "scene/3d/lightmapper.h"
|
||||
#include "scene/resources/mesh.h"
|
||||
#include "scene/resources/surface_tool.h"
|
||||
|
||||
#include <atomic>
|
||||
|
||||
class LightmapperCPU : public Lightmapper {
|
||||
GDCLASS(LightmapperCPU, Lightmapper)
|
||||
|
||||
struct MeshInstance {
|
||||
MeshData data;
|
||||
int slice = 0;
|
||||
Vector2i offset;
|
||||
Vector2i size;
|
||||
bool cast_shadows;
|
||||
bool generate_lightmap;
|
||||
String node_name;
|
||||
};
|
||||
|
||||
struct Light {
|
||||
Vector3 position;
|
||||
uint32_t type = LIGHT_TYPE_DIRECTIONAL;
|
||||
Vector3 direction;
|
||||
float energy;
|
||||
float indirect_multiplier;
|
||||
Color color;
|
||||
float range;
|
||||
float attenuation;
|
||||
float spot_angle;
|
||||
float spot_attenuation;
|
||||
bool bake_direct;
|
||||
};
|
||||
|
||||
struct LightmapTexel {
|
||||
Vector3 albedo;
|
||||
float alpha;
|
||||
Vector3 emission;
|
||||
Vector3 pos;
|
||||
Vector3 normal;
|
||||
|
||||
Vector3 direct_light;
|
||||
Vector3 output_light;
|
||||
|
||||
float area_coverage;
|
||||
};
|
||||
|
||||
struct BakeParams {
|
||||
float bias;
|
||||
int bounces;
|
||||
int samples;
|
||||
bool use_denoiser = true;
|
||||
Ref<Image> environment_panorama;
|
||||
Basis environment_transform;
|
||||
};
|
||||
|
||||
struct UVSeam {
|
||||
Vector2 edge0[2];
|
||||
Vector2 edge1[2];
|
||||
};
|
||||
|
||||
struct SeamEdge {
|
||||
Vector3 pos[2];
|
||||
Vector3 normal[2];
|
||||
Vector2 uv[2];
|
||||
|
||||
_FORCE_INLINE_ bool operator<(const SeamEdge &p_edge) const {
|
||||
return pos[0].x < p_edge.pos[0].x;
|
||||
}
|
||||
};
|
||||
|
||||
struct AtlasOffset {
|
||||
int slice;
|
||||
int x;
|
||||
int y;
|
||||
};
|
||||
|
||||
struct ThreadData;
|
||||
|
||||
typedef void (LightmapperCPU::*BakeThreadFunc)(uint32_t, void *);
|
||||
|
||||
struct ThreadData {
|
||||
LightmapperCPU *instance;
|
||||
uint32_t count;
|
||||
BakeThreadFunc thread_func;
|
||||
void *userdata;
|
||||
};
|
||||
|
||||
BakeParams parameters;
|
||||
|
||||
LocalVector<Ref<Image> > bake_textures;
|
||||
Map<RID, Ref<Image> > albedo_textures;
|
||||
Map<RID, Ref<Image> > emission_textures;
|
||||
|
||||
LocalVector<MeshInstance> mesh_instances;
|
||||
LocalVector<Light> lights;
|
||||
|
||||
LocalVector<LocalVector<LightmapTexel> > scene_lightmaps;
|
||||
LocalVector<LocalVector<int> > scene_lightmap_indices;
|
||||
Set<int> no_shadow_meshes;
|
||||
|
||||
std::atomic<uint32_t> thread_progress;
|
||||
std::atomic<bool> thread_cancelled;
|
||||
|
||||
Ref<LightmapRaycaster> raycaster;
|
||||
|
||||
Error _layout_atlas(int p_max_size, Vector2i *r_atlas_size, int *r_atlas_slices);
|
||||
|
||||
static void _thread_func_callback(void *p_thread_data);
|
||||
void _thread_func_wrapper(uint32_t p_idx, ThreadData *p_thread_data);
|
||||
bool _parallel_run(int p_count, const String &p_description, BakeThreadFunc p_thread_func, void *p_userdata, BakeStepFunc p_substep_func = nullptr);
|
||||
|
||||
void _generate_buffer(uint32_t p_idx, void *p_unused);
|
||||
Ref<Image> _init_bake_texture(const MeshData::TextureDef &p_texture_def, const Map<RID, Ref<Image> > &p_tex_cache, Image::Format p_default_format);
|
||||
Color _bilinear_sample(const Ref<Image> &p_img, const Vector2 &p_uv, bool p_clamp_x = false, bool p_clamp_y = false);
|
||||
Vector3 _fix_sample_position(const Vector3 &p_position, const Vector3 &p_texel_center, const Vector3 &p_normal, const Vector3 &p_tangent, const Vector3 &p_bitangent, const Vector2 &p_texel_size);
|
||||
void _plot_triangle(const Vector2 *p_vertices, const Vector3 *p_positions, const Vector3 *p_normals, const Vector2 *p_uvs, const Ref<Image> &p_albedo_texture, const Ref<Image> &p_emission_texture, Vector2i p_size, LocalVector<LightmapTexel> &r_texels, LocalVector<int> &r_lightmap_indices);
|
||||
|
||||
void _compute_direct_light(uint32_t p_idx, void *r_lightmap);
|
||||
|
||||
void _compute_indirect_light(uint32_t p_idx, void *r_lightmap);
|
||||
|
||||
void _post_process(uint32_t p_idx, void *r_output);
|
||||
void _compute_seams(const MeshInstance &p_mesh, LocalVector<UVSeam> &r_seams);
|
||||
void _fix_seams(const LocalVector<UVSeam> &p_seams, Vector3 *r_lightmap, Vector2i p_size);
|
||||
void _fix_seam(const Vector2 &p_pos0, const Vector2 &p_pos1, const Vector2 &p_uv0, const Vector2 &p_uv1, const Vector3 *p_read_buffer, Vector3 *r_write_buffer, const Vector2i &p_size);
|
||||
void _dilate_lightmap(Vector3 *r_lightmap, const LocalVector<int> p_indices, Vector2i p_size, int margin);
|
||||
|
||||
void _blit_lightmap(const Vector<Vector3> &p_src, const Vector2i &p_size, Ref<Image> &p_dst, int p_x, int p_y, bool p_with_padding);
|
||||
|
||||
public:
|
||||
virtual void add_albedo_texture(Ref<Texture> p_texture);
|
||||
virtual void add_emission_texture(Ref<Texture> p_texture);
|
||||
virtual void add_mesh(const MeshData &p_mesh, Vector2i p_size);
|
||||
virtual void add_directional_light(bool p_bake_direct, const Vector3 &p_direction, const Color &p_color, float p_energy, float p_indirect_multiplier);
|
||||
virtual void add_omni_light(bool p_bake_direct, const Vector3 &p_position, const Color &p_color, float p_energy, float p_indirect_multiplier, float p_range, float p_attenuation);
|
||||
virtual void add_spot_light(bool p_bake_direct, const Vector3 &p_position, const Vector3 p_direction, const Color &p_color, float p_energy, float p_indirect_multiplier, float p_range, float p_attenuation, float p_spot_angle, float p_spot_attenuation);
|
||||
virtual BakeError bake(BakeQuality p_quality, bool p_use_denoiser, int p_bounces, float p_bias, bool p_generate_atlas, int p_max_texture_size, const Ref<Image> &p_environment_panorama, const Basis &p_environment_transform, BakeStepFunc p_step_function = nullptr, void *p_bake_userdata = nullptr, BakeStepFunc p_substep_function = nullptr);
|
||||
|
||||
int get_bake_texture_count() const;
|
||||
Ref<Image> get_bake_texture(int p_index) const;
|
||||
int get_bake_mesh_count() const;
|
||||
Variant get_bake_mesh_userdata(int p_index) const;
|
||||
Rect2 get_bake_mesh_uv_scale(int p_index) const;
|
||||
int get_bake_mesh_texture_slice(int p_index) const;
|
||||
|
||||
LightmapperCPU();
|
||||
};
|
||||
|
||||
#endif // LIGHTMAPPER_H
|
||||
54
modules/lightmapper_cpu/register_types.cpp
Normal file
54
modules/lightmapper_cpu/register_types.cpp
Normal file
@@ -0,0 +1,54 @@
|
||||
/*************************************************************************/
|
||||
/* register_types.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#include "register_types.h"
|
||||
|
||||
#include "core/project_settings.h"
|
||||
#include "lightmapper_cpu.h"
|
||||
#include "scene/3d/lightmapper.h"
|
||||
|
||||
#ifndef _3D_DISABLED
|
||||
static Lightmapper *create_lightmapper_cpu() {
|
||||
return memnew(LightmapperCPU);
|
||||
}
|
||||
#endif
|
||||
|
||||
void register_lightmapper_cpu_types() {
|
||||
GLOBAL_DEF("rendering/cpu_lightmapper/quality/low_quality_ray_count", 64);
|
||||
GLOBAL_DEF("rendering/cpu_lightmapper/quality/medium_quality_ray_count", 256);
|
||||
GLOBAL_DEF("rendering/cpu_lightmapper/quality/high_quality_ray_count", 512);
|
||||
GLOBAL_DEF("rendering/cpu_lightmapper/quality/ultra_quality_ray_count", 1024);
|
||||
#ifndef _3D_DISABLED
|
||||
Lightmapper::create_cpu = create_lightmapper_cpu;
|
||||
#endif
|
||||
}
|
||||
|
||||
void unregister_lightmapper_cpu_types() {
|
||||
}
|
||||
37
modules/lightmapper_cpu/register_types.h
Normal file
37
modules/lightmapper_cpu/register_types.h
Normal file
@@ -0,0 +1,37 @@
|
||||
/*************************************************************************/
|
||||
/* register_types.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#ifndef LIGHTMAPPER_CPU_REGISTER_TYPES_H
|
||||
#define LIGHTMAPPER_CPU_REGISTER_TYPES_H
|
||||
|
||||
void register_lightmapper_cpu_types();
|
||||
void unregister_lightmapper_cpu_types();
|
||||
|
||||
#endif // LIGHTMAPPER_CPU_REGISTER_TYPES_H
|
||||
93
modules/raycast/SCsub
Normal file
93
modules/raycast/SCsub
Normal file
@@ -0,0 +1,93 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
Import("env")
|
||||
Import("env_modules")
|
||||
|
||||
embree_src = [
|
||||
"common/sys/sysinfo.cpp",
|
||||
"common/sys/alloc.cpp",
|
||||
"common/sys/filename.cpp",
|
||||
"common/sys/library.cpp",
|
||||
"common/sys/thread.cpp",
|
||||
"common/sys/string.cpp",
|
||||
"common/sys/regression.cpp",
|
||||
"common/sys/mutex.cpp",
|
||||
"common/sys/condition.cpp",
|
||||
"common/sys/barrier.cpp",
|
||||
"common/math/constants.cpp",
|
||||
"common/simd/sse.cpp",
|
||||
"common/lexers/stringstream.cpp",
|
||||
"common/lexers/tokenstream.cpp",
|
||||
"common/tasking/taskschedulerinternal.cpp",
|
||||
"common/algorithms/parallel_for.cpp",
|
||||
"common/algorithms/parallel_reduce.cpp",
|
||||
"common/algorithms/parallel_prefix_sum.cpp",
|
||||
"common/algorithms/parallel_for_for.cpp",
|
||||
"common/algorithms/parallel_for_for_prefix_sum.cpp",
|
||||
"common/algorithms/parallel_partition.cpp",
|
||||
"common/algorithms/parallel_sort.cpp",
|
||||
"common/algorithms/parallel_set.cpp",
|
||||
"common/algorithms/parallel_map.cpp",
|
||||
"common/algorithms/parallel_filter.cpp",
|
||||
"kernels/common/device.cpp",
|
||||
"kernels/common/stat.cpp",
|
||||
"kernels/common/acceln.cpp",
|
||||
"kernels/common/accelset.cpp",
|
||||
"kernels/common/state.cpp",
|
||||
"kernels/common/rtcore.cpp",
|
||||
"kernels/common/rtcore_builder.cpp",
|
||||
"kernels/common/scene.cpp",
|
||||
"kernels/common/alloc.cpp",
|
||||
"kernels/common/geometry.cpp",
|
||||
"kernels/common/scene_triangle_mesh.cpp",
|
||||
"kernels/geometry/primitive4.cpp",
|
||||
"kernels/builders/primrefgen.cpp",
|
||||
"kernels/bvh/bvh.cpp",
|
||||
"kernels/bvh/bvh_statistics.cpp",
|
||||
"kernels/bvh/bvh4_factory.cpp",
|
||||
"kernels/bvh/bvh8_factory.cpp",
|
||||
"kernels/bvh/bvh_collider.cpp",
|
||||
"kernels/bvh/bvh_rotate.cpp",
|
||||
"kernels/bvh/bvh_refit.cpp",
|
||||
"kernels/bvh/bvh_builder.cpp",
|
||||
"kernels/bvh/bvh_builder_morton.cpp",
|
||||
"kernels/bvh/bvh_builder_sah.cpp",
|
||||
"kernels/bvh/bvh_builder_sah_spatial.cpp",
|
||||
"kernels/bvh/bvh_builder_sah_mb.cpp",
|
||||
"kernels/bvh/bvh_builder_twolevel.cpp",
|
||||
"kernels/bvh/bvh_intersector1_bvh4.cpp",
|
||||
]
|
||||
|
||||
embree_dir = "#thirdparty/embree/"
|
||||
|
||||
env_embree = env_modules.Clone()
|
||||
embree_sources = [embree_dir + file for file in embree_src]
|
||||
env_embree.Prepend(CPPPATH=[embree_dir, embree_dir + "include"])
|
||||
env_embree.Append(
|
||||
CPPFLAGS=[
|
||||
"-DEMBREE_TARGET_SSE2",
|
||||
"-DEMBREE_LOWEST_ISA",
|
||||
"-msse2",
|
||||
"-DTASKING_INTERNAL",
|
||||
"-DNDEBUG",
|
||||
"-D__SSE2__",
|
||||
"-D__SSE__",
|
||||
]
|
||||
)
|
||||
|
||||
if not env_embree.msvc:
|
||||
env_embree.Append(CPPFLAGS=["-mxsave"])
|
||||
|
||||
if env["platform"] == "windows":
|
||||
if env.msvc:
|
||||
env.Append(LINKFLAGS=["psapi.lib"])
|
||||
else:
|
||||
env.Append(LIBS=["psapi"])
|
||||
|
||||
env_embree.disable_warnings()
|
||||
env_embree.add_source_files(env.modules_sources, embree_sources)
|
||||
|
||||
env_raycast = env_modules.Clone()
|
||||
env_raycast.Prepend(CPPPATH=[embree_dir, embree_dir + "include", embree_dir + "common"])
|
||||
|
||||
env_raycast.add_source_files(env.modules_sources, "*.cpp")
|
||||
13
modules/raycast/config.py
Normal file
13
modules/raycast/config.py
Normal file
@@ -0,0 +1,13 @@
|
||||
def can_build(env, platform):
|
||||
# Embree requires at least SSE2 to be available, so 32-bit and ARM64 builds are
|
||||
# not supported.
|
||||
# It's also only relevant for tools build and desktop platforms,
|
||||
# as doing lightmap generation on Android or HTML5 would be a bit far-fetched.
|
||||
supported_platform = platform in ["x11", "osx", "windows", "server"]
|
||||
supported_bits = env["bits"] == "64"
|
||||
supported_arch = env["arch"] != "arm64"
|
||||
return env["tools"] and supported_platform and supported_bits and supported_arch
|
||||
|
||||
|
||||
def configure(env):
|
||||
pass
|
||||
259
modules/raycast/godot_update_embree.py
Normal file
259
modules/raycast/godot_update_embree.py
Normal file
@@ -0,0 +1,259 @@
|
||||
import glob, os, shutil, subprocess, re
|
||||
|
||||
include_dirs = [
|
||||
"common/tasking",
|
||||
"kernels/bvh",
|
||||
"kernels/builders",
|
||||
"common/sys",
|
||||
"kernels",
|
||||
"kernels/common",
|
||||
"common/math",
|
||||
"common/algorithms",
|
||||
"common/lexers",
|
||||
"common/simd",
|
||||
"include/embree3",
|
||||
"kernels/subdiv",
|
||||
"kernels/geometry",
|
||||
]
|
||||
|
||||
cpp_files = [
|
||||
"common/sys/sysinfo.cpp",
|
||||
"common/sys/alloc.cpp",
|
||||
"common/sys/filename.cpp",
|
||||
"common/sys/library.cpp",
|
||||
"common/sys/thread.cpp",
|
||||
"common/sys/string.cpp",
|
||||
"common/sys/regression.cpp",
|
||||
"common/sys/mutex.cpp",
|
||||
"common/sys/condition.cpp",
|
||||
"common/sys/barrier.cpp",
|
||||
"common/math/constants.cpp",
|
||||
"common/simd/sse.cpp",
|
||||
"common/lexers/stringstream.cpp",
|
||||
"common/lexers/tokenstream.cpp",
|
||||
"common/tasking/taskschedulerinternal.cpp",
|
||||
"common/algorithms/parallel_for.cpp",
|
||||
"common/algorithms/parallel_reduce.cpp",
|
||||
"common/algorithms/parallel_prefix_sum.cpp",
|
||||
"common/algorithms/parallel_for_for.cpp",
|
||||
"common/algorithms/parallel_for_for_prefix_sum.cpp",
|
||||
"common/algorithms/parallel_partition.cpp",
|
||||
"common/algorithms/parallel_sort.cpp",
|
||||
"common/algorithms/parallel_set.cpp",
|
||||
"common/algorithms/parallel_map.cpp",
|
||||
"common/algorithms/parallel_filter.cpp",
|
||||
"kernels/common/device.cpp",
|
||||
"kernels/common/stat.cpp",
|
||||
"kernels/common/acceln.cpp",
|
||||
"kernels/common/accelset.cpp",
|
||||
"kernels/common/state.cpp",
|
||||
"kernels/common/rtcore.cpp",
|
||||
"kernels/common/rtcore_builder.cpp",
|
||||
"kernels/common/scene.cpp",
|
||||
"kernels/common/alloc.cpp",
|
||||
"kernels/common/geometry.cpp",
|
||||
"kernels/common/scene_triangle_mesh.cpp",
|
||||
"kernels/geometry/primitive4.cpp",
|
||||
"kernels/builders/primrefgen.cpp",
|
||||
"kernels/bvh/bvh.cpp",
|
||||
"kernels/bvh/bvh_statistics.cpp",
|
||||
"kernels/bvh/bvh4_factory.cpp",
|
||||
"kernels/bvh/bvh8_factory.cpp",
|
||||
"kernels/bvh/bvh_collider.cpp",
|
||||
"kernels/bvh/bvh_rotate.cpp",
|
||||
"kernels/bvh/bvh_refit.cpp",
|
||||
"kernels/bvh/bvh_builder.cpp",
|
||||
"kernels/bvh/bvh_builder_morton.cpp",
|
||||
"kernels/bvh/bvh_builder_sah.cpp",
|
||||
"kernels/bvh/bvh_builder_sah_spatial.cpp",
|
||||
"kernels/bvh/bvh_builder_sah_mb.cpp",
|
||||
"kernels/bvh/bvh_builder_twolevel.cpp",
|
||||
"kernels/bvh/bvh_intersector1.cpp",
|
||||
"kernels/bvh/bvh_intersector1_bvh4.cpp",
|
||||
]
|
||||
|
||||
os.chdir("../../thirdparty")
|
||||
|
||||
if os.path.exists("embree"):
|
||||
shutil.rmtree("embree")
|
||||
|
||||
subprocess.run(["git", "clone", "https://github.com/embree/embree.git", "embree-tmp"])
|
||||
os.chdir("embree-tmp")
|
||||
|
||||
commit_hash = str(subprocess.check_output(["git", "rev-parse", "HEAD"], universal_newlines=True)).strip()
|
||||
|
||||
dest_dir = "../embree"
|
||||
all_files = set(cpp_files)
|
||||
|
||||
for include_dir in include_dirs:
|
||||
headers = glob.iglob(os.path.join(include_dir, "*.h"))
|
||||
all_files.update(headers)
|
||||
|
||||
for f in all_files:
|
||||
d = os.path.join(dest_dir, os.path.dirname(f))
|
||||
if not os.path.exists(d):
|
||||
os.makedirs(d)
|
||||
shutil.copy2(f, d)
|
||||
|
||||
with open(os.path.join(dest_dir, "kernels/hash.h"), "w") as hash_file:
|
||||
hash_file.write(
|
||||
f"""
|
||||
// Copyright 2009-2020 Intel Corporation
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#define RTC_HASH "{commit_hash}"
|
||||
"""
|
||||
)
|
||||
|
||||
with open(os.path.join(dest_dir, "kernels/config.h"), "w") as config_file:
|
||||
config_file.write(
|
||||
"""
|
||||
// Copyright 2009-2020 Intel Corporation
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/* #undef EMBREE_RAY_MASK */
|
||||
/* #undef EMBREE_STAT_COUNTERS */
|
||||
/* #undef EMBREE_BACKFACE_CULLING */
|
||||
/* #undef EMBREE_BACKFACE_CULLING_CURVES */
|
||||
#define EMBREE_FILTER_FUNCTION
|
||||
/* #undef EMBREE_IGNORE_INVALID_RAYS */
|
||||
#define EMBREE_GEOMETRY_TRIANGLE
|
||||
/* #undef EMBREE_GEOMETRY_QUAD */
|
||||
/* #undef EMBREE_GEOMETRY_CURVE */
|
||||
/* #undef EMBREE_GEOMETRY_SUBDIVISION */
|
||||
/* #undef EMBREE_GEOMETRY_USER */
|
||||
/* #undef EMBREE_GEOMETRY_INSTANCE */
|
||||
/* #undef EMBREE_GEOMETRY_GRID */
|
||||
/* #undef EMBREE_GEOMETRY_POINT */
|
||||
/* #undef EMBREE_RAY_PACKETS */
|
||||
/* #undef EMBREE_COMPACT_POLYS */
|
||||
|
||||
#define EMBREE_CURVE_SELF_INTERSECTION_AVOIDANCE_FACTOR 2.0
|
||||
|
||||
#if defined(EMBREE_GEOMETRY_TRIANGLE)
|
||||
#define IF_ENABLED_TRIS(x) x
|
||||
#else
|
||||
#define IF_ENABLED_TRIS(x)
|
||||
#endif
|
||||
|
||||
#if defined(EMBREE_GEOMETRY_QUAD)
|
||||
#define IF_ENABLED_QUADS(x) x
|
||||
#else
|
||||
#define IF_ENABLED_QUADS(x)
|
||||
#endif
|
||||
|
||||
#if defined(EMBREE_GEOMETRY_CURVE) || defined(EMBREE_GEOMETRY_POINT)
|
||||
#define IF_ENABLED_CURVES_OR_POINTS(x) x
|
||||
#else
|
||||
#define IF_ENABLED_CURVES_OR_POINTS(x)
|
||||
#endif
|
||||
|
||||
#if defined(EMBREE_GEOMETRY_CURVE)
|
||||
#define IF_ENABLED_CURVES(x) x
|
||||
#else
|
||||
#define IF_ENABLED_CURVES(x)
|
||||
#endif
|
||||
|
||||
#if defined(EMBREE_GEOMETRY_POINT)
|
||||
#define IF_ENABLED_POINTS(x) x
|
||||
#else
|
||||
#define IF_ENABLED_POINTS(x)
|
||||
#endif
|
||||
|
||||
#if defined(EMBREE_GEOMETRY_SUBDIVISION)
|
||||
#define IF_ENABLED_SUBDIV(x) x
|
||||
#else
|
||||
#define IF_ENABLED_SUBDIV(x)
|
||||
#endif
|
||||
|
||||
#if defined(EMBREE_GEOMETRY_USER)
|
||||
#define IF_ENABLED_USER(x) x
|
||||
#else
|
||||
#define IF_ENABLED_USER(x)
|
||||
#endif
|
||||
|
||||
#if defined(EMBREE_GEOMETRY_INSTANCE)
|
||||
#define IF_ENABLED_INSTANCE(x) x
|
||||
#else
|
||||
#define IF_ENABLED_INSTANCE(x)
|
||||
#endif
|
||||
|
||||
#if defined(EMBREE_GEOMETRY_GRID)
|
||||
#define IF_ENABLED_GRIDS(x) x
|
||||
#else
|
||||
#define IF_ENABLED_GRIDS(x)
|
||||
#endif
|
||||
"""
|
||||
)
|
||||
|
||||
|
||||
with open("CMakeLists.txt", "r") as cmake_file:
|
||||
cmake_content = cmake_file.read()
|
||||
major_version = int(re.compile(r"EMBREE_VERSION_MAJOR\s(\d+)").findall(cmake_content)[0])
|
||||
minor_version = int(re.compile(r"EMBREE_VERSION_MINOR\s(\d+)").findall(cmake_content)[0])
|
||||
patch_version = int(re.compile(r"EMBREE_VERSION_PATCH\s(\d+)").findall(cmake_content)[0])
|
||||
|
||||
with open(os.path.join(dest_dir, "include/embree3/rtcore_config.h"), "w") as config_file:
|
||||
config_file.write(
|
||||
f"""
|
||||
// Copyright 2009-2020 Intel Corporation
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#pragma once
|
||||
|
||||
#define RTC_VERSION_MAJOR {major_version}
|
||||
#define RTC_VERSION_MINOR {minor_version}
|
||||
#define RTC_VERSION_PATCH {patch_version}
|
||||
#define RTC_VERSION {major_version}{minor_version:02d}{patch_version:02d}
|
||||
#define RTC_VERSION_STRING "{major_version}.{minor_version}.{patch_version}"
|
||||
|
||||
#define RTC_MAX_INSTANCE_LEVEL_COUNT 1
|
||||
|
||||
#define EMBREE_MIN_WIDTH 0
|
||||
#define RTC_MIN_WIDTH EMBREE_MIN_WIDTH
|
||||
|
||||
#define EMBREE_STATIC_LIB
|
||||
/* #undef EMBREE_API_NAMESPACE */
|
||||
|
||||
#if defined(EMBREE_API_NAMESPACE)
|
||||
# define RTC_NAMESPACE
|
||||
# define RTC_NAMESPACE_BEGIN namespace {{
|
||||
# define RTC_NAMESPACE_END }}
|
||||
# define RTC_NAMESPACE_USE using namespace ;
|
||||
# define RTC_API_EXTERN_C
|
||||
# undef EMBREE_API_NAMESPACE
|
||||
#else
|
||||
# define RTC_NAMESPACE_BEGIN
|
||||
# define RTC_NAMESPACE_END
|
||||
# define RTC_NAMESPACE_USE
|
||||
# if defined(__cplusplus)
|
||||
# define RTC_API_EXTERN_C extern "C"
|
||||
# else
|
||||
# define RTC_API_EXTERN_C
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(ISPC)
|
||||
# define RTC_API_IMPORT extern "C" unmasked
|
||||
# define RTC_API_EXPORT extern "C" unmasked
|
||||
#elif defined(EMBREE_STATIC_LIB)
|
||||
# define RTC_API_IMPORT RTC_API_EXTERN_C
|
||||
# define RTC_API_EXPORT RTC_API_EXTERN_C
|
||||
#elif defined(_WIN32)
|
||||
# define RTC_API_IMPORT RTC_API_EXTERN_C __declspec(dllimport)
|
||||
# define RTC_API_EXPORT RTC_API_EXTERN_C __declspec(dllexport)
|
||||
#else
|
||||
# define RTC_API_IMPORT RTC_API_EXTERN_C
|
||||
# define RTC_API_EXPORT RTC_API_EXTERN_C __attribute__ ((visibility ("default")))
|
||||
#endif
|
||||
|
||||
#if defined(RTC_EXPORT_API)
|
||||
# define RTC_API RTC_API_EXPORT
|
||||
#else
|
||||
# define RTC_API RTC_API_IMPORT
|
||||
#endif
|
||||
"""
|
||||
)
|
||||
|
||||
os.chdir("..")
|
||||
shutil.rmtree("embree-tmp")
|
||||
198
modules/raycast/lightmap_raycaster.cpp
Normal file
198
modules/raycast/lightmap_raycaster.cpp
Normal file
@@ -0,0 +1,198 @@
|
||||
/*************************************************************************/
|
||||
/* lightmap_raycaster.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#include "lightmap_raycaster.h"
|
||||
|
||||
// From Embree.
|
||||
#include <math/vec2.h>
|
||||
#include <math/vec3.h>
|
||||
|
||||
using namespace embree;
|
||||
|
||||
LightmapRaycaster *LightmapRaycasterEmbree::create_embree_raycaster() {
|
||||
return memnew(LightmapRaycasterEmbree);
|
||||
}
|
||||
|
||||
void LightmapRaycasterEmbree::make_default_raycaster() {
|
||||
create_function = create_embree_raycaster;
|
||||
}
|
||||
|
||||
void LightmapRaycasterEmbree::filter_function(const struct RTCFilterFunctionNArguments *p_args) {
|
||||
|
||||
RTCHit *hit = (RTCHit *)p_args->hit;
|
||||
|
||||
unsigned int geomID = hit->geomID;
|
||||
float u = hit->u;
|
||||
float v = hit->v;
|
||||
|
||||
LightmapRaycasterEmbree *scene = (LightmapRaycasterEmbree *)p_args->geometryUserPtr;
|
||||
RTCGeometry geom = rtcGetGeometry(scene->embree_scene, geomID);
|
||||
|
||||
rtcInterpolate0(geom, hit->primID, hit->u, hit->v, RTC_BUFFER_TYPE_VERTEX_ATTRIBUTE, 0, &hit->u, 2);
|
||||
|
||||
if (scene->alpha_textures.has(geomID)) {
|
||||
const AlphaTextureData &alpha_texture = scene->alpha_textures[geomID];
|
||||
|
||||
if (alpha_texture.sample(hit->u, hit->v) < 128) {
|
||||
p_args->valid[0] = 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
rtcInterpolate0(geom, hit->primID, u, v, RTC_BUFFER_TYPE_VERTEX_ATTRIBUTE, 1, &hit->Ng_x, 3);
|
||||
}
|
||||
|
||||
bool LightmapRaycasterEmbree::intersect(Ray &r_ray) {
|
||||
RTCIntersectContext context;
|
||||
|
||||
rtcInitIntersectContext(&context);
|
||||
|
||||
rtcIntersect1(embree_scene, &context, (RTCRayHit *)&r_ray);
|
||||
return r_ray.geomID != RTC_INVALID_GEOMETRY_ID;
|
||||
}
|
||||
|
||||
void LightmapRaycasterEmbree::intersect(Vector<Ray> &r_rays) {
|
||||
Ray *rays = r_rays.ptrw();
|
||||
for (int i = 0; i < r_rays.size(); ++i) {
|
||||
intersect(rays[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void LightmapRaycasterEmbree::set_mesh_alpha_texture(Ref<Image> p_alpha_texture, unsigned int p_id) {
|
||||
if (p_alpha_texture.is_valid() && p_alpha_texture->get_size() != Vector2i()) {
|
||||
AlphaTextureData tex;
|
||||
tex.size = p_alpha_texture->get_size();
|
||||
tex.data.resize(tex.size.x * tex.size.y);
|
||||
|
||||
{
|
||||
PoolVector<uint8_t>::Read r = p_alpha_texture->get_data().read();
|
||||
uint8_t *ptrw = tex.data.ptrw();
|
||||
for (int i = 0; i < tex.size.x * tex.size.y; ++i) {
|
||||
ptrw[i] = r[i];
|
||||
}
|
||||
}
|
||||
|
||||
alpha_textures.insert(p_id, tex);
|
||||
}
|
||||
}
|
||||
|
||||
float blerp(float c00, float c10, float c01, float c11, float tx, float ty) {
|
||||
return Math::lerp(Math::lerp(c00, c10, tx), Math::lerp(c01, c11, tx), ty);
|
||||
}
|
||||
|
||||
uint8_t LightmapRaycasterEmbree::AlphaTextureData::sample(float u, float v) const {
|
||||
float x = u * size.x;
|
||||
float y = v * size.y;
|
||||
int xi = (int)x;
|
||||
int yi = (int)y;
|
||||
|
||||
uint8_t texels[4];
|
||||
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
int sample_x = CLAMP(xi + i % 2, 0, size.x - 1);
|
||||
int sample_y = CLAMP(yi + i / 2, 0, size.y - 1);
|
||||
texels[i] = data[sample_y * size.x + sample_x];
|
||||
}
|
||||
|
||||
return Math::round(blerp(texels[0], texels[1], texels[2], texels[3], x - xi, y - yi));
|
||||
}
|
||||
|
||||
void LightmapRaycasterEmbree::add_mesh(const Vector<Vector3> &p_vertices, const Vector<Vector3> &p_normals, const Vector<Vector2> &p_uv2s, unsigned int p_id) {
|
||||
|
||||
RTCGeometry embree_mesh = rtcNewGeometry(embree_device, RTC_GEOMETRY_TYPE_TRIANGLE);
|
||||
|
||||
rtcSetGeometryVertexAttributeCount(embree_mesh, 2);
|
||||
|
||||
int vertex_count = p_vertices.size();
|
||||
|
||||
ERR_FAIL_COND(vertex_count % 3 != 0);
|
||||
ERR_FAIL_COND(vertex_count != p_uv2s.size());
|
||||
|
||||
Vec3fa *embree_vertices = (Vec3fa *)rtcSetNewGeometryBuffer(embree_mesh, RTC_BUFFER_TYPE_VERTEX, 0, RTC_FORMAT_FLOAT3, sizeof(Vec3fa), vertex_count);
|
||||
Vec2fa *embree_light_uvs = (Vec2fa *)rtcSetNewGeometryBuffer(embree_mesh, RTC_BUFFER_TYPE_VERTEX_ATTRIBUTE, 0, RTC_FORMAT_FLOAT2, sizeof(Vec2fa), vertex_count);
|
||||
uint32_t *embree_triangles = (uint32_t *)rtcSetNewGeometryBuffer(embree_mesh, RTC_BUFFER_TYPE_INDEX, 0, RTC_FORMAT_UINT3, sizeof(uint32_t) * 3, vertex_count / 3);
|
||||
|
||||
Vec3fa *embree_normals = nullptr;
|
||||
if (!p_normals.empty()) {
|
||||
embree_normals = (Vec3fa *)rtcSetNewGeometryBuffer(embree_mesh, RTC_BUFFER_TYPE_VERTEX_ATTRIBUTE, 1, RTC_FORMAT_FLOAT3, sizeof(Vec3fa), vertex_count);
|
||||
}
|
||||
|
||||
for (uint32_t i = 0; i < vertex_count; i++) {
|
||||
embree_vertices[i] = Vec3fa(p_vertices[i].x, p_vertices[i].y, p_vertices[i].z);
|
||||
embree_light_uvs[i] = Vec2fa(p_uv2s[i].x, p_uv2s[i].y);
|
||||
if (embree_normals != nullptr) {
|
||||
embree_normals[i] = Vec3fa(p_normals[i].x, p_normals[i].y, p_normals[i].z);
|
||||
}
|
||||
embree_triangles[i] = i;
|
||||
}
|
||||
|
||||
rtcCommitGeometry(embree_mesh);
|
||||
rtcSetGeometryIntersectFilterFunction(embree_mesh, filter_function);
|
||||
rtcSetGeometryUserData(embree_mesh, this);
|
||||
rtcAttachGeometryByID(embree_scene, embree_mesh, p_id);
|
||||
rtcReleaseGeometry(embree_mesh);
|
||||
}
|
||||
|
||||
void LightmapRaycasterEmbree::commit() {
|
||||
rtcCommitScene(embree_scene);
|
||||
}
|
||||
|
||||
void LightmapRaycasterEmbree::set_mesh_filter(const Set<int> &p_mesh_ids) {
|
||||
for (Set<int>::Element *E = p_mesh_ids.front(); E; E = E->next()) {
|
||||
rtcDisableGeometry(rtcGetGeometry(embree_scene, E->get()));
|
||||
}
|
||||
rtcCommitScene(embree_scene);
|
||||
filter_meshes = p_mesh_ids;
|
||||
}
|
||||
|
||||
void LightmapRaycasterEmbree::clear_mesh_filter() {
|
||||
for (Set<int>::Element *E = filter_meshes.front(); E; E = E->next()) {
|
||||
rtcEnableGeometry(rtcGetGeometry(embree_scene, E->get()));
|
||||
}
|
||||
rtcCommitScene(embree_scene);
|
||||
filter_meshes.clear();
|
||||
}
|
||||
|
||||
void embree_error_handler(void *p_user_data, RTCError p_code, const char *p_str) {
|
||||
print_error("Embree error: " + String(p_str));
|
||||
}
|
||||
|
||||
LightmapRaycasterEmbree::LightmapRaycasterEmbree() {
|
||||
embree_device = rtcNewDevice(nullptr);
|
||||
rtcSetDeviceErrorFunction(embree_device, &embree_error_handler, nullptr);
|
||||
embree_scene = rtcNewScene(embree_device);
|
||||
}
|
||||
|
||||
LightmapRaycasterEmbree::~LightmapRaycasterEmbree() {
|
||||
if (embree_scene != nullptr)
|
||||
rtcReleaseScene(embree_scene);
|
||||
if (embree_device != nullptr)
|
||||
rtcReleaseDevice(embree_device);
|
||||
}
|
||||
73
modules/raycast/lightmap_raycaster.h
Normal file
73
modules/raycast/lightmap_raycaster.h
Normal file
@@ -0,0 +1,73 @@
|
||||
/*************************************************************************/
|
||||
/* lightmap_raycaster.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#include "core/object.h"
|
||||
#include "scene/3d/lightmapper.h"
|
||||
#include "scene/resources/mesh.h"
|
||||
|
||||
#include <embree3/rtcore.h>
|
||||
|
||||
class LightmapRaycasterEmbree : public LightmapRaycaster {
|
||||
GDCLASS(LightmapRaycasterEmbree, LightmapRaycaster);
|
||||
|
||||
private:
|
||||
struct AlphaTextureData {
|
||||
Vector<uint8_t> data;
|
||||
Vector2i size;
|
||||
|
||||
uint8_t sample(float u, float v) const;
|
||||
};
|
||||
|
||||
RTCDevice embree_device;
|
||||
RTCScene embree_scene;
|
||||
|
||||
static void filter_function(const struct RTCFilterFunctionNArguments *p_args);
|
||||
|
||||
Map<unsigned int, AlphaTextureData> alpha_textures;
|
||||
Set<int> filter_meshes;
|
||||
|
||||
public:
|
||||
virtual bool intersect(Ray &p_ray);
|
||||
|
||||
virtual void intersect(Vector<Ray> &r_rays);
|
||||
|
||||
virtual void add_mesh(const Vector<Vector3> &p_vertices, const Vector<Vector3> &p_normals, const Vector<Vector2> &p_uv2s, unsigned int p_id);
|
||||
virtual void set_mesh_alpha_texture(Ref<Image> p_alpha_texture, unsigned int p_id);
|
||||
virtual void commit();
|
||||
|
||||
virtual void set_mesh_filter(const Set<int> &p_mesh_ids);
|
||||
virtual void clear_mesh_filter();
|
||||
|
||||
static LightmapRaycaster *create_embree_raycaster();
|
||||
static void make_default_raycaster();
|
||||
|
||||
LightmapRaycasterEmbree();
|
||||
~LightmapRaycasterEmbree();
|
||||
};
|
||||
40
modules/raycast/register_types.cpp
Normal file
40
modules/raycast/register_types.cpp
Normal file
@@ -0,0 +1,40 @@
|
||||
/*************************************************************************/
|
||||
/* register_types.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#include "register_types.h"
|
||||
|
||||
#include "lightmap_raycaster.h"
|
||||
|
||||
void register_raycast_types() {
|
||||
LightmapRaycasterEmbree::make_default_raycaster();
|
||||
}
|
||||
|
||||
void unregister_raycast_types() {
|
||||
}
|
||||
32
modules/raycast/register_types.h
Normal file
32
modules/raycast/register_types.h
Normal file
@@ -0,0 +1,32 @@
|
||||
/*************************************************************************/
|
||||
/* register_types.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
void register_raycast_types();
|
||||
void unregister_raycast_types();
|
||||
@@ -41,7 +41,7 @@ extern bool (*array_mesh_lightmap_unwrap_callback)(float p_texel_size, const flo
|
||||
|
||||
bool xatlas_mesh_lightmap_unwrap_callback(float p_texel_size, const float *p_vertices, const float *p_normals, int p_vertex_count, const int *p_indices, const int *p_face_materials, int p_index_count, float **r_uv, int **r_vertex, int *r_vertex_count, int **r_index, int *r_index_count, int *r_size_hint_x, int *r_size_hint_y) {
|
||||
|
||||
//set up input mesh
|
||||
// set up input mesh
|
||||
xatlas::MeshDecl input_mesh;
|
||||
input_mesh.indexData = p_indices;
|
||||
input_mesh.indexCount = p_index_count;
|
||||
@@ -56,18 +56,19 @@ bool xatlas_mesh_lightmap_unwrap_callback(float p_texel_size, const float *p_ver
|
||||
input_mesh.vertexUvStride = 0;
|
||||
|
||||
xatlas::ChartOptions chart_options;
|
||||
xatlas::PackOptions pack_options;
|
||||
chart_options.fixWinding = true;
|
||||
|
||||
pack_options.maxChartSize = 4096;
|
||||
xatlas::PackOptions pack_options;
|
||||
pack_options.padding = 1;
|
||||
pack_options.maxChartSize = 4094; // Lightmap atlassing needs 2 for padding between meshes, so 4096-2
|
||||
pack_options.blockAlign = true;
|
||||
pack_options.texelsPerUnit = 1.0 / p_texel_size;
|
||||
|
||||
xatlas::Atlas *atlas = xatlas::Create();
|
||||
printf("Adding mesh..\n");
|
||||
|
||||
xatlas::AddMeshError err = xatlas::AddMesh(atlas, input_mesh, 1);
|
||||
ERR_FAIL_COND_V_MSG(err != xatlas::AddMeshError::Success, false, xatlas::StringForEnum(err));
|
||||
|
||||
printf("Generate..\n");
|
||||
xatlas::Generate(atlas, chart_options, pack_options);
|
||||
|
||||
*r_size_hint_x = atlas->width;
|
||||
@@ -96,7 +97,6 @@ bool xatlas_mesh_lightmap_unwrap_callback(float p_texel_size, const float *p_ver
|
||||
max_y = MAX(max_y, output.vertexArray[i].uv[1]);
|
||||
}
|
||||
|
||||
printf("Final texture size: %f,%f - max %f,%f\n", w, h, max_x, max_y);
|
||||
*r_vertex_count = output.vertexCount;
|
||||
|
||||
for (uint32_t i = 0; i < output.indexCount; i++) {
|
||||
@@ -106,7 +106,7 @@ bool xatlas_mesh_lightmap_unwrap_callback(float p_texel_size, const float *p_ver
|
||||
*r_index_count = output.indexCount;
|
||||
|
||||
xatlas::Destroy(atlas);
|
||||
printf("Done\n");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user