28 #include <opensubdiv/far/topologyRefinerFactory.h>
37 using blender::opensubdiv::stack;
48 namespace OPENSUBDIV_VERSION {
52 inline bool TopologyRefinerFactory<TopologyRefinerData>::resizeComponentTopology(
62 base_mesh_topology->setNumVertices(num_vertices);
63 setNumBaseVertices(refiner, num_vertices);
78 const int num_edges = converter->
getNumEdges(converter);
79 base_mesh_topology->setNumEdges(num_edges);
83 const int num_faces = converter->
getNumFaces(converter);
84 base_mesh_topology->setNumFaces(num_faces);
85 setNumBaseFaces(refiner, num_faces);
86 for (
int face_index = 0; face_index < num_faces; ++face_index) {
88 base_mesh_topology->setNumFaceVertices(face_index, num_face_vertices);
89 setNumBaseFaceVertices(refiner, face_index, num_face_vertices);
97 base_mesh_topology->finishResizeTopology();
102 const int num_edges = converter->
getNumEdges(converter);
103 setNumBaseEdges(refiner, num_edges);
104 for (
int edge_index = 0; edge_index < num_edges; ++edge_index) {
105 const int num_edge_faces = converter->
getNumEdgeFaces(converter, edge_index);
106 setNumBaseEdgeFaces(refiner, edge_index, num_edge_faces);
110 for (
int vertex_index = 0; vertex_index < num_vertices; ++vertex_index) {
111 const int num_vert_edges = converter->
getNumVertexEdges(converter, vertex_index);
112 const int num_vert_faces = converter->
getNumVertexFaces(converter, vertex_index);
113 setNumBaseVertexEdges(refiner, vertex_index, num_vert_edges);
114 setNumBaseVertexFaces(refiner, vertex_index, num_vert_faces);
117 base_mesh_topology->finishResizeTopology();
122 inline bool TopologyRefinerFactory<TopologyRefinerData>::assignComponentTopology(
126 using Far::IndexArray;
134 const int num_faces = converter->
getNumFaces(converter);
135 for (
int face_index = 0; face_index < num_faces; ++face_index) {
136 IndexArray dst_face_verts = getBaseFaceVertices(refiner, face_index);
139 base_mesh_topology->setFaceVertexIndices(
140 face_index, dst_face_verts.size(), &dst_face_verts[0]);
147 if (!full_topology_specified) {
154 for (
int vertex_index = 0; vertex_index < num_vertices; ++vertex_index) {
156 IndexArray dst_vertex_faces = getBaseVertexFaces(refiner, vertex_index);
157 const int num_vertex_faces = converter->
getNumVertexFaces(converter, vertex_index);
158 vertex_faces.resize(num_vertex_faces);
159 converter->
getVertexFaces(converter, vertex_index, &vertex_faces[0]);
162 IndexArray dst_vertex_edges = getBaseVertexEdges(refiner, vertex_index);
163 const int num_vertex_edges = converter->
getNumVertexEdges(converter, vertex_index);
164 vertex_edges.resize(num_vertex_edges);
165 converter->
getVertexEdges(converter, vertex_index, &vertex_edges[0]);
166 memcpy(&dst_vertex_edges[0], &vertex_edges[0],
sizeof(
int) * num_vertex_edges);
167 memcpy(&dst_vertex_faces[0], &vertex_faces[0],
sizeof(
int) * num_vertex_faces);
171 const int num_edges = converter->
getNumEdges(converter);
172 for (
int edge_index = 0; edge_index < num_edges; ++edge_index) {
174 IndexArray dst_edge_vertices = getBaseEdgeVertices(refiner, edge_index);
175 converter->
getEdgeVertices(converter, edge_index, &dst_edge_vertices[0]);
178 IndexArray dst_edge_faces = getBaseEdgeFaces(refiner, edge_index);
179 converter->
getEdgeFaces(converter, edge_index, &dst_edge_faces[0]);
183 for (
int face_index = 0; face_index < num_faces; ++face_index) {
184 IndexArray dst_face_edges = getBaseFaceEdges(refiner, face_index);
185 converter->
getFaceEdges(converter, face_index, &dst_face_edges[0]);
188 populateBaseLocalIndices(refiner);
194 inline bool TopologyRefinerFactory<TopologyRefinerData>::assignComponentTags(
198 using OpenSubdiv::Sdc::Crease;
205 const int num_edges = converter->
getNumEdges(converter);
206 for (
int edge_index = 0; edge_index < num_edges; ++edge_index) {
208 if (sharpness < 1e-6f) {
212 int edge_vertices[2];
214 base_mesh_topology->setEdgeVertexIndices(edge_index, edge_vertices[0], edge_vertices[1]);
215 base_mesh_topology->setEdgeSharpness(edge_index, sharpness);
217 if (full_topology_specified) {
218 setBaseEdgeSharpness(refiner, edge_index, sharpness);
223 const int base_edge_index = findBaseEdge(refiner, edge_vertices[0], edge_vertices[1]);
225 printf(
"OpenSubdiv Error: failed to find reconstructed edge\n");
228 setBaseEdgeSharpness(refiner, base_edge_index, sharpness);
238 for (
int vertex_index = 0; vertex_index < num_vertices; ++vertex_index) {
239 ConstIndexArray vertex_edges = getBaseVertexEdges(refiner, vertex_index);
241 base_mesh_topology->setVertexSharpness(vertex_index, Crease::SHARPNESS_INFINITE);
242 setBaseVertexSharpness(refiner, vertex_index, Crease::SHARPNESS_INFINITE);
247 float sharpness = 0.0f;
250 base_mesh_topology->setVertexSharpness(vertex_index, sharpness);
257 if (vertex_edges.size() == 2) {
258 const int edge0 = vertex_edges[0], edge1 = vertex_edges[1];
259 const float sharpness0 = refiner._levels[0]->getEdgeSharpness(edge0);
260 const float sharpness1 = refiner._levels[0]->getEdgeSharpness(edge1);
262 sharpness +=
min(sharpness0, sharpness1);
263 sharpness =
min(sharpness, 10.0f);
266 setBaseVertexSharpness(refiner, vertex_index, sharpness);
272 inline bool TopologyRefinerFactory<TopologyRefinerData>::assignFaceVaryingTopology(
284 if (num_layers <= 0) {
288 const int num_faces = getNumBaseFaces(refiner);
289 for (
int layer_index = 0; layer_index < num_layers; ++layer_index) {
293 const int channel = createBaseFVarChannel(refiner, num_uvs);
296 for (
int face_index = 0; face_index < num_faces; ++face_index) {
297 Far::IndexArray dst_face_uvs = getBaseFaceFVarValues(refiner, face_index, channel);
300 dst_face_uvs[
corner] = uv_index;
309 inline void TopologyRefinerFactory<TopologyRefinerData>::reportInvalidTopology(
312 printf(
"OpenSubdiv Error: %s\n", msg);
320 namespace opensubdiv {
326 using OpenSubdiv::Sdc::Options;
332 options.SetVtxBoundaryInterpolation(
334 options.SetCreasingMethod(Options::CREASE_UNIFORM);
342 using OpenSubdiv::Sdc::SchemeType;
344 OpenSubdiv::Sdc::Options sdc_options = getSDCOptions(converter);
347 TopologyRefinerFactoryType::Options topology_options(scheme_type, sdc_options);
352 topology_options.validateFullTopology =
false;
354 return topology_options;
362 using OpenSubdiv::Far::TopologyRefiner;
371 TopologyRefinerFactoryType::Options topology_refiner_options = getTopologyRefinerOptions(
373 TopologyRefiner *
topology_refiner = TopologyRefinerFactoryType::Create(cb_data,
374 topology_refiner_options);
385 return topology_refiner_impl;
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Sky Generate a procedural sky texture Noise Generate fractal Perlin noise Wave Generate procedural bands or rings with noise Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a vector
MeshTopology base_mesh_topology
OpenSubdiv::Far::TopologyRefiner * topology_refiner
OpenSubdiv_TopologyRefinerSettings settings
static TopologyRefinerImpl * createFromConverter(OpenSubdiv_Converter *converter, const OpenSubdiv_TopologyRefinerSettings &settings)
CCL_NAMESPACE_BEGIN struct Options options
static void linear_interpolation(const T &a, const T &b, MutableSpan< T > dst)
OpenSubdiv::Sdc::Options::VtxBoundaryInterpolation getVtxBoundaryInterpolationFromCAPI(OpenSubdiv_VtxBoundaryInterpolation boundary_interpolation)
OpenSubdiv::Sdc::SchemeType getSchemeTypeFromCAPI(OpenSubdiv_SchemeType type)
OpenSubdiv::Sdc::Options::FVarLinearInterpolation getFVarLinearInterpolationFromCAPI(OpenSubdiv_FVarLinearInterpolation linear_interpolation)
int(* getNumVertexFaces)(const struct OpenSubdiv_Converter *converter, const int vertex_index)
bool(* specifiesFullTopology)(const struct OpenSubdiv_Converter *converter)
void(* getFaceVertices)(const struct OpenSubdiv_Converter *converter, const int face_index, int *face_vertices)
float(* getVertexSharpness)(const struct OpenSubdiv_Converter *converter, const int vertex_index)
void(* getFaceEdges)(const struct OpenSubdiv_Converter *converter, const int face_index, int *face_edges)
int(* getNumUVLayers)(const struct OpenSubdiv_Converter *converter)
int(* getNumVertexEdges)(const struct OpenSubdiv_Converter *converter, const int vertex_index)
OpenSubdiv_FVarLinearInterpolation(* getFVarLinearInterpolation)(const struct OpenSubdiv_Converter *converter)
void(* getEdgeVertices)(const struct OpenSubdiv_Converter *converter, const int edge_index, int edge_vertices[2])
OpenSubdiv_SchemeType(* getSchemeType)(const struct OpenSubdiv_Converter *converter)
bool(* isInfiniteSharpVertex)(const struct OpenSubdiv_Converter *converter, const int vertex_index)
void(* getVertexFaces)(const struct OpenSubdiv_Converter *converter, const int vertex_index, int *vertex_faces)
int(* getNumVertices)(const struct OpenSubdiv_Converter *converter)
float(* getEdgeSharpness)(const struct OpenSubdiv_Converter *converter, const int edge_index)
int(* getNumEdges)(const struct OpenSubdiv_Converter *converter)
int(* getNumFaces)(const struct OpenSubdiv_Converter *converter)
int(* getNumEdgeFaces)(const struct OpenSubdiv_Converter *converter, const int edge_index)
int(* getNumUVCoordinates)(const struct OpenSubdiv_Converter *converter)
void(* getVertexEdges)(const struct OpenSubdiv_Converter *converter, const int vertex_index, int *vertex_edges)
void(* finishUVLayer)(const struct OpenSubdiv_Converter *converter)
void(* getEdgeFaces)(const struct OpenSubdiv_Converter *converter, const int edge, int *edge_faces)
OpenSubdiv_VtxBoundaryInterpolation(* getVtxBoundaryInterpolation)(const struct OpenSubdiv_Converter *converter)
void(* precalcUVLayer)(const struct OpenSubdiv_Converter *converter, const int layer_index)
int(* getFaceCornerUVIndex)(const struct OpenSubdiv_Converter *converter, const int face_index, const int corner_index)
int(* getNumFaceVertices)(const struct OpenSubdiv_Converter *converter, const int face_index)
blender::opensubdiv::MeshTopology * base_mesh_topology
const OpenSubdiv_Converter * converter
OpenSubdiv::Far::TopologyRefinerFactory< TopologyRefinerData > TopologyRefinerFactoryType