3d:: using models not walls for worms

This commit is contained in:
Zeno Rogue 2019-05-11 15:20:34 +02:00
parent 45b7188869
commit 534663e663
3 changed files with 24 additions and 18 deletions

View File

@ -964,6 +964,8 @@ void make_3d_models() {
make_revolution_cut(shWormSegment, 60, g);
make_revolution_cut(shSmallWormSegment, 60, g);
make_revolution_cut(shWormHead, 60, g);
make_revolution_cut(shWormTail, 60, g);
make_revolution_cut(shSmallWormTail, 60, g);
make_revolution_cut(shTentHead, 60, g);
make_revolution_cut(shKrakenHead, 60, -geom3::FLOOR);
make_revolution_cut(shSeaTentacle, 60, -geom3::FLOOR);

View File

@ -2195,8 +2195,6 @@ bool drawMonster(const transmatrix& Vparam, int ct, cell *c, color_t col) {
else if(isAnyIvy(c) || isWorm(c)) {
if(isWorm(c) && WDIM == 3) return false;
if((m == moHexSnake || m == moHexSnakeTail) && c->hitpoints == 2) {
int d = c->mondir;
if(d == NODIR)
@ -2211,6 +2209,9 @@ bool drawMonster(const transmatrix& Vparam, int ct, cell *c, color_t col) {
if(isDragon(c->monst) && c->stuntime == 0) col = 0xFF6000;
if(DIM == 3 && among(c->monst, moIvyRoot, moWorm, moHexSnake, moDragonHead, moKrakenH))
radarpoints.emplace_back(radarpoint{makeradar(Vparam), minf[m].glyph, col, isFriendly(m) ? 0x00FF00FF : 0xFF0000FF });
transmatrix Vb0 = Vb;
if(c->mondir != NODIR && DIM == 3 && isAnyIvy(c)) {
queueline(tC0(Vparam), Vparam * tC0(calc_relative_matrix(c->move(c->mondir), c, C0)), (col << 8) + 0xFF, 0);
@ -2274,7 +2275,9 @@ bool drawMonster(const transmatrix& Vparam, int ct, cell *c, color_t col) {
add_segment(taildist(c), [=] () {
for(int i=11; i>=0; i--) {
if(i < 3 && (c->monst == moTentacle || c->monst == moTentaclewait)) continue;
transmatrix Vbx = Vb * spin(sin(M_PI * i / 6.) * wav / (i+.1)) * xpush(length * (i) / 12.0);
transmatrix Vbx = Vb;
if(WDIM == 2) Vbx = Vbx * spin(sin(M_PI * i / 6.) * wav / (i+.1));
Vbx = Vbx * xpush(length * (i) / 12.0);
// transmatrix Vbx2 = Vnext * xpush(length2 * i / 6.0);
// Vbx = Vbx * rspintox(inverse(Vbx) * Vbx2 * C0) * pispin;
ShadowV(Vbx, sh, PPR::GIANTSHADOW);
@ -2308,14 +2311,14 @@ bool drawMonster(const transmatrix& Vparam, int ct, cell *c, color_t col) {
Vb = Vb * pispin;
transmatrix Vbh = mmscale(Vb, geom3::AHEAD);
queuepoly(Vbh, shWormHead, darkena(col, 0, 0xFF));
queuepolyat(Vbh, shEyes, 0xFF, PPR::ONTENTACLE_EYES);
queuepolyat(Vbh, shWormEyes, 0xFF, PPR::ONTENTACLE_EYES);
ShadowV(Vb, shWormHead, PPR::GIANTSHADOW);
}
else if(m == moDragonHead) {
transmatrix Vbh = mmscale(Vb, geom3::AHEAD);
ShadowV(Vb, shDragonHead, PPR::GIANTSHADOW);
queuepoly(Vbh, shDragonHead, darkena(col, c->hitpoints?0:1, 0xFF));
queuepolyat(Vbh/* * pispin */, shEyes, 0xFF, PPR::ONTENTACLE_EYES);
queuepolyat(Vbh/* * pispin */, shDragonEyes, 0xFF, PPR::ONTENTACLE_EYES);
int noscolor = (c->hitpoints == 1 && c->stuntime ==1) ? 0xFF0000FF : 0xFF;
queuepoly(Vbh, shDragonNostril, noscolor);
@ -4075,7 +4078,6 @@ void draw_gravity_particles(cell *c, const transmatrix V) {
}
bool isWall3(cell *c, color_t& wcol) {
if(isWorm(c)) { wcol = minf[c->monst].color; return true; }
if(isWall(c)) return true;
if(c->wall == waChasm && c->land == laMemory) { wcol = 0x606000; return true; }
if(c->wall == waInvisibleFloor) return false;

View File

@ -2854,6 +2854,8 @@ void buildpolys() {
bshape(shPirateX, PPR::ITEM, scalefactor, 124);
bshape(shTreat, PPR::ITEM, scalefactor, 253);
ld wormscale = WDIM == 3 ? 3 : 1;
// first layer monsters
bshape(shTentacleX, PPR::TENTACLE0);
drawTentacle(shTentacleX, crossf * .25, crossf * .1, 10);
@ -2862,24 +2864,24 @@ void buildpolys() {
bshape(shTentacle, PPR::TENTACLE1);
drawTentacle(shTentacle, crossf * .2, crossf * .1, 10);
copyshape(shJoint, shDisk, PPR::ONTENTACLE);
bshape(shTentHead, PPR::ONTENTACLE, scalefactor, 79);
bshape(shWormHead, PPR::ONTENTACLE, scalefactor, 80);
bshape(shTentHead, PPR::ONTENTACLE, scalefactor * wormscale, 79);
bshape(shWormHead, PPR::ONTENTACLE, scalefactor * wormscale, 80);
bshape(shWormSegment, PPR::TENTACLE1);
RING(i)
hpcpush(ddi(i, .20 * scalefactor) * C0);
hpcpush(ddi(i, .20 * scalefactor * wormscale) * C0);
bshape(shSmallWormSegment, PPR::TENTACLE1);
RING(i)
hpcpush(ddi(i, .16 * scalefactor) * C0);
bshape(shWormTail, PPR::TENTACLE1, scalefactor, 383);
bshape(shSmallWormTail, PPR::TENTACLE1, scalefactor, 384);
hpcpush(ddi(i, .16 * scalefactor * wormscale) * C0);
bshape(shWormTail, PPR::TENTACLE1, scalefactor * wormscale, 383);
bshape(shSmallWormTail, PPR::TENTACLE1, scalefactor * wormscale, 384);
bshape(shDragonSegment, PPR::TENTACLE1, scalefactor, 234); //233 alt
bshape(shDragonWings, PPR::ONTENTACLE, scalefactor, 237);
bshape(shDragonLegs, PPR::TENTACLE0, scalefactor, 238);
bshape(shDragonTail, PPR::TENTACLE1, scalefactor, 240); //239 alt
bshape(shDragonNostril, PPR::ONTENTACLE_EYES, scalefactor, 241);
bshape(shDragonHead, PPR::ONTENTACLE, scalefactor, 242);
bshape(shDragonSegment, PPR::TENTACLE1, scalefactor * wormscale, 234); //233 alt
bshape(shDragonWings, PPR::ONTENTACLE, scalefactor * wormscale, 237);
bshape(shDragonLegs, PPR::TENTACLE0, scalefactor * wormscale, 238);
bshape(shDragonTail, PPR::TENTACLE1, scalefactor * wormscale, 240); //239 alt
bshape(shDragonNostril, PPR::ONTENTACLE_EYES, scalefactor * wormscale, 241);
bshape(shDragonHead, PPR::ONTENTACLE, scalefactor * wormscale, 242);
ld krsc = 1;
if(sphere) krsc *= 1.4;