mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-06-16 10:19:58 +00:00
3d:: correct eyes
This commit is contained in:
parent
61a2c1a69e
commit
73f53b93a8
|
@ -699,6 +699,62 @@ void make_ball(hpcshape& sh, ld rad, int lev) {
|
||||||
add_texture(sh);
|
add_texture(sh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hyperpoint psmin(hyperpoint H) {
|
||||||
|
hyperpoint res;
|
||||||
|
res[2] = asin_auto(H[2]);
|
||||||
|
ld cs = pow(cos_auto(res[2]), 2);
|
||||||
|
ld r = sqrt(cs+H[0]*H[0]+H[1]*H[1]);
|
||||||
|
res[0] = H[0] / r;
|
||||||
|
res[1] = H[1] / r;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
void adjust_eye(hpcshape& eye, hpcshape head, ld shift_eye, ld shift_head, int q, ld zoom=1) {
|
||||||
|
using namespace hyperpoint_vec;
|
||||||
|
hyperpoint center = Hypc;
|
||||||
|
for(int i=eye.s; i<eye.e; i++) if(q == 1 || hpc[i][1] > 0) center += hpc[i];
|
||||||
|
center = normalize(center);
|
||||||
|
// center /= (eye.e - eye.s);
|
||||||
|
ld rad = 0;
|
||||||
|
for(int i=eye.s; i<eye.e; i++) if(q == 1 || hpc[i][1] > 0) rad += hdist(center, hpc[i]);
|
||||||
|
rad /= (eye.e - eye.s);
|
||||||
|
|
||||||
|
hyperpoint pscenter = psmin(center);
|
||||||
|
|
||||||
|
ld pos = 0;
|
||||||
|
int qty = 0, qtyall = 0;
|
||||||
|
|
||||||
|
vector<hyperpoint> pss;
|
||||||
|
|
||||||
|
for(int i=head.s; i<head.e; i++) pss.push_back(psmin(zpush(shift_head) * hpc[i]));
|
||||||
|
|
||||||
|
ld zmid = 0;
|
||||||
|
for(hyperpoint& h: pss) zmid += h[2];
|
||||||
|
zmid /= isize(pss);
|
||||||
|
|
||||||
|
ld mindist = 1e9;
|
||||||
|
for(int i=0; i<isize(pss); i+=3) if(pss[i][2] < zmid || WDIM == 3) {
|
||||||
|
ld d = sqhypot_d(2, pss[i]-pscenter) + sqhypot_d(2, pss[i+1]-pscenter) + sqhypot_d(2, pss[i+2]-pscenter);
|
||||||
|
if(d < mindist) mindist = d, pos = min(min(pss[i][2], pss[i+1][2]), pss[i+2][2]), qty++;
|
||||||
|
qtyall++;
|
||||||
|
}
|
||||||
|
println(hlog, "center = ", center);
|
||||||
|
println(hlog, "qty= ", qty, "/",qtyall, " pos = ", pos, " mindist=", mindist);
|
||||||
|
|
||||||
|
make_ball(eye, rad, 0);
|
||||||
|
transmatrix T = zpush(-shift_eye) * rgpushxto0(center) * zpush(pos);
|
||||||
|
for(int i=eye.s; i<isize(hpc); i++) hpc[i] = T * hpc[i];
|
||||||
|
int s = isize(hpc);
|
||||||
|
if(q == 2)
|
||||||
|
for(int i=eye.s; i<s; i++) hpcpush(MirrorY * hpc[i]);
|
||||||
|
finishshape();
|
||||||
|
// eye.prio = PPR::SUPERLINE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void shift_last_straight(ld z) {
|
||||||
|
for(int i=last->s; i<isize(hpc); i++) hpc[i] = zpush(z) * hpc[i];
|
||||||
|
}
|
||||||
|
|
||||||
void queueball(const transmatrix& V, ld rad, color_t col, eItem what) {
|
void queueball(const transmatrix& V, ld rad, color_t col, eItem what) {
|
||||||
if(what == itOrbSpeed) {
|
if(what == itOrbSpeed) {
|
||||||
transmatrix V1 = V * cspin(1, 2, M_PI/2);
|
transmatrix V1 = V * cspin(1, 2, M_PI/2);
|
||||||
|
@ -888,15 +944,6 @@ void make_3d_models() {
|
||||||
|
|
||||||
make_revolution_cut(shButterflyBody, 180);
|
make_revolution_cut(shButterflyBody, 180);
|
||||||
|
|
||||||
shift_shape(shWolf1, -g-0.088 * S);
|
|
||||||
shift_shape(shWolf2, -g-0.088 * S);
|
|
||||||
shift_shape(shWolf3, -g-0.098 * S);
|
|
||||||
shift_shape(shFamiliarEye, -g-0.088 * S);
|
|
||||||
shift_shape(shWolfEyes, -g+(-0.088 - 0.01 * 0.9) * S);
|
|
||||||
|
|
||||||
shift_shape(shEyes, -g+(-3.3) * S / -20);
|
|
||||||
for(int i=shEyes.s; i<shEyes.e; i++) hpc[i] = cspin(0, 2, M_PI/2) * hpc[i];
|
|
||||||
|
|
||||||
animate_bird(shEagle, shAnimatedEagle, 0.05*S);
|
animate_bird(shEagle, shAnimatedEagle, 0.05*S);
|
||||||
animate_bird(shTinyBird, shAnimatedTinyEagle, 0.05*S/2);
|
animate_bird(shTinyBird, shAnimatedTinyEagle, 0.05*S/2);
|
||||||
|
|
||||||
|
@ -982,6 +1029,24 @@ void make_3d_models() {
|
||||||
|
|
||||||
shift_shape(shMagicSword, geom3::ABODY);
|
shift_shape(shMagicSword, geom3::ABODY);
|
||||||
shift_shape(shMagicShovel, geom3::ABODY);
|
shift_shape(shMagicShovel, geom3::ABODY);
|
||||||
|
|
||||||
|
adjust_eye(shSlimeEyes, shSlime, geom3::FLATEYE, 0, 2, 2);
|
||||||
|
adjust_eye(shGhostEyes, shGhost, geom3::GHOST, geom3::GHOST, 2, WDIM == 2 ? 2 : 4);
|
||||||
|
adjust_eye(shMiniEyes, shMiniGhost, geom3::GHOST, geom3::GHOST, 2, 2);
|
||||||
|
adjust_eye(shWormEyes, shWormHead, 0, 0, 2, 4);
|
||||||
|
adjust_eye(shDragonEyes, shDragonHead, 0, 0, 2, 4);
|
||||||
|
|
||||||
|
adjust_eye(shKrakenEye, shKrakenHead, 0, 0, 1);
|
||||||
|
adjust_eye(shKrakenEye2, shKrakenEye, 0, 0, 1, 2);
|
||||||
|
|
||||||
|
adjust_eye(shWolf1, shDogHead, geom3::AHEAD, geom3::AHEAD, 1);
|
||||||
|
adjust_eye(shWolf2, shDogHead, geom3::AHEAD, geom3::AHEAD, 1);
|
||||||
|
adjust_eye(shWolf3, shDogHead, geom3::AHEAD, geom3::AHEAD, 1);
|
||||||
|
adjust_eye(shFamiliarEye, shWolfHead, geom3::AHEAD, geom3::AHEAD, 1);
|
||||||
|
|
||||||
|
adjust_eye(shWolfEyes, shWolfHead, geom3::AHEAD, geom3::AHEAD, 1);
|
||||||
|
|
||||||
|
adjust_eye(shReptileEye, shReptileHead, geom3::AHEAD, geom3::AHEAD, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef S
|
#undef S
|
||||||
|
|
16
graph.cpp
16
graph.cpp
|
@ -1310,6 +1310,10 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V1, color_t col
|
||||||
}
|
}
|
||||||
queuepoly(VAHEAD, shWolfHead, darkena(col, 0, 0xFF));
|
queuepoly(VAHEAD, shWolfHead, darkena(col, 0, 0xFF));
|
||||||
queuepoly(VAHEAD, shWolfEyes, darkena(col, 3, 0xFF));
|
queuepoly(VAHEAD, shWolfEyes, darkena(col, 3, 0xFF));
|
||||||
|
if(DIM == 3) {
|
||||||
|
queuepoly(VAHEAD, shFamiliarEye, 0xFF);
|
||||||
|
queuepoly(VAHEAD * Mirror, shFamiliarEye, 0xFF);
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1678,13 +1682,13 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V1, color_t col
|
||||||
case moGhost: case moSeep: case moFriendlyGhost: {
|
case moGhost: case moSeep: case moFriendlyGhost: {
|
||||||
if(m == moFriendlyGhost) col = fghostcolor(where);
|
if(m == moFriendlyGhost) col = fghostcolor(where);
|
||||||
queuepolyat(VGHOST, shGhost, darkena(col, 0, m == moFriendlyGhost ? 0xC0 : 0x80), DIM == 3 ? PPR::SUPERLINE : shGhost.prio);
|
queuepolyat(VGHOST, shGhost, darkena(col, 0, m == moFriendlyGhost ? 0xC0 : 0x80), DIM == 3 ? PPR::SUPERLINE : shGhost.prio);
|
||||||
queuepolyat(VGHOST, shEyes, 0xFF, DIM == 3 ? PPR::SUPERLINE : shEyes.prio);
|
queuepolyat(VGHOST, shGhostEyes, 0xFF, DIM == 3 ? PPR::SUPERLINE : shEyes.prio);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
case moVineSpirit: {
|
case moVineSpirit: {
|
||||||
queuepoly(VGHOST, shGhost, 0xD0D0D0C0 | UNTRANS);
|
queuepoly(VGHOST, shGhost, 0xD0D0D0C0 | UNTRANS);
|
||||||
queuepoly(VGHOST, shEyes, 0xFF0000FF);
|
queuepolyat(VGHOST, shGhostEyes, 0xFF0000FF, DIM == 3 ? PPR::SUPERLINE : shGhostEyes.prio);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1700,7 +1704,7 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V1, color_t col
|
||||||
|
|
||||||
case moSlime: {
|
case moSlime: {
|
||||||
queuepoly(VFISH, shSlime, darkena(col, 0, 0x80));
|
queuepoly(VFISH, shSlime, darkena(col, 0, 0x80));
|
||||||
queuepoly(VSLIMEEYE, shEyes, 0xFF);
|
queuepoly(VSLIMEEYE, shSlimeEyes, 0xFF);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1918,13 +1922,13 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V1, color_t col
|
||||||
|
|
||||||
case moWorm: case moWormwait: case moHexSnake: {
|
case moWorm: case moWormwait: case moHexSnake: {
|
||||||
queuepoly(V, shWormHead, darkena(col, 0, 0xFF));
|
queuepoly(V, shWormHead, darkena(col, 0, 0xFF));
|
||||||
queuepolyat(V, shEyes, 0xFF, PPR::ONTENTACLE_EYES);
|
queuepolyat(V, shWormEyes, 0xFF, PPR::ONTENTACLE_EYES);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
case moDragonHead: {
|
case moDragonHead: {
|
||||||
queuepoly(V, shDragonHead, darkena(col, 0, 0xFF));
|
queuepoly(V, shDragonHead, darkena(col, 0, 0xFF));
|
||||||
queuepolyat(V, shEyes, 0xFF, PPR::ONTENTACLE_EYES);
|
queuepolyat(V, shDragonEyes, 0xFF, PPR::ONTENTACLE_EYES);
|
||||||
int noscolor = 0xFF0000FF;
|
int noscolor = 0xFF0000FF;
|
||||||
queuepoly(V, shDragonNostril, noscolor);
|
queuepoly(V, shDragonNostril, noscolor);
|
||||||
queuepoly(V * Mirror, shDragonNostril, noscolor);
|
queuepoly(V * Mirror, shDragonNostril, noscolor);
|
||||||
|
@ -1977,7 +1981,7 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V1, color_t col
|
||||||
queuepoly(VFISH, shJelly, darkena(col, 0, 0xD0));
|
queuepoly(VFISH, shJelly, darkena(col, 0, 0xD0));
|
||||||
queuepolyat(VBODY, shJelly, darkena(col, 0, 0xD0), PPR::MONSTER_BODY);
|
queuepolyat(VBODY, shJelly, darkena(col, 0, 0xD0), PPR::MONSTER_BODY);
|
||||||
queuepolyat(VHEAD, shJelly, darkena(col, 0, 0xD0), PPR::MONSTER_HEAD);
|
queuepolyat(VHEAD, shJelly, darkena(col, 0, 0xD0), PPR::MONSTER_HEAD);
|
||||||
queuepolyat(VHEAD, shEyes, 0xFF, PPR::MONSTER_HEAD);
|
queuepolyat(VHEAD, shSlimeEyes, 0xFF, PPR::MONSTER_HEAD);
|
||||||
}
|
}
|
||||||
else if(isDemon(m)) {
|
else if(isDemon(m)) {
|
||||||
const transmatrix VBS = VBODY * otherbodyparts(V, darkena(col, 0, 0xC0), m, footphase);
|
const transmatrix VBS = VBODY * otherbodyparts(V, darkena(col, 0, 0xC0), m, footphase);
|
||||||
|
|
|
@ -1683,6 +1683,7 @@ hpcshape
|
||||||
shWestHat1, shWestHat2, shGunInHand,
|
shWestHat1, shWestHat2, shGunInHand,
|
||||||
shKnightArmor, shKnightCloak, shWightCloak,
|
shKnightArmor, shKnightCloak, shWightCloak,
|
||||||
shGhost, shEyes, shSlime, shJelly, shJoint, shWormHead, shTentHead, shShark, shWormSegment, shSmallWormSegment, shWormTail, shSmallWormTail,
|
shGhost, shEyes, shSlime, shJelly, shJoint, shWormHead, shTentHead, shShark, shWormSegment, shSmallWormSegment, shWormTail, shSmallWormTail,
|
||||||
|
shSlimeEyes, shDragonEyes, shWormEyes, shGhostEyes,
|
||||||
shMiniGhost, shMiniEyes,
|
shMiniGhost, shMiniEyes,
|
||||||
shHedgehogBlade, shHedgehogBladePlayer,
|
shHedgehogBlade, shHedgehogBladePlayer,
|
||||||
shWolfBody, shWolfHead, shWolfLegs, shWolfEyes,
|
shWolfBody, shWolfHead, shWolfLegs, shWolfEyes,
|
||||||
|
@ -3047,6 +3048,7 @@ void buildpolys() {
|
||||||
bshape(shEyes, PPR::MONSTER_EYE0, scalefactor, 135);
|
bshape(shEyes, PPR::MONSTER_EYE0, scalefactor, 135);
|
||||||
bshape(shMiniEyes, PPR::MONSTER_EYE0, scalefactor/3, 135);
|
bshape(shMiniEyes, PPR::MONSTER_EYE0, scalefactor/3, 135);
|
||||||
bshape(shShark, PPR::MONSTER_BODY, scalefactor, 136);
|
bshape(shShark, PPR::MONSTER_BODY, scalefactor, 136);
|
||||||
|
shSlimeEyes = shDragonEyes = shWormEyes = shGhostEyes = shEyes;
|
||||||
bshape(shTinyShark, PPR::MONSTER_BODY, scalefactor / 2, 136);
|
bshape(shTinyShark, PPR::MONSTER_BODY, scalefactor / 2, 136);
|
||||||
bshape(shBugBody, PPR::MONSTER_BODY, scalefactor, 137);
|
bshape(shBugBody, PPR::MONSTER_BODY, scalefactor, 137);
|
||||||
bshape(shBugArmor, PPR::MONSTER_ARMOR0, scalefactor, 138);
|
bshape(shBugArmor, PPR::MONSTER_ARMOR0, scalefactor, 138);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user