void TriggerSetOrient (tObjTransformation *posP, short nSegment, short nSide, int bSetPos, int nStep) { CAngleVector an; CFixVector n; if (nStep <= 0) { n = *SEGMENTS [nSegment].m_sides [nSide].m_normals; n = -n; /* n [Y] = -n [Y]; n [Z] = -n [Z]; */ gameStates.gameplay.vTgtDir = n; if (nStep < 0) nStep = MAX_ORIENT_STEPS; } else n = gameStates.gameplay.vTgtDir; // turn the ship so that it is facing the destination nSide of the destination CSegment // Invert the Normal as it points into the CSegment // compute angles from the Normal an = n.ToAnglesVec (); // create new orientation matrix if (!nStep) posP->mOrient = CFixMatrix::Create (an); if (bSetPos) posP->vPos = SEGMENTS [nSegment].Center (); // rotate the ships vel vector accordingly //StopPlayerMovement (); }
int CCamera::Create (short nId, short srcSeg, short srcSide, short tgtSeg, short tgtSide, CObject *objP, int bShadowMap, int bTeleport) { CAngleVector a; #if 0 short* corners; CFixVector *pv; #endif Init (); m_info.nId = nId; m_info.bShadowMap = bShadowMap; m_info.buffer.SetWidth (Pow2ize (screen.Width () / (2 - gameOpts->render.cameras.bHires))); m_info.buffer.SetHeight (Pow2ize (screen.Height () / (2 - gameOpts->render.cameras.bHires))); m_info.buffer.SetBPP (4); //m_info.buffer.SetRowSize (max (CCanvas::Current ()->Width (), m_info.buffer.Width ())); #if RENDER2TEXTURE if (!CreateBuffer ()) #endif { #if CAMERA_READPIXELS if (!(m_info.buffer.Create (m_info.buffer.Width () * m_info.buffer.Height () * 4))) return 0; if (gameOpts->render.cameras.bFitToWall || m_info.bTeleport) m_info.screenBuf = m_info.buffer.Buffer (); else { m_info.screenBuf = new ubyte [CCanvas::Current ()->Width () * CCanvas::Current ()->Height () * 4]; if (!m_info.screenBuf) { gameOpts->render.cameras.bFitToWall = 1; m_info.screenBuf = m_info.buffer.Buffer (); } } memset (m_info.buffer.Buffer (), 0, m_info.buffer.Width () * m_info.buffer.Height () * 4); #else return 0; #endif } if (objP) { m_info.objP = objP; m_info.orient = objP->info.position.mOrient; m_info.curAngle = m_info.curDelta = 0; m_info.t0 = 0; cameraManager.SetObjectCamera (objP->Index (), nId); } else { m_info.objP = &m_info.obj; if (bTeleport) { CFixVector n = *SEGMENTS [srcSeg].m_sides [srcSide].m_normals; /* n[X] = -n[X]; n[Y] = -n[Y]; */ n.Neg (); a = n.ToAnglesVec (); } else a = SEGMENTS [srcSeg].m_sides [srcSide].m_normals [0].ToAnglesVec (); m_info.obj.info.position.mOrient = CFixMatrix::Create(a); #if 1 if (bTeleport) m_info.obj.info.position.vPos = SEGMENTS [srcSeg].Center (); else m_info.obj.info.position.vPos = SEGMENTS [srcSeg].SideCenter (srcSide); #else corners = SEGMENTS [srcSeg].Corners (srcSide); for (i = 0; i < 4; i++) { pv = gameData.segs.vertices + corners [i]; m_info.obj.info.position.p.vPos.x += pv->x; m_info.obj.info.position.p.vPos.y += pv->y; m_info.obj.info.position.p.vPos.z += pv->z; } m_info.obj.info.position.p.vPos.x /= 4; m_info.obj.info.position.p.vPos.y /= 4; m_info.obj.info.position.p.vPos.z /= 4; #endif m_info.obj.info.nSegment = srcSeg; m_info.bMirror = (tgtSeg == srcSeg) && (tgtSide == srcSide); } //m_info.obj.nSide = srcSide; m_info.nSegment = tgtSeg; m_info.nSide = tgtSide; m_info.bTeleport = (char) bTeleport; return 1; }