X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fopengl%2Fr_playermodel.pas;h=f17be32d3e1ed99f8a1a6e9cd70761cb9ba0f0ac;hb=79b65a82e3f122c0715a55b683ef2a92eff39a29;hp=1602f23e0d2b346d9c4f10e77665ca249486657d;hpb=7f57e4b195f1a553c5bb01638cc7d9908c992c88;p=d2df-sdl.git diff --git a/src/game/opengl/r_playermodel.pas b/src/game/opengl/r_playermodel.pas index 1602f23..f17be32 100644 --- a/src/game/opengl/r_playermodel.pas +++ b/src/game/opengl/r_playermodel.pas @@ -19,8 +19,11 @@ interface uses g_playermodel; // TPlayerModel + procedure r_PlayerModel_Initialize; + procedure r_PlayerModel_Finalize; procedure r_PlayerModel_Load; procedure r_PlayerModel_Free; + procedure r_PlayerModel_Update; procedure r_PlayerModel_Draw (pm: TPlayerModel; X, Y: Integer; Alpha: Byte = 0); implementation @@ -30,7 +33,7 @@ implementation MAPDEF, utils, ImagingTypes, Imaging, ImagingUtility, r_graphics, g_options, r_animations, r_textures, - g_base, g_basic, g_map, g_weapons + g_base, g_basic, g_map, g_weapons, g_textures ; const @@ -48,6 +51,20 @@ implementation mask: DWORD; end; end; + RedFlagFrames: DWORD; + BlueFlagFrames: DWORD; + FlagAnimState: TAnimationState; + + procedure r_PlayerModel_Initialize; + begin + FlagAnimState := TAnimationState.Create(True, 8, 5); + end; + + procedure r_PlayerModel_Finalize; + begin + FlagAnimState.Free; + FlagAnimState := nil; + end; procedure ExtAnimFromBaseAnim(MName: String; AIdx: Integer); const @@ -82,6 +99,8 @@ implementation procedure r_PlayerModel_Load; var ID1, ID2: DWORD; i, a, b: Integer; prefix, aname: String; begin + g_Frames_CreateWAD(@RedFlagFrames, 'FRAMES_FLAG_RED', GameWAD + ':TEXTURES\FLAGRED', 64, 64, 5, False); + g_Frames_CreateWAD(@BlueFlagFrames, 'FRAMES_FLAG_BLUE', GameWAD + ':TEXTURES\FLAGBLUE', 64, 64, 5, False); for a := WP_FIRST + 1 to WP_LAST do begin g_Texture_CreateWAD(WeaponID[a][W_POS_NORMAL][W_ACT_NORMAL], GameWAD+':WEAPONS\'+UpperCase(WeapNames[a])); @@ -100,7 +119,7 @@ implementation prefix := PlayerModelsArray[i].FileName + ':TEXTURES\'; for b := A_STAND to A_LAST do begin - aname := PlayerModelsArray[i].Info.Name + '_RIGHTANIM' + IntToStr(b); + aname := PlayerModelsArray[i].Name + '_RIGHTANIM' + IntToStr(b); with PlayerModelsArray[i].Anim[TDirection.D_RIGHT, b] do begin if not (g_Frames_CreateWAD(@ID1, aname, prefix + Resource, 64, 64, Frames, Back) and @@ -108,7 +127,7 @@ implementation begin if b > A_LASTBASE then begin - ExtAnimFromBaseAnim(PlayerModelsArray[i].Info.Name, b); + ExtAnimFromBaseAnim(PlayerModelsArray[i].Name, b); continue end end; @@ -119,7 +138,7 @@ implementation begin if (Resource <> '') and (Mask <> '') then begin - aname := PlayerModelsArray[i].Info.Name + '_LEFTANIM' + IntToStr(b); + aname := PlayerModelsArray[i].Name + '_LEFTANIM' + IntToStr(b); g_Frames_CreateWAD(@ID1, aname, prefix + Resource, 64, 64, Frames, Back); g_Frames_CreateWAD(@ID2, aname + '_MASK', prefix + Mask, 64, 64, Frames, Back); Models[i].Frames[TDirection.D_LEFT, b].base := ID1; @@ -134,6 +153,8 @@ implementation procedure r_PlayerModel_Free; var i, a, b, c: Integer; begin + e_DeleteTexture(RedFlagFrames); + e_DeleteTexture(BlueFlagFrames); if PlayerModelsArray = nil then Exit; for i := 0 to High(PlayerModelsArray) do begin @@ -141,10 +162,10 @@ implementation begin for a := A_STAND to A_LAST do begin - g_Frames_DeleteByName(Info.Name+'_LEFTANIM'+IntToStr(a)); - g_Frames_DeleteByName(Info.Name+'_LEFTANIM'+IntToStr(a)+'_MASK'); - g_Frames_DeleteByName(Info.Name+'_RIGHTANIM'+IntToStr(a)); - g_Frames_DeleteByName(Info.Name+'_RIGHTANIM'+IntToStr(a)+'_MASK'); + g_Frames_DeleteByName(Name + '_LEFTANIM' + IntToStr(a)); + g_Frames_DeleteByName(Name + '_LEFTANIM' + IntToStr(a) + '_MASK'); + g_Frames_DeleteByName(Name + '_RIGHTANIM' + IntToStr(a)); + g_Frames_DeleteByName(Name + '_RIGHTANIM' + IntToStr(a) + '_MASK'); end; if Gibs <> nil then begin @@ -164,12 +185,18 @@ implementation e_DeleteTexture(WeaponID[a][b][c]) end; + procedure r_PlayerModel_Update; + begin + FlagAnimState.Update + end; + procedure r_PlayerModel_Draw (pm: TPlayerModel; X, Y: Integer; Alpha: Byte = 0); var Mirror: TMirrorType; pos, act: Byte; - p: TDFPoint; + fp, p: TDFPoint; FramesID: DWORD; + fa: Integer; begin // Флаги: if pm.Direction = TDirection.D_LEFT then @@ -177,14 +204,26 @@ begin else Mirror := TMirrorType.Horizontal; - if (pm.Flag <> FLAG_NONE) and (pm.FlagAnim <> nil) and (not (pm.CurrentAnimation in [A_DIE1, A_DIE2])) then + FramesID := 0; + case pm.Flag of + FLAG_RED: FramesID := RedFlagFrames; + FLAG_BLUE: FramesID := BlueFlagFrames; + end; + if (FramesID <> 0) and (not (pm.CurrentAnimation in [A_DIE1, A_DIE2])) then begin + fp := PlayerModelsArray[pm.id].FlagPoint; + fa := PlayerModelsArray[pm.id].FlagAngle; p.X := IfThen(pm.Direction = TDirection.D_LEFT, FLAG_BASEPOINT.X, 64 - FLAG_BASEPOINT.X); p.Y := FLAG_BASEPOINT.Y; - - r_Animation_DrawEx(pm.FlagAnim, X+IfThen(pm.Direction = TDirection.D_LEFT, pm.FlagPoint.X-1, 2*FLAG_BASEPOINT.X-pm.FlagPoint.X+1)-FLAG_BASEPOINT.X, - Y+pm.FlagPoint.Y-FLAG_BASEPOINT.Y+1, Mirror, p, - IfThen(pm.Direction = TDirection.D_RIGHT, pm.FlagAngle, -pm.FlagAngle)); + r_AnimationState_DrawEx( + FramesID, + FlagAnimState, + X + IfThen(pm.Direction = TDirection.D_LEFT, fp.X - 1, 2 * FLAG_BASEPOINT.X - fp.X + 1) - FLAG_BASEPOINT.X, + Y + fp.Y - FLAG_BASEPOINT.Y + 1, + Mirror, + p, + IfThen(pm.Direction = TDirection.D_RIGHT, fa, -fa) + ); end; // Оружие: @@ -193,7 +232,7 @@ begin else Mirror := TMirrorType.Horizontal; - if PlayerModelsArray[pm.id].Info.HaveWeapon and (not (pm.CurrentAnimation in [A_DIE1, A_DIE2, A_PAIN])) and (pm.CurrentWeapon in [WP_FIRST + 1..WP_LAST]) then + if PlayerModelsArray[pm.id].HaveWeapon and (not (pm.CurrentAnimation in [A_DIE1, A_DIE2, A_PAIN])) and (pm.CurrentWeapon in [WP_FIRST + 1..WP_LAST]) then begin if pm.CurrentAnimation in [A_SEEUP, A_ATTACKUP] then pos := W_POS_UP @@ -203,7 +242,7 @@ begin else pos := W_POS_NORMAL; - if (pm.CurrentAnimation in [A_ATTACK, A_ATTACKUP, A_ATTACKDOWN]) or pm.Fire then + if (pm.CurrentAnimation in [A_ATTACK, A_ATTACKUP, A_ATTACKDOWN]) or pm.GetFire() then act := W_ACT_FIRE else act := W_ACT_NORMAL;