Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/BKE_cryptomatte.hh
| /* SPDX-License-Identifier: GPL-2.0-or-later | /* SPDX-License-Identifier: GPL-2.0-or-later | ||||
| * Copyright 2020 Blender Foundation. All rights reserved. */ | * Copyright 2020 Blender Foundation. All rights reserved. */ | ||||
| /** \file | /** \file | ||||
| * \ingroup bke | * \ingroup bke | ||||
| */ | */ | ||||
| #pragma once | #pragma once | ||||
| #include <optional> | #include <optional> | ||||
| #include <string> | #include <string> | ||||
| #include "BKE_cryptomatte.h" | #include "BKE_cryptomatte.h" | ||||
| #include "BLI_hash_mm3.h" | |||||
| #include "BLI_map.hh" | #include "BLI_map.hh" | ||||
| #include "BLI_string_ref.hh" | #include "BLI_string_ref.hh" | ||||
| #include "BKE_cryptomatte.h" | #include "BKE_cryptomatte.h" | ||||
| struct ID; | struct ID; | ||||
| namespace blender::bke::cryptomatte { | namespace blender::bke::cryptomatte { | ||||
| Show All 26 Lines | |||||
| * `render_pass_name` internal data. | * `render_pass_name` internal data. | ||||
| */ | */ | ||||
| StringRef BKE_cryptomatte_extract_layer_name(const StringRef render_pass_name); | StringRef BKE_cryptomatte_extract_layer_name(const StringRef render_pass_name); | ||||
| struct CryptomatteHash { | struct CryptomatteHash { | ||||
| uint32_t hash; | uint32_t hash; | ||||
| CryptomatteHash(uint32_t hash); | CryptomatteHash(uint32_t hash); | ||||
| CryptomatteHash(const char *name, int name_len); | CryptomatteHash(const char *name, int name_len) | ||||
| static CryptomatteHash from_hex_encoded(blender::StringRef hex_encoded); | { | ||||
| hash = BLI_hash_mm3((const unsigned char *)name, name_len, 0); | |||||
| } | |||||
| static CryptomatteHash from_hex_encoded(blender::StringRef hex_encoded); | |||||
| std::string hex_encoded() const; | std::string hex_encoded() const; | ||||
| /** | /** | ||||
| * Convert a cryptomatte hash to a float. | * Convert a cryptomatte hash to a float. | ||||
| * | * | ||||
| * Cryptomatte hashes are stored in float textures and images. The conversion is taken from the | * Cryptomatte hashes are stored in float textures and images. The conversion is taken from the | ||||
| * cryptomatte specification. See Floating point conversion section in | * cryptomatte specification. See Floating point conversion section in | ||||
| * https://github.com/Psyop/Cryptomatte/blob/master/specification/cryptomatte_specification.pdf. | * https://github.com/Psyop/Cryptomatte/blob/master/specification/cryptomatte_specification.pdf. | ||||
| * | * | ||||
| * The conversion uses as many 32 bit floating point values as possible to minimize hash | * The conversion uses as many 32 bit floating point values as possible to minimize hash | ||||
| * collisions. Unfortunately not all 32 bits can be used as NaN and Inf can be problematic. | * collisions. Unfortunately not all 32 bits can be used as NaN and Inf can be problematic. | ||||
| * | * | ||||
| * Note that this conversion assumes to be running on a L-endian system. | * Note that this conversion assumes to be running on a L-endian system. | ||||
| */ | */ | ||||
| float float_encoded() const; | float float_encoded() const | ||||
| { | |||||
| uint32_t mantissa = hash & ((1 << 23) - 1); | |||||
| uint32_t exponent = (hash >> 23) & ((1 << 8) - 1); | |||||
| exponent = MAX2(exponent, (uint32_t)1); | |||||
| exponent = MIN2(exponent, (uint32_t)254); | |||||
| exponent = exponent << 23; | |||||
| uint32_t sign = (hash >> 31); | |||||
| sign = sign << 31; | |||||
| uint32_t float_bits = sign | exponent | mantissa; | |||||
| float f; | |||||
| memcpy(&f, &float_bits, sizeof(uint32_t)); | |||||
| return f; | |||||
| } | |||||
| }; | }; | ||||
| struct CryptomatteLayer { | struct CryptomatteLayer { | ||||
| blender::Map<std::string, CryptomatteHash> hashes; | blender::Map<std::string, CryptomatteHash> hashes; | ||||
| #ifdef WITH_CXX_GUARDEDALLOC | #ifdef WITH_CXX_GUARDEDALLOC | ||||
| MEM_CXX_CLASS_ALLOC_FUNCS("cryptomatte:CryptomatteLayer") | MEM_CXX_CLASS_ALLOC_FUNCS("cryptomatte:CryptomatteLayer") | ||||
| #endif | #endif | ||||
| Show All 20 Lines | struct CryptomatteStampDataCallbackData { | ||||
| /* C type callback function (StampCallback). */ | /* C type callback function (StampCallback). */ | ||||
| static void extract_layer_names(void *_data, const char *propname, char *propvalue, int len); | static void extract_layer_names(void *_data, const char *propname, char *propvalue, int len); | ||||
| /* C type callback function (StampCallback). */ | /* C type callback function (StampCallback). */ | ||||
| static void extract_layer_manifest(void *_data, const char *propname, char *propvalue, int len); | static void extract_layer_manifest(void *_data, const char *propname, char *propvalue, int len); | ||||
| }; | }; | ||||
| const blender::Vector<std::string> &BKE_cryptomatte_layer_names_get( | const blender::Vector<std::string> &BKE_cryptomatte_layer_names_get( | ||||
| const CryptomatteSession &session); | const CryptomatteSession &session); | ||||
| CryptomatteLayer *BKE_cryptomatte_layer_get(CryptomatteSession &session, | |||||
| const StringRef layer_name); | |||||
| struct CryptomatteSessionDeleter { | struct CryptomatteSessionDeleter { | ||||
| void operator()(CryptomatteSession *session) | void operator()(CryptomatteSession *session) | ||||
| { | { | ||||
| BKE_cryptomatte_free(session); | BKE_cryptomatte_free(session); | ||||
| } | } | ||||
| }; | }; | ||||
| using CryptomatteSessionPtr = std::unique_ptr<CryptomatteSession, CryptomatteSessionDeleter>; | using CryptomatteSessionPtr = std::unique_ptr<CryptomatteSession, CryptomatteSessionDeleter>; | ||||
| } // namespace blender::bke::cryptomatte | } // namespace blender::bke::cryptomatte | ||||