Blender V5.0
geometry_mesh.cpp
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#include "bvh/bvh.h"
6
7#include "device/device.h"
8
9#include "scene/attribute.h"
10#include "scene/camera.h"
11#include "scene/geometry.h"
12#include "scene/hair.h"
13#include "scene/light.h"
14#include "scene/mesh.h"
15#include "scene/object.h"
16#include "scene/osl.h"
17#include "scene/pointcloud.h"
18#include "scene/scene.h"
19#include "scene/shader.h"
20#include "scene/shader_nodes.h"
21
22#include "util/progress.h"
23
25
27 DeviceScene *dscene,
28 Scene *scene,
29 Progress &progress)
30{
31 /* Count. */
32 size_t vert_size = 0;
33 size_t tri_size = 0;
34
35 size_t curve_key_size = 0;
36 size_t curve_size = 0;
37 size_t curve_segment_size = 0;
38
39 size_t point_size = 0;
40
41 for (Geometry *geom : scene->geometry) {
42 if (geom->is_mesh() || geom->is_volume()) {
43 Mesh *mesh = static_cast<Mesh *>(geom);
44
45 vert_size += mesh->verts.size();
46 tri_size += mesh->num_triangles();
47 }
48 else if (geom->is_hair()) {
49 Hair *hair = static_cast<Hair *>(geom);
50
51 curve_key_size += hair->get_curve_keys().size();
52 curve_size += hair->num_curves();
53 curve_segment_size += hair->num_segments();
54 }
55 else if (geom->is_pointcloud()) {
56 PointCloud *pointcloud = static_cast<PointCloud *>(geom);
57 point_size += pointcloud->num_points();
58 }
59 }
60
61 /* Fill in all the arrays. */
62 if (tri_size != 0) {
63 /* normals */
64 progress.set_status("Updating Mesh", "Computing normals");
65
66 packed_float3 *tri_verts = dscene->tri_verts.alloc(vert_size);
67 uint *tri_shader = dscene->tri_shader.alloc(tri_size);
68 packed_float3 *vnormal = dscene->tri_vnormal.alloc(vert_size);
69 packed_uint3 *tri_vindex = dscene->tri_vindex.alloc(tri_size);
70
71 const bool copy_all_data = dscene->tri_shader.need_realloc() ||
72 dscene->tri_vindex.need_realloc() ||
73 dscene->tri_vnormal.need_realloc();
74
75 for (Geometry *geom : scene->geometry) {
76 if (geom->is_mesh() || geom->is_volume()) {
77 Mesh *mesh = static_cast<Mesh *>(geom);
78
79 if (mesh->shader_is_modified() || mesh->smooth_is_modified() ||
80 mesh->triangles_is_modified() || copy_all_data)
81 {
82 mesh->pack_shaders(scene, &tri_shader[mesh->prim_offset]);
83 }
84
85 if (mesh->verts_is_modified() || copy_all_data) {
86 mesh->pack_normals(&vnormal[mesh->vert_offset]);
87 }
88
89 if (mesh->verts_is_modified() || mesh->triangles_is_modified() || copy_all_data) {
90 mesh->pack_verts(&tri_verts[mesh->vert_offset], &tri_vindex[mesh->prim_offset]);
91 }
92
93 if (progress.get_cancel()) {
94 return;
95 }
96 }
97 }
98
99 /* vertex coordinates */
100 progress.set_status("Updating Mesh", "Copying Mesh to device");
101
106 }
107
108 if (curve_segment_size != 0) {
109 progress.set_status("Updating Mesh", "Copying Curves to device");
110
111 float4 *curve_keys = dscene->curve_keys.alloc(curve_key_size);
112 KernelCurve *curves = dscene->curves.alloc(curve_size);
113 KernelCurveSegment *curve_segments = dscene->curve_segments.alloc(curve_segment_size);
114
115 const bool copy_all_data = dscene->curve_keys.need_realloc() ||
116 dscene->curves.need_realloc() ||
118
119 for (Geometry *geom : scene->geometry) {
120 if (geom->is_hair()) {
121 Hair *hair = static_cast<Hair *>(geom);
122
123 const bool curve_keys_co_modified = hair->curve_radius_is_modified() ||
124 hair->curve_keys_is_modified();
125 const bool curve_data_modified = hair->curve_shader_is_modified() ||
126 hair->curve_first_key_is_modified();
127
128 if (!curve_keys_co_modified && !curve_data_modified && !copy_all_data) {
129 continue;
130 }
131
132 hair->pack_curves(scene,
133 &curve_keys[hair->curve_key_offset],
134 &curves[hair->prim_offset],
135 &curve_segments[hair->curve_segment_offset]);
136 if (progress.get_cancel()) {
137 return;
138 }
139 }
140 }
141
145 }
146
147 if (point_size != 0) {
148 progress.set_status("Updating Mesh", "Copying Point clouds to device");
149
150 float4 *points = dscene->points.alloc(point_size);
151 uint *points_shader = dscene->points_shader.alloc(point_size);
152
153 for (Geometry *geom : scene->geometry) {
154 if (geom->is_pointcloud()) {
155 PointCloud *pointcloud = static_cast<PointCloud *>(geom);
156 pointcloud->pack(
157 scene, &points[pointcloud->prim_offset], &points_shader[pointcloud->prim_offset]);
158 if (progress.get_cancel()) {
159 return;
160 }
161 }
162 }
163
164 dscene->points.copy_to_device();
166 }
167}
168
unsigned int uint
device_vector< uint > points_shader
Definition devicescene.h:38
device_vector< float4 > points
Definition devicescene.h:37
device_vector< KernelCurveSegment > curve_segments
Definition devicescene.h:34
device_vector< KernelCurve > curves
Definition devicescene.h:32
device_vector< packed_uint3 > tri_vindex
Definition devicescene.h:30
device_vector< float4 > curve_keys
Definition devicescene.h:33
device_vector< packed_float3 > tri_vnormal
Definition devicescene.h:29
device_vector< uint > tri_shader
Definition devicescene.h:28
device_vector< packed_float3 > tri_verts
Definition devicescene.h:27
void device_update_mesh(Device *device, DeviceScene *dscene, Scene *scene, Progress &progress)
bool is_volume() const
bool is_pointcloud() const
bool is_hair() const
size_t prim_offset
bool is_mesh() const
Definition hair.h:13
size_t curve_key_offset
Definition hair.h:89
size_t curve_segment_offset
Definition hair.h:90
size_t num_curves() const
Definition hair.h:126
void pack_curves(Scene *scene, float4 *curve_key_co, KernelCurve *curve, KernelCurveSegment *curve_segments)
Definition hair.cpp:486
size_t num_segments() const
Definition hair.h:131
bool get_cancel() const
Definition progress.h:77
void set_status(const string &status_, const string &substatus_="")
Definition progress.h:248
T * alloc(const size_t width, const size_t height=0)
#define CCL_NAMESPACE_END
size_t vert_offset
Definition scene/mesh.h:177
void pack_verts(packed_float3 *tri_verts, packed_uint3 *tri_vindex)
size_t num_triangles() const
Definition scene/mesh.h:77
void pack_normals(packed_float3 *vnormal)
void pack_shaders(Scene *scene, uint *shader)
void pack(Scene *scene, float4 *packed_points, uint *packed_shader)
size_t num_points() const
unique_ptr_vector< Geometry > geometry
Definition scene.h:140