Compare commits
2 Commits
temp-attri
...
fix-tablet
Author | SHA1 | Date | |
---|---|---|---|
46221219d8 | |||
1a48488946 |
@@ -265,5 +265,4 @@ ForEachMacros:
|
||||
- VECTOR_SET_SLOT_PROBING_BEGIN
|
||||
|
||||
StatementMacros:
|
||||
- PyObject_HEAD
|
||||
- PyObject_VAR_HEAD
|
||||
|
@@ -836,7 +836,7 @@ if(WITH_PYTHON)
|
||||
# because UNIX will search for the old Python paths which may not exist.
|
||||
# giving errors about missing paths before this case is met.
|
||||
if(DEFINED PYTHON_VERSION AND "${PYTHON_VERSION}" VERSION_LESS "3.9")
|
||||
message(FATAL_ERROR "At least Python 3.9 is required to build, but found Python ${PYTHON_VERSION}")
|
||||
message(FATAL_ERROR "At least Python 3.9 is required to build")
|
||||
endif()
|
||||
|
||||
file(GLOB RESULT "${CMAKE_SOURCE_DIR}/release/scripts/addons")
|
||||
|
@@ -472,7 +472,8 @@ if(NOT GFLAGS_FOUND)
|
||||
gflags_report_not_found(
|
||||
"Could not find gflags include directory, set GFLAGS_INCLUDE_DIR "
|
||||
"to directory containing gflags/gflags.h")
|
||||
endif()
|
||||
endif(NOT GFLAGS_INCLUDE_DIR OR
|
||||
NOT EXISTS ${GFLAGS_INCLUDE_DIR})
|
||||
|
||||
find_library(GFLAGS_LIBRARY NAMES gflags
|
||||
PATHS ${GFLAGS_LIBRARY_DIR_HINTS}
|
||||
@@ -483,7 +484,8 @@ if(NOT GFLAGS_FOUND)
|
||||
gflags_report_not_found(
|
||||
"Could not find gflags library, set GFLAGS_LIBRARY "
|
||||
"to full path to libgflags.")
|
||||
endif()
|
||||
endif(NOT GFLAGS_LIBRARY OR
|
||||
NOT EXISTS ${GFLAGS_LIBRARY})
|
||||
|
||||
# gflags typically requires a threading library (which is OS dependent), note
|
||||
# that this defines the CMAKE_THREAD_LIBS_INIT variable. If we are able to
|
||||
@@ -558,7 +560,8 @@ if(NOT GFLAGS_FOUND)
|
||||
gflags_report_not_found(
|
||||
"Caller defined GFLAGS_INCLUDE_DIR:"
|
||||
" ${GFLAGS_INCLUDE_DIR} does not contain gflags/gflags.h header.")
|
||||
endif()
|
||||
endif(GFLAGS_INCLUDE_DIR AND
|
||||
NOT EXISTS ${GFLAGS_INCLUDE_DIR}/gflags/gflags.h)
|
||||
# TODO: This regex for gflags library is pretty primitive, we use lowercase
|
||||
# for comparison to handle Windows using CamelCase library names, could
|
||||
# this check be better?
|
||||
@@ -568,7 +571,8 @@ if(NOT GFLAGS_FOUND)
|
||||
gflags_report_not_found(
|
||||
"Caller defined GFLAGS_LIBRARY: "
|
||||
"${GFLAGS_LIBRARY} does not match gflags.")
|
||||
endif()
|
||||
endif(GFLAGS_LIBRARY AND
|
||||
NOT "${LOWERCASE_GFLAGS_LIBRARY}" MATCHES ".*gflags[^/]*")
|
||||
|
||||
gflags_reset_find_library_prefix()
|
||||
|
||||
|
@@ -40,7 +40,7 @@ FIND_PACKAGE_HANDLE_STANDARD_ARGS(NanoVDB DEFAULT_MSG
|
||||
|
||||
IF(NANOVDB_FOUND)
|
||||
SET(NANOVDB_INCLUDE_DIRS ${NANOVDB_INCLUDE_DIR})
|
||||
ENDIF()
|
||||
ENDIF(NANOVDB_FOUND)
|
||||
|
||||
MARK_AS_ADVANCED(
|
||||
NANOVDB_INCLUDE_DIR
|
||||
|
@@ -46,7 +46,7 @@ SET(_opencollada_FIND_COMPONENTS
|
||||
)
|
||||
|
||||
# Fedora openCOLLADA package links these statically
|
||||
# note that order is important here or it won't link
|
||||
# note that order is important here ot it wont link
|
||||
SET(_opencollada_FIND_STATIC_COMPONENTS
|
||||
buffer
|
||||
ftoa
|
||||
|
@@ -44,7 +44,7 @@ SET(PYTHON_LINKFLAGS "-Xlinker -export-dynamic" CACHE STRING "Linker flags for p
|
||||
MARK_AS_ADVANCED(PYTHON_LINKFLAGS)
|
||||
|
||||
|
||||
# if the user passes these defines as args, we don't want to overwrite
|
||||
# if the user passes these defines as args, we dont want to overwrite
|
||||
SET(_IS_INC_DEF OFF)
|
||||
SET(_IS_INC_CONF_DEF OFF)
|
||||
SET(_IS_LIB_DEF OFF)
|
||||
@@ -143,7 +143,7 @@ IF((NOT _IS_INC_DEF) OR (NOT _IS_INC_CONF_DEF) OR (NOT _IS_LIB_DEF) OR (NOT _IS_
|
||||
SET(_PYTHON_ABI_FLAGS "${_CURRENT_ABI_FLAGS}")
|
||||
break()
|
||||
ELSE()
|
||||
# ensure we don't find values from 2 different ABI versions
|
||||
# ensure we dont find values from 2 different ABI versions
|
||||
IF(NOT _IS_INC_DEF)
|
||||
UNSET(PYTHON_INCLUDE_DIR CACHE)
|
||||
ENDIF()
|
||||
|
@@ -40,7 +40,7 @@ FIND_PACKAGE_HANDLE_STANDARD_ARGS(sse2neon DEFAULT_MSG
|
||||
|
||||
IF(SSE2NEON_FOUND)
|
||||
SET(SSE2NEON_INCLUDE_DIRS ${SSE2NEON_INCLUDE_DIR})
|
||||
ENDIF()
|
||||
ENDIF(SSE2NEON_FOUND)
|
||||
|
||||
MARK_AS_ADVANCED(
|
||||
SSE2NEON_INCLUDE_DIR
|
||||
|
@@ -305,7 +305,7 @@ def file_check_arg_sizes(tu):
|
||||
for i, node_child in enumerate(children):
|
||||
children = list(node_child.get_children())
|
||||
|
||||
# skip if we don't have an index...
|
||||
# skip if we dont have an index...
|
||||
size_def = args_size_definition.get(i, -1)
|
||||
|
||||
if size_def == -1:
|
||||
@@ -354,7 +354,7 @@ def file_check_arg_sizes(tu):
|
||||
filepath # always the same but useful when running threaded
|
||||
))
|
||||
|
||||
# we don't really care what we are looking at, just scan entire file for
|
||||
# we dont really care what we are looking at, just scan entire file for
|
||||
# function calls.
|
||||
|
||||
def recursive_func_call_check(node):
|
||||
|
@@ -694,7 +694,7 @@ macro(message_first_run)
|
||||
endmacro()
|
||||
|
||||
# when we have warnings as errors applied globally this
|
||||
# needs to be removed for some external libs which we don't maintain.
|
||||
# needs to be removed for some external libs which we dont maintain.
|
||||
|
||||
# utility macro
|
||||
macro(remove_cc_flag
|
||||
@@ -794,7 +794,7 @@ macro(remove_extra_strict_flags)
|
||||
endmacro()
|
||||
|
||||
# note, we can only append flags on a single file so we need to negate the options.
|
||||
# at the moment we can't shut up ffmpeg deprecations, so use this, but will
|
||||
# at the moment we cant shut up ffmpeg deprecations, so use this, but will
|
||||
# probably add more removals here.
|
||||
macro(remove_strict_c_flags_file
|
||||
filenames)
|
||||
@@ -963,6 +963,14 @@ macro(blender_project_hack_post)
|
||||
unset(_reset_standard_cflags_rel)
|
||||
unset(_reset_standard_cxxflags_rel)
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# workaround for omission in cmake 2.8.4's GNU.cmake, fixed in 2.8.5
|
||||
if(CMAKE_COMPILER_IS_GNUCC)
|
||||
if(NOT DARWIN)
|
||||
set(CMAKE_INCLUDE_SYSTEM_FLAG_C "-isystem ")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
endmacro()
|
||||
|
||||
# pair of macros to allow libraries to be specify files to install, but to
|
||||
|
@@ -261,10 +261,8 @@ if(NOT DEFINED LIBDIR)
|
||||
else()
|
||||
message(FATAL_ERROR "32 bit compiler detected, blender no longer provides pre-build libraries for 32 bit windows, please set the LIBDIR cmake variable to your own library folder")
|
||||
endif()
|
||||
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.29.30130)
|
||||
message(STATUS "Visual Studio 2022 detected.")
|
||||
set(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/${LIBDIR_BASE}_vc15)
|
||||
elseif(MSVC_VERSION GREATER 1919)
|
||||
# Can be 1910..1912
|
||||
if(MSVC_VERSION GREATER 1919)
|
||||
message(STATUS "Visual Studio 2019 detected.")
|
||||
set(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/${LIBDIR_BASE}_vc15)
|
||||
elseif(MSVC_VERSION GREATER 1909)
|
||||
@@ -550,6 +548,7 @@ if(WITH_OPENIMAGEIO)
|
||||
set(OPENIMAGEIO_LIBRARIES ${OIIO_OPTIMIZED} ${OIIO_DEBUG})
|
||||
|
||||
set(OPENIMAGEIO_DEFINITIONS "-DUSE_TBB=0")
|
||||
set(OPENCOLORIO_DEFINITIONS "-DDOpenColorIO_SKIP_IMPORTS")
|
||||
set(OPENIMAGEIO_IDIFF "${OPENIMAGEIO}/bin/idiff.exe")
|
||||
add_definitions(-DOIIO_STATIC_DEFINE)
|
||||
add_definitions(-DOIIO_NO_SSE=1)
|
||||
@@ -595,7 +594,7 @@ if(WITH_OPENCOLORIO)
|
||||
debug ${OPENCOLORIO_LIBPATH}/libexpatdMD.lib
|
||||
debug ${OPENCOLORIO_LIBPATH}/pystring_d.lib
|
||||
)
|
||||
set(OPENCOLORIO_DEFINITIONS "-DOpenColorIO_SKIP_IMPORTS")
|
||||
set(OPENCOLORIO_DEFINITIONS)
|
||||
endif()
|
||||
|
||||
if(WITH_OPENVDB)
|
||||
|
@@ -6,9 +6,6 @@ if %ERRORLEVEL% EQU 0 goto DetectionComplete
|
||||
call "%~dp0\detect_msvc2019.cmd"
|
||||
if %ERRORLEVEL% EQU 0 goto DetectionComplete
|
||||
|
||||
call "%~dp0\detect_msvc2022.cmd"
|
||||
if %ERRORLEVEL% EQU 0 goto DetectionComplete
|
||||
|
||||
echo Compiler Detection failed. Use verbose switch for more information.
|
||||
exit /b 1
|
||||
|
||||
|
@@ -1,6 +1,5 @@
|
||||
if "%BUILD_VS_YEAR%"=="2017" set BUILD_VS_LIBDIRPOST=vc15
|
||||
if "%BUILD_VS_YEAR%"=="2019" set BUILD_VS_LIBDIRPOST=vc15
|
||||
if "%BUILD_VS_YEAR%"=="2022" set BUILD_VS_LIBDIRPOST=vc15
|
||||
|
||||
set BUILD_VS_SVNDIR=win64_%BUILD_VS_LIBDIRPOST%
|
||||
set BUILD_VS_LIBDIR="%BLENDER_DIR%..\lib\%BUILD_VS_SVNDIR%"
|
||||
|
@@ -19,10 +19,10 @@ if "%WITH_PYDEBUG%"=="1" (
|
||||
set PYDEBUG_CMAKE_ARGS=-DWINDOWS_PYTHON_DEBUG=On
|
||||
)
|
||||
|
||||
if "%BUILD_VS_YEAR%"=="2017" (
|
||||
set BUILD_GENERATOR_POST=%WINDOWS_ARCH%
|
||||
) else (
|
||||
if "%BUILD_VS_YEAR%"=="2019" (
|
||||
set BUILD_PLATFORM_SELECT=-A %MSBUILD_PLATFORM%
|
||||
) else (
|
||||
set BUILD_GENERATOR_POST=%WINDOWS_ARCH%
|
||||
)
|
||||
|
||||
set BUILD_CMAKE_ARGS=%BUILD_CMAKE_ARGS% -G "Visual Studio %BUILD_VS_VER% %BUILD_VS_YEAR%%BUILD_GENERATOR_POST%" %BUILD_PLATFORM_SELECT% %TESTS_CMAKE_ARGS% %CLANG_CMAKE_ARGS% %ASAN_CMAKE_ARGS% %PYDEBUG_CMAKE_ARGS%
|
||||
|
@@ -1,3 +0,0 @@
|
||||
set BUILD_VS_VER=17
|
||||
set BUILD_VS_YEAR=2022
|
||||
call "%~dp0\detect_msvc_vswhere.cmd"
|
@@ -66,14 +66,6 @@ if NOT "%1" == "" (
|
||||
) else if "%1" == "2019b" (
|
||||
set BUILD_VS_YEAR=2019
|
||||
set VSWHERE_ARGS=-products Microsoft.VisualStudio.Product.BuildTools
|
||||
) else if "%1" == "2022" (
|
||||
set BUILD_VS_YEAR=2022
|
||||
) else if "%1" == "2022pre" (
|
||||
set BUILD_VS_YEAR=2022
|
||||
set VSWHERE_ARGS=-prerelease
|
||||
) else if "%1" == "2022b" (
|
||||
set BUILD_VS_YEAR=2022
|
||||
set VSWHERE_ARGS=-products Microsoft.VisualStudio.Product.BuildTools
|
||||
) else if "%1" == "packagename" (
|
||||
set BUILD_CMAKE_ARGS=%BUILD_CMAKE_ARGS% -DCPACK_OVERRIDE_PACKAGENAME="%2"
|
||||
shift /1
|
||||
|
@@ -1,13 +1,2 @@
|
||||
sphinx==3.5.4
|
||||
|
||||
# Sphinx dependencies that are important
|
||||
Jinja2==2.11.3
|
||||
Pygments==2.9.0
|
||||
docutils==0.16
|
||||
snowballstemmer==2.1.0
|
||||
babel==2.9.1
|
||||
requests==2.25.1
|
||||
|
||||
# Only needed to match the theme used for the official documentation.
|
||||
# Without this theme, the default theme will be used.
|
||||
Sphinx==3.5.3
|
||||
sphinx_rtd_theme==0.5.2
|
||||
|
2
extern/mantaflow/preprocessed/gitinfo.h
vendored
2
extern/mantaflow/preprocessed/gitinfo.h
vendored
@@ -1,3 +1,3 @@
|
||||
|
||||
|
||||
#define MANTA_GIT_VERSION "commit 8fbebe02459b7f72575872c20961f7cb757db408"
|
||||
#define MANTA_GIT_VERSION "commit 9c505cd22e289b98c9aa717efba8ef3201c7e458"
|
||||
|
13
extern/mantaflow/preprocessed/kernel.h
vendored
13
extern/mantaflow/preprocessed/kernel.h
vendored
@@ -71,19 +71,6 @@ class ParticleBase;
|
||||
for (int j = bnd; j < (grid).getSizeY() - bnd; ++j) \
|
||||
for (int i = bnd; i < (grid).getSizeX() - bnd; ++i)
|
||||
|
||||
#define FOR_NEIGHBORS_BND(grid, radius, bnd) \
|
||||
for (int zj = ((grid).is3D() ? std::max(bnd, k - radius) : 0); \
|
||||
zj <= ((grid).is3D() ? std::min(k + radius, (grid).getSizeZ() - 1 - bnd) : 0); \
|
||||
zj++) \
|
||||
for (int yj = std::max(bnd, j - radius); \
|
||||
yj <= std::min(j + radius, (grid).getSizeY() - 1 - bnd); \
|
||||
yj++) \
|
||||
for (int xj = std::max(bnd, i - radius); \
|
||||
xj <= std::min(i + radius, (grid).getSizeX() - 1 - bnd); \
|
||||
xj++)
|
||||
|
||||
#define FOR_NEIGHBORS(grid, radius) FOR_NEIGHBORS_BND(grid, radius, 0)
|
||||
|
||||
//! Basic data structure for kernel data, initialized based on kernel type (e.g. single, idx, etc).
|
||||
struct KernelBase {
|
||||
int maxX, maxY, maxZ, minZ, maxT, minT;
|
||||
|
92
extern/mantaflow/preprocessed/plugin/flip.cpp
vendored
92
extern/mantaflow/preprocessed/plugin/flip.cpp
vendored
@@ -822,29 +822,33 @@ struct ComputeUnionLevelsetPindex : public KernelBase {
|
||||
{
|
||||
const Vec3 gridPos = Vec3(i, j, k) + Vec3(0.5); // shifted by half cell
|
||||
Real phiv = radius * 1.0; // outside
|
||||
const int r = int(radius) + 1;
|
||||
|
||||
FOR_NEIGHBORS(phi, r)
|
||||
{
|
||||
int r = int(radius) + 1;
|
||||
int rZ = phi.is3D() ? r : 0;
|
||||
for (int zj = k - rZ; zj <= k + rZ; zj++)
|
||||
for (int yj = j - r; yj <= j + r; yj++)
|
||||
for (int xj = i - r; xj <= i + r; xj++) {
|
||||
if (!phi.isInBounds(Vec3i(xj, yj, zj)))
|
||||
continue;
|
||||
|
||||
// note, for the particle indices in indexSys the access is periodic (ie, dont skip for eg
|
||||
// inBounds(sx,10,10)
|
||||
IndexInt isysIdxS = index.index(xj, yj, zj);
|
||||
IndexInt pStart = index(isysIdxS), pEnd = 0;
|
||||
if (phi.isInBounds(isysIdxS + 1))
|
||||
pEnd = index(isysIdxS + 1);
|
||||
else
|
||||
pEnd = indexSys.size();
|
||||
// note, for the particle indices in indexSys the access is periodic (ie, dont skip for
|
||||
// eg inBounds(sx,10,10)
|
||||
IndexInt isysIdxS = index.index(xj, yj, zj);
|
||||
IndexInt pStart = index(isysIdxS), pEnd = 0;
|
||||
if (phi.isInBounds(isysIdxS + 1))
|
||||
pEnd = index(isysIdxS + 1);
|
||||
else
|
||||
pEnd = indexSys.size();
|
||||
|
||||
// now loop over particles in cell
|
||||
for (IndexInt p = pStart; p < pEnd; ++p) {
|
||||
const int psrc = indexSys[p].sourceIndex;
|
||||
if (ptype && ((*ptype)[psrc] & exclude))
|
||||
continue;
|
||||
const Vec3 pos = parts[psrc].pos;
|
||||
phiv = std::min(phiv, fabs(norm(gridPos - pos)) - radius);
|
||||
}
|
||||
}
|
||||
// now loop over particles in cell
|
||||
for (IndexInt p = pStart; p < pEnd; ++p) {
|
||||
const int psrc = indexSys[p].sourceIndex;
|
||||
if (ptype && ((*ptype)[psrc] & exclude))
|
||||
continue;
|
||||
const Vec3 pos = parts[psrc].pos;
|
||||
phiv = std::min(phiv, fabs(norm(gridPos - pos)) - radius);
|
||||
}
|
||||
}
|
||||
phi(i, j, k) = phiv;
|
||||
}
|
||||
inline const Grid<int> &getArg0()
|
||||
@@ -1022,35 +1026,39 @@ struct ComputeAveragedLevelsetWeight : public KernelBase {
|
||||
|
||||
// loop over neighborhood, similar to ComputeUnionLevelsetPindex
|
||||
const Real sradiusInv = 1. / (4. * radius * radius);
|
||||
const int r = int(radius) + 1;
|
||||
int r = int(1. * radius) + 1;
|
||||
int rZ = phi.is3D() ? r : 0;
|
||||
// accumulators
|
||||
Real wacc = 0.;
|
||||
Vec3 pacc = Vec3(0.);
|
||||
Real racc = 0.;
|
||||
|
||||
FOR_NEIGHBORS(phi, r)
|
||||
{
|
||||
for (int zj = k - rZ; zj <= k + rZ; zj++)
|
||||
for (int yj = j - r; yj <= j + r; yj++)
|
||||
for (int xj = i - r; xj <= i + r; xj++) {
|
||||
if (!phi.isInBounds(Vec3i(xj, yj, zj)))
|
||||
continue;
|
||||
|
||||
IndexInt isysIdxS = index.index(xj, yj, zj);
|
||||
IndexInt pStart = index(isysIdxS), pEnd = 0;
|
||||
if (phi.isInBounds(isysIdxS + 1))
|
||||
pEnd = index(isysIdxS + 1);
|
||||
else
|
||||
pEnd = indexSys.size();
|
||||
for (IndexInt p = pStart; p < pEnd; ++p) {
|
||||
IndexInt psrc = indexSys[p].sourceIndex;
|
||||
if (ptype && ((*ptype)[psrc] & exclude))
|
||||
continue;
|
||||
IndexInt isysIdxS = index.index(xj, yj, zj);
|
||||
IndexInt pStart = index(isysIdxS), pEnd = 0;
|
||||
if (phi.isInBounds(isysIdxS + 1))
|
||||
pEnd = index(isysIdxS + 1);
|
||||
else
|
||||
pEnd = indexSys.size();
|
||||
for (IndexInt p = pStart; p < pEnd; ++p) {
|
||||
IndexInt psrc = indexSys[p].sourceIndex;
|
||||
if (ptype && ((*ptype)[psrc] & exclude))
|
||||
continue;
|
||||
|
||||
Vec3 pos = parts[psrc].pos;
|
||||
Real s = normSquare(gridPos - pos) * sradiusInv;
|
||||
// Real w = std::max(0., cubed(1.-s) );
|
||||
Real w = std::max(0., (1. - s)); // a bit smoother
|
||||
wacc += w;
|
||||
racc += radius * w;
|
||||
pacc += pos * w;
|
||||
}
|
||||
}
|
||||
Vec3 pos = parts[psrc].pos;
|
||||
Real s = normSquare(gridPos - pos) * sradiusInv;
|
||||
// Real w = std::max(0., cubed(1.-s) );
|
||||
Real w = std::max(0., (1. - s)); // a bit smoother
|
||||
wacc += w;
|
||||
racc += radius * w;
|
||||
pacc += pos * w;
|
||||
}
|
||||
}
|
||||
|
||||
if (wacc > VECTOR_EPSILON) {
|
||||
racc /= wacc;
|
||||
|
@@ -234,10 +234,10 @@ void subdivideMesh(
|
||||
normalize(ne2);
|
||||
|
||||
// Real thisArea = sqrMag(cross(-e2,e0));
|
||||
// small angle approximation says sin(x) = arcsin(x) = x,
|
||||
// arccos(x) = pi/2 - arcsin(x),
|
||||
// cos(x) = dot(A,B),
|
||||
// so angle is approximately 1 - dot(A,B).
|
||||
// small angle approximation says sin(x) = arcsin(x) = x,
|
||||
// arccos(x) = pi/2 - arcsin(x),
|
||||
// cos(x) = dot(A,B),
|
||||
// so angle is approximately 1 - dot(A,B).
|
||||
Real angle[3];
|
||||
angle[0] = 1.0 - dot(ne0, -ne2);
|
||||
angle[1] = 1.0 - dot(ne1, -ne0);
|
||||
|
@@ -2287,9 +2287,10 @@ struct knFlipComputePotentialTrappedAir : public KernelBase {
|
||||
const Vec3 &vj = scaleFromManta * v.getCentered(x, y, z);
|
||||
const Vec3 xij = xi - xj;
|
||||
const Vec3 vij = vi - vj;
|
||||
Real h = !pot.is3D() ? 1.414 * radius :
|
||||
1.732 * radius; // estimate sqrt(2)*radius resp. sqrt(3)*radius
|
||||
// for h, due to squared resp. cubic neighbor area
|
||||
Real h = !pot.is3D() ?
|
||||
1.414 * radius :
|
||||
1.732 * radius; // estimate sqrt(2)*radius resp. sqrt(3)*radius for h, due
|
||||
// to squared resp. cubic neighbor area
|
||||
vdiff += norm(vij) * (1 - dot(getNormalized(vij), getNormalized(xij))) *
|
||||
(1 - norm(xij) / h);
|
||||
}
|
||||
|
@@ -79,15 +79,15 @@ typedef struct CLG_IDFilter {
|
||||
} CLG_IDFilter;
|
||||
|
||||
typedef struct CLogContext {
|
||||
/** Single linked list of types. */
|
||||
/** Single linked list of types. */
|
||||
CLG_LogType *types;
|
||||
/** Single linked list of references. */
|
||||
/** Single linked list of references. */
|
||||
CLG_LogRef *refs;
|
||||
#ifdef WITH_CLOG_PTHREADS
|
||||
pthread_mutex_t types_lock;
|
||||
#endif
|
||||
|
||||
/* exclude, include filters. */
|
||||
/* exclude, include filters. */
|
||||
CLG_IDFilter *filters[2];
|
||||
bool use_color;
|
||||
bool use_basename;
|
||||
|
@@ -51,12 +51,12 @@ CCL_NAMESPACE_BEGIN
|
||||
/* XML reading state */
|
||||
|
||||
struct XMLReadState : public XMLReader {
|
||||
Scene *scene; /* Scene pointer. */
|
||||
Transform tfm; /* Current transform state. */
|
||||
bool smooth; /* Smooth normal state. */
|
||||
Shader *shader; /* Current shader. */
|
||||
string base; /* Base path to current file. */
|
||||
float dicing_rate; /* Current dicing rate. */
|
||||
Scene *scene; /* scene pointer */
|
||||
Transform tfm; /* current transform state */
|
||||
bool smooth; /* smooth normal state */
|
||||
Shader *shader; /* current shader */
|
||||
string base; /* base path to current file*/
|
||||
float dicing_rate; /* current dicing rate */
|
||||
|
||||
XMLReadState() : scene(NULL), smooth(false), shader(NULL), dicing_rate(1.0f)
|
||||
{
|
||||
@@ -385,7 +385,7 @@ static Mesh *xml_add_mesh(Scene *scene, const Transform &tfm)
|
||||
Mesh *mesh = new Mesh();
|
||||
scene->geometry.push_back(mesh);
|
||||
|
||||
/* Create object. */
|
||||
/* create object*/
|
||||
Object *object = new Object();
|
||||
object->set_geometry(mesh);
|
||||
object->set_tfm(tfm);
|
||||
|
@@ -821,11 +821,6 @@ class CYCLES_RENDER_PT_filter(CyclesButtonsPanel, Panel):
|
||||
col.prop(view_layer, "use_strand", text="Hair")
|
||||
col.prop(view_layer, "use_volumes", text="Volumes")
|
||||
|
||||
col = layout.column(heading="Use")
|
||||
sub = col.row()
|
||||
sub.prop(view_layer, "use_motion_blur", text="Motion Blur")
|
||||
sub.active = rd.use_motion_blur
|
||||
|
||||
|
||||
class CYCLES_RENDER_PT_override(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Override"
|
||||
|
@@ -533,7 +533,7 @@ void BlenderSync::sync_particle_hair(
|
||||
return;
|
||||
}
|
||||
|
||||
/* Extract particle hair data - should be combined with connecting to mesh later. */
|
||||
/* extract particle hair data - should be combined with connecting to mesh later*/
|
||||
|
||||
ParticleCurveData CData;
|
||||
|
||||
|
@@ -44,7 +44,7 @@ void BlenderSync::sync_light(BL::Object &b_parent,
|
||||
const bool tfm_updated = (light && light->get_tfm() != tfm);
|
||||
|
||||
/* Update if either object or light data changed. */
|
||||
if (!light_map.add_or_update(&light, b_ob, b_parent, key) && !tfm_updated) {
|
||||
if (!tfm_updated && !light_map.add_or_update(&light, b_ob, b_parent, key)) {
|
||||
Shader *shader;
|
||||
if (!shader_map.add_or_update(&shader, b_light)) {
|
||||
if (light->get_is_portal())
|
||||
|
@@ -281,6 +281,7 @@ void BlenderSync::sync_data(BL::RenderSettings &b_render,
|
||||
|
||||
void BlenderSync::sync_integrator()
|
||||
{
|
||||
BL::RenderSettings r = b_scene.render();
|
||||
PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
|
||||
|
||||
experimental = (get_enum(cscene, "feature_set") != 0);
|
||||
@@ -324,7 +325,7 @@ void BlenderSync::sync_integrator()
|
||||
integrator->set_sample_clamp_direct(get_float(cscene, "sample_clamp_direct"));
|
||||
integrator->set_sample_clamp_indirect(get_float(cscene, "sample_clamp_indirect"));
|
||||
if (!preview) {
|
||||
integrator->set_motion_blur(view_layer.use_motion_blur);
|
||||
integrator->set_motion_blur(r.use_motion_blur());
|
||||
}
|
||||
|
||||
integrator->set_method((Integrator::Method)get_enum(
|
||||
@@ -455,8 +456,6 @@ void BlenderSync::sync_view_layer(BL::ViewLayer &b_view_layer)
|
||||
view_layer.use_surfaces = b_view_layer.use_solid() || scene->bake_manager->get_baking();
|
||||
view_layer.use_hair = b_view_layer.use_strand();
|
||||
view_layer.use_volumes = b_view_layer.use_volumes();
|
||||
view_layer.use_motion_blur = b_view_layer.use_motion_blur() &&
|
||||
b_scene.render().use_motion_blur();
|
||||
|
||||
/* Material override. */
|
||||
view_layer.material_override = b_view_layer.material_override();
|
||||
@@ -603,7 +602,7 @@ vector<Pass> BlenderSync::sync_render_passes(BL::Scene &b_scene,
|
||||
for (BL::RenderPass &b_pass : b_rlay.passes) {
|
||||
PassType pass_type = get_pass_type(b_pass);
|
||||
|
||||
if (pass_type == PASS_MOTION && view_layer.use_motion_blur)
|
||||
if (pass_type == PASS_MOTION && b_scene.render().use_motion_blur())
|
||||
continue;
|
||||
if (pass_type != PASS_NONE)
|
||||
Pass::add(pass_type, passes, b_pass.name().c_str());
|
||||
|
@@ -246,7 +246,6 @@ class BlenderSync {
|
||||
use_surfaces(true),
|
||||
use_hair(true),
|
||||
use_volumes(true),
|
||||
use_motion_blur(true),
|
||||
samples(0),
|
||||
bound_samples(false)
|
||||
{
|
||||
@@ -259,7 +258,6 @@ class BlenderSync {
|
||||
bool use_surfaces;
|
||||
bool use_hair;
|
||||
bool use_volumes;
|
||||
bool use_motion_blur;
|
||||
int samples;
|
||||
bool bound_samples;
|
||||
} view_layer;
|
||||
|
@@ -181,7 +181,7 @@ static void rtc_filter_occluded_func(const RTCFilterFunctionNArguments *args)
|
||||
/* record intersection */
|
||||
ctx->local_isect->hits[hit_idx] = current_isect;
|
||||
ctx->local_isect->Ng[hit_idx] = normalize(make_float3(hit->Ng_x, hit->Ng_y, hit->Ng_z));
|
||||
/* This tells Embree to continue tracing. */
|
||||
/* This tells Embree to continue tracing .*/
|
||||
*args->valid = 0;
|
||||
break;
|
||||
}
|
||||
|
@@ -179,7 +179,7 @@ class InnerNode : public BVHNode {
|
||||
}
|
||||
|
||||
/* NOTE: This function is only used during binary BVH builder, and it
|
||||
* supposed to be configured to have 2 children which will be filled-in in a
|
||||
* supposed to be configured to have 2 children which will be filled in in a
|
||||
* bit. But this is important to have children reset to NULL. */
|
||||
explicit InnerNode(const BoundBox &bounds) : BVHNode(bounds), num_children_(0)
|
||||
{
|
||||
|
@@ -297,7 +297,7 @@ struct BVHSpatialBin {
|
||||
*/
|
||||
|
||||
struct BVHSpatialStorage {
|
||||
/* Accumulated bounds when sweeping from right to left. */
|
||||
/* Accumulated bounds when sweeping from right to left. */
|
||||
vector<BoundBox> right_bounds;
|
||||
|
||||
/* Bins used for histogram when selecting best split plane. */
|
||||
|
@@ -388,7 +388,7 @@ void BVHSpatialSplit::split_curve_primitive(const Hair *hair,
|
||||
BoundBox &left_bounds,
|
||||
BoundBox &right_bounds)
|
||||
{
|
||||
/* curve split: NOTE - Currently ignores curve width and needs to be fixed. */
|
||||
/* curve split: NOTE - Currently ignores curve width and needs to be fixed.*/
|
||||
Hair::Curve curve = hair->get_curve(prim_index);
|
||||
const int k0 = curve.first_key + segment_index;
|
||||
const int k1 = k0 + 1;
|
||||
|
@@ -1196,18 +1196,16 @@ class OptiXDevice : public CUDADevice {
|
||||
|
||||
const CUDAContextScope scope(cuContext);
|
||||
|
||||
const bool use_fast_trace_bvh = (bvh->params.bvh_type == SceneParams::BVH_STATIC);
|
||||
|
||||
// Compute memory usage
|
||||
OptixAccelBufferSizes sizes = {};
|
||||
OptixAccelBuildOptions options = {};
|
||||
options.operation = operation;
|
||||
if (use_fast_trace_bvh) {
|
||||
VLOG(2) << "Using fast to trace OptiX BVH";
|
||||
if (background) {
|
||||
// Prefer best performance and lowest memory consumption in background
|
||||
options.buildFlags = OPTIX_BUILD_FLAG_PREFER_FAST_TRACE | OPTIX_BUILD_FLAG_ALLOW_COMPACTION;
|
||||
}
|
||||
else {
|
||||
VLOG(2) << "Using fast to update OptiX BVH";
|
||||
// Prefer fast updates in viewport
|
||||
options.buildFlags = OPTIX_BUILD_FLAG_PREFER_FAST_BUILD | OPTIX_BUILD_FLAG_ALLOW_UPDATE;
|
||||
}
|
||||
|
||||
@@ -1255,16 +1253,15 @@ class OptiXDevice : public CUDADevice {
|
||||
out_data.device_pointer,
|
||||
sizes.outputSizeInBytes,
|
||||
&out_handle,
|
||||
use_fast_trace_bvh ? &compacted_size_prop : NULL,
|
||||
use_fast_trace_bvh ? 1 : 0));
|
||||
background ? &compacted_size_prop : NULL,
|
||||
background ? 1 : 0));
|
||||
bvh->traversable_handle = static_cast<uint64_t>(out_handle);
|
||||
|
||||
// Wait for all operations to finish
|
||||
check_result_cuda_ret(cuStreamSynchronize(NULL));
|
||||
|
||||
// Compact acceleration structure to save memory (only if using fast trace as the
|
||||
// OPTIX_BUILD_FLAG_ALLOW_COMPACTION flag is only set in this case).
|
||||
if (use_fast_trace_bvh) {
|
||||
// Compact acceleration structure to save memory (do not do this in viewport for faster builds)
|
||||
if (background) {
|
||||
uint64_t compacted_size = sizes.outputSizeInBytes;
|
||||
check_result_cuda_ret(
|
||||
cuMemcpyDtoH(&compacted_size, compacted_size_prop.result, sizeof(compacted_size)));
|
||||
@@ -1309,8 +1306,6 @@ class OptiXDevice : public CUDADevice {
|
||||
return;
|
||||
}
|
||||
|
||||
const bool use_fast_trace_bvh = (bvh->params.bvh_type == SceneParams::BVH_STATIC);
|
||||
|
||||
free_bvh_memory_delayed();
|
||||
|
||||
BVHOptiX *const bvh_optix = static_cast<BVHOptiX *>(bvh);
|
||||
@@ -1320,10 +1315,10 @@ class OptiXDevice : public CUDADevice {
|
||||
if (!bvh->params.top_level) {
|
||||
assert(bvh->objects.size() == 1 && bvh->geometry.size() == 1);
|
||||
|
||||
// Refit is only possible in viewport for now (because AS is built with
|
||||
// OPTIX_BUILD_FLAG_ALLOW_UPDATE only there, see above)
|
||||
OptixBuildOperation operation = OPTIX_BUILD_OPERATION_BUILD;
|
||||
/* Refit is only possible when using fast to trace BVH (because AS is built with
|
||||
* OPTIX_BUILD_FLAG_ALLOW_UPDATE only there, see above). */
|
||||
if (refit && !use_fast_trace_bvh) {
|
||||
if (refit && !background) {
|
||||
assert(bvh_optix->traversable_handle != 0);
|
||||
operation = OPTIX_BUILD_OPERATION_UPDATE;
|
||||
}
|
||||
|
@@ -65,7 +65,7 @@ class DenoiseParams {
|
||||
/* Viewport start sample. */
|
||||
int start_sample;
|
||||
|
||||
/** Native Denoiser. */
|
||||
/** Native Denoiser **/
|
||||
|
||||
/* Pixel radius for neighboring pixels to take into account. */
|
||||
int radius;
|
||||
@@ -81,7 +81,7 @@ class DenoiseParams {
|
||||
/* Clamp the input to the range of +-1e8. Should be enough for any legitimate data. */
|
||||
bool clamp_input;
|
||||
|
||||
/** OIDN/Optix Denoiser. */
|
||||
/** OIDN/Optix Denoiser **/
|
||||
|
||||
/* Passes handed over to the OIDN/OptiX denoiser (default to color + albedo). */
|
||||
DenoiserInput input_passes;
|
||||
|
@@ -1186,7 +1186,7 @@ bool OpenCLInfo::get_device_extensions(cl_device_id device_id,
|
||||
{
|
||||
size_t extension_length = 0;
|
||||
cl_int err;
|
||||
/* Determine the size of the extension string. */
|
||||
/* Determine the size of the extension string*/
|
||||
if ((err = clGetDeviceInfo(device_id, CL_DEVICE_EXTENSIONS, 0, 0, &extension_length)) !=
|
||||
CL_SUCCESS) {
|
||||
if (error != NULL) {
|
||||
|
@@ -116,7 +116,7 @@ CCL_NAMESPACE_BEGIN
|
||||
# endif
|
||||
# endif /* __SHADOW_RECORD_ALL__ */
|
||||
|
||||
/* Record all intersections - Volume BVH traversal. */
|
||||
/* Record all intersections - Volume BVH traversal */
|
||||
|
||||
# if defined(__VOLUME_RECORD_ALL__)
|
||||
# define BVH_FUNCTION_NAME bvh_intersect_volume_all
|
||||
|
@@ -61,8 +61,8 @@ ccl_device_forceinline float3 bsdf_ashikhmin_shirley_eval_reflect(const ShaderCl
|
||||
const MicrofacetBsdf *bsdf = (const MicrofacetBsdf *)sc;
|
||||
float3 N = bsdf->N;
|
||||
|
||||
float NdotI = dot(N, I); /* in Cycles/OSL convention I is omega_out */
|
||||
float NdotO = dot(N, omega_in); /* and consequently we use for O omaga_in ;) */
|
||||
float NdotI = dot(N, I); /* in Cycles/OSL convention I is omega_out */
|
||||
float NdotO = dot(N, omega_in); /* and consequently we use for O omaga_in ;) */
|
||||
|
||||
float out = 0.0f;
|
||||
|
||||
|
@@ -66,7 +66,7 @@ ccl_device_noinline void motion_triangle_shader_setup(
|
||||
sd->P = motion_triangle_refine_local(kg, sd, isect, ray, verts);
|
||||
}
|
||||
else
|
||||
#endif /* __BVH_LOCAL__*/
|
||||
#endif /* __BVH_LOCAL__*/
|
||||
{
|
||||
sd->P = motion_triangle_refine(kg, sd, isect, ray, verts);
|
||||
}
|
||||
|
@@ -22,7 +22,7 @@
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
/* Normal on triangle. */
|
||||
/* normal on triangle */
|
||||
ccl_device_inline float3 triangle_normal(KernelGlobals *kg, ShaderData *sd)
|
||||
{
|
||||
/* load triangle vertices */
|
||||
@@ -40,7 +40,7 @@ ccl_device_inline float3 triangle_normal(KernelGlobals *kg, ShaderData *sd)
|
||||
}
|
||||
}
|
||||
|
||||
/* Point and normal on triangle. */
|
||||
/* point and normal on triangle */
|
||||
ccl_device_inline void triangle_point_normal(
|
||||
KernelGlobals *kg, int object, int prim, float u, float v, float3 *P, float3 *Ng, int *shader)
|
||||
{
|
||||
|
@@ -64,7 +64,7 @@ typedef struct KernelGlobals {
|
||||
OSLThreadData *osl_tdata;
|
||||
# endif
|
||||
|
||||
/* **** Run-time data **** */
|
||||
/* **** Run-time data **** */
|
||||
|
||||
/* Heap-allocated storage for transparent shadows intersections. */
|
||||
Intersection *transparent_shadow_intersections;
|
||||
|
@@ -35,7 +35,7 @@
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
/* Spherical coordinates <-> Cartesian direction. */
|
||||
/* Spherical coordinates <-> Cartesian direction */
|
||||
|
||||
ccl_device float2 direction_to_spherical(float3 dir)
|
||||
{
|
||||
|
@@ -79,7 +79,7 @@ ccl_device void enqueue_ray_index_local(
|
||||
{
|
||||
int lidx = ccl_local_id(1) * ccl_local_size(0) + ccl_local_id(0);
|
||||
|
||||
/* Get local queue id. */
|
||||
/* Get local queue id .*/
|
||||
unsigned int lqidx;
|
||||
if (enqueue_flag) {
|
||||
lqidx = atomic_fetch_and_inc_uint32(local_queue_atomics);
|
||||
|
@@ -274,7 +274,7 @@ ccl_device_inline void shader_setup_from_sample(KernelGlobals *kg,
|
||||
/* primitive */
|
||||
sd->object = object;
|
||||
sd->lamp = LAMP_NONE;
|
||||
/* Currently no access to bvh prim index for strand sd->prim. */
|
||||
/* currently no access to bvh prim index for strand sd->prim*/
|
||||
sd->prim = prim;
|
||||
sd->u = u;
|
||||
sd->v = v;
|
||||
|
@@ -409,7 +409,7 @@ ccl_device void subsurface_random_walk_coefficients(const ShaderClosure *sc,
|
||||
|
||||
ccl_device_forceinline float eval_phase_dwivedi(float v, float phase_log, float cos_theta)
|
||||
{
|
||||
/* Eq. 9 from [2] using precomputed log((v + 1) / (v - 1)) */
|
||||
/* Eq. 9 from [2] using precomputed log((v + 1) / (v - 1))*/
|
||||
return 1.0f / ((v - cos_theta) * phase_log);
|
||||
}
|
||||
|
||||
|
@@ -302,7 +302,7 @@ enum PathRayFlag {
|
||||
PATH_RAY_DIFFUSE_ANCESTOR = (1 << 15),
|
||||
/* Single pass has been written. */
|
||||
PATH_RAY_SINGLE_PASS_DONE = (1 << 16),
|
||||
/* Ray is behind a shadow catcher. */
|
||||
/* Ray is behind a shadow catcher .*/
|
||||
PATH_RAY_SHADOW_CATCHER = (1 << 17),
|
||||
/* Store shadow data for shadow catcher or denoising. */
|
||||
PATH_RAY_STORE_SHADOW_INFO = (1 << 18),
|
||||
|
@@ -317,4 +317,4 @@ class OSLRenderServices : public OSL::RendererServices {
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
||||
#endif /* __OSL_SERVICES_H__ */
|
||||
#endif /* __OSL_SERVICES_H__ */
|
||||
|
@@ -49,7 +49,7 @@ void OSLShader::thread_init(KernelGlobals *kg,
|
||||
return;
|
||||
}
|
||||
|
||||
/* Per thread kernel data init. */
|
||||
/* per thread kernel data init*/
|
||||
kg->osl = osl_globals;
|
||||
|
||||
OSL::ShadingSystem *ss = kg->osl->ss;
|
||||
|
@@ -68,7 +68,7 @@ typedef ccl_global struct SplitBranchedState {
|
||||
|
||||
uint lcg_state;
|
||||
LocalIntersection ss_isect;
|
||||
# endif /* __SUBSURFACE__ */
|
||||
# endif /*__SUBSURFACE__ */
|
||||
|
||||
int shared_sample_count; /* number of branched samples shared with other threads */
|
||||
int original_ray; /* index of original ray when sharing branched samples */
|
||||
|
@@ -803,7 +803,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg,
|
||||
float melanin_redness = stack_load_float_default(
|
||||
stack, melanin_redness_ofs, data_node2.w);
|
||||
|
||||
/* Randomize melanin. */
|
||||
/* Randomize melanin. */
|
||||
float random_color = stack_load_float_default(stack, random_color_ofs, data_node3.z);
|
||||
random_color = clamp(random_color, 0.0f, 1.0f);
|
||||
float factor_random_color = 1.0f + 2.0f * (random - 0.5f) * random_color;
|
||||
|
@@ -220,13 +220,11 @@ ccl_device void svm_node_hair_info(
|
||||
stack_store_float(stack, out_offset, data);
|
||||
break;
|
||||
}
|
||||
# if 0
|
||||
case NODE_INFO_CURVE_FADE: {
|
||||
/*case NODE_INFO_CURVE_FADE: {
|
||||
data = sd->curve_transparency;
|
||||
stack_store_float(stack, out_offset, data);
|
||||
break;
|
||||
}
|
||||
# endif
|
||||
}*/
|
||||
case NODE_INFO_CURVE_TANGENT_NORMAL: {
|
||||
data3 = curve_tangent_normal(kg, sd);
|
||||
stack_store_float3(stack, out_offset, data3);
|
||||
|
@@ -182,7 +182,7 @@ ccl_device void svm_node_tex_image_box(KernelGlobals *kg, ShaderData *sd, float
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* Desperate mode, no valid choice anyway, fallback to one side. */
|
||||
/* Desperate mode, no valid choice anyway, fallback to one side.*/
|
||||
weight.x = 1.0f;
|
||||
}
|
||||
|
||||
|
@@ -333,7 +333,7 @@ static M44d get_interpolated_matrix_for_time(const MatrixSampleMap &samples, chr
|
||||
|
||||
chrono_t t = (time - prev_time) / (next_time - prev_time);
|
||||
|
||||
/* Ensure rotation around the shortest angle. */
|
||||
/* ensure rotation around the shortest angle */
|
||||
if ((prev_rotation ^ next_rotation) < 0) {
|
||||
next_rotation = -next_rotation;
|
||||
}
|
||||
|
@@ -676,8 +676,8 @@ void GeometryManager::update_attribute_element_offset(Geometry *geom,
|
||||
Mesh *mesh = static_cast<Mesh *>(geom);
|
||||
if (mesh->subdivision_type == Mesh::SUBDIVISION_CATMULL_CLARK &&
|
||||
desc.flags & ATTR_SUBDIVIDED) {
|
||||
/* Indices for subdivided attributes are retrieved
|
||||
* from patch table so no need for correction here. */
|
||||
/* indices for subdivided attributes are retrieved
|
||||
* from patch table so no need for correction here*/
|
||||
}
|
||||
else if (element == ATTR_ELEMENT_VERTEX)
|
||||
offset -= mesh->vert_offset;
|
||||
|
@@ -4374,7 +4374,7 @@ NODE_DEFINE(HairInfoNode)
|
||||
SOCKET_OUT_FLOAT(intercept, "Intercept");
|
||||
SOCKET_OUT_FLOAT(thickness, "Thickness");
|
||||
SOCKET_OUT_NORMAL(tangent_normal, "Tangent Normal");
|
||||
#if 0 /* Output for minimum hair width transparency - deactivated. */
|
||||
#if 0 /*output for minimum hair width transparency - deactivated */
|
||||
SOCKET_OUT_FLOAT(fade, "Fade");
|
||||
#endif
|
||||
SOCKET_OUT_FLOAT(index, "Random");
|
||||
@@ -4425,12 +4425,12 @@ void HairInfoNode::compile(SVMCompiler &compiler)
|
||||
if (!out->links.empty()) {
|
||||
compiler.add_node(NODE_HAIR_INFO, NODE_INFO_CURVE_TANGENT_NORMAL, compiler.stack_assign(out));
|
||||
}
|
||||
#if 0
|
||||
out = output("Fade");
|
||||
|
||||
/*out = output("Fade");
|
||||
if(!out->links.empty()) {
|
||||
compiler.add_node(NODE_HAIR_INFO, NODE_INFO_CURVE_FADE, compiler.stack_assign(out));
|
||||
}
|
||||
#endif
|
||||
}*/
|
||||
|
||||
out = output("Random");
|
||||
if (!out->links.empty()) {
|
||||
int attr = compiler.attribute(ATTR_STD_CURVE_RANDOM);
|
||||
|
@@ -195,4 +195,4 @@ class OSLCompiler {
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
||||
#endif /* __OSL_H__ */
|
||||
#endif /* __OSL_H__ */
|
||||
|
@@ -1252,7 +1252,7 @@ bool Session::update_progressive_refine(bool cancel)
|
||||
double current_time = time_dt();
|
||||
|
||||
if (current_time - last_update_time < params.progressive_update_timeout) {
|
||||
/* If last sample was processed, we need to write buffers anyway. */
|
||||
/* if last sample was processed, we need to write buffers anyway */
|
||||
if (!write && sample != 1)
|
||||
return false;
|
||||
}
|
||||
|
@@ -15,7 +15,7 @@
|
||||
if(WITH_GTESTS)
|
||||
Include(GTestTesting)
|
||||
|
||||
# Otherwise we get warnings here that we can't fix in external projects
|
||||
# Otherwise we get warnings here that we cant fix in external projects
|
||||
remove_strict_flags()
|
||||
endif()
|
||||
|
||||
|
@@ -223,14 +223,12 @@ ccl_device_inline ssef fastpow24(const ssef &arg)
|
||||
ssef x = fastpow<0x3F4CCCCD, 0x4F55A7FB>(arg); // error max = 0.17 avg = 0.0018 |avg| = 0.05
|
||||
ssef arg2 = arg * arg;
|
||||
ssef arg4 = arg2 * arg2;
|
||||
|
||||
/* error max = 0.018 avg = 0.0031 |avg| = 0.0031 */
|
||||
x = improve_5throot_solution(x, arg4);
|
||||
/* error max = 0.00021 avg = 1.6e-05 |avg| = 1.6e-05 */
|
||||
x = improve_5throot_solution(x, arg4);
|
||||
/* error max = 6.1e-07 avg = 5.2e-08 |avg| = 1.1e-07 */
|
||||
x = improve_5throot_solution(x, arg4);
|
||||
|
||||
x = improve_5throot_solution(x,
|
||||
arg4); /* error max = 0.018 avg = 0.0031 |avg| = 0.0031 */
|
||||
x = improve_5throot_solution(x,
|
||||
arg4); /* error max = 0.00021 avg = 1.6e-05 |avg| = 1.6e-05 */
|
||||
x = improve_5throot_solution(x,
|
||||
arg4); /* error max = 6.1e-07 avg = 5.2e-08 |avg| = 1.1e-07 */
|
||||
return x * (x * x);
|
||||
}
|
||||
|
||||
|
@@ -129,7 +129,7 @@ class DebugFlags {
|
||||
DEVICE_NONE,
|
||||
/* All OpenCL devices will be used. */
|
||||
DEVICE_ALL,
|
||||
/* Default system OpenCL device will be used. */
|
||||
/* Default system OpenCL device will be used. */
|
||||
DEVICE_DEFAULT,
|
||||
/* Host processor will be used. */
|
||||
DEVICE_CPU,
|
||||
|
@@ -243,7 +243,7 @@ ccl_device float fast_sinpif(float x)
|
||||
const float P = 3.584135056f; /* P = 16-4*Q */
|
||||
return y * (Q + P * fabsf(y));
|
||||
|
||||
/* The original article used inferior constants for Q and P and
|
||||
/* The original article used used inferior constants for Q and P and
|
||||
* so had max error 1.091e-3.
|
||||
*
|
||||
* The optimal value for Q was determined by exhaustive search, minimizing
|
||||
|
@@ -282,8 +282,8 @@ static CPUCapabilities &system_cpu_capabilities()
|
||||
/* actual opcode for xgetbv */
|
||||
__asm__(".byte 0x0f, 0x01, 0xd0" : "=a"(xcr_feature_mask), "=d"(edx) : "c"(0));
|
||||
# elif defined(_MSC_VER) && defined(_XCR_XFEATURE_ENABLED_MASK)
|
||||
/* Minimum VS2010 SP1 compiler is required. */
|
||||
xcr_feature_mask = (uint32_t)_xgetbv(_XCR_XFEATURE_ENABLED_MASK);
|
||||
xcr_feature_mask = (uint32_t)_xgetbv(
|
||||
_XCR_XFEATURE_ENABLED_MASK); /* min VS2010 SP1 compiler is required */
|
||||
# else
|
||||
xcr_feature_mask = 0;
|
||||
# endif
|
||||
|
@@ -68,7 +68,7 @@ class TaskPool {
|
||||
|
||||
/* ** Statistics ** */
|
||||
|
||||
/* Time stamp of first task pushed. */
|
||||
/* Time time stamp of first task pushed. */
|
||||
double start_time;
|
||||
|
||||
/* Number of all tasks pushed to the pool. Cleared after wait_work() and cancel(). */
|
||||
@@ -88,7 +88,7 @@ class TaskScheduler {
|
||||
|
||||
/* Approximate number of threads that will work on task, which may be lower
|
||||
* or higher than the actual number of threads. Use as little as possible and
|
||||
* leave splitting up tasks to the scheduler. */
|
||||
* leave splitting up tasks to the scheduler.. */
|
||||
static int num_threads();
|
||||
|
||||
protected:
|
||||
|
@@ -483,17 +483,10 @@ if(WITH_XR_OPENXR)
|
||||
shlwapi
|
||||
)
|
||||
elseif(UNIX AND NOT APPLE)
|
||||
list(APPEND XR_PLATFORM_DEFINES -DXR_OS_LINUX)
|
||||
if (WITH_GHOST_WAYLAND)
|
||||
list(APPEND XR_PLATFORM_DEFINES -DXR_USE_PLATFORM_WAYLAND)
|
||||
endif()
|
||||
if (WITH_GHOST_X11)
|
||||
if (WITH_GL_EGL)
|
||||
list(APPEND XR_PLATFORM_DEFINES -DXR_USE_PLATFORM_EGL)
|
||||
else()
|
||||
list(APPEND XR_PLATFORM_DEFINES -DXR_USE_PLATFORM_XLIB)
|
||||
endif()
|
||||
endif()
|
||||
list(APPEND XR_PLATFORM_DEFINES
|
||||
-DXR_OS_LINUX
|
||||
-DXR_USE_PLATFORM_XLIB
|
||||
)
|
||||
endif()
|
||||
|
||||
add_definitions(-DWITH_XR_OPENXR ${XR_PLATFORM_DEFINES})
|
||||
|
@@ -95,7 +95,7 @@ class GHOST_ISystemPaths {
|
||||
virtual void addToSystemRecentFiles(const char *filename) const = 0;
|
||||
|
||||
private:
|
||||
/** The one and only system paths. */
|
||||
/** The one and only system paths*/
|
||||
static GHOST_ISystemPaths *m_systemPaths;
|
||||
|
||||
#ifdef WITH_CXX_GUARDEDALLOC
|
||||
|
@@ -105,8 +105,8 @@ typedef enum {
|
||||
|
||||
typedef enum {
|
||||
GHOST_kTabletAutomatic = 0,
|
||||
/* Show as Windows Ink to users to match "Use Windows Ink" in tablet utilities,
|
||||
* but we use the dependent Windows Pointer API. */
|
||||
/* Show as Windows Ink to users to match "Use Windows Ink" in tablet utilities, but we use the
|
||||
dependent Windows Pointer API. */
|
||||
GHOST_kTabletWinPointer,
|
||||
GHOST_kTabletWintab,
|
||||
} GHOST_TTabletAPI;
|
||||
@@ -170,7 +170,7 @@ typedef enum {
|
||||
GHOST_kButtonMaskRight,
|
||||
GHOST_kButtonMaskButton4,
|
||||
GHOST_kButtonMaskButton5,
|
||||
/* Trackballs and programmable buttons. */
|
||||
/* Trackballs and programmable buttons */
|
||||
GHOST_kButtonMaskButton6,
|
||||
GHOST_kButtonMaskButton7,
|
||||
GHOST_kButtonNumMasks
|
||||
@@ -179,15 +179,15 @@ typedef enum {
|
||||
typedef enum {
|
||||
GHOST_kEventUnknown = 0,
|
||||
|
||||
GHOST_kEventCursorMove, /* Mouse move event. */
|
||||
GHOST_kEventButtonDown, /* Mouse button event. */
|
||||
GHOST_kEventButtonUp, /* Mouse button event. */
|
||||
GHOST_kEventWheel, /* Mouse wheel event. */
|
||||
GHOST_kEventTrackpad, /* Trackpad event. */
|
||||
GHOST_kEventCursorMove, /// Mouse move event
|
||||
GHOST_kEventButtonDown, /// Mouse button event
|
||||
GHOST_kEventButtonUp, /// Mouse button event
|
||||
GHOST_kEventWheel, /// Mouse wheel event
|
||||
GHOST_kEventTrackpad, /// Trackpad event
|
||||
|
||||
#ifdef WITH_INPUT_NDOF
|
||||
GHOST_kEventNDOFMotion, /* N degree of freedom device motion event. */
|
||||
GHOST_kEventNDOFButton, /* N degree of freedom device button event. */
|
||||
GHOST_kEventNDOFMotion, /// N degree of freedom device motion event
|
||||
GHOST_kEventNDOFButton, /// N degree of freedom device button event
|
||||
#endif
|
||||
|
||||
GHOST_kEventKeyDown,
|
||||
@@ -209,8 +209,8 @@ typedef enum {
|
||||
GHOST_kEventDraggingExited,
|
||||
GHOST_kEventDraggingDropDone,
|
||||
|
||||
GHOST_kEventOpenMainFile, /* Needed for Cocoa to open double-clicked .blend file at startup. */
|
||||
GHOST_kEventNativeResolutionChange, /* Needed for Cocoa when window moves to other display. */
|
||||
GHOST_kEventOpenMainFile, // Needed for Cocoa to open double-clicked .blend file at startup
|
||||
GHOST_kEventNativeResolutionChange, // Needed for Cocoa when window moves to other display
|
||||
|
||||
GHOST_kEventTimer,
|
||||
|
||||
@@ -283,7 +283,7 @@ typedef enum {
|
||||
GHOST_kKeyPeriod = '.',
|
||||
GHOST_kKeySlash = '/',
|
||||
|
||||
/* Number keys. */
|
||||
// Number keys
|
||||
GHOST_kKey0 = '0',
|
||||
GHOST_kKey1,
|
||||
GHOST_kKey2,
|
||||
@@ -298,7 +298,7 @@ typedef enum {
|
||||
GHOST_kKeySemicolon = ';',
|
||||
GHOST_kKeyEqual = '=',
|
||||
|
||||
/* Character keys. */
|
||||
// Character keys
|
||||
GHOST_kKeyA = 'A',
|
||||
GHOST_kKeyB,
|
||||
GHOST_kKeyC,
|
||||
@@ -337,9 +337,9 @@ typedef enum {
|
||||
GHOST_kKeyRightControl,
|
||||
GHOST_kKeyLeftAlt,
|
||||
GHOST_kKeyRightAlt,
|
||||
GHOST_kKeyOS, /* Command key on Apple, Windows key(s) on Windows. */
|
||||
GHOST_kKeyGrLess, /* German PC only! */
|
||||
GHOST_kKeyApp, /* Also known as menu key. */
|
||||
GHOST_kKeyOS, // Command key on Apple, Windows key(s) on Windows
|
||||
GHOST_kKeyGrLess, // German PC only!
|
||||
GHOST_kKeyApp, /* Also known as menu key. */
|
||||
|
||||
GHOST_kKeyCapsLock,
|
||||
GHOST_kKeyNumLock,
|
||||
@@ -360,7 +360,7 @@ typedef enum {
|
||||
GHOST_kKeyUpPage,
|
||||
GHOST_kKeyDownPage,
|
||||
|
||||
/* Numpad keys. */
|
||||
// Numpad keys
|
||||
GHOST_kKeyNumpad0,
|
||||
GHOST_kKeyNumpad1,
|
||||
GHOST_kKeyNumpad2,
|
||||
@@ -378,7 +378,7 @@ typedef enum {
|
||||
GHOST_kKeyNumpadAsterisk,
|
||||
GHOST_kKeyNumpadSlash,
|
||||
|
||||
/* Function keys. */
|
||||
// Function keys
|
||||
GHOST_kKeyF1,
|
||||
GHOST_kKeyF2,
|
||||
GHOST_kKeyF3,
|
||||
@@ -404,7 +404,7 @@ typedef enum {
|
||||
GHOST_kKeyF23,
|
||||
GHOST_kKeyF24,
|
||||
|
||||
/* Multimedia keypad buttons. */
|
||||
// Multimedia keypad buttons
|
||||
GHOST_kKeyMediaPlay,
|
||||
GHOST_kKeyMediaStop,
|
||||
GHOST_kKeyMediaFirst,
|
||||
@@ -481,9 +481,9 @@ typedef struct {
|
||||
|
||||
typedef enum {
|
||||
GHOST_kDragnDropTypeUnknown = 0,
|
||||
GHOST_kDragnDropTypeFilenames, /* Array of strings representing file names (full path). */
|
||||
GHOST_kDragnDropTypeString, /* Unformatted text UTF-8 string. */
|
||||
GHOST_kDragnDropTypeBitmap /* Bitmap image data. */
|
||||
GHOST_kDragnDropTypeFilenames, /*Array of strings representing file names (full path) */
|
||||
GHOST_kDragnDropTypeString, /* Unformatted text UTF-8 string */
|
||||
GHOST_kDragnDropTypeBitmap /*Bitmap image data */
|
||||
} GHOST_TDragnDropTypes;
|
||||
|
||||
typedef struct {
|
||||
@@ -529,23 +529,18 @@ typedef enum {
|
||||
#ifdef WITH_INPUT_NDOF
|
||||
typedef struct {
|
||||
/** N-degree of freedom device data v3 [GSoC 2010] */
|
||||
/* Each component normally ranges from -1 to +1, but can exceed that.
|
||||
* These use blender standard view coordinates,
|
||||
* with positive rotations being CCW about the axis. */
|
||||
/* translation: */
|
||||
float tx, ty, tz;
|
||||
/* rotation:
|
||||
* - `axis = (rx,ry,rz).normalized`
|
||||
* - `amount = (rx,ry,rz).magnitude` [in revolutions, 1.0 = 360 deg]. */
|
||||
float rx, ry, rz;
|
||||
/** Time since previous NDOF Motion event */
|
||||
float dt;
|
||||
/** Starting, #GHOST_kInProgress or #GHOST_kFinishing (for modal handlers) */
|
||||
GHOST_TProgress progress;
|
||||
// Each component normally ranges from -1 to +1, but can exceed that.
|
||||
// These use blender standard view coordinates, with positive rotations being CCW about the axis.
|
||||
float tx, ty, tz; // translation
|
||||
float rx, ry, rz; // rotation:
|
||||
// axis = (rx,ry,rz).normalized
|
||||
// amount = (rx,ry,rz).magnitude [in revolutions, 1.0 = 360 deg]
|
||||
float dt; // time since previous NDOF Motion event
|
||||
GHOST_TProgress progress; // Starting, InProgress or Finishing (for modal handlers)
|
||||
} GHOST_TEventNDOFMotionData;
|
||||
|
||||
typedef enum { GHOST_kPress, GHOST_kRelease } GHOST_TButtonAction;
|
||||
/* Good for mouse or other buttons too, hmmm? */
|
||||
// good for mouse or other buttons too, hmmm?
|
||||
|
||||
typedef struct {
|
||||
GHOST_TButtonAction action;
|
||||
@@ -568,7 +563,7 @@ typedef struct {
|
||||
*/
|
||||
/** The ascii code for the key event ('\0' if none). */
|
||||
char ascii;
|
||||
/** The unicode character. if the length is 6, not NULL terminated if all 6 are set. */
|
||||
/** The unicode character. if the length is 6, not NULL terminated if all 6 are set */
|
||||
char utf8_buf[6];
|
||||
|
||||
/** Generated by auto-repeat. */
|
||||
@@ -601,8 +596,7 @@ typedef void *GHOST_TEmbedderWindowID;
|
||||
#endif // _WIN32
|
||||
|
||||
#ifndef _WIN32
|
||||
/* I can't use "Window" from `X11/Xlib.h`
|
||||
* because it conflicts with Window defined in `winlay.h`. */
|
||||
// I can't use "Window" from "<X11/Xlib.h>" because it conflits with Window defined in winlay.h
|
||||
typedef int GHOST_TEmbedderWindowID;
|
||||
#endif // _WIN32
|
||||
|
||||
@@ -650,10 +644,8 @@ typedef void *(*GHOST_XrGraphicsContextBindFn)(void);
|
||||
typedef void (*GHOST_XrGraphicsContextUnbindFn)(GHOST_ContextHandle graphics_context);
|
||||
typedef void (*GHOST_XrDrawViewFn)(const struct GHOST_XrDrawViewInfo *draw_view, void *customdata);
|
||||
|
||||
/**
|
||||
* An array of #GHOST_TXrGraphicsBinding items defining the candidate bindings to use.
|
||||
* The first available candidate will be chosen, so order defines priority.
|
||||
*/
|
||||
/* An array of GHOST_TXrGraphicsBinding items defining the candidate bindings to use. The first
|
||||
* available candidate will be chosen, so order defines priority. */
|
||||
typedef const GHOST_TXrGraphicsBinding *GHOST_XrGraphicsBindingCandidates;
|
||||
|
||||
typedef struct {
|
||||
@@ -694,7 +686,7 @@ typedef struct GHOST_XrDrawViewInfo {
|
||||
float angle_up, angle_down;
|
||||
} fov;
|
||||
|
||||
/** Set if the buffer should be submitted with a SRGB transfer applied. */
|
||||
/** Set if the buffer should be submitted with a srgb transfer applied. */
|
||||
char expects_srgb_buffer;
|
||||
} GHOST_XrDrawViewInfo;
|
||||
|
||||
@@ -744,7 +736,7 @@ typedef struct GHOST_XrActionSpaceInfo {
|
||||
typedef struct GHOST_XrActionBindingInfo {
|
||||
const char *action_name;
|
||||
GHOST_TUns32 count_interaction_paths;
|
||||
/** Interaction path: User (sub-action) path + component path. */
|
||||
/** Interaction path: User (subaction) path + component path. */
|
||||
const char **interaction_paths;
|
||||
} GHOST_XrActionBindingInfo;
|
||||
|
||||
|
@@ -149,9 +149,6 @@ static bool egl_chk(bool result, const char *file = NULL, int line = 0, const ch
|
||||
static_cast<unsigned int>(error),
|
||||
code ? code : "<Unknown>",
|
||||
msg ? msg : "<Unknown>");
|
||||
(void)(file);
|
||||
(void)(line);
|
||||
(void)(text);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -202,8 +199,7 @@ template<typename T> T &choose_api(EGLenum api, T &a, T &b, T &c)
|
||||
}
|
||||
}
|
||||
|
||||
GHOST_ContextEGL::GHOST_ContextEGL(const GHOST_System *const system,
|
||||
bool stereoVisual,
|
||||
GHOST_ContextEGL::GHOST_ContextEGL(bool stereoVisual,
|
||||
EGLNativeWindowType nativeWindow,
|
||||
EGLNativeDisplayType nativeDisplay,
|
||||
EGLint contextProfileMask,
|
||||
@@ -213,7 +209,6 @@ GHOST_ContextEGL::GHOST_ContextEGL(const GHOST_System *const system,
|
||||
EGLint contextResetNotificationStrategy,
|
||||
EGLenum api)
|
||||
: GHOST_Context(stereoVisual),
|
||||
m_system(system),
|
||||
m_nativeDisplay(nativeDisplay),
|
||||
m_nativeWindow(nativeWindow),
|
||||
m_contextProfileMask(contextProfileMask),
|
||||
@@ -290,21 +285,6 @@ GHOST_TSuccess GHOST_ContextEGL::getSwapInterval(int &intervalOut)
|
||||
return GHOST_kSuccess;
|
||||
}
|
||||
|
||||
EGLDisplay GHOST_ContextEGL::getDisplay() const
|
||||
{
|
||||
return m_display;
|
||||
}
|
||||
|
||||
EGLConfig GHOST_ContextEGL::getConfig() const
|
||||
{
|
||||
return m_config;
|
||||
}
|
||||
|
||||
EGLContext GHOST_ContextEGL::getContext() const
|
||||
{
|
||||
return m_context;
|
||||
}
|
||||
|
||||
GHOST_TSuccess GHOST_ContextEGL::activateDrawingContext()
|
||||
{
|
||||
if (m_display) {
|
||||
@@ -476,7 +456,9 @@ GHOST_TSuccess GHOST_ContextEGL::initializeDrawingContext()
|
||||
|
||||
attrib_list.push_back(EGL_NONE);
|
||||
|
||||
if (!EGL_CHK(::eglChooseConfig(m_display, &(attrib_list[0]), &m_config, 1, &num_config)))
|
||||
EGLConfig config;
|
||||
|
||||
if (!EGL_CHK(::eglChooseConfig(m_display, &(attrib_list[0]), &config, 1, &num_config)))
|
||||
goto error;
|
||||
|
||||
// A common error is to assume that ChooseConfig worked because it returned EGL_TRUE
|
||||
@@ -484,7 +466,7 @@ GHOST_TSuccess GHOST_ContextEGL::initializeDrawingContext()
|
||||
goto error;
|
||||
|
||||
if (m_nativeWindow != 0) {
|
||||
m_surface = ::eglCreateWindowSurface(m_display, m_config, m_nativeWindow, NULL);
|
||||
m_surface = ::eglCreateWindowSurface(m_display, config, m_nativeWindow, NULL);
|
||||
}
|
||||
else {
|
||||
static const EGLint pb_attrib_list[] = {
|
||||
@@ -494,7 +476,7 @@ GHOST_TSuccess GHOST_ContextEGL::initializeDrawingContext()
|
||||
1,
|
||||
EGL_NONE,
|
||||
};
|
||||
m_surface = ::eglCreatePbufferSurface(m_display, m_config, pb_attrib_list);
|
||||
m_surface = ::eglCreatePbufferSurface(m_display, config, pb_attrib_list);
|
||||
}
|
||||
|
||||
if (!EGL_CHK(m_surface != EGL_NO_SURFACE))
|
||||
@@ -595,7 +577,7 @@ GHOST_TSuccess GHOST_ContextEGL::initializeDrawingContext()
|
||||
|
||||
attrib_list.push_back(EGL_NONE);
|
||||
|
||||
m_context = ::eglCreateContext(m_display, m_config, m_sharedContext, &(attrib_list[0]));
|
||||
m_context = ::eglCreateContext(m_display, config, m_sharedContext, &(attrib_list[0]));
|
||||
|
||||
if (!EGL_CHK(m_context != EGL_NO_CONTEXT))
|
||||
goto error;
|
||||
|
@@ -24,7 +24,6 @@
|
||||
#pragma once
|
||||
|
||||
#include "GHOST_Context.h"
|
||||
#include "GHOST_System.h"
|
||||
|
||||
#include <GL/eglew.h>
|
||||
|
||||
@@ -37,15 +36,11 @@
|
||||
#endif
|
||||
|
||||
class GHOST_ContextEGL : public GHOST_Context {
|
||||
/* XR code needs low level graphics data to send to OpenXR. */
|
||||
friend class GHOST_XrGraphicsBindingOpenGL;
|
||||
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
GHOST_ContextEGL(const GHOST_System *const system,
|
||||
bool stereoVisual,
|
||||
GHOST_ContextEGL(bool stereoVisual,
|
||||
EGLNativeWindowType nativeWindow,
|
||||
EGLNativeDisplayType nativeDisplay,
|
||||
EGLint contextProfileMask,
|
||||
@@ -105,17 +100,9 @@ class GHOST_ContextEGL : public GHOST_Context {
|
||||
*/
|
||||
GHOST_TSuccess getSwapInterval(int &intervalOut);
|
||||
|
||||
EGLDisplay getDisplay() const;
|
||||
|
||||
EGLConfig getConfig() const;
|
||||
|
||||
EGLContext getContext() const;
|
||||
|
||||
private:
|
||||
bool initContextEGLEW();
|
||||
|
||||
const GHOST_System *const m_system;
|
||||
|
||||
EGLNativeDisplayType m_nativeDisplay;
|
||||
EGLNativeWindowType m_nativeWindow;
|
||||
|
||||
@@ -130,7 +117,6 @@ class GHOST_ContextEGL : public GHOST_Context {
|
||||
EGLContext m_context;
|
||||
EGLSurface m_surface;
|
||||
EGLDisplay m_display;
|
||||
EGLConfig m_config;
|
||||
|
||||
EGLint m_swap_interval;
|
||||
|
||||
|
@@ -124,7 +124,7 @@ GHOST_TSuccess GHOST_ContextGLX::initializeDrawingContext()
|
||||
GHOST_X11_ERROR_HANDLERS_OVERRIDE(handler_store);
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/* Begin Inline Glew */
|
||||
/* Begin Inline Glew */
|
||||
|
||||
#ifdef USE_GLXEW_INIT_WORKAROUND
|
||||
const GLubyte *extStart = (GLubyte *)"";
|
||||
|
@@ -161,5 +161,5 @@ GHOST_TSuccess GHOST_DisplayManagerCocoa::setCurrentDisplaySetting(
|
||||
|
||||
// CGDisplayErr err = ::CGDisplaySwitchToMode(m_displayIDs[display], displayModeValues);
|
||||
|
||||
return /* err == CGDisplayNoErr ? */ GHOST_kSuccess /* : GHOST_kFailure */;
|
||||
return /*err == CGDisplayNoErr ?*/ GHOST_kSuccess /*: GHOST_kFailure*/;
|
||||
}
|
||||
|
@@ -160,7 +160,7 @@ GHOST_TSuccess GHOST_DisplayManagerSDL::setCurrentDisplaySetting(
|
||||
else {
|
||||
/* this is a problem for the BGE player :S, perhaps SDL2 will resolve at some point.
|
||||
* we really need SDL_SetDisplayModeForDisplay() to become an API func! - campbell */
|
||||
printf("no windows available, can't fullscreen\n");
|
||||
printf("no windows available, cant fullscreen\n");
|
||||
|
||||
/* do not fail, we will try again later when the window is created - wander */
|
||||
return GHOST_kSuccess;
|
||||
|
@@ -31,17 +31,10 @@ class GHOST_IXrGraphicsBinding {
|
||||
public:
|
||||
union {
|
||||
#if defined(WITH_GHOST_X11)
|
||||
# if defined(WITH_GL_EGL)
|
||||
XrGraphicsBindingEGLMNDX egl;
|
||||
# else
|
||||
XrGraphicsBindingOpenGLXlibKHR glx;
|
||||
# endif
|
||||
#elif defined(WIN32)
|
||||
XrGraphicsBindingOpenGLWin32KHR wgl;
|
||||
XrGraphicsBindingD3D11KHR d3d11;
|
||||
#endif
|
||||
#if defined(WITH_GHOST_WAYLAND)
|
||||
XrGraphicsBindingOpenGLWaylandKHR wl;
|
||||
#endif
|
||||
} oxr_binding;
|
||||
|
||||
|
@@ -239,7 +239,7 @@ class GHOST_System : public GHOST_ISystem {
|
||||
* Set which tablet API to use. Only affects Windows, other platforms have a single API.
|
||||
* \param api: Enum indicating which API to use.
|
||||
*/
|
||||
virtual void setTabletAPI(GHOST_TTabletAPI api);
|
||||
virtual void setTabletAPI(GHOST_TTabletAPI api) override;
|
||||
GHOST_TTabletAPI getTabletAPI(void);
|
||||
|
||||
#ifdef WITH_INPUT_NDOF
|
||||
@@ -328,8 +328,8 @@ class GHOST_System : public GHOST_ISystem {
|
||||
*/
|
||||
virtual GHOST_TSuccess showMessageBox(const char * /*title*/,
|
||||
const char * /*message*/,
|
||||
const char * /*help_label*/,
|
||||
const char * /*continue_label*/,
|
||||
const char * /*help_label */,
|
||||
const char * /*continue_label */,
|
||||
const char * /*link*/,
|
||||
GHOST_DialogOptions /*dialog_options*/) const
|
||||
{
|
||||
|
@@ -32,7 +32,11 @@
|
||||
#include "GHOST_WindowCocoa.h"
|
||||
#include "GHOST_WindowManager.h"
|
||||
|
||||
#include "GHOST_ContextCGL.h"
|
||||
#if defined(WITH_GL_EGL)
|
||||
# include "GHOST_ContextEGL.h"
|
||||
#else
|
||||
# include "GHOST_ContextCGL.h"
|
||||
#endif
|
||||
|
||||
#ifdef WITH_INPUT_NDOF
|
||||
# include "GHOST_NDOFManagerCocoa.h"
|
||||
@@ -86,8 +90,7 @@ static GHOST_TKey convertKey(int rawCode, unichar recvChar, UInt16 keyAction)
|
||||
{
|
||||
// printf("\nrecvchar %c 0x%x",recvChar,recvChar);
|
||||
switch (rawCode) {
|
||||
/* Physical key-codes: (not used due to map changes in int'l keyboards). */
|
||||
#if 0
|
||||
/*Physical keycodes not used due to map changes in int'l keyboards
|
||||
case kVK_ANSI_A: return GHOST_kKeyA;
|
||||
case kVK_ANSI_B: return GHOST_kKeyB;
|
||||
case kVK_ANSI_C: return GHOST_kKeyC;
|
||||
@@ -113,9 +116,9 @@ static GHOST_TKey convertKey(int rawCode, unichar recvChar, UInt16 keyAction)
|
||||
case kVK_ANSI_W: return GHOST_kKeyW;
|
||||
case kVK_ANSI_X: return GHOST_kKeyX;
|
||||
case kVK_ANSI_Y: return GHOST_kKeyY;
|
||||
case kVK_ANSI_Z: return GHOST_kKeyZ;
|
||||
#endif
|
||||
/* Numbers keys: mapped to handle some int'l keyboard (e.g. French). */
|
||||
case kVK_ANSI_Z: return GHOST_kKeyZ;*/
|
||||
|
||||
/* Numbers keys mapped to handle some int'l keyboard (e.g. French)*/
|
||||
case kVK_ISO_Section:
|
||||
return GHOST_kKeyUnknown;
|
||||
case kVK_ANSI_1:
|
||||
@@ -245,8 +248,8 @@ static GHOST_TKey convertKey(int rawCode, unichar recvChar, UInt16 keyAction)
|
||||
return GHOST_kKeyUpPage;
|
||||
case kVK_PageDown:
|
||||
return GHOST_kKeyDownPage;
|
||||
#if 0 /* TODO: why are these commented? */
|
||||
case kVK_ANSI_Minus: return GHOST_kKeyMinus;
|
||||
|
||||
/*case kVK_ANSI_Minus: return GHOST_kKeyMinus;
|
||||
case kVK_ANSI_Equal: return GHOST_kKeyEqual;
|
||||
case kVK_ANSI_Comma: return GHOST_kKeyComma;
|
||||
case kVK_ANSI_Period: return GHOST_kKeyPeriod;
|
||||
@@ -256,15 +259,15 @@ static GHOST_TKey convertKey(int rawCode, unichar recvChar, UInt16 keyAction)
|
||||
case kVK_ANSI_Backslash: return GHOST_kKeyBackslash;
|
||||
case kVK_ANSI_LeftBracket: return GHOST_kKeyLeftBracket;
|
||||
case kVK_ANSI_RightBracket: return GHOST_kKeyRightBracket;
|
||||
case kVK_ANSI_Grave: return GHOST_kKeyAccentGrave;
|
||||
#endif
|
||||
case kVK_ANSI_Grave: return GHOST_kKeyAccentGrave;*/
|
||||
|
||||
case kVK_VolumeUp:
|
||||
case kVK_VolumeDown:
|
||||
case kVK_Mute:
|
||||
return GHOST_kKeyUnknown;
|
||||
|
||||
default: {
|
||||
/* Alphanumerical or punctuation key that is remappable in int'l keyboards. */
|
||||
/* alphanumerical or punctuation key that is remappable in int'l keyboards */
|
||||
if ((recvChar >= 'A') && (recvChar <= 'Z')) {
|
||||
return (GHOST_TKey)(recvChar - 'A' + GHOST_kKeyA);
|
||||
}
|
||||
@@ -272,8 +275,8 @@ static GHOST_TKey convertKey(int rawCode, unichar recvChar, UInt16 keyAction)
|
||||
return (GHOST_TKey)(recvChar - 'a' + GHOST_kKeyA);
|
||||
}
|
||||
else {
|
||||
/* Leopard and Snow Leopard 64bit compatible API. */
|
||||
CFDataRef uchrHandle; /* The keyboard layout. */
|
||||
/* Leopard and Snow Leopard 64bit compatible API*/
|
||||
CFDataRef uchrHandle; /*the keyboard layout*/
|
||||
TISInputSourceRef kbdTISHandle;
|
||||
|
||||
kbdTISHandle = TISCopyCurrentKeyboardLayoutInputSource();
|
||||
@@ -281,9 +284,9 @@ static GHOST_TKey convertKey(int rawCode, unichar recvChar, UInt16 keyAction)
|
||||
kTISPropertyUnicodeKeyLayoutData);
|
||||
CFRelease(kbdTISHandle);
|
||||
|
||||
/* Get actual character value of the "remappable" keys in int'l keyboards,
|
||||
* if keyboard layout is not correctly reported (e.g. some non Apple keyboards in Tiger),
|
||||
* then fallback on using the received #charactersIgnoringModifiers. */
|
||||
/*get actual character value of the "remappable" keys in int'l keyboards,
|
||||
if keyboard layout is not correctly reported (e.g. some non Apple keyboards in Tiger),
|
||||
then fallback on using the received charactersIgnoringModifiers */
|
||||
if (uchrHandle) {
|
||||
UInt32 deadKeyState = 0;
|
||||
UniCharCount actualStrLength = 0;
|
||||
@@ -434,10 +437,8 @@ extern "C" int GHOST_HACK_getFirstFile(char buf[FIRSTFILEBUFLG])
|
||||
// So WM_exit needs to be called directly, as the event loop will never run before termination
|
||||
- (void)applicationWillTerminate:(NSNotification *)aNotification
|
||||
{
|
||||
#if 0
|
||||
G.is_break = false; /* Let Cocoa perform the termination at the end. */
|
||||
WM_exit(C);
|
||||
#endif
|
||||
/*G.is_break = FALSE; //Let Cocoa perform the termination at the end
|
||||
WM_exit(C);*/
|
||||
}
|
||||
|
||||
- (void)applicationWillBecomeActive:(NSNotification *)aNotification
|
||||
@@ -552,12 +553,10 @@ GHOST_TSuccess GHOST_SystemCocoa::init()
|
||||
// ProcessSerialNumber psn;
|
||||
|
||||
// Carbon stuff to move window & menu to foreground
|
||||
#if 0
|
||||
if (!GetCurrentProcess(&psn)) {
|
||||
/*if (!GetCurrentProcess(&psn)) {
|
||||
TransformProcessType(&psn, kProcessTransformToForegroundApplication);
|
||||
SetFrontProcess(&psn);
|
||||
}
|
||||
#endif
|
||||
}*/
|
||||
|
||||
@autoreleasepool {
|
||||
[NSApplication sharedApplication]; // initializes NSApp
|
||||
@@ -1218,7 +1217,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleDraggingEvent(GHOST_TEventType eventType
|
||||
return GHOST_kFailure;
|
||||
}
|
||||
|
||||
/* Get the bitmap of the image. */
|
||||
/*Get the bitmap of the image*/
|
||||
enumerator = [[droppedImg representations] objectEnumerator];
|
||||
while ((representation = [enumerator nextObject])) {
|
||||
if ([representation isKindOfClass:[NSBitmapImageRep class]]) {
|
||||
@@ -1231,7 +1230,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleDraggingEvent(GHOST_TEventType eventType
|
||||
|
||||
if (([bitmapImage bitsPerPixel] == 32) && (([bitmapImage bitmapFormat] & 0x5) == 0) &&
|
||||
![bitmapImage isPlanar]) {
|
||||
/* Try a fast copy if the image is a meshed RGBA 32bit bitmap. */
|
||||
/* Try a fast copy if the image is a meshed RGBA 32bit bitmap*/
|
||||
toIBuf = (GHOST_TUns8 *)ibuf->rect;
|
||||
rasterRGB = (GHOST_TUns8 *)[bitmapImage bitmapData];
|
||||
for (y = 0; y < imgSize.height; y++) {
|
||||
@@ -1261,7 +1260,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleDraggingEvent(GHOST_TEventType eventType
|
||||
colorSpaceName:NSDeviceRGBColorSpace
|
||||
bitmapFormat:(NSBitmapFormat)0
|
||||
bytesPerRow:4 * imgSize.width
|
||||
bitsPerPixel:32 /* RGB format padded to 32bits. */];
|
||||
bitsPerPixel:32 /*RGB format padded to 32bits*/];
|
||||
|
||||
[NSGraphicsContext saveGraphicsState];
|
||||
[NSGraphicsContext
|
||||
@@ -1308,7 +1307,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleDraggingEvent(GHOST_TEventType eventType
|
||||
return GHOST_kFailure;
|
||||
}
|
||||
|
||||
/* Copy the image to ibuf, flipping it vertically. */
|
||||
/*Copy the image to ibuf, flipping it vertically*/
|
||||
toIBuf = (GHOST_TUns8 *)ibuf->rect;
|
||||
for (y = 0; y < imgSize.height; y++) {
|
||||
for (x = 0; x < imgSize.width; x++) {
|
||||
|
@@ -376,7 +376,7 @@ void GHOST_SystemSDL::processEvent(SDL_Event *sdl_event)
|
||||
bounds.wrapPoint(x_new, y_new, 8, window->getCursorGrabAxis());
|
||||
window->getCursorGrabAccum(x_accum, y_accum);
|
||||
|
||||
// can't use setCursorPosition because the mouse may have no focus!
|
||||
// cant use setCursorPosition because the mouse may have no focus!
|
||||
if (x_new != x_root || y_new != y_root) {
|
||||
if (1) { //xme.time > m_last_warp) {
|
||||
/* when wrapping we don't need to add an event because the
|
||||
|
@@ -1590,36 +1590,15 @@ GHOST_IContext *GHOST_SystemWayland::createOffscreenContext(GHOST_GLSettings /*g
|
||||
d->os_surfaces.push_back(os_surface);
|
||||
d->os_egl_windows.push_back(os_egl_window);
|
||||
|
||||
GHOST_Context *context;
|
||||
|
||||
for (int minor = 6; minor >= 0; --minor) {
|
||||
context = new GHOST_ContextEGL(this,
|
||||
false,
|
||||
EGLNativeWindowType(os_egl_window),
|
||||
EGLNativeDisplayType(d->display),
|
||||
EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT,
|
||||
4,
|
||||
minor,
|
||||
GHOST_OPENGL_EGL_CONTEXT_FLAGS,
|
||||
GHOST_OPENGL_EGL_RESET_NOTIFICATION_STRATEGY,
|
||||
EGL_OPENGL_API);
|
||||
|
||||
if (context->initializeDrawingContext())
|
||||
return context;
|
||||
else
|
||||
delete context;
|
||||
}
|
||||
|
||||
context = new GHOST_ContextEGL(this,
|
||||
false,
|
||||
EGLNativeWindowType(os_egl_window),
|
||||
EGLNativeDisplayType(d->display),
|
||||
EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT,
|
||||
3,
|
||||
3,
|
||||
GHOST_OPENGL_EGL_CONTEXT_FLAGS,
|
||||
GHOST_OPENGL_EGL_RESET_NOTIFICATION_STRATEGY,
|
||||
EGL_OPENGL_API);
|
||||
GHOST_Context *context = new GHOST_ContextEGL(false,
|
||||
EGLNativeWindowType(os_egl_window),
|
||||
EGLNativeDisplayType(d->display),
|
||||
EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT,
|
||||
3,
|
||||
3,
|
||||
GHOST_OPENGL_EGL_CONTEXT_FLAGS,
|
||||
GHOST_OPENGL_EGL_RESET_NOTIFICATION_STRATEGY,
|
||||
EGL_OPENGL_API);
|
||||
|
||||
if (context->initializeDrawingContext()) {
|
||||
return context;
|
||||
|
@@ -50,7 +50,11 @@
|
||||
#include "GHOST_WindowManager.h"
|
||||
#include "GHOST_WindowWin32.h"
|
||||
|
||||
#include "GHOST_ContextWGL.h"
|
||||
#if defined(WITH_GL_EGL)
|
||||
# include "GHOST_ContextEGL.h"
|
||||
#else
|
||||
# include "GHOST_ContextWGL.h"
|
||||
#endif
|
||||
|
||||
#ifdef WITH_INPUT_NDOF
|
||||
# include "GHOST_NDOFManagerWin32.h"
|
||||
@@ -866,7 +870,7 @@ GHOST_EventButton *GHOST_SystemWin32::processButtonEvent(GHOST_TEventType type,
|
||||
|
||||
/* Move mouse to button event position. */
|
||||
if (window->getTabletData().Active != GHOST_kTabletModeNone) {
|
||||
/* Tablet should be handling in between mouse moves, only move to event position. */
|
||||
/* Tablet should be handling inbetween mouse moves, only move to event position. */
|
||||
DWORD msgPos = ::GetMessagePos();
|
||||
int msgPosX = GET_X_LPARAM(msgPos);
|
||||
int msgPosY = GET_Y_LPARAM(msgPos);
|
||||
@@ -1012,8 +1016,8 @@ void GHOST_SystemWin32::processWintabEvent(GHOST_WindowWin32 *window)
|
||||
void GHOST_SystemWin32::processPointerEvent(
|
||||
UINT type, GHOST_WindowWin32 *window, WPARAM wParam, LPARAM lParam, bool &eventHandled)
|
||||
{
|
||||
/* Pointer events might fire when changing windows for a device which is set to use Wintab,
|
||||
* even when Wintab is left enabled but set to the bottom of Wintab overlap order. */
|
||||
/* Pointer events might fire when changing windows for a device which is set to use Wintab, even
|
||||
* when when Wintab is left enabled but set to the bottom of Wintab overlap order. */
|
||||
if (!window->usingTabletAPI(GHOST_kTabletWinPointer)) {
|
||||
return;
|
||||
}
|
||||
@@ -1503,7 +1507,7 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam,
|
||||
case WM_SYSKEYDOWN:
|
||||
case WM_KEYUP:
|
||||
case WM_SYSKEYUP:
|
||||
/* These functions were replaced by #WM_INPUT. */
|
||||
/* These functions were replaced by WM_INPUT*/
|
||||
case WM_CHAR:
|
||||
/* The WM_CHAR message is posted to the window with the keyboard focus when
|
||||
* a WM_KEYDOWN message is translated by the TranslateMessage function. WM_CHAR
|
||||
@@ -1597,6 +1601,17 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam,
|
||||
}
|
||||
else {
|
||||
wt->leaveRange();
|
||||
|
||||
/* Send mouse event to signal end of tablet tracking to operators. */
|
||||
DWORD msgPos = ::GetMessagePos();
|
||||
int x = GET_X_LPARAM(msgPos);
|
||||
int y = GET_Y_LPARAM(msgPos);
|
||||
event = new GHOST_EventCursor(system->getMilliSeconds(),
|
||||
GHOST_kEventCursorMove,
|
||||
window,
|
||||
x,
|
||||
y,
|
||||
GHOST_TABLET_DATA_NONE);
|
||||
}
|
||||
}
|
||||
eventHandled = true;
|
||||
@@ -1636,6 +1651,18 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam,
|
||||
/* Reset pointer pen info if pen device has left tracking range. */
|
||||
if (pointerInfo.pointerType == PT_PEN && !IS_POINTER_INRANGE_WPARAM(wParam)) {
|
||||
window->resetPointerPenInfo();
|
||||
|
||||
/* Send mouse event to signal end of tablet tracking to operators. */
|
||||
DWORD msgPos = ::GetMessagePos();
|
||||
int x = GET_X_LPARAM(msgPos);
|
||||
int y = GET_Y_LPARAM(msgPos);
|
||||
event = new GHOST_EventCursor(system->getMilliSeconds(),
|
||||
GHOST_kEventCursorMove,
|
||||
window,
|
||||
x,
|
||||
y,
|
||||
GHOST_TABLET_DATA_NONE);
|
||||
|
||||
eventHandled = true;
|
||||
}
|
||||
break;
|
||||
@@ -1851,7 +1878,7 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam,
|
||||
* to perform any move or size change processing during the WM_WINDOWPOSCHANGED
|
||||
* message without calling DefWindowProc.
|
||||
*/
|
||||
/* See #WM_SIZE comment. */
|
||||
/* see WM_SIZE comment*/
|
||||
if (window->m_inLiveResize) {
|
||||
system->pushEvent(processWindowEvent(GHOST_kEventWindowMove, window));
|
||||
system->dispatchEvents();
|
||||
@@ -1889,7 +1916,10 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam,
|
||||
case WM_DISPLAYCHANGE: {
|
||||
GHOST_Wintab *wt = window->getWintab();
|
||||
if (wt) {
|
||||
wt->remapCoordinates();
|
||||
for (GHOST_IWindow *iter_win : system->getWindowManager()->getWindows()) {
|
||||
GHOST_WindowWin32 *iter_win32win = (GHOST_WindowWin32 *)iter_win;
|
||||
wt->remapCoordinates();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@@ -89,7 +89,7 @@
|
||||
/* see T34039 Fix Alt key glitch on Unity desktop */
|
||||
#define USE_UNITY_WORKAROUND
|
||||
|
||||
/* Fix 'shortcut' part of keyboard reading code only ever using first defined key-map
|
||||
/* Fix 'shortcut' part of keyboard reading code only ever using first defined keymap
|
||||
* instead of active one. See T47228 and D1746 */
|
||||
#define USE_NON_LATIN_KB_WORKAROUND
|
||||
|
||||
@@ -441,8 +441,7 @@ GHOST_IContext *GHOST_SystemX11::createOffscreenContext(GHOST_GLSettings glSetti
|
||||
|
||||
for (int minor = 5; minor >= 0; --minor) {
|
||||
#if defined(WITH_GL_EGL)
|
||||
context = new GHOST_ContextEGL(this,
|
||||
false,
|
||||
context = new GHOST_ContextEGL(false,
|
||||
EGLNativeWindowType(nullptr),
|
||||
EGLNativeDisplayType(m_display),
|
||||
profile_mask,
|
||||
@@ -472,8 +471,7 @@ GHOST_IContext *GHOST_SystemX11::createOffscreenContext(GHOST_GLSettings glSetti
|
||||
}
|
||||
|
||||
#if defined(WITH_GL_EGL)
|
||||
context = new GHOST_ContextEGL(this,
|
||||
false,
|
||||
context = new GHOST_ContextEGL(false,
|
||||
EGLNativeWindowType(nullptr),
|
||||
EGLNativeDisplayType(m_display),
|
||||
profile_mask,
|
||||
@@ -591,7 +589,9 @@ static void SleepTillEvent(Display *display, GHOST_TInt64 maxSleep)
|
||||
}
|
||||
}
|
||||
|
||||
/* This function borrowed from Qt's X11 support qclipboard_x11.cpp */
|
||||
/* This function borrowed from Qt's X11 support
|
||||
* qclipboard_x11.cpp
|
||||
* */
|
||||
struct init_timestamp_data {
|
||||
Time timestamp;
|
||||
};
|
||||
@@ -2563,7 +2563,7 @@ static bool is_filler_char(char c)
|
||||
return isspace(c) || c == '_' || c == '-' || c == ';' || c == ':';
|
||||
}
|
||||
|
||||
/* These C functions are copied from Wine 3.12's `wintab.c` */
|
||||
/* These C functions are copied from Wine 3.12's wintab.c */
|
||||
static bool match_token(const char *haystack, const char *needle)
|
||||
{
|
||||
const char *h, *n;
|
||||
@@ -2675,8 +2675,8 @@ void GHOST_SystemX11::refreshXInputDevices()
|
||||
xtablet.PressureLevels = xvi->axes[2].max_value;
|
||||
|
||||
if (xvi->num_axes > 3) {
|
||||
/* This is assuming that the tablet has the same tilt resolution in both
|
||||
* positive and negative directions. It would be rather weird if it didn't. */
|
||||
/* this is assuming that the tablet has the same tilt resolution in both
|
||||
* positive and negative directions. It would be rather weird if it didn't.. */
|
||||
xtablet.XtiltLevels = xvi->axes[3].max_value;
|
||||
xtablet.YtiltLevels = xvi->axes[4].max_value;
|
||||
}
|
||||
|
@@ -365,7 +365,7 @@ class GHOST_Window : public GHOST_IWindow {
|
||||
/** The current grabbed state of the cursor */
|
||||
GHOST_TGrabCursorMode m_cursorGrab;
|
||||
|
||||
/** Grab cursor axis. */
|
||||
/** Grab cursor axis.*/
|
||||
GHOST_TAxisFlag m_cursorGrabAxis;
|
||||
|
||||
/** Initial grab location. */
|
||||
|
@@ -22,7 +22,11 @@
|
||||
#include "GHOST_Debug.h"
|
||||
#include "GHOST_SystemCocoa.h"
|
||||
|
||||
#include "GHOST_ContextCGL.h"
|
||||
#if defined(WITH_GL_EGL)
|
||||
# include "GHOST_ContextEGL.h"
|
||||
#else
|
||||
# include "GHOST_ContextCGL.h"
|
||||
#endif
|
||||
|
||||
#include <Cocoa/Cocoa.h>
|
||||
#include <Metal/Metal.h>
|
||||
|
@@ -556,7 +556,7 @@ static SDL_Cursor *sdl_ghost_CreateCursor(
|
||||
return cursor;
|
||||
}
|
||||
|
||||
/* TODO, this is currently never freed but it won't leak either. */
|
||||
/* TODO, this is currently never freed but it wont leak either. */
|
||||
static SDL_Cursor *getStandardCursorShape(GHOST_TStandardCursor shape)
|
||||
{
|
||||
if (sdl_std_cursor_array[0] == NULL) {
|
||||
|
@@ -532,25 +532,7 @@ GHOST_Context *GHOST_WindowWayland::newDrawingContext(GHOST_TDrawingContextType
|
||||
context = new GHOST_ContextNone(m_wantStereoVisual);
|
||||
break;
|
||||
case GHOST_kDrawingContextTypeOpenGL:
|
||||
for (int minor = 6; minor >= 0; --minor) {
|
||||
context = new GHOST_ContextEGL(this->m_system,
|
||||
m_wantStereoVisual,
|
||||
EGLNativeWindowType(w->egl_window),
|
||||
EGLNativeDisplayType(m_system->display()),
|
||||
EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT,
|
||||
4,
|
||||
minor,
|
||||
GHOST_OPENGL_EGL_CONTEXT_FLAGS,
|
||||
GHOST_OPENGL_EGL_RESET_NOTIFICATION_STRATEGY,
|
||||
EGL_OPENGL_API);
|
||||
|
||||
if (context->initializeDrawingContext())
|
||||
return context;
|
||||
else
|
||||
delete context;
|
||||
}
|
||||
context = new GHOST_ContextEGL(this->m_system,
|
||||
m_wantStereoVisual,
|
||||
context = new GHOST_ContextEGL(m_wantStereoVisual,
|
||||
EGLNativeWindowType(w->egl_window),
|
||||
EGLNativeDisplayType(m_system->display()),
|
||||
EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT,
|
||||
@@ -559,6 +541,7 @@ GHOST_Context *GHOST_WindowWayland::newDrawingContext(GHOST_TDrawingContextType
|
||||
GHOST_OPENGL_EGL_CONTEXT_FLAGS,
|
||||
GHOST_OPENGL_EGL_RESET_NOTIFICATION_STRATEGY,
|
||||
EGL_OPENGL_API);
|
||||
break;
|
||||
}
|
||||
|
||||
return (context->initializeDrawingContext() == GHOST_kSuccess) ? context : nullptr;
|
||||
|
@@ -30,8 +30,11 @@
|
||||
#include "utf_winfunc.h"
|
||||
#include "utfconv.h"
|
||||
|
||||
#include "GHOST_ContextWGL.h"
|
||||
|
||||
#if defined(WITH_GL_EGL)
|
||||
# include "GHOST_ContextEGL.h"
|
||||
#else
|
||||
# include "GHOST_ContextWGL.h"
|
||||
#endif
|
||||
#ifdef WIN32_COMPOSITING
|
||||
# include <Dwmapi.h>
|
||||
#endif
|
||||
@@ -287,7 +290,7 @@ void GHOST_WindowWin32::setTitle(const char *title)
|
||||
|
||||
std::string GHOST_WindowWin32::getTitle() const
|
||||
{
|
||||
char buf[s_maxTitleLength]; /* CHANGE + never used yet. */
|
||||
char buf[s_maxTitleLength]; /*CHANGE + never used yet*/
|
||||
::GetWindowText(m_hWnd, buf, s_maxTitleLength);
|
||||
return std::string(buf);
|
||||
}
|
||||
|
@@ -273,7 +273,7 @@ class GHOST_WindowWin32 : public GHOST_Window {
|
||||
/**
|
||||
* Loads Wintab context for the window.
|
||||
* \param enable: True if Wintab should be enabled after loading. Wintab should not be enabled if
|
||||
* the window is minimized.
|
||||
* the window is minimzed.
|
||||
*/
|
||||
void loadWintab(bool enable);
|
||||
|
||||
|
@@ -1241,7 +1241,7 @@ GHOST_WindowX11::~GHOST_WindowX11()
|
||||
if (m_valid_setup) {
|
||||
static Atom Primary_atom, Clipboard_atom;
|
||||
Window p_owner, c_owner;
|
||||
/* Change the owner of the Atoms to None if we are the owner. */
|
||||
/*Change the owner of the Atoms to None if we are the owner*/
|
||||
Primary_atom = XInternAtom(m_display, "PRIMARY", False);
|
||||
Clipboard_atom = XInternAtom(m_display, "CLIPBOARD", False);
|
||||
|
||||
@@ -1325,7 +1325,6 @@ GHOST_Context *GHOST_WindowX11::newDrawingContext(GHOST_TDrawingContextType type
|
||||
for (int minor = 5; minor >= 0; --minor) {
|
||||
#ifdef WITH_GL_EGL
|
||||
context = new GHOST_ContextEGL(
|
||||
this->m_system,
|
||||
m_wantStereoVisual,
|
||||
EGLNativeWindowType(m_window),
|
||||
EGLNativeDisplayType(m_display),
|
||||
@@ -1356,8 +1355,7 @@ GHOST_Context *GHOST_WindowX11::newDrawingContext(GHOST_TDrawingContextType type
|
||||
}
|
||||
|
||||
#ifdef WITH_GL_EGL
|
||||
context = new GHOST_ContextEGL(this->m_system,
|
||||
m_wantStereoVisual,
|
||||
context = new GHOST_ContextEGL(m_wantStereoVisual,
|
||||
EGLNativeWindowType(m_window),
|
||||
EGLNativeDisplayType(m_display),
|
||||
profile_mask,
|
||||
|
@@ -152,7 +152,7 @@ void GHOST_Wintab::modifyContext(LOGCONTEXT &lc)
|
||||
lc.lcOptions |= CXO_CSRMESSAGES | CXO_MESSAGES;
|
||||
|
||||
/* Tablet scaling is handled manually because some drivers don't handle HIDPI or multi-display
|
||||
* correctly; reset tablet scale factors to un-scaled tablet coordinates. */
|
||||
* correctly; reset tablet scale factors to unscaled tablet coodinates. */
|
||||
lc.lcOutOrgX = lc.lcInOrgX;
|
||||
lc.lcOutOrgY = lc.lcInOrgY;
|
||||
lc.lcOutExtX = lc.lcInExtX;
|
||||
|
@@ -106,7 +106,7 @@ class GHOST_Wintab {
|
||||
* \param x_in: The tablet x coordinate.
|
||||
* \param y_in: The tablet y coordinate.
|
||||
* \param x_out: Output for the Win32 mapped x coordinate.
|
||||
* \param y_out: Output for the Win32 mapped y coordinate.
|
||||
* \param y_out: Output for the Win32 mapped y coordiante.
|
||||
*/
|
||||
void mapWintabToSysCoordinates(int x_in, int y_in, int &x_out, int &y_out);
|
||||
|
||||
@@ -140,7 +140,7 @@ class GHOST_Wintab {
|
||||
bool trustCoordinates();
|
||||
|
||||
/**
|
||||
* Tests whether Wintab coordinates can be trusted by comparing Win32 and Wintab reported cursor
|
||||
* Tests whether Wintab coordinates can be trusted by comparing Win32 and Wintab reported curser
|
||||
* position.
|
||||
* \param sysX: System cursor x position.
|
||||
* \param sysY: System cursor y position.
|
||||
@@ -148,7 +148,7 @@ class GHOST_Wintab {
|
||||
* \param wtY: Wintab cursor y position.
|
||||
* \return True if Win32 and Wintab cursor positions match within tolerance.
|
||||
*
|
||||
* Note: Only test coordinates on button press, not release. This prevents issues when async
|
||||
* Note: Only test coordiantes on button press, not release. This prevents issues when async
|
||||
* mismatch causes mouse movement to replay and snap back, which is only an issue while drawing.
|
||||
*/
|
||||
bool testCoordinates(int sysX, int sysY, int wtX, int wtY);
|
||||
@@ -160,7 +160,7 @@ class GHOST_Wintab {
|
||||
GHOST_TabletData getLastTabletData();
|
||||
|
||||
private:
|
||||
/** Wintab DLL handle. */
|
||||
/** Wintab dll handle. */
|
||||
unique_hmodule m_handle;
|
||||
/** Wintab API functions. */
|
||||
GHOST_WIN32_WTInfo m_fpInfo = nullptr;
|
||||
@@ -180,7 +180,7 @@ class GHOST_Wintab {
|
||||
/** Pressed button map. */
|
||||
GHOST_TUns8 m_buttons = 0;
|
||||
|
||||
/** Range of a coordinate space. */
|
||||
/** Range of a coodinate space. */
|
||||
struct Range {
|
||||
/** Origin of range. */
|
||||
int org = 0;
|
||||
|
@@ -392,10 +392,9 @@ GHOST_XrActionSet::GHOST_XrActionSet(XrInstance instance, const GHOST_XrActionSe
|
||||
{
|
||||
XrActionSetCreateInfo action_set_info{XR_TYPE_ACTION_SET_CREATE_INFO};
|
||||
strcpy(action_set_info.actionSetName, info.name);
|
||||
|
||||
/* Just use same name for localized. This can be changed in the future if necessary. */
|
||||
strcpy(action_set_info.localizedActionSetName, info.name);
|
||||
|
||||
strcpy(action_set_info.localizedActionSetName,
|
||||
info.name); /* Just use same name for localized. This can be changed in the future if
|
||||
necessary. */
|
||||
action_set_info.priority = 0; /* Use same (default) priority for all action sets. */
|
||||
|
||||
CHECK_XR(xrCreateActionSet(instance, &action_set_info, &m_action_set),
|
||||
|
@@ -420,11 +420,6 @@ void GHOST_XrContext::getExtensionsToEnable(
|
||||
r_ext_names.push_back(gpu_binding);
|
||||
}
|
||||
|
||||
#if defined(WITH_GHOST_X11) && defined(WITH_GL_EGL)
|
||||
assert(openxr_extension_is_available(m_oxr->extensions, XR_MNDX_EGL_ENABLE_EXTENSION_NAME));
|
||||
r_ext_names.push_back(XR_MNDX_EGL_ENABLE_EXTENSION_NAME);
|
||||
#endif
|
||||
|
||||
for (const std::string_view &ext : try_ext) {
|
||||
if (openxr_extension_is_available(m_oxr->extensions, ext)) {
|
||||
r_ext_names.push_back(ext.data());
|
||||
|
@@ -22,15 +22,7 @@
|
||||
#include <list>
|
||||
#include <sstream>
|
||||
|
||||
#if defined(WITH_GL_EGL)
|
||||
# include "GHOST_ContextEGL.h"
|
||||
# if defined(WITH_GHOST_X11)
|
||||
# include "GHOST_SystemX11.h"
|
||||
# endif
|
||||
# if defined(WITH_GHOST_WAYLAND)
|
||||
# include "GHOST_SystemWayland.h"
|
||||
# endif
|
||||
#elif defined(WITH_GHOST_X11)
|
||||
#if defined(WITH_GHOST_X11)
|
||||
# include "GHOST_ContextGLX.h"
|
||||
#elif defined(WIN32)
|
||||
# include "GHOST_ContextD3D.h"
|
||||
@@ -74,9 +66,7 @@ class GHOST_XrGraphicsBindingOpenGL : public GHOST_IXrGraphicsBinding {
|
||||
XrSystemId system_id,
|
||||
std::string *r_requirement_info) const override
|
||||
{
|
||||
#if defined(WITH_GL_EGL)
|
||||
GHOST_ContextEGL &ctx_gl = static_cast<GHOST_ContextEGL &>(ghost_ctx);
|
||||
#elif defined(WITH_GHOST_X11)
|
||||
#if defined(WITH_GHOST_X11)
|
||||
GHOST_ContextGLX &ctx_gl = static_cast<GHOST_ContextGLX &>(ghost_ctx);
|
||||
#else
|
||||
GHOST_ContextWGL &ctx_gl = static_cast<GHOST_ContextWGL &>(ghost_ctx);
|
||||
@@ -116,17 +106,6 @@ class GHOST_XrGraphicsBindingOpenGL : public GHOST_IXrGraphicsBinding {
|
||||
void initFromGhostContext(GHOST_Context &ghost_ctx) override
|
||||
{
|
||||
#if defined(WITH_GHOST_X11)
|
||||
# if defined(WITH_GL_EGL)
|
||||
GHOST_ContextEGL &ctx_egl = static_cast<GHOST_ContextEGL &>(ghost_ctx);
|
||||
|
||||
if (dynamic_cast<const GHOST_SystemX11 *const>(ctx_egl.m_system)) {
|
||||
oxr_binding.egl.type = XR_TYPE_GRAPHICS_BINDING_EGL_MNDX;
|
||||
oxr_binding.egl.getProcAddress = eglGetProcAddress;
|
||||
oxr_binding.egl.display = ctx_egl.getDisplay();
|
||||
oxr_binding.egl.config = ctx_egl.getConfig();
|
||||
oxr_binding.egl.context = ctx_egl.getContext();
|
||||
}
|
||||
# else
|
||||
GHOST_ContextGLX &ctx_glx = static_cast<GHOST_ContextGLX &>(ghost_ctx);
|
||||
XVisualInfo *visual_info = glXGetVisualFromFBConfig(ctx_glx.m_display, ctx_glx.m_fbconfig);
|
||||
|
||||
@@ -138,7 +117,6 @@ class GHOST_XrGraphicsBindingOpenGL : public GHOST_IXrGraphicsBinding {
|
||||
oxr_binding.glx.visualid = visual_info->visualid;
|
||||
|
||||
XFree(visual_info);
|
||||
# endif
|
||||
#elif defined(WIN32)
|
||||
GHOST_ContextWGL &ctx_wgl = static_cast<GHOST_ContextWGL &>(ghost_ctx);
|
||||
|
||||
@@ -147,14 +125,6 @@ class GHOST_XrGraphicsBindingOpenGL : public GHOST_IXrGraphicsBinding {
|
||||
oxr_binding.wgl.hGLRC = ctx_wgl.m_hGLRC;
|
||||
#endif
|
||||
|
||||
#if defined(WITH_GHOST_WAYLAND)
|
||||
GHOST_ContextEGL &ctx_wl_egl = static_cast<GHOST_ContextEGL &>(ghost_ctx);
|
||||
if (dynamic_cast<const GHOST_SystemWayland *const>(ctx_wl_egl.m_system)) {
|
||||
oxr_binding.wl.type = XR_TYPE_GRAPHICS_BINDING_OPENGL_WAYLAND_KHR;
|
||||
oxr_binding.wl.display = (struct wl_display *)ctx_wl_egl.m_nativeDisplay;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Generate a frame-buffer to use for blitting into the texture. */
|
||||
glGenFramebuffers(1, &m_fbo);
|
||||
}
|
||||
|
@@ -74,11 +74,10 @@ class GHOST_XrSession {
|
||||
const GHOST_XrActionProfileInfo *infos);
|
||||
bool attachActionSets();
|
||||
|
||||
/**
|
||||
* Action functions to be called post-session start.
|
||||
* \param action_set_name: When `nullptr`, all attached action sets will be synced.
|
||||
*/
|
||||
bool syncActions(const char *action_set_name = nullptr);
|
||||
/** Action functions to be called post-session start. */
|
||||
bool syncActions(
|
||||
const char *action_set_name = nullptr); /* If action_set_name is nullptr, all attached
|
||||
* action sets will be synced. */
|
||||
bool applyHapticAction(const char *action_set_name,
|
||||
const char *action_name,
|
||||
const GHOST_TInt64 &duration,
|
||||
|
@@ -42,13 +42,7 @@
|
||||
# include <d3d12.h>
|
||||
#endif
|
||||
#ifdef WITH_GHOST_X11
|
||||
# ifdef WITH_GL_EGL
|
||||
/* TODO: Why do we have to create this typedef manually? */
|
||||
typedef void (*(*PFNEGLGETPROCADDRESSPROC)(const char *procname))(void);
|
||||
# include <GL/eglew.h>
|
||||
# else
|
||||
# include <GL/glxew.h>
|
||||
# endif
|
||||
# include <GL/glxew.h>
|
||||
#endif
|
||||
|
||||
#include <openxr/openxr.h>
|
||||
|
@@ -78,7 +78,7 @@ extern short (*MEM_testN)(void *vmemh);
|
||||
|
||||
/**
|
||||
* Duplicates a block of memory, and returns a pointer to the
|
||||
* newly allocated block. */
|
||||
* newly allocated block. */
|
||||
extern void *(*MEM_dupallocN)(const void *vmemh) /* ATTR_MALLOC */ ATTR_WARN_UNUSED_RESULT;
|
||||
|
||||
/**
|
||||
|
@@ -103,7 +103,7 @@ int main(int argc, char *argv[])
|
||||
/* ----------------------------------------------------------------- */
|
||||
/* Round two, do a normal allocation, and corrupt some blocks. */
|
||||
/* ----------------------------------------------------------------- */
|
||||
/* Switch off, because it will complain about some things. */
|
||||
/* switch off, because it will complain about some things. */
|
||||
MEM_set_error_callback(NULL);
|
||||
|
||||
for (i = 0; i < NUM_BLOCKS; i++) {
|
||||
@@ -115,7 +115,7 @@ int main(int argc, char *argv[])
|
||||
p[i] = MEM_callocN(blocksize, strdup(tagstring));
|
||||
}
|
||||
|
||||
/* Now corrupt a few blocks. */
|
||||
/* now corrupt a few blocks...*/
|
||||
ip = (int *)p[5] - 50;
|
||||
for (i = 0; i < 1000; i++, ip++)
|
||||
*ip = i + 1;
|
||||
|
@@ -89,7 +89,7 @@ bool IK_QJacobianSolver::Setup(IK_QSegment *root, std::list<IK_QTask *> &tasks)
|
||||
if (num_dof == 0)
|
||||
return false;
|
||||
|
||||
// compute task ids and assign weights to task
|
||||
// compute task id's and assing weights to task
|
||||
int primary_size = 0, primary = 0;
|
||||
int secondary_size = 0, secondary = 0;
|
||||
double primary_weight = 0.0, secondary_weight = 0.0;
|
||||
@@ -237,7 +237,7 @@ void IK_QJacobianSolver::ConstrainPoleVector(IK_QSegment *root, std::list<IK_QTa
|
||||
|
||||
bool IK_QJacobianSolver::UpdateAngles(double &norm)
|
||||
{
|
||||
// assign each segment a unique id for the jacobian
|
||||
// assing each segment a unique id for the jacobian
|
||||
std::vector<IK_QSegment *>::iterator seg;
|
||||
IK_QSegment *qseg, *minseg = NULL;
|
||||
double minabsdelta = 1e10, absdelta;
|
||||
|
@@ -867,7 +867,7 @@ IMETHOD void Vector2::Set3DYZ(const Vector& v)
|
||||
data[1]=v(2);
|
||||
}
|
||||
IMETHOD void Vector2::Set3DZX(const Vector& v)
|
||||
// projects v in its XY plane, and sets *this to these values
|
||||
// projects v in its XY plane, and and sets *this to these values
|
||||
{
|
||||
data[0]=v(2);
|
||||
data[1]=v(0);
|
||||
|
@@ -378,7 +378,7 @@ void PrintArray(const Array3Df& array);
|
||||
* (if automatic_range_detection = true)
|
||||
* \note and TODO this automatic detection only works when the image contains
|
||||
* at least one pixel of both bounds.
|
||||
*/
|
||||
**/
|
||||
void FloatArrayToScaledByteArray(const Array3Df& float_array,
|
||||
Array3Du* byte_array,
|
||||
bool automatic_range_detection = false);
|
||||
|
@@ -323,7 +323,7 @@ static void get_rgba(
|
||||
float *r, float *g, float *b, float *a, int total_cells, float *data, int sequential)
|
||||
{
|
||||
int i;
|
||||
/* Use offsets to map RGB grids to correct location in data grid. */
|
||||
/* Use offsets to map RGB grids to to correct location in data grid. */
|
||||
int m = 4, i_g = 1, i_b = 2, i_a = 3;
|
||||
if (sequential) {
|
||||
m = 1;
|
||||
|
@@ -425,15 +425,14 @@ tbool genTangSpace(const SMikkTSpaceContext *pContext, const float fAngularThres
|
||||
index = 0;
|
||||
for (f = 0; f < iNrFaces; f++) {
|
||||
const int verts = pContext->m_pInterface->m_getNumVerticesOfFace(pContext, f);
|
||||
if (verts != 3 && verts != 4) {
|
||||
if (verts != 3 && verts != 4)
|
||||
continue;
|
||||
}
|
||||
|
||||
// I've decided to let degenerate triangles and group-with-anythings
|
||||
// vary between left/right hand coordinate systems at the vertices.
|
||||
// All healthy triangles on the other hand are built to always be either or.
|
||||
#if 0
|
||||
// force the coordinate system orientation to be uniform for every face.
|
||||
|
||||
/*// force the coordinate system orientation to be uniform for every face.
|
||||
// (this is already the case for good triangles but not for
|
||||
// degenerate ones and those with bGroupWithAnything==true)
|
||||
bool bOrient = psTspace[index].bOrient;
|
||||
@@ -448,8 +447,7 @@ tbool genTangSpace(const SMikkTSpaceContext *pContext, const float fAngularThres
|
||||
else ++i;
|
||||
}
|
||||
if (!bNotFound) bOrient = psTspace[index+i].bOrient;
|
||||
}
|
||||
#endif
|
||||
}*/
|
||||
|
||||
// set data
|
||||
for (i = 0; i < verts; i++) {
|
||||
|
@@ -48,7 +48,6 @@ if(WITH_OPENCOLORIO)
|
||||
)
|
||||
|
||||
add_definitions(${GL_DEFINITIONS})
|
||||
add_definitions(${OPENCOLORIO_DEFINITIONS})
|
||||
|
||||
list(APPEND INC_SYS
|
||||
${OPENCOLORIO_INCLUDE_DIRS}
|
||||
@@ -68,6 +67,9 @@ if(WITH_OPENCOLORIO)
|
||||
list(APPEND INC_SYS
|
||||
${BOOST_INCLUDE_DIR}
|
||||
)
|
||||
add_definitions(
|
||||
-DOpenColorIO_STATIC
|
||||
)
|
||||
list(APPEND LIB
|
||||
${BOOST_LIBRARIES}
|
||||
)
|
||||
|
@@ -195,7 +195,7 @@ vec4 OCIO_ProcessColor(vec4 col, vec4 col_overlay, vec2 noise_uv)
|
||||
return col;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
in vec2 texCoord_interp;
|
||||
out vec4 fragColor;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user