Blender V4.3
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 ParticleSystem;
13
14namespace blender::io::hydra {
15
16class InstancerData : public IdData {
17 struct MeshInstance {
18 std::unique_ptr<MeshData> data;
19 pxr::VtIntArray indices;
20 };
21
22 struct NonmeshInstance {
23 std::unique_ptr<ObjectData> data;
24 pxr::VtMatrix4dArray transforms;
25 int count = 0;
26 };
27
28 private:
29 Map<pxr::SdfPath, MeshInstance> mesh_instances_;
30 Map<pxr::SdfPath, NonmeshInstance> nonmesh_instances_;
31 pxr::VtMatrix4dArray mesh_transforms_;
32
33 public:
34 InstancerData(HydraSceneDelegate *scene_delegate, pxr::SdfPath const &prim_id);
35
36 void init() override;
37 void insert() override;
38 void remove() override;
39 void update() override;
40
41 pxr::VtValue get_data(pxr::TfToken const &key) const override;
42 pxr::GfMatrix4d transform(pxr::SdfPath const &id) const;
43 pxr::HdPrimvarDescriptorVector primvar_descriptors(pxr::HdInterpolation interpolation) const;
44 pxr::VtIntArray indices(pxr::SdfPath const &id) const;
45 ObjectData *object_data(pxr::SdfPath const &id) const;
46 pxr::SdfPathVector prototypes() const;
47 void available_materials(Set<pxr::SdfPath> &paths) const;
48 void update_double_sided(MaterialData *mat_data);
49
50 /* Following update functions are working together:
51 * pre_update()
52 * update_instance()
53 * update_instance()
54 * ...
55 * post_update() */
56 void pre_update();
57 void update_instance(DupliObject *dupli);
58 void post_update();
59
60 private:
61 pxr::SdfPath object_prim_id(Object *object) const;
62 pxr::SdfPath hair_prim_id(Object *parent_obj, const ParticleSystem *psys) const;
63 pxr::SdfPath nonmesh_prim_id(pxr::SdfPath const &prim_id, int index) const;
64 int nonmesh_prim_id_index(pxr::SdfPath const &id) const;
65 void update_nonmesh_instance(NonmeshInstance &inst);
66 MeshInstance *mesh_instance(pxr::SdfPath const &id) const;
67 NonmeshInstance *nonmesh_instance(pxr::SdfPath const &id) const;
68};
69
70} // namespace blender::io::hydra
pxr::SdfPath prim_id
Definition id.hh:36
pxr::GfMatrix4d transform(pxr::SdfPath const &id) const
Definition instancer.cc:61
pxr::HdPrimvarDescriptorVector primvar_descriptors(pxr::HdInterpolation interpolation) const
Definition instancer.cc:72
void update_instance(DupliObject *dupli)
Definition instancer.cc:140
InstancerData(HydraSceneDelegate *scene_delegate, pxr::SdfPath const &prim_id)
Definition instancer.cc:23
pxr::VtValue get_data(pxr::TfToken const &key) const override
Definition instancer.cc:52
void available_materials(Set< pxr::SdfPath > &paths) const
Definition instancer.cc:112
pxr::SdfPathVector prototypes() const
Definition instancer.cc:101
ObjectData * object_data(pxr::SdfPath const &id) const
Definition instancer.cc:88
void update_double_sided(MaterialData *mat_data)
Definition instancer.cc:122
static ushort indices[]