Implementation of the design task #142969. This adds the following: - Exact GPU interpolation of curves of all types. - Radius attribute support. - Cyclic curve support. - Resolution attribute support. - New Cylinder hair shape type.  What changed: - EEVEE doesn't compute random normals for strand hairs anymore. These are considered legacy now. - EEVEE now have an internal shadow bias to avoid self shadowing on hair. - Workbench Curves Strip display option is no longer flat and has better shading. - Legacy Hair particle system evaluates radius at control points before applying additional subdivision. This now matches Cycles. - Color Attribute Node without a name do not fetch the active color attribute anymore. This now matches Cycles. Notes: - This is not 100% matching the CPU implementation for interpolation (see the epsilons in the tests). - Legacy Hair Particle points is now stored in local space after interpolation. The new cylinder shape allows for more correct hair shading in workbench and better intersection in EEVEE. | | Strand | Strip | Cylinder | | ---- | --- | --- | --- | | Main |  |  | N/A | | PR |  |  |  | | | Strand | Strip | Cylinder | | ---- | --- | --- | --- | | Main |  | | N/A | | PR | ||  | Cyclic Curve, Mixed curve type, and proper radius support:  Test file for attribute lookup: [test_attribute_lookup.blend](/attachments/1d54dd06-379b-4480-a1c5-96adc1953f77) Follow Up Tasks: - Correct full tube segments orientation based on tangent and normal attributes - Correct V resolution property per object - More attribute type support (currently only color) TODO: - [x] Attribute Loading Changes - [x] Generic Attributes - [x] Length Attribute - [x] Intercept Attribute - [x] Original Coordinate Attribute - [x] Cyclic Curves - [x] Legacy Hair Particle conversion - [x] Attribute Loading - [x] Additional Subdivision - [x] Move some function to generic headers (VertBuf, OffsetIndices) - [x] Fix default UV/Color attribute assignment Pull Request: https://projects.blender.org/blender/blender/pulls/143180
71 lines
1.8 KiB
C++
71 lines
1.8 KiB
C++
/* SPDX-FileCopyrightText: 2016 Blender Authors
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
/** \file
|
|
* \ingroup draw
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
struct FluidModifierData;
|
|
struct GPUMaterial;
|
|
|
|
namespace blender::gpu {
|
|
class Texture;
|
|
class UniformBuf;
|
|
class VertBuf;
|
|
} // namespace blender::gpu
|
|
struct ModifierData;
|
|
struct Object;
|
|
struct ParticleSystem;
|
|
struct RegionView3D;
|
|
struct ViewLayer;
|
|
struct Scene;
|
|
struct DRWData;
|
|
namespace blender::draw {
|
|
class Manager;
|
|
struct CurvesModule;
|
|
struct PointCloudModule;
|
|
struct VolumeModule;
|
|
class ObjectRef;
|
|
} // namespace blender::draw
|
|
|
|
/* draw_curves.cc */
|
|
|
|
namespace blender::draw {
|
|
|
|
/* If drw_data is nullptr, DST global is accessed to get it. */
|
|
void DRW_curves_init(DRWData *drw_data = nullptr);
|
|
void DRW_curves_begin_sync(DRWData *drw_data);
|
|
void DRW_curves_module_free(draw::CurvesModule *module);
|
|
void DRW_curves_update(draw::Manager &manager);
|
|
|
|
/* draw_pointcloud.cc */
|
|
|
|
/* If drw_data is nullptr, DST global is accessed to get it. */
|
|
void DRW_pointcloud_init(DRWData *drw_data = nullptr);
|
|
void DRW_pointcloud_module_free(draw::PointCloudModule *module);
|
|
|
|
/* draw_volume.cc */
|
|
|
|
/* If drw_data is nullptr, DST global is accessed to get it. */
|
|
void DRW_volume_init(DRWData *drw_data = nullptr);
|
|
void DRW_volume_module_free(draw::VolumeModule *module);
|
|
|
|
} // namespace blender::draw
|
|
|
|
/* `draw_fluid.cc` */
|
|
|
|
/* Fluid simulation. */
|
|
void DRW_smoke_ensure(FluidModifierData *fmd, int highres);
|
|
void DRW_smoke_ensure_coba_field(FluidModifierData *fmd);
|
|
void DRW_smoke_ensure_velocity(FluidModifierData *fmd);
|
|
void DRW_fluid_ensure_flags(FluidModifierData *fmd);
|
|
void DRW_fluid_ensure_range_field(FluidModifierData *fmd);
|
|
|
|
void DRW_smoke_free(FluidModifierData *fmd);
|
|
|
|
void DRW_smoke_begin_sync(DRWData *drw_data);
|
|
void DRW_smoke_exit(DRWData *drw_data);
|