Skip to content

Commit

Permalink
extrude
Browse files Browse the repository at this point in the history
  • Loading branch information
archibate committed Aug 6, 2022
1 parent a8afaa9 commit 669d0e3
Show file tree
Hide file tree
Showing 8 changed files with 25 additions and 11 deletions.
2 changes: 1 addition & 1 deletion projects/MeshSubdiv/OSDPrimSubdiv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ static void osdPrimSubdiv(PrimitiveObject *prim, int levels, std::string edgeCre
const int maxlevel=levels;
if (maxlevel <= 0 || !prim->verts.size()) return;

if (prim->loops.size() && prim->loop_uvs.size() <= prim->loops.size())
if (prim->loops.size() && prim->loop_uvs.size())
hasLoopUVs = false;

//nCoarseVerts=0,
Expand Down
4 changes: 2 additions & 2 deletions zeno/include/zeno/types/PrimitiveObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ struct PrimitiveObject : IObjectClone<PrimitiveObject> {
AttrVector<vec2i> polys;
AttrVector<vec2i> edges;

std::vector<vec2f> uvs;
std::vector<int> loop_uvs;
AttrVector<vec2f> uvs;
AttrVector<int> loop_uvs;

std::shared_ptr<MaterialObject> mtl;
std::shared_ptr<InstancingObject> inst;
Expand Down
4 changes: 4 additions & 0 deletions zeno/src/funcs/ObjectCodecPrimitive.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,9 @@ std::shared_ptr<PrimitiveObject> decodePrimitiveObject(const char *it) {
decodeAttrVector(obj->quads, it);
decodeAttrVector(obj->loops, it);
decodeAttrVector(obj->polys, it);
decodeAttrVector(obj->edges, it);
decodeAttrVector(obj->uvs, it);
decodeAttrVector(obj->loop_uvs, it);
if (*it++ == '1') {
obj->mtl = std::make_shared<MaterialObject>();
obj->mtl->deserialize(it);
Expand All @@ -99,7 +101,9 @@ bool encodePrimitiveObject(PrimitiveObject const *obj, std::back_insert_iterator
encodeAttrVector(obj->quads, it);
encodeAttrVector(obj->loops, it);
encodeAttrVector(obj->polys, it);
encodeAttrVector(obj->edges, it);
encodeAttrVector(obj->uvs, it);
encodeAttrVector(obj->loop_uvs, it);
if (obj->mtl) {
*it++ = '1';
for (char c: obj->mtl->serialize())
Expand Down
6 changes: 3 additions & 3 deletions zeno/src/nodes/neo/PrimCodecUVs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ namespace zeno {

// 'smart loop_uvs' to 'qianqiang loop.attr(uv)'
ZENO_API void primDecodeUVs(PrimitiveObject *prim) {
if (prim->loops.size() && prim->loop_uvs.size() <= prim->loops.size()) {
if (prim->loops.size() && prim->loop_uvs.size()) {
auto &loop_uvs = prim->loop_uvs;
auto &attr_uv = prim->loops.add_attr<vec3f>("uv"); // todo: support vec2f in attr...
/*attr_uv.resize(prim->loop_uvs.size());*/
size_t n = std::min(loop_uvs.size(), attr_uv.size());
if (n == 0) zeno::log_warn("primDecodeUVs: no loops but have loop_uvs");
if (prim->uvs.size() == 0) zeno::log_error("primDecodeUVs: no uvs but have loop_uvs");
else if (prim->uvs.size() == 0) zeno::log_error("primDecodeUVs: no uvs but have loop_uvs");
parallel_for(n, [&] (size_t i) {
auto uv = prim->uvs[loop_uvs[i]];
attr_uv[i] = {uv[0], uv[1], 0};
Expand All @@ -27,7 +27,7 @@ ZENO_API void primDecodeUVs(PrimitiveObject *prim) {

// 'smart loop_uvs' to 'veryqianqiang vert.attr(uv)'
ZENO_API void primLoopUVsToVerts(PrimitiveObject *prim) {
if (prim->loops.size() && prim->loop_uvs.size() <= prim->loops.size()) {
if (prim->loops.size() && prim->loop_uvs.size()) {
auto &loop_uvs = prim->loop_uvs;
auto &vert_uv = prim->verts.add_attr<vec3f>("uv"); // todo: support vec2f in attr...
/*attr_uv.resize(prim->loop_uvs.size());*/
Expand Down
14 changes: 12 additions & 2 deletions zeno/src/nodes/neo/PrimExtrude.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <zeno/extra/TempNode.h>
#include <zeno/core/INode.h>
#include <zeno/zeno.h>
#include <numeric>
#include <set>

namespace zeno {
Expand All @@ -24,9 +25,12 @@ struct PrimExtrude : INode {
auto sourceMaskAttrO = get_input2<std::string>("sourceMaskAttrO");
auto autoFlipFace = get_input2<bool>("autoFlipFace");
auto autoFindEdges = get_input2<bool>("autoFindEdges");
auto averagedExtrude = get_input2<bool>("averagedExtrude");

auto prim2 = std::make_shared<PrimitiveObject>(*prim);

bool flipNewFace = autoFlipFace && extrude < 0;
bool flipOldFace = autoFlipFace && extrude > 0;
if (autoFindEdges && !maskAttr.empty()) {
AttrVector<vec2i> oldlines = std::move(prim2->lines);
primWireframe(prim2.get(), false);
Expand Down Expand Up @@ -64,6 +68,13 @@ struct PrimExtrude : INode {
std::string tmpNormAttr = "%%extrude2";
primCalcNormal(prim2.get(), 1.0f, tmpNormAttr);
p2norms = std::move(prim2->verts.attr<vec3f>(tmpNormAttr));
if (averagedExtrude) {
auto avgdir = std::reduce(p2norms.begin(), p2norms.end(), vec3f(0));
avgdir = normalizeSafe(avgdir);
offset += extrude * avgdir;
extrude = 0;
p2norms.clear();
}
prim2->verts.erase_attr(tmpNormAttr);
}

Expand All @@ -76,8 +87,6 @@ struct PrimExtrude : INode {
//prim2->verts.erase_attr(tmpInsetAttr);
}

bool flipNewFace = autoFlipFace && extrude < 0;
bool flipOldFace = autoFlipFace && extrude > 0;
if (flipNewFace) {
primFlipFaces(prim2.get());
}
Expand Down Expand Up @@ -202,6 +211,7 @@ ZENDEFNODE(PrimExtrude, {
{"string", "sourceMaskAttrO", ""},
{"bool", "autoFlipFace", "1"},
{"bool", "autoFindEdges", "1"},
{"bool", "averagedExtrude", "0"},
},
{
{"PrimitiveObject", "prim"},
Expand Down
2 changes: 1 addition & 1 deletion zeno/src/nodes/neo/PrimSepTris.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ ZENO_API void primSepTriangles(PrimitiveObject *prim, bool smoothNormal, bool ke
new_uv[b + i * 6 + 5] = uv3[i];
}
}
if (prim->loops.size() && prim->loop_uvs.size() <= prim->loops.size()) {
if (prim->loops.size() && prim->loop_uvs.size()) {
auto &loop_uvs = prim->loop_uvs;
size_t b = 0;
std::vector<int> v(loopcount * 3);
Expand Down
2 changes: 1 addition & 1 deletion zeno/src/nodes/neo/WriteObjPrim.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ void dump_obj(PrimitiveObject *prim, std::ostream &fout) {
for (auto const &[x, y, z]: prim->verts) {
fout << "v " << x << ' ' << y << ' ' << z << '\n';
}
if (prim->loops.size() && prim->loop_uvs.size() <= prim->loops.size()) {
if (prim->loops.size() && prim->loop_uvs.size()) {
auto &loop_uvs = prim->loop_uvs;
for (auto const &[x, y]: prim->uvs) {
fout << "vt " << x << ' ' << y << '\n';
Expand Down
2 changes: 1 addition & 1 deletion zenovis/src/bate/GraphicPrimitive.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ struct ZhxxGraphicPrimitive final : IGraphicDraw {
}
if (thePrmHasFaces) {
zeno::log_trace("demoting faces");
if (prim->loops.size() && prim->loop_uvs.size() <= prim->loops.size()) {
if (prim->loops.size() && prim->loop_uvs.size()) {
zeno::primDecodeUVs(&*prim);//loop_uvs to loop.attr("uv")
}
zeno::primTriangulateQuads(&*prim);
Expand Down

0 comments on commit 669d0e3

Please sign in to comment.