Blender V5.0
instancer.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
7#include "BLI_map.hh"
8#include "BLI_set.hh"
9
10#include "mesh.hh"
11
12struct DupliObject;
13struct ParticleSystem;
14
15namespace blender::io::hydra {
16
17class InstancerData : public IdData {
18 struct MeshInstance {
19 std::unique_ptr<MeshData> data;
20 pxr::VtIntArray indices;
21 };
22
23 struct NonmeshInstance {
24 std::unique_ptr<ObjectData> data;
25 pxr::VtMatrix4dArray transforms;
26 int count = 0;
27 };
28
29 private:
30 Map<pxr::SdfPath, MeshInstance> mesh_instances_;
31 Map<pxr::SdfPath, NonmeshInstance> nonmesh_instances_;
32 pxr::VtMatrix4dArray mesh_transforms_;
33
34 public:
35 InstancerData(HydraSceneDelegate *scene_delegate, pxr::SdfPath const &prim_id);
36
37 void init() override;
38 void insert() override;
39 void remove() override;
40 void update() override;
41
42 pxr::VtValue get_data(pxr::TfToken const &key) const override;
43 pxr::GfMatrix4d transform(pxr::SdfPath const &id) const;
44 pxr::HdPrimvarDescriptorVector primvar_descriptors(pxr::HdInterpolation interpolation) const;
45 pxr::VtIntArray indices(pxr::SdfPath const &id) const;
46 ObjectData *object_data(pxr::SdfPath const &id) const;
47 pxr::SdfPathVector prototypes() const;
48 void available_materials(Set<pxr::SdfPath> &paths) const;
49 void update_double_sided(MaterialData *mat_data);
50
51 /* Following update functions are working together:
52 * pre_update()
53 * update_instance()
54 * update_instance()
55 * ...
56 * post_update() */
57 void pre_update();
58 void update_instance(DupliObject *dupli);
59 void post_update();
60
61 private:
62 pxr::SdfPath object_prim_id(Object *object) const;
63 pxr::SdfPath hair_prim_id(Object *parent_obj, const ParticleSystem *psys) const;
64 pxr::SdfPath nonmesh_prim_id(pxr::SdfPath const &prim_id, int index) const;
65 int nonmesh_prim_id_index(pxr::SdfPath const &id) const;
66 void update_nonmesh_instance(NonmeshInstance &inst);
67 MeshInstance *mesh_instance(pxr::SdfPath const &id) const;
68 NonmeshInstance *nonmesh_instance(pxr::SdfPath const &id) const;
69};
70
71} // namespace blender::io::hydra
BMesh const char void * data
IdData(HydraSceneDelegate *scene_delegate, const ID *id, pxr::SdfPath const &prim_id)
Definition id.cc:9
pxr::SdfPath prim_id
Definition id.hh:36
pxr::GfMatrix4d transform(pxr::SdfPath const &id) const
Definition instancer.cc:62
pxr::VtIntArray indices(pxr::SdfPath const &id) const
Definition instancer.cc:84
pxr::HdPrimvarDescriptorVector primvar_descriptors(pxr::HdInterpolation interpolation) const
Definition instancer.cc:73
void update_instance(DupliObject *dupli)
Definition instancer.cc:141
InstancerData(HydraSceneDelegate *scene_delegate, pxr::SdfPath const &prim_id)
Definition instancer.cc:24
pxr::VtValue get_data(pxr::TfToken const &key) const override
Definition instancer.cc:53
void available_materials(Set< pxr::SdfPath > &paths) const
Definition instancer.cc:113
pxr::SdfPathVector prototypes() const
Definition instancer.cc:102
ObjectData * object_data(pxr::SdfPath const &id) const
Definition instancer.cc:89
void update_double_sided(MaterialData *mat_data)
Definition instancer.cc:123
static ushort indices[]
int count