Draw inbetween mesh.

master
Jeremy Hu 2016-12-31 16:25:51 +09:30
parent 36ebce180b
commit c4287c5484
5 changed files with 101 additions and 4 deletions

View File

@ -537,6 +537,7 @@ static bmeshBall *bmeshFindParentBallForConvexHull(bmesh *bm, bmeshBall *root,
if (isDistanceEnoughForConvexHull(root, ball)) { if (isDistanceEnoughForConvexHull(root, ball)) {
return ball; return ball;
} }
ball->radius = 0;
return bmeshFindParentBallForConvexHull(bm, root, depth - 1, return bmeshFindParentBallForConvexHull(bm, root, depth - 1,
bm->parentBallStack[depth - 1]); bm->parentBallStack[depth - 1]);
} }
@ -593,7 +594,7 @@ static int bmeshStichFrom(bmesh *bm, int depth, bmeshBall *ball) {
bm->parentBallStack[depth] = ball; bm->parentBallStack[depth] = ball;
} }
ball->roundColor = bm->roundColor; ball->roundColor = bm->roundColor;
if (BMESH_BALL_TYPE_ROOT == ball->type/* && 4 == ball->index*/) { if (BMESH_BALL_TYPE_ROOT == ball->type) {
convexHull *hull; convexHull *hull;
bmeshBall *outmostBall = 0; bmeshBall *outmostBall = 0;
int outmostBallFirstVertexIndex = 0; int outmostBallFirstVertexIndex = 0;
@ -805,3 +806,84 @@ int bmeshStitch(bmesh *bm) {
bm->roundColor++; bm->roundColor++;
return bmeshStichFrom(bm, 0, bmeshGetRootBall(bm)); return bmeshStichFrom(bm, 0, bmeshGetRootBall(bm));
} }
void calculateBallQuad(bmeshBall *ball, quad *q) {
vec3 z, y;
vec3Scale(&ball->localYaxis, ball->radius, &y);
vec3Scale(&ball->localZaxis, ball->radius, &z);
vec3Sub(&ball->position, &y, &q->pt[0]);
vec3Add(&q->pt[0], &z, &q->pt[0]);
vec3Sub(&ball->position, &y, &q->pt[1]);
vec3Sub(&q->pt[1], &z, &q->pt[1]);
vec3Add(&ball->position, &y, &q->pt[2]);
vec3Sub(&q->pt[2], &z, &q->pt[2]);
vec3Add(&ball->position, &y, &q->pt[3]);
vec3Add(&q->pt[3], &z, &q->pt[3]);
}
static void drawWallsBetweenQuads(quad *q1, quad *q2) {
int i;
for (i = 0; i < 4; ++i) {
quad wall = {{q1->pt[i], q2->pt[i],
q2->pt[(i + 1) % 4], q1->pt[(i + 1) % 4]}};
drawQuad(&wall);
}
}
static int bmeshGenerateInbetweenMeshFrom(bmesh *bm, bmeshBall *parent,
bmeshBall *ball) {
int result = 0;
bmeshBallIterator iterator;
bmeshBall *child = 0;
if (bm->roundColor == ball->roundColor) {
return 0;
}
ball->roundColor = bm->roundColor;
if (ball->radius > 0) {
quad currentFace;
calculateBallQuad(ball, &currentFace);
if (parent && parent->radius > 0) {
quad parentFace;
calculateBallQuad(parent, &parentFace);
drawWallsBetweenQuads(&parentFace, &currentFace);
child = bmeshGetBallFirstChild(bm, ball, &iterator);
if (!child) {
bmeshBall fakeParentParent = *parent;
bmeshBall fakeParent = *ball;
bmeshBall fakeBall;
for (;;) {
quad childFace;
fakeBall = fakeParent;
vec3Lerp(&fakeParentParent.position, &fakeParent.position, 2,
&fakeBall.position);
calculateBallQuad(&fakeBall, &childFace);
drawWallsBetweenQuads(&currentFace, &childFace);
if (vec3Distance(&ball->position, &fakeBall.position) >=
ball->radius) {
drawQuad(&childFace);
break;
}
fakeParentParent = fakeParent;
fakeParent = fakeBall;
}
}
}
}
for (child = bmeshGetBallFirstChild(bm, ball, &iterator);
child;
child = bmeshGetBallNextChild(bm, ball, &iterator)) {
result = bmeshGenerateInbetweenMeshFrom(bm, ball, child);
if (0 != result) {
fprintf(stderr, "%s:bmeshGenerateInbetweenMeshFrom failed.\n",
__FUNCTION__);
return result;
}
}
return result;
}
int bmeshGenerateInbetweenMesh(bmesh *bm) {
bm->roundColor++;
return bmeshGenerateInbetweenMeshFrom(bm, 0, bmeshGetRootBall(bm));
}

View File

@ -55,6 +55,7 @@ quad *bmeshGetQuad(bmesh *bm, int index);
int bmeshAddQuad(bmesh *bm, quad *q); int bmeshAddQuad(bmesh *bm, quad *q);
int bmeshSweep(bmesh *bm); int bmeshSweep(bmesh *bm);
int bmeshStitch(bmesh *bm); int bmeshStitch(bmesh *bm);
int bmeshGenerateInbetweenMesh(bmesh *bm);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -35,6 +35,18 @@ void drawTriangle(triangle *poly) {
glEnd(); glEnd();
} }
void drawQuad(quad *poly) {
vec3 normal;
int i;
glBegin(GL_QUADS);
vec3Normal(&poly->pt[0], &poly->pt[1], &poly->pt[2], &normal);
for (i = 0; i < 4; ++i) {
glNormal3f(normal.x, normal.y, normal.z);
glVertex3f(poly->pt[i].x, poly->pt[i].y, poly->pt[i].z);
}
glEnd();
}
int drawCylinder(vec3 *topOrigin, vec3 *bottomOrigin, float radius, int slices, int drawCylinder(vec3 *topOrigin, vec3 *bottomOrigin, float radius, int slices,
int stacks) { int stacks) {
vec3 zAxis = {0, 0, 1}; vec3 zAxis = {0, 0, 1};

View File

@ -14,6 +14,7 @@ extern "C" {
int drawInit(void); int drawInit(void);
int drawSphere(vec3 *origin, float radius, int slices, int stacks); int drawSphere(vec3 *origin, float radius, int slices, int stacks);
void drawTriangle(triangle *poly); void drawTriangle(triangle *poly);
void drawQuad(quad *poly);
int drawCylinder(vec3 *topOrigin, vec3 *bottomOrigin, float radius, int slices, int drawCylinder(vec3 *topOrigin, vec3 *bottomOrigin, float radius, int slices,
int stacks); int stacks);
int drawGrid(float size, float step); int drawGrid(float size, float step);

View File

@ -42,7 +42,7 @@ static int drawBmeshBall(bmesh *bm, bmeshBall *ball) {
static void drawBmeshBallRecursively(bmesh *bm, bmeshBall *ball) { static void drawBmeshBallRecursively(bmesh *bm, bmeshBall *ball) {
bmeshBallIterator iterator; bmeshBallIterator iterator;
bmeshBall *child; bmeshBall *child;
drawBmeshBall(bm, ball); //drawBmeshBall(bm, ball);
for (child = bmeshGetBallFirstChild(bm, ball, &iterator); for (child = bmeshGetBallFirstChild(bm, ball, &iterator);
child; child;
child = bmeshGetBallNextChild(bm, ball, &iterator)) { child = bmeshGetBallNextChild(bm, ball, &iterator)) {
@ -50,7 +50,7 @@ static void drawBmeshBallRecursively(bmesh *bm, bmeshBall *ball) {
} }
} }
static int drawBmeshBallQuad(bmeshBall *ball) { static void drawBmeshBallQuad(bmeshBall *ball) {
vec3 normal; vec3 normal;
int j; int j;
vec3 z, y; vec3 z, y;
@ -262,6 +262,7 @@ void Render::paintGL() {
bmeshGenerateInbetweenBalls(bm); bmeshGenerateInbetweenBalls(bm);
bmeshSweep(bm); bmeshSweep(bm);
bmeshStitch(bm); bmeshStitch(bm);
bmeshGenerateInbetweenMesh(bm);
} }
drawBmeshBallRecursively(bm, bmeshGetRootBall(bm)); drawBmeshBallRecursively(bm, bmeshGetRootBall(bm));
@ -280,7 +281,7 @@ void Render::paintGL() {
for (index = 0; index < bmeshGetBoneNum(bm); ++index) { for (index = 0; index < bmeshGetBoneNum(bm); ++index) {
bmeshBone *bone = bmeshGetBone(bm, index); bmeshBone *bone = bmeshGetBone(bm, index);
drawBmeshBone(bm, bone); //drawBmeshBone(bm, bone);
} }
/* /*
glColor4f(1.0f, 1.0f, 1.0f, 0.5); glColor4f(1.0f, 1.0f, 1.0f, 0.5);