void CLevitate::AddStone(const Vec3f & pos) { if(arxtime.is_paused() || nbstone > 255) { return; } int nb = 256; while(nb--) { if(!tstone[nb].actif) { nbstone++; T_STONE stone; stone.actif = 1; stone.numstone = rand() & 1; stone.pos = pos; stone.yvel = rnd() * -5.f; stone.ang = Anglef(rnd(), rnd(), rnd()) * Anglef(360.f, 360.f, 360.f); stone.angvel = Anglef(rnd(), rnd(), rnd()) * Anglef(5.f, 6.f, 3.f); stone.scale = Vec3f(0.2f + rnd() * 0.3f); stone.time = Random::get(2000, 2500); stone.currtime = 0; tstone[nb] = stone; break; } } }
/* Reinit */ void Cinematic::OneTimeSceneReInit() { m_camera.size = Anglef(160.f, 60.f, 60.f); m_camera.orgTrans.pos = Vec3f(900.f, -160.f, 4340.f); m_camera.angle = Anglef(3.f, 268.f, 0.f); m_camera.clip = Rect(LargeurRender, HauteurRender); m_camera.center = m_camera.clip.center(); m_camera.focal = 350.f; m_camera.bkgcolor = Color::none; m_camera.cdepth = 2500.f; numbitmap = -1; numbitmapsuiv = -1; fx = -1; changekey = true; idsound = -1; key = NULL; projectload = false; DeleteAllBitmap(); DeleteAllSound(); DeleteTrack(); FlashBlancEnCours = false; m_flIntensityRND = 0.f; }
void CCurse::Render() { RenderMaterial mat; mat.setCulling(Renderer::CullCW); mat.setDepthTest(true); mat.setBlendType(RenderMaterial::Opaque); Anglef stiteangle = Anglef(0, fRot, 0); Vec3f stitepos = eTarget; Vec3f stitescale = Vec3f_ONE; Color3f stitecolor = Color3f::white; Draw3DObject(svoodoo, stiteangle, stitepos, stitescale, stitecolor, mat); for(int i = 0; i < 4; i++) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } pd->ov = eTarget; pd->move = Vec3f(2.f * frand2(), rnd() * -10.f - 10.f, 2.f * frand2()); pd->siz = 0.015f; pd->tolive = Random::get(1000, 1600); pd->tc = tex_p1; pd->special = ROTATING | MODULATE_ROTATION | DISSIPATING | SUBSTRACT | GRAVITY; pd->fparam = 0.0000001f; } }
float CCurse::Render() { GRenderer->SetCulling(Renderer::CullCW); GRenderer->SetRenderState(Renderer::DepthWrite, true); GRenderer->SetRenderState(Renderer::AlphaBlending, false); if(svoodoo) { Anglef stiteangle = Anglef(fRot, 0, 0); Vec3f stitepos = eTarget; Vec3f stitescale = Vec3f::ONE; Color3f stitecolor = Color3f::white; DrawEERIEObjEx(svoodoo , &stiteangle, &stitepos, &stitescale, &stitecolor); } for(int i = 0; i < 4; i++) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } pd->ov = eTarget; pd->move = Vec3f(2.f * frand2(), rnd() * -10.f - 10.f, 2.f * frand2()); pd->siz = 0.015f; pd->tolive = Random::get(1000, 1600); pd->tc = tex_p1; pd->special = ROTATING | MODULATE_ROTATION | DISSIPATING | SUBSTRACT | GRAVITY; pd->fparam = 0.0000001f; } return 1; }
void GraphicsUtilityTest::front() { transform.pos = Vec3f(0.f, 0.f, 0.f); transform.updateFromAngle(Anglef(0.f, 0.f, 0.f)); Util_SetViewMatrix(matrix, transform); expected.setToIdentity(); CPPUNIT_ASSERT_EQUAL(expected, matrix); }
void GraphicsUtilityTest::back() { transform.updateFromAngle(Anglef(180.f, 180.f, 0.f)); Util_SetViewMatrix(matrix, transform); expected.setToIdentity(); expected._12 = 7.64274186e-15f; expected._13 = -8.74227766e-08f; expected._23 = 8.74227766e-08f; expected._31 = 8.74227766e-08f; expected._32 = -8.74227766e-08f; CPPUNIT_ASSERT_EQUAL(expected, matrix); }
void GraphicsUtilityTest::translation() { transform.pos = Vec3f(10.f, 200.f, 3000.f); transform.updateFromAngle(Anglef(0.f, 0.f, 0.f)); Util_SetViewMatrix(matrix, transform); expected.setToIdentity(); expected._41 = -10; expected._42 = 200; expected._43 = -3000; CPPUNIT_ASSERT_EQUAL(expected, matrix); }
std::pair<Vec3f, Vec3f> angleToFrontUpVec(const Anglef & angle) { Vec3f front = angleToVector(angle); Vec3f up = angleToVector(angle + Anglef(90.f, 0, 0)); arx_assert(glm::abs(glm::dot(front, up)) < 5.f * std::numeric_limits<float>::epsilon(), "front=(%f,%f,%f) and up=(%f,%f,%f) should be orthogonal; dot=%1f*epsilon", double(front.x), double(front.y), double(front.z), double(up.x), double(up.y), double(up.z), double(glm::dot(front, up) / std::numeric_limits<float>::epsilon())); return std::make_pair(front, up); }
void CLevitate::AddStone(Vec3f * pos) { if(arxtime.is_paused() || nbstone > 255) { return; } int nb = 256; while(nb--) { if(!tstone[nb].actif) { nbstone++; tstone[nb].actif = 1; tstone[nb].numstone = rand() & 1; tstone[nb].pos = *pos; tstone[nb].yvel = rnd() * -5.f; tstone[nb].ang = Anglef(rnd() * 360.f, rnd() * 360.f, rnd() * 360.f); tstone[nb].angvel = Anglef(5.f * rnd(), 6.f * rnd(), 3.f * rnd()); tstone[nb].scale = Vec3f::repeat(0.2f + rnd() * 0.3f); tstone[nb].time = Random::get(2000, 2500); tstone[nb].currtime = 0; break; } } }
void GraphicsUtilityTest::edgeCase2() { transform.updateFromAngle(Anglef(-90.f, -90.f, 0.f)); Util_SetViewMatrix(matrix, transform); expected.setToIdentity(); expected._11 = -1.f; expected._12 = 8.35187172e-23f; expected._13 = -4.37113883e-08f; expected._21 = -4.37113883e-08f; expected._22 = -1.91068547e-15f; expected._23 = 1.f; expected._32 = 1.f; expected._33 = 1.91068547e-15f; CPPUNIT_ASSERT_EQUAL(expected, matrix); }
/* Reinit */ void Cinematic::OneTimeSceneReInit() { Camera.size = Anglef(160.f, 60.f, 60.f); Camera.pos.x = 900.f; Camera.pos.y = -160.f; Camera.pos.z = 4340.f; Camera.angle.a = 3.f; Camera.angle.b = 268.f; Camera.angle.g = 0.f; Camera.clip.left = 0; Camera.clip.top = 0; Camera.clip.right = LargeurRender; Camera.clip.bottom = HauteurRender; Camera.clipz0 = 0.f; Camera.clipz1 = 2.999f; Camera.centerx = LargeurRender / 2; Camera.centery = HauteurRender / 2; Camera.AddX = 320.f; Camera.AddY = 240.f; Camera.focal = 350.f; Camera.Zdiv = 3000.f; Camera.Zmul = 1.f / Camera.Zdiv; Camera.clip3D = 60; Camera.type = CAM_SUBJVIEW; Camera.bkgcolor = Color::none; numbitmap = -1; numbitmapsuiv = -1; fx = -1; changekey = true; idsound = -1; key = NULL; projectload = false; DeleteAllBitmap(); DeleteAllSound(); DeleteTrack(); FlashBlancEnCours = false; m_flIntensityRND = 0.f; }
void CurseSpell::Update() { fRot += g_gameTime.lastFrameDuration() / GameDurationMs(4); Vec3f target = Vec3f_ZERO; Entity * targetIo = entities.get(m_target); if(targetIo) { target = targetIo->pos; if(m_target == EntityHandle_Player) target.y -= 200.f; else target.y += targetIo->physics.cyl.height - 30.f; } m_pos = target; RenderMaterial mat; mat.setCulling(CullCW); mat.setDepthTest(true); mat.setBlendType(RenderMaterial::Opaque); Draw3DObject(svoodoo, Anglef(0, fRot, 0), m_pos, Vec3f_ONE, Color3f::white, mat); for(int i = 0; i < 4; i++) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } pd->ov = m_pos; pd->move = arx::linearRand(Vec3f(-2.f, -20.f, -2.f), Vec3f(2.f, -10.f, 2.f)); pd->siz = 0.015f; pd->tolive = Random::getu(1000, 1600); pd->tc = tex_p1; pd->m_flags = ROTATING | DISSIPATING | SUBSTRACT | GRAVITY; pd->m_rotation = 0.0000001f; } }
static void drawDebugFogs() { RenderMaterial mat; mat.setBlendType(RenderMaterial::Opaque); mat.setDepthTest(true); for(size_t i = 0; i < MAX_FOG; i++) { const FOG_DEF & fog = fogs[i]; if(!fog.exist) { continue; } Draw3DObject(g_fogObject, Anglef(0.f, 0.f, 0.f), fog.pos, Vec3f(1.f), Color3f::white, mat); if(fog.special & FOG_DIRECTIONAL) { drawLine(fog.pos, fog.pos + fog.move * 50.f, Color::white); } drawLineSphere(Sphere(fog.pos, fog.size), Color(Color3<u8>::blue, 200)); } }
void CurseSpell::Update(float timeDelta) { fRot += timeDelta * 0.25f; Vec3f target = Vec3f_ZERO; if(ValidIONum(m_target)) { target = entities[m_target]->pos; if(m_target == PlayerEntityHandle) target.y -= 200.f; else target.y += entities[m_target]->physics.cyl.height - 30.f; } m_pos = target; RenderMaterial mat; mat.setCulling(Renderer::CullCW); mat.setDepthTest(true); mat.setBlendType(RenderMaterial::Opaque); Draw3DObject(svoodoo, Anglef(0, fRot, 0), m_pos, Vec3f_ONE, Color3f::white, mat); for(int i = 0; i < 4; i++) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } pd->ov = m_pos; pd->move = Vec3f(2.f * frand2(), rnd() * -10.f - 10.f, 2.f * frand2()); pd->siz = 0.015f; pd->tolive = Random::get(1000, 1600); pd->tc = tex_p1; pd->special = ROTATING | MODULATE_ROTATION | DISSIPATING | SUBSTRACT | GRAVITY; pd->fparam = 0.0000001f; } }
void GraphicsUtilityTest::combined() { transform.pos = Vec3f(10.f, 200.f, 3000.f); transform.updateFromAngle(Anglef(45.f, -45.f, 0.f)); Util_SetViewMatrix(matrix, transform); expected._11 = 0.707106709f; expected._12 = 0.5f; expected._13 = 0.5f; expected._14 = 0.f; expected._21 = 1.49011612e-08f; expected._22 = 0.707106769f; expected._23 = -0.707106769f; expected._24 = 0.f; expected._31 = -0.707106769f; expected._32 = 0.5f; expected._33 = 0.5f; expected._34 = 0.f; expected._41 = 2114.24927f; expected._42 = -1363.57849f; expected._43 = -1646.42126f; expected._44 = 1.f; CPPUNIT_ASSERT_EQUAL(expected, matrix); }
void ARX_INTERFACE_ManageOpenedBook_Finish(const Vec2f & mousePos, Rectf rect, float scale) { RenderState baseState = render3D().depthTest(false).fog(false); Vec3f pos = Vec3f(0.f, 0.f, 2100.f); EERIE_LIGHT * light = lightHandleGet(torchLightHandle); EERIE_LIGHT tl = *light; light->pos = Vec3f(500.f, -1960.f, 1590.f); light->m_exists = true; light->rgb = Color3f(0.6f, 0.7f, 0.9f); light->intensity = 1.8f; light->fallstart = 4520.f; light->fallend = light->fallstart + 600.f; RecalcLight(light); Camera * oldcam = g_camera; g_culledDynamicLights[0] = light; g_culledDynamicLightsCount = 1; Vec2i tmpPos(0); GRenderer->SetAntialiasing(true); float wave = timeWaveSin(g_platformTime.frameStart(), PlatformDurationMsf(1256.6370614f)); float ptDelta = toMs(g_platformTime.lastFrameDuration()); Camera bookcam; bookcam.angle = Anglef(); bookcam.m_pos = Vec3f(0.f); bookcam.focal = 500.f; bookcam.cdepth = 2200.f; for(size_t i = 0; i < RUNE_COUNT; i++) { if(!gui::necklace.runes[i]) continue; EERIE_3DOBJ * rune = gui::necklace.runes[i]; Vec2i projectionCenter = Vec2i(rect.topLeft() + (Vec2f(285, 36) + Vec2f(tmpPos) * Vec2f(45, 64)) * scale); PrepareCamera(&bookcam, Rect(rect), projectionCenter); if(player.hasRune((Rune)i)) { Anglef angle; if(rune->angle.getYaw() != 0.f) { if(rune->angle.getYaw() > 300.f) { rune->angle.setYaw(300.f); } angle.setYaw(wave * rune->angle.getYaw() * (1.0f / 40)); } rune->angle.setYaw(rune->angle.getYaw() - ptDelta * 0.2f); if(rune->angle.getYaw() < 0.f) rune->angle.setYaw(0.f); // Now draw the rune TransformInfo t2(pos, glm::quat_cast(toRotationMatrix(angle))); DrawEERIEInter(rune, t2, NULL, false, 0.f); Rectf runeBox = UpdateBbox2d(*rune).toRect(); PopAllTriangleListOpaque(baseState); tmpPos.x++; if(tmpPos.x > 4) { tmpPos.x = 0; tmpPos.y++; } // TODO this is a workaround for vertexClipPositions being relative to viewport Vec2f mousePosInViewport = mousePos - rect.topLeft(); // Checks for Mouse floating over a rune... if(runeBox.contains(mousePosInViewport)) { bool r = false; for(size_t j = 0; j < rune->facelist.size(); j++) { float n = PtIn2DPolyProj(rune->vertexClipPositions, &rune->facelist[j], mousePosInViewport.x, mousePosInViewport.y); if(n != 0.f) { r = true; break; } } if(r) { TransformInfo t(pos, glm::quat_cast(toRotationMatrix(angle))); DrawEERIEInter(rune, t, NULL, false, 0.f); rune->angle.setYaw(rune->angle.getYaw() + ptDelta * 2.f); PopAllTriangleListOpaque(baseState.blendAdditive()); cursorSetInteraction(); if(eeMouseDown1()) { PlayerBookDrawRune((Rune)i); } } } TransformInfo t1(pos, quat_identity()); DrawEERIEInter(gui::necklace.lacet, t1, NULL, false, 0.f); PopAllTriangleListOpaque(baseState); } } *light = tl; PrepareCamera(oldcam, g_size); GRenderer->SetAntialiasing(false); }
void ConfuseSpell::Update() { Vec3f pos = entities[m_target]->pos; if(m_target != EntityHandle_Player) { pos.y += entities[m_target]->physics.cyl.height - 30.f; } ObjVertHandle idx = entities[m_target]->obj->fastaccess.head_group_origin; if(idx != ObjVertHandle()) { pos = entities[m_target]->obj->vertexlist3[idx.handleData()].v; pos.y -= 50.f; } eCurPos = pos; RenderMaterial mat; mat.setDepthTest(false); mat.setBlendType(RenderMaterial::Additive); mat.setTexture(tex_trail); Anglef stiteangle = Anglef(0.f, -glm::degrees(arxtime.now_f() * ( 1.0f / 500 )), 0.f); { AnimationDuration delta = AnimationDurationUs(s64(g_framedelay * 1000.f)); EERIEDrawAnimQuatUpdate(spapi, animlayer, stiteangle, eCurPos, delta, NULL, false); EERIEDrawAnimQuatRender(spapi, eCurPos, NULL, 0.f); } for(int i = 0; i < 6; i++) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } Vec2f p = glm::diskRand(15.f); pd->ov = eCurPos + Vec3f(p.x, 0.f, p.y); pd->move = Vec3f(0.f, Random::getf(1.f, 4.f), 0.f); pd->siz = 0.25f; pd->tolive = Random::getu(2300, 3300); pd->tc = tex_p1; pd->m_flags = PARTICLE_GOLDRAIN | FADE_IN_AND_OUT | ROTATING | DISSIPATING; pd->m_rotation = 0.0000001f; Color3f baseColor = Color3f(0.4f, 0.2f, 0.4f); Color3f randomFactor = Color3f(0.4f, 0.6f, 0.4f); Color3f c = baseColor + randomColor3f() * randomFactor; while(glm::abs(c.r - c.g) > 0.3f && glm::abs(c.g - c.b) > 0.3f) { c = baseColor + randomColor3f() * randomFactor; } pd->rgb = c * Color3f(0.8f, 0.8f, 0.8f); } EERIE_LIGHT * light = dynLightCreate(m_light); if(light) { light->intensity = 1.3f; light->fallstart = 180.f; light->fallend = 420.f; light->rgb = Color3f(0.3f, 0.3f, 0.5f) + Color3f(0.2f, 0.f, 0.2f) * randomColor3f(); light->pos = eCurPos; light->duration = ArxDurationMs(200); light->extras = 0; } }
void AddFlare(const Vec2f & pos, float sm, short typ, Entity * io, bool bookDraw) { size_t oldest = 0; size_t i; for(i = 0; i < g_magicFlaresMax; i++) { if(!g_magicFlares[i].exist) { break; } if(g_magicFlares[i].tolive < g_magicFlares[oldest].tolive) { oldest = i; } } if(i >= g_magicFlaresMax) { removeFlare(g_magicFlares[oldest]); i = oldest; } MagicFlare & flare = g_magicFlares[i]; flare.exist = 1; g_magicFlaresCount++; if(!bookDraw) flare.bDrawBitmap = 0; else flare.bDrawBitmap = 1; flare.io = io; if(io) { flare.flags = 1; io->flarecount++; } else { flare.flags = 0; } flare.pos.x = pos.x - Random::getf(0.f, 4.f); flare.pos.y = pos.y - Random::getf(0.f, 4.f) - 50.f; flare.tv.rhw = flare.v.rhw = 1.f; if(!bookDraw) { EERIE_CAMERA ka = *g_magicFlareCamera; ka.angle = Anglef(360.f, 360.f, 360.f) - ka.angle; EERIE_CAMERA * oldcam = ACTIVECAM; SetActiveCamera(&ka); PrepareCamera(&ka, g_size); flare.v.p += ka.orgTrans.pos; EE_RTP(flare.tv.p, flare.v); flare.v.p += ka.orgTrans.pos; float vx = -(flare.pos.x - subj.center.x) * 0.2173913f; float vy = (flare.pos.y - subj.center.y) * 0.1515151515151515f; if(io) { flare.v.p = io->pos; flare.v.p += angleToVectorXZ(io->angle.getYaw() + vx) * 100.f; flare.v.p.y += std::sin(glm::radians(MAKEANGLE(io->angle.getPitch() + vy))) * 100.f - 150.f; } else { flare.v.p.x = 1.0f * float(pos.x - (g_size.width() / 2)) * 156.f / (640.f * g_sizeRatio.y); flare.v.p.y = 0.75f * float(pos.y - (g_size.height() / 2)) * 156.f / (480.f * g_sizeRatio.y); flare.v.p.z = 75.f; ka = *oldcam; SetActiveCamera(&ka); PrepareCamera(&ka, g_size); float temp = (flare.v.p.y * -ka.orgTrans.xsin) + (flare.v.p.z * ka.orgTrans.xcos); flare.v.p.y = (flare.v.p.y * ka.orgTrans.xcos) - (-flare.v.p.z * ka.orgTrans.xsin); flare.v.p.z = (temp * ka.orgTrans.ycos) - (-flare.v.p.x * ka.orgTrans.ysin); flare.v.p.x = (temp * -ka.orgTrans.ysin) + (flare.v.p.x * ka.orgTrans.ycos); flare.v.p += oldcam->orgTrans.pos; } flare.tv.p = flare.v.p; SetActiveCamera(oldcam); PrepareCamera(oldcam, g_size); } else { flare.tv.p = Vec3f(flare.pos.x, flare.pos.y, 0.001f); } switch(g_magicFlareCurrentColor) { case 0: { flare.rgb = Color3f(.4f, 0.f, .4f) + Color3f(2.f/3, 2.f/3, 2.f/3) * randomColor3f(); break; } case 1: { flare.rgb = Color3f(.5f, .5f, 0.f) + Color3f(.625f, .625f, .55f) * randomColor3f(); break; } case 2: { flare.rgb = Color3f(.4f, 0.f, 0.f) + Color3f(2.f/3, .55f, .55f) * randomColor3f(); break; } } static const float FLARE_MUL = 2.f; if(typ == -1) { float zz = eeMousePressed1() ? 0.29f : ((sm > 0.5f) ? Random::getf() : 1.f); if(zz < 0.2f) { flare.type = 2; flare.size = Random::getf(42.f, 84.f); flare.tolive = Random::getf(800.f, 1600.f) * FLARE_MUL; } else if(zz < 0.5f) { flare.type = 3; flare.size = Random::getf(16.f, 68.f); flare.tolive = Random::getf(800.f, 1600.f) * FLARE_MUL; } else { flare.type = 1; flare.size = Random::getf(32.f, 56.f) * sm; flare.tolive = Random::getf(1700.f, 2200.f) * FLARE_MUL; } } else { flare.type = (Random::getf() > 0.8f) ? 1 : 4; flare.size = Random::getf(64.f, 102.f) * sm; flare.tolive = Random::getf(1700.f, 2200.f) * FLARE_MUL; } flare.dynlight = LightHandle(); for(unsigned int kk = 0; kk < 3; kk++) { if(Random::getf() < 0.5f) { continue; } PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } if(!bookDraw) { pd->m_flags = FADE_IN_AND_OUT | ROTATING | DISSIPATING; if(!io) { pd->m_flags |= PARTICLE_NOZBUFFER; } } else { pd->m_flags = FADE_IN_AND_OUT; } pd->ov = flare.v.p + randomVec(-5.f, 5.f); pd->move = Vec3f(0.f, 5.f, 0.f); pd->scale = Vec3f(-2.f); pd->tolive = 1300 + kk * 100 + Random::getu(0, 800); pd->tc = fire2; if(kk == 1) { pd->move.y = 4.f; pd->siz = 1.5f; } else { pd->siz = Random::getf(1.f, 2.f); } pd->rgb = Color3f(flare.rgb.r * (2.f/3), flare.rgb.g * (2.f/3), flare.rgb.b * (2.f/3)); pd->m_rotation = 1.2f; if(bookDraw) pd->is2D = true; } }
void AddFlare(const Vec2s & pos, float sm, short typ, Entity * io, bool bookDraw) { int oldest = 0; size_t i; for(i = 0; i < MAX_FLARES; i++) { if(!magicFlares[i].exist) { break; } if(magicFlares[i].tolive < magicFlares[oldest].tolive) { oldest = i; } } if(i >= MAX_FLARES) { removeFlare(magicFlares[oldest]); i = oldest; } FLARES * fl = &magicFlares[i]; fl->exist = 1; flarenum++; if(!bookDraw) fl->bDrawBitmap = 0; else fl->bDrawBitmap = 1; fl->io = io; if(io) { fl->flags = 1; io->flarecount++; } else { fl->flags = 0; } fl->pos.x = float(pos.x) - rnd() * 4.f; fl->pos.y = float(pos.y) - rnd() * 4.f - 50.f; fl->tv.rhw = fl->v.rhw = 1.f; if(!bookDraw) { EERIE_CAMERA ka = *Kam; ka.angle = Anglef(360.f, 360.f, 360.f) - ka.angle; EERIE_CAMERA * oldcam = ACTIVECAM; SetActiveCamera(&ka); PrepareCamera(&ka, g_size); fl->v.p += ka.orgTrans.pos; EE_RTP(fl->tv.p, &fl->v); fl->v.p += ka.orgTrans.pos; float vx = -(fl->pos.x - subj.center.x) * 0.2173913f; float vy = (fl->pos.y - subj.center.y) * 0.1515151515151515f; if(io) { fl->v.p = io->pos; fl->v.p += angleToVectorXZ(io->angle.getPitch() + vx) * 100.f; fl->v.p.y += std::sin(glm::radians(MAKEANGLE(io->angle.getYaw() + vy))) * 100.f - 150.f; } else { fl->v.p.x = 1.0f * float(pos.x - (g_size.width() / 2)) * 156.f / (640.f * g_sizeRatio.y); fl->v.p.y = 0.75f * float(pos.y - (g_size.height() / 2)) * 156.f / (480.f * g_sizeRatio.y); fl->v.p.z = 75.f; ka = *oldcam; SetActiveCamera(&ka); PrepareCamera(&ka, g_size); float temp = (fl->v.p.y * -ka.orgTrans.xsin) + (fl->v.p.z * ka.orgTrans.xcos); fl->v.p.y = (fl->v.p.y * ka.orgTrans.xcos) - (-fl->v.p.z * ka.orgTrans.xsin); fl->v.p.z = (temp * ka.orgTrans.ycos) - (-fl->v.p.x * ka.orgTrans.ysin); fl->v.p.x = (temp * -ka.orgTrans.ysin) + (fl->v.p.x * ka.orgTrans.ycos); fl->v.p += oldcam->orgTrans.pos; } fl->tv.p = fl->v.p; SetActiveCamera(oldcam); PrepareCamera(oldcam, g_size); } else { fl->tv.p = Vec3f(fl->pos.x, fl->pos.y, 0.001f); } switch(PIPOrgb) { case 0: { fl->rgb = Color3f(.4f, 0.f, .4f) + Color3f(2.f/3, 2.f/3, 2.f/3) * randomColor3f(); break; } case 1: { fl->rgb = Color3f(.5f, .5f, 0.f) + Color3f(.625f, .625f, .55f) * randomColor3f(); break; } case 2: { fl->rgb = Color3f(.4f, 0.f, 0.f) + Color3f(2.f/3, .55f, .55f) * randomColor3f(); break; } } if(typ == -1) { float zz = eeMousePressed1() ? 0.29f : ((sm > 0.5f) ? rnd() : 1.f); if(zz < 0.2f) { fl->type = 2; fl->size = rnd() * 42.f + 42.f; fl->tolive = (800.f + rnd() * 800.f) * FLARE_MUL; } else if(zz < 0.5f) { fl->type = 3; fl->size = rnd() * 52.f + 16.f; fl->tolive = (800.f + rnd() * 800.f) * FLARE_MUL; } else { fl->type = 1; fl->size = (rnd() * 24.f + 32.f) * sm; fl->tolive = (1700.f + rnd() * 500.f) * FLARE_MUL; } } else { fl->type = (rnd() > 0.8f) ? 1 : 4; fl->size = (rnd() * 38.f + 64.f) * sm; fl->tolive = (1700.f + rnd() * 500.f) * FLARE_MUL; } fl->dynlight = LightHandle::Invalid; for(long kk = 0; kk < 3; kk++) { if(rnd() < 0.5f) { continue; } PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } if(!bookDraw) { pd->special = FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING; if(!io) { pd->special |= PARTICLE_NOZBUFFER; } } else { pd->special = FADE_IN_AND_OUT; } pd->ov = fl->v.p + randomVec(-5.f, 5.f); pd->move = Vec3f(0.f, 5.f, 0.f); pd->scale = Vec3f(-2.f); pd->tolive = 1300 + kk * 100 + Random::get(0, 800); pd->tc = fire2; if(kk == 1) { pd->move.y = 4.f; pd->siz = 1.5f; } else { pd->siz = 1.f + rnd(); } pd->rgb = Color3f(fl->rgb.r * (2.f/3), fl->rgb.g * (2.f/3), fl->rgb.b * (2.f/3)); pd->fparam = 1.2f; if(bookDraw) pd->is2D = true; } }
void MagicMissileSpell::Launch() { m_duration = ArxDurationMs(6000); m_hand_group = GetActionPointIdx(entities[m_caster]->obj, "primary_attach"); if(m_hand_group != ActionPoint()) { Entity * caster = entities[m_caster]; ActionPoint group = m_hand_group; m_hand_pos = actionPointPosition(caster->obj, group); } Vec3f startPos; float pitch, yaw; if(m_caster == EntityHandle_Player) { yaw = player.angle.getYaw(); pitch = player.angle.getPitch(); Vec3f vector = angleToVector(Anglef(pitch, yaw, 0.f)) * 60.f; if(m_hand_group != ActionPoint()) { startPos = m_hand_pos; } else { startPos = player.pos; startPos += angleToVectorXZ(yaw); } startPos += vector; } else { pitch = 0; yaw = entities[m_caster]->angle.getYaw(); Vec3f vector = angleToVector(Anglef(pitch, yaw, 0.f)) * 60.f; if(m_hand_group != ActionPoint()) { startPos = m_hand_pos; } else { startPos = entities[m_caster]->pos; } startPos += vector; Entity * io = entities[m_caster]; if(ValidIONum(io->targetinfo)) { const Vec3f & p1 = m_caster_pos; const Vec3f & p2 = entities[io->targetinfo]->pos; pitch = -(glm::degrees(getAngle(p1.y, p1.z, p2.y, p2.z + glm::distance(Vec2f(p2.x, p2.z), Vec2f(p1.x, p1.z))))); //alpha entre orgn et dest; } else if (ValidIONum(m_target)) { const Vec3f & p1 = m_caster_pos; const Vec3f & p2 = entities[m_target]->pos; pitch = -(glm::degrees(getAngle(p1.y, p1.z, p2.y, p2.z + glm::distance(Vec2f(p2.x, p2.z), Vec2f(p1.x, p1.z))))); //alpha entre orgn et dest; } } m_mrCheat = (m_caster == EntityHandle_Player && cur_mr == 3); ArxDuration lMax = ArxDuration_ZERO; long number; if(sp_max || cur_rf == 3) { number = long(m_level); } else { number = glm::clamp(long(m_level + 1) / 2, 1l, 5l); } pTab.reserve(number); for(size_t i = 0; i < size_t(number); i++) { CMagicMissile * missile = NULL; if(!m_mrCheat) { missile = new CMagicMissile(); } else { missile = new MrMagicMissileFx(); } pTab.push_back(missile); Anglef angles(pitch, yaw, 0.f); if(i > 0) { angles.setPitch(angles.getPitch() + Random::getf(-4.0f, 4.0f)); angles.setYaw(angles.getYaw() + Random::getf(-6.0f, 6.0f)); } missile->Create(startPos, angles); ArxDuration lTime = m_duration + ArxDurationMs(Random::get(-1000, 1000)); lTime = std::max(ArxDurationMs(1000), lTime); lMax = std::max(lMax, lTime); missile->SetDuration(lTime); EERIE_LIGHT * el = dynLightCreate(missile->lLightId); if(el) { el->intensity = 0.7f + 2.3f; el->fallend = 190.f; el->fallstart = 80.f; if(m_mrCheat) { el->rgb = Color3f(1.f, 0.3f, 0.8f); } else { el->rgb = Color3f(0.f, 0.f, 1.f); } el->pos = startPos; el->duration = ArxDurationMs(300); } } m_duration = lMax + ArxDurationMs(1000); }
void AddFlare(const Vec2s & pos, float sm, short typ, Entity * io, bool bookDraw) { long i; for(i = 0; i < MAX_FLARES; i++) { if(!magicFlares[i].exist) { break; } } if(i >= MAX_FLARES) { return; } FLARES * fl = &magicFlares[i]; fl->exist = 1; flarenum++; if(!bookDraw) fl->bDrawBitmap = 0; else fl->bDrawBitmap = 1; fl->io = io; if(io) { fl->flags = 1; io->flarecount++; } else { fl->flags = 0; } fl->x = float(pos.x) - rnd() * 4.f; fl->y = float(pos.y) - rnd() * 4.f - 50.f; fl->tv.rhw = fl->v.rhw = 1.f; fl->tv.specular = fl->v.specular = 1; if(!bookDraw) { EERIE_CAMERA ka = *Kam; ka.angle = Anglef(360.f, 360.f, 360.f) - ka.angle; EERIE_CAMERA * oldcam = ACTIVECAM; SetActiveCamera(&ka); PrepareCamera(&ka); fl->v.p += ka.orgTrans.pos; EE_RTP(&fl->tv, &fl->v); fl->v.p += ka.orgTrans.pos; float vx = -(fl->x - subj.center.x) * 0.2173913f; float vy = (fl->y - subj.center.y) * 0.1515151515151515f; if(io) { fl->v.p.x = io->pos.x - EEsin(radians(MAKEANGLE(io->angle.getPitch() + vx))) * 100.f; fl->v.p.y = io->pos.y + EEsin(radians(MAKEANGLE(io->angle.getYaw() + vy))) * 100.f - 150.f; fl->v.p.z = io->pos.z + EEcos(radians(MAKEANGLE(io->angle.getPitch() + vx))) * 100.f; } else { fl->v.p.x = float(pos.x - (g_size.width() / 2)) * 150.f / float(g_size.width()); fl->v.p.y = float(pos.y - (g_size.height() / 2)) * 150.f / float(g_size.width()); fl->v.p.z = 75.f; ka = *oldcam; SetActiveCamera(&ka); PrepareCamera(&ka); float temp = (fl->v.p.y * -ka.orgTrans.xsin) + (fl->v.p.z * ka.orgTrans.xcos); fl->v.p.y = (fl->v.p.y * ka.orgTrans.xcos) - (-fl->v.p.z * ka.orgTrans.xsin); fl->v.p.z = (temp * ka.orgTrans.ycos) - (-fl->v.p.x * ka.orgTrans.ysin); fl->v.p.x = (temp * -ka.orgTrans.ysin) + (fl->v.p.x * ka.orgTrans.ycos); fl->v.p += oldcam->orgTrans.pos; } fl->tv.p = fl->v.p; SetActiveCamera(oldcam); PrepareCamera(oldcam); } else { fl->tv.p = Vec3f(fl->x, fl->y, 0.001f); } switch(PIPOrgb) { case 0: { fl->rgb = Color3f(rnd() * (2.f/3) + .4f, rnd() * (2.f/3), rnd() * (2.f/3) + .4f); break; } case 1: { fl->rgb = Color3f(rnd() * .625f + .5f, rnd() * .625f + .5f, rnd() * .55f); break; } case 2: { fl->rgb = Color3f(rnd() * (2.f/3) + .4f, rnd() * .55f, rnd() * .55f); break; } } if(typ == -1) { float zz = (EERIEMouseButton & 1) ? 0.29f : ((sm > 0.5f) ? rnd() : 1.f); if(zz < 0.2f) { fl->type = 2; fl->size = rnd() * 42.f + 42.f; fl->tolive = (800.f + rnd() * 800.f) * FLARE_MUL; } else if(zz < 0.5f) { fl->type = 3; fl->size = rnd() * 52.f + 16.f; fl->tolive = (800.f + rnd() * 800.f) * FLARE_MUL; } else { fl->type = 1; fl->size = (rnd() * 24.f + 32.f) * sm; fl->tolive = (1700.f + rnd() * 500.f) * FLARE_MUL; } } else { fl->type = (rnd() > 0.8f) ? 1 : 4; fl->size = (rnd() * 38.f + 64.f) * sm; fl->tolive = (1700.f + rnd() * 500.f) * FLARE_MUL; } fl->dynlight = -1; fl->move = OPIPOrgb; for(long kk = 0; kk < 3; kk++) { if(rnd() < 0.5f) { continue; } PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } if(!bookDraw) { pd->special = FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING; if(!io) { pd->special |= PARTICLE_NOZBUFFER; } } else { pd->special = FADE_IN_AND_OUT; } pd->ov = fl->v.p + randomVec(-5.f, 5.f); pd->move = Vec3f(0.f, 5.f, 0.f); pd->scale = Vec3f(-2.f); pd->tolive = 1300 + kk * 100 + Random::get(0, 800); pd->tc = fire2; if(kk == 1) { pd->move.y = 4.f; pd->siz = 1.5f; } else { pd->siz = 1.f + rnd(); } pd->rgb = Color3f(fl->rgb.r * (2.f/3), fl->rgb.g * (2.f/3), fl->rgb.b * (2.f/3)); pd->fparam = 1.2f; if(bookDraw) pd->type = PARTICLE_2D; } }
void ConfuseSpell::Update(float timeDelta) { ARX_UNUSED(timeDelta); Vec3f pos = entities[m_target]->pos; if(m_target != PlayerEntityHandle) { pos.y += entities[m_target]->physics.cyl.height - 30.f; } long idx = entities[m_target]->obj->fastaccess.head_group_origin; if(idx >= 0) { pos = entities[m_target]->obj->vertexlist3[idx].v; pos.y -= 50.f; } eCurPos = pos; RenderMaterial mat; mat.setDepthTest(false); mat.setBlendType(RenderMaterial::Additive); mat.setTexture(tex_trail); Anglef stiteangle = Anglef(0.f, -glm::degrees(arxtime.get_updated() * ( 1.0f / 500 )), 0.f); Draw3DObject(spapi, stiteangle, eCurPos, Vec3f_ONE, Color3f::white, mat); for(int i = 0; i < 6; i++) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } float ang = rnd() * 360.f; float rad = rnd() * 15.f; pd->ov = eCurPos; pd->ov += angleToVectorXZ(ang) * rad; pd->move = Vec3f(0.f, rnd() * 3.f + 1.f, 0.f); pd->siz = 0.25f; pd->tolive = Random::get(2300, 3300); pd->tc = tex_p1; pd->special = PARTICLE_GOLDRAIN | FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING; pd->fparam = 0.0000001f; Color3f baseColor = Color3f(0.4f, 0.2f, 0.4f); Color3f randomFactor = Color3f(0.4f, 0.6f, 0.4f); Color3f c = baseColor + Color3f(rnd(), rnd(), rnd()) * randomFactor; while(glm::abs(c.r - c.g) > 0.3f && glm::abs(c.g - c.b) > 0.3f) { c = baseColor + Color3f(rnd(), rnd(), rnd()) * randomFactor; } pd->rgb = c * Color3f(0.8f, 0.8f, 0.8f); } if(!lightHandleIsValid(m_light)) m_light = GetFreeDynLight(); if(lightHandleIsValid(m_light)) { EERIE_LIGHT * light = lightHandleGet(m_light); light->intensity = 1.3f; light->fallstart = 180.f; light->fallend = 420.f; light->rgb = Color3f(0.3f, 0.3f, 0.5f) + Color3f(0.2f, 0.f, 0.2f) * Color3f(rnd(), rnd(), rnd()); light->pos = eCurPos; light->duration = 200; light->extras = 0; } }
void ConfuseSpell::Update() { Vec3f pos = entities[m_target]->pos; if(m_target != PlayerEntityHandle) { pos.y += entities[m_target]->physics.cyl.height - 30.f; } long idx = entities[m_target]->obj->fastaccess.head_group_origin; if(idx >= 0) { pos = entities[m_target]->obj->vertexlist3[idx].v; pos.y -= 50.f; } eCurPos = pos; RenderMaterial mat; mat.setDepthTest(false); mat.setBlendType(RenderMaterial::Additive); mat.setTexture(tex_trail); arxtime.update(); Anglef stiteangle = Anglef(0.f, -glm::degrees(arxtime.now_f() * ( 1.0f / 500 )), 0.f); { EERIEDrawAnimQuatUpdate(spapi, animlayer, stiteangle, eCurPos, g_framedelay, NULL, false); EERIEDrawAnimQuatRender(spapi, eCurPos, NULL, 0.f); } for(int i = 0; i < 6; i++) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } Vec2f p = glm::diskRand(15.f); pd->ov = eCurPos + Vec3f(p.x, 0.f, p.y); pd->move = Vec3f(0.f, Random::getf(1.f, 4.f), 0.f); pd->siz = 0.25f; pd->tolive = Random::getu(2300, 3300); pd->tc = tex_p1; pd->special = PARTICLE_GOLDRAIN | FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING; pd->fparam = 0.0000001f; Color3f baseColor = Color3f(0.4f, 0.2f, 0.4f); Color3f randomFactor = Color3f(0.4f, 0.6f, 0.4f); Color3f c = baseColor + randomColor3f() * randomFactor; while(glm::abs(c.r - c.g) > 0.3f && glm::abs(c.g - c.b) > 0.3f) { c = baseColor + randomColor3f() * randomFactor; } pd->rgb = c * Color3f(0.8f, 0.8f, 0.8f); } if(!lightHandleIsValid(m_light)) m_light = GetFreeDynLight(); if(lightHandleIsValid(m_light)) { EERIE_LIGHT * light = lightHandleGet(m_light); light->intensity = 1.3f; light->fallstart = 180.f; light->fallend = 420.f; light->rgb = Color3f(0.3f, 0.3f, 0.5f) + Color3f(0.2f, 0.f, 0.2f) * randomColor3f(); light->pos = eCurPos; light->duration = 200; light->extras = 0; } }