Files
test2/source/blender/draw/intern/draw_common.hh
Miguel Pozo f07542d8cb EEVEE-Next: Fix Hair and Curves motion vectors
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
2023-09-26 19:55:46 +02:00

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