Hair and Curves need to call `DRW_curves_update` before `geometry_steps_fill`, otherwise the copied geometry is just uninitialized data. However, doing so triggers an assertion: > DRW_render_instance_buffer_finish had not been called before drawing. This PR ports the `DRW_hair/curves_pos_buffer_get` functions to the new `draw::Manager` API, so it can be called at any arbitrary point. It also changes `VelocityModule::geometry_map` to use `uint64` keys instead of `ID` pointers, since the same particle system can be used on different objects and have multiple geometries. Notes: * The new functions are only used for `VelocityModule::step_object_sync` on image renders. Using them elsewhere would require modifying the old draw manager to do the init/update/free setup. * Only the compute shader version has been ported. Pull Request: https://projects.blender.org/blender/blender/pulls/112425
96 lines
2.9 KiB
C++
96 lines
2.9 KiB
C++
/* SPDX-FileCopyrightText: 2023 Blender Authors
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
/** \file
|
|
* \ingroup draw
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "draw_common.h"
|
|
#include "draw_manager.hh"
|
|
#include "draw_pass.hh"
|
|
|
|
namespace blender::draw {
|
|
|
|
/** Hair. */
|
|
|
|
void hair_init();
|
|
|
|
GPUVertBuf *hair_pos_buffer_get(Scene *scene,
|
|
Object *object,
|
|
ParticleSystem *psys,
|
|
ModifierData *md);
|
|
|
|
void hair_update(Manager &manager);
|
|
|
|
void hair_free();
|
|
|
|
GPUBatch *hair_sub_pass_setup(PassMain::Sub &sub_ps,
|
|
const Scene *scene,
|
|
Object *object,
|
|
ParticleSystem *psys,
|
|
ModifierData *md,
|
|
GPUMaterial *gpu_material = nullptr);
|
|
|
|
GPUBatch *hair_sub_pass_setup(PassSimple::Sub &sub_ps,
|
|
const Scene *scene,
|
|
Object *object,
|
|
ParticleSystem *psys,
|
|
ModifierData *md,
|
|
GPUMaterial *gpu_material = nullptr);
|
|
|
|
/** Curves. */
|
|
|
|
void curves_init();
|
|
|
|
GPUVertBuf *curves_pos_buffer_get(Scene *scene, Object *object);
|
|
|
|
void curves_update(Manager &manager);
|
|
|
|
void curves_free();
|
|
|
|
GPUBatch *curves_sub_pass_setup(PassMain::Sub &ps,
|
|
const Scene *scene,
|
|
Object *ob,
|
|
GPUMaterial *gpu_material = nullptr);
|
|
|
|
GPUBatch *curves_sub_pass_setup(PassSimple::Sub &ps,
|
|
const Scene *scene,
|
|
Object *ob,
|
|
GPUMaterial *gpu_material = nullptr);
|
|
|
|
/* Point cloud. */
|
|
|
|
GPUBatch *point_cloud_sub_pass_setup(PassMain::Sub &sub_ps,
|
|
Object *object,
|
|
GPUMaterial *gpu_material = nullptr);
|
|
|
|
GPUBatch *point_cloud_sub_pass_setup(PassSimple::Sub &sub_ps,
|
|
Object *object,
|
|
GPUMaterial *gpu_material = nullptr);
|
|
|
|
/** Volume. */
|
|
|
|
/**
|
|
* Add attribute bindings of volume grids to an existing pass.
|
|
* No draw call is added so the caller can decide how to use the data.
|
|
* \return nullptr if there is nothing to draw.
|
|
*/
|
|
PassMain::Sub *volume_sub_pass(PassMain::Sub &ps,
|
|
Scene *scene,
|
|
Object *ob,
|
|
GPUMaterial *gpu_material);
|
|
/**
|
|
* Add attribute bindings of volume grids to an existing pass.
|
|
* No draw call is added so the caller can decide how to use the data.
|
|
* \return nullptr if there is nothing to draw.
|
|
*/
|
|
PassSimple::Sub *volume_sub_pass(PassSimple::Sub &ps,
|
|
Scene *scene,
|
|
Object *ob,
|
|
GPUMaterial *gpu_material);
|
|
|
|
} // namespace blender::draw
|