X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_gfx.pas;h=567fb5f5d6e66ff87e9cba272861948e65650cc9;hb=438f611326a5ace6bd38c9e38399a7712f752425;hp=52c3b24890adb90e6ab452556ad93b65f220a654;hpb=fd12a344c25480e0db011c3084804df3f98d005c;p=d2df-sdl.git diff --git a/src/game/g_gfx.pas b/src/game/g_gfx.pas index 52c3b24..567fb5f 100644 --- a/src/game/g_gfx.pas +++ b/src/game/g_gfx.pas @@ -1,4 +1,4 @@ -(* Copyright (C) DooM 2D:Forever Developers +(* Copyright (C) Doom 2D: Forever Developers * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,6 +26,8 @@ uses const BLOOD_NORMAL = 0; BLOOD_SPARKS = 1; + BLOOD_CSPARKS = 2; + BLOOD_COMBINE = 3; ONCEANIM_NONE = 0; ONCEANIM_SMOKE = 1; @@ -78,7 +80,8 @@ function awmIsSetHolmes (x, y: Integer): Boolean; inline; implementation uses - g_map, g_panel, g_basic, Math, e_graphics, GL, GLExt, + {$INCLUDE ../nogl/noGLuses.inc} + g_map, g_panel, g_basic, Math, e_graphics, g_options, g_console, SysUtils, g_triggers, MAPDEF, g_game, g_language, g_net, utils, xprofiler; @@ -107,7 +110,7 @@ type particleType: TPartType; red, green, blue: Byte; alpha: Byte; - time, liveTime: Word; + time, liveTime, waitTime: Word; stickDX: Integer; // STATE_STICK: -1,1: stuck to a wall; 0: stuck to ceiling justSticked: Boolean; // not used floorY: Integer; // actually, floor-1; `Unknown`: unknown @@ -527,7 +530,7 @@ procedure TParticle.thinkerBloodAndWater (); ex: Integer; begin state := TPartState.Stuck; - if (dX > 0) then stickDX := 1 else stickDX := -1; + if (dx > 0) then stickDX := 1 else stickDX := -1; freeze(); // find next floor transition findFloor(); @@ -587,7 +590,7 @@ label _done, _gravityagain, _stuckagain; var pan: TPanel; - dX, dY: SmallInt; + dx, dy: SmallInt; ex, ey: Integer; checkEnv: Boolean; floorJustTraced: Boolean; @@ -595,7 +598,7 @@ var oldFloorY: Integer; {$ENDIF} begin - if not gpart_dbg_phys_enabled then goto _done; + if not gpart_dbg_phys_enabled then begin x += round(velX); y += round(velY); goto _done; end; if gAdvBlood then begin @@ -682,8 +685,8 @@ begin end; // it is important to have it here - dX := round(velX); - dY := round(velY); + dx := round(velX); + dy := round(velY); if (state = TPartState.Normal) then checkAirStreams(); @@ -730,10 +733,10 @@ begin end; // trace movement - if (dX <> 0) then + if (dx <> 0) then begin // has some horizontal velocity - pan := g_Map_traceToNearest(x, y, x+dX, y+dY, GridTagObstacle, @ex, @ey); + pan := g_Map_traceToNearest(x, y, x+dx, y+dy, GridTagObstacle, @ex, @ey); checkEnv := (x <> ex); x := ex; y := ey; @@ -750,11 +753,11 @@ begin // we stuck // the only case when we can have both ceiling and wall is corner; stick to wall in this case // check if we stuck to a wall - if (dX < 0) then dX := -1 else dX := 1; - if (g_Map_PanelAtPoint(x+dX, y, GridTagObstacle) <> nil) then + if (dx < 0) then dx := -1 else dx := 1; + if (g_Map_PanelAtPoint(x+dx, y, GridTagObstacle) <> nil) then begin // stuck to a wall - stickToWall(dX); + stickToWall(dx); end else begin @@ -763,31 +766,31 @@ begin end; end; end - else if (dY <> 0) then + else if (dy <> 0) then begin // has only vertical velocity - if (dY < 0) then + if (dy < 0) then begin // flying up if (ceilingY = Unknown) then findCeiling(); // need to do this anyway - y += dY; + y += dy; if (y <= ceilingY) then begin y := ceilingY; stickToCeiling(); end; // oops, hit a ceiling // environment didn't changed end else begin - while (dY > 0) do + while (dy > 0) do begin // falling down floorJustTraced := (floorY = Unknown); if floorJustTraced then findFloor(); if (floorType = TFloorType.LiquidOut) then env := TEnvType.ELiquid else env := TEnvType.EAir; - y += dY; + y += dy; //e_LogWritefln('floorY=%s; newy=%s; dY=%s; floorType=%s', [floorY, y, dY, floorType]); if (y >= floorY) then begin // floor transition - dY := y-floorY; + dy := y-floorY; y := floorY; //e_LogWritefln(' HIT FLOORY: floorY=%s; newy=%s; dY=%s; floorType=%s', [floorY, y, dY, floorType]); case floorType of @@ -845,10 +848,10 @@ begin else begin // simple blood - dX := round(velX); - dY := round(velY); - y += dY; - x += dX; + dx := round(velX); + dy := round(velY); + y += dy; + x += dx; if (g_Map_PanelAtPoint(x, y, GridTagObstacle) <> nil) then begin die(); exit; end; end; @@ -863,7 +866,10 @@ _done: begin if (env = TEnvType.ELiquid) then begin - time += 1; + if waitTime > 0 then + waitTime -= 1 + else + time += 1; if (liveTime <= 0) then begin die(); exit; end; ex := 255-trunc(255.0*time/liveTime); if (ex <= 10) then begin die(); exit; end; @@ -875,7 +881,10 @@ _done: begin // water will disappear in any liquid if (env = TEnvType.ELiquid) then begin die(); exit; end; - time += 1; + if waitTime > 0 then + waitTime -= 1 + else + time += 1; // dry water if (liveTime <= 0) then begin die(); exit; end; ex := 255-trunc(255.0*time/liveTime); @@ -920,6 +929,11 @@ begin begin g_GFX_SparkVel(fX, fY, 2+Random(2), -vx div 2, -vy div 2, devX, devY); exit; + end + else if (kind = BLOOD_CSPARKS) OR (kind = BLOOD_COMBINE) then + begin + g_GFX_SparkVel(fX, fY, count, -vx div 2, -vy div 2, devX, devY); + if kind <> BLOOD_COMBINE then exit end; l := Length(Particles); @@ -976,6 +990,7 @@ begin state := TPartState.Normal; time := 0; liveTime := 120+Random(40); + waitTime := 20; floorY := Unknown; ceilingY := Unknown; end; @@ -1102,6 +1117,7 @@ begin state := TPartState.Normal; time := 0; liveTime := 60+Random(60); + waitTime := 120; floorY := Unknown; ceilingY := Unknown; end; @@ -1120,14 +1136,14 @@ end; // ////////////////////////////////////////////////////////////////////////// // procedure TParticle.thinkerBubble (); var - dY: Integer; + dy: Integer; begin - dY := round(velY); + dy := round(velY); - if (dY <> 0) then + if (dy <> 0) then begin - y += dY; - if (dY < 0) then + y += dy; + if (dy < 0) then begin if (y <= ceilingY) then begin die(); exit; end; end @@ -1140,7 +1156,10 @@ begin if (velY > -4) then velY += accelY; - time += 1; + if waitTime > 0 then + waitTime -= 1 + else + time += 1; end; @@ -1186,14 +1205,14 @@ begin // tracer will return `false` if we started outside of the liquid {$IF DEFINED(D2F_DEBUG_BUBBLES)} - stt := curTimeMicro(); + stt := getTimeMicro(); ptr := mapGrid.traceOrthoRayWhileIn(liquidx, liquidTopY, x, y, x, 0, GridTagWater or GridTagAcid1 or GridTagAcid2); - stt := curTimeMicro()-stt; + stt := getTimeMicro()-stt; e_LogWritefln('traceOrthoRayWhileIn: time=%s (%s); liquidTopY=%s', [Integer(stt), ptr, liquidTopY]); // - stt := curTimeMicro(); + stt := getTimeMicro(); nptr := g_Map_TraceLiquidNonPrecise(x, y, 0, -8, liquidx, liquidTopY); - stt := curTimeMicro()-stt; + stt := getTimeMicro()-stt; e_LogWritefln('g_Map_TraceLiquidNonPrecise: time=%s (%s); liquidTopY=%s', [Integer(stt), nptr, liquidTopY]); if not nptr then continue; {$ELSE} @@ -1215,6 +1234,7 @@ begin particleType := TPartType.Bubbles; time := 0; liveTime := 65535; + waitTime := 0; end; if (CurrentParticle >= MaxParticles-1) then CurrentParticle := 0 else CurrentParticle += 1; @@ -1227,14 +1247,16 @@ procedure TParticle.thinkerSpark (); label _done; var - dX, dY: SmallInt; + dx, dy: SmallInt; pan: TPanel; ex, ey: Integer; begin - if not gpart_dbg_phys_enabled then goto _done; + if not gpart_dbg_phys_enabled then begin x += round(velX); y += round(velY); goto _done; end; - dX := round(velX); - dY := round(velY); + dx := round(velX); + dy := round(velY); + + //writeln('spark0: pos=(', x, ',', y, '); delta=(', dx, ',', dy, '); state=', state, '; ceilingY=', ceilingY, '; floorY=', floorY); // apply gravity if (abs(velX) < 0.1) and (abs(velY) < 0.1) then @@ -1244,10 +1266,10 @@ begin end; // flying - if (dX <> 0) then + if (dx <> 0) then begin // has some horizontal velocity - pan := g_Map_traceToNearest(x, y, x+dX, y+dY, (GridTagObstacle or GridTagLiquid), @ex, @ey); + pan := g_Map_traceToNearest(x, y, x+dx, y+dy, (GridTagObstacle or GridTagLiquid), @ex, @ey); if (x <> ex) then begin floorY := Unknown; ceilingY := Unknown; end; // dunno yet x := ex; y := ey; @@ -1259,14 +1281,14 @@ begin accelX := 0; end; end - else if (dY <> 0) then + else if (dy <> 0) then begin // has some vertical velocity - if (dY < 0) then + if (dy < 0) then begin // flying up if (ceilingY = Unknown) then findCeiling(); // need to do this anyway - y += dY; + y += dy; if (y <= ceilingY) then begin // oops, hit a ceiling @@ -1280,7 +1302,7 @@ begin begin // falling down if (floorY = Unknown) then findFloor(); // need to do this anyway - y += dY; + y += dy; if (y >= floorY) then begin // hit something except a floor? @@ -1304,7 +1326,12 @@ _done: velY += accelY; end; - time += 1; + //writeln('spark1: pos=(', x, ',', y, '); delta=(', velX:6:3, ',', velY:6:3, '); state=', state, '; ceilingY=', ceilingY, '; floorY=', floorY); + + if waitTime > 0 then + waitTime -= 1 + else + time += 1; end; @@ -1371,6 +1398,7 @@ begin state := TPartState.Normal; time := 0; liveTime := 30+Random(60); + waitTime := 0; floorY := Unknown; ceilingY := Unknown; end; @@ -1446,6 +1474,7 @@ begin state := TPartState.Normal; time := 0; liveTime := 30+Random(60); + waitTime := 0; floorY := Unknown; ceilingY := Unknown; end; @@ -1615,19 +1644,60 @@ end; procedure g_GFX_Draw (); -var - a, len: Integer; + var + a, len: Integer; +{$IFDEF USE_NANOGL} + type + Vertex = record + x, y: GLfloat; + r, g, b, a: GLfloat; + end; + var + count: Integer; + v: array of Vertex; +{$ENDIF} begin if not gpart_dbg_enabled then exit; if (Particles <> nil) then begin glDisable(GL_TEXTURE_2D); - glPointSize(2); + if (g_dbg_scale < 0.6) then glPointSize(1) + else if (g_dbg_scale > 1.3) then glPointSize(g_dbg_scale+1) + else glPointSize(2); + glDisable(GL_POINT_SMOOTH); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +{$IFDEF USE_NANOGL} + count := 0; + SetLength(v, Length(Particles)); + for a := 0 to High(Particles) do + begin + with Particles[a] do + begin + if alive and (x >= sX) and (y >= sY) and (x <= sX + sWidth) and (sY <= sY + sHeight) then + begin + v[count].x := x + 0.37; + v[count].y := y + 0.37; + v[count].r := red / 255; + v[count].g := green / 255; + v[count].b := blue / 255; + v[count].a := alpha / 255; + Inc(count); + end; + end; + end; + + glVertexPointer(2, GL_FLOAT, SizeOf(Vertex), @v[0].x); + glColorPointer(4, GL_FLOAT, SizeOf(Vertex), @v[0].r); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDrawArrays(GL_POINTS, 0, count); +{$ELSE} glBegin(GL_POINTS); len := High(Particles); @@ -1645,6 +1715,7 @@ begin end; glEnd(); +{$ENDIF} glDisable(GL_BLEND); end; @@ -1656,7 +1727,7 @@ begin begin if (OnceAnims[a].Animation <> nil) then begin - with OnceAnims[a] do Animation.Draw(x, y, M_NONE); + with OnceAnims[a] do Animation.Draw(x, y, TMirrorType.None); end; end; end;