diff --git a/language.version b/language.version index d38a94aac..735d3de14 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw1.2pre r99 \cu(Wed 29 Dec 13:57:43 CET 2021)\c-"; -SWWM_SHORTVER="\cw1.2pre r99 \cu(2021-12-29 13:57:43)\c-"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw1.2pre r100 \cu(Wed 29 Dec 21:41:34 CET 2021)\c-"; +SWWM_SHORTVER="\cw1.2pre r100 \cu(2021-12-29 21:41:34)\c-"; diff --git a/shaders/glsl/Fuzz.fp b/shaders/glsl/Fuzz.fp index 35ad5e131..34bbf7828 100644 --- a/shaders/glsl/Fuzz.fp +++ b/shaders/glsl/Fuzz.fp @@ -36,6 +36,10 @@ float[]( 3. ); +#ifndef BASE_RES +#define BASE_RES vec2(640.,400.) +#endif + void SetupMaterial( inout Material mat ) { vec2 coord; diff --git a/zscript/hud/swwm_hud.zsc b/zscript/hud/swwm_hud.zsc index 81c7f5005..cc4890dce 100644 --- a/zscript/hud/swwm_hud.zsc +++ b/zscript/hud/swwm_hud.zsc @@ -66,6 +66,7 @@ Class SWWMStatusBar : BaseStatusBar SWWMWeaponTooltip ctip; + transient ThinkerIterator mi; // for map markers double minimapzoom, oldminimapzoom; // minimap constants const CLIPDIST = 800; // clip distance for minimap view, with rotation accounted @@ -1881,6 +1882,99 @@ Class SWWMStatusBar : BaseStatusBar else Screen.DrawThickLine(int(rv1.x),int(rv1.y),int(rv2.x),int(rv2.y),max(1.,hs*.5),col); } } + private void DrawMapMarkers( Vector2 basepos ) + { + double zoomlevel = oldminimapzoom*(1.-FracTic)+minimapzoom*FracTic; + double zoomview = MAPVIEWDIST*zoomlevel, zoomclip = CLIPDIST*zoomlevel; + Vector2 cpos = players[consoleplayer].Camera.prev.xy*(1.-FracTic)+players[consoleplayer].Camera.pos.xy*FracTic; + Sector csec = players[consoleplayer].Camera.CurSector; + if ( !mi ) mi = ThinkerIterator.Create("MapMarker",Thinker.STAT_MAPMARKER); + else mi.Reinit(); + MapMarker m; + while ( m = MapMarker(mi.Next()) ) + { + if ( m.bDORMANT ) continue; + if ( m.args[1] && !(m.CurSector.moreflags&Sector.SECMF_DRAWN) ) continue; + TextureID tx; + if ( m.picnum.IsValid() ) tx = m.picnum; + else tx = m.CurState.GetSpriteTexture(1); + Vector2 sz = TexMan.GetScaledSize(tx); + Vector2 scl; + // seems to match automap scaling somewhat + if ( m.Args[2] ) scl = (m.Scale/zoomlevel)*.15; + else scl = m.Scale*.5; + sz.x *= scl.x; + sz.y *= scl.y; + double radius = max(sz.x,sz.y); // naive, I know + if ( m.args[0] ) + { + // oh bother, this will be dicks + let ai = level.CreateActorIterator(m.args[0]); + Actor a; + while ( a = ai.Next() ) + { + Vector2 rv = a.pos.xy-cpos; + bool isportal = false; + if ( swwm_mm_portaloverlay ) + { + Sector sec = level.PointInSector(a.pos.xy); + if ( sec.portalgroup != csec.portalgroup ) + { + isportal = true; + // portal displacement + rv -= SWWMUtility.PortalDisplacement(csec,sec); + } + } + if ( min(abs(rv.x)-radius,abs(rv.y)-radius) > zoomview ) + continue; + // flip Y + rv.y *= -1; + // rotate by view + rv = Actor.RotateVector(rv,ViewRot.x-90); + // scale to minimap frame + rv *= (HALFMAPSIZE/zoomclip)*hs; + // offset to minimap center + rv += basepos; + // draw + int clipleft = int((basepos.x-HALFMAPSIZE)*hs); + int cliptop = int((basepos.y-HALFMAPSIZE)*hs); + int clipright = int(clipleft+HALFMAPSIZE*2*hs); + int clipbottom = int(cliptop+HALFMAPSIZE*2*hs); + Screen.DrawTexture(tx,false,rv.x,rv.y,DTA_ColorOverlay,isportal?Color(128,mm_portalcolor.r,mm_portalcolor.g,mm_portalcolor.b):Color(0,0,0,0),DTA_ScaleX,hs*scl.x,DTA_ScaleY,hs*scl.y,DTA_LegacyRenderStyle,m.GetRenderStyle(),DTA_Alpha,m.Alpha,DTA_FillColor,m.FillColor,DTA_TranslationIndex,m.Translation,DTA_ClipLeft,clipleft,DTA_ClipTop,cliptop,DTA_ClipRight,clipright,DTA_ClipBottom,clipbottom); + } + ai.Destroy(); + continue; + } + Vector2 rv = m.pos.xy-cpos; + bool isportal = false; + if ( swwm_mm_portaloverlay ) + { + Sector sec = level.PointInSector(m.pos.xy); + if ( sec.portalgroup != csec.portalgroup ) + { + isportal = true; + // portal displacement + rv -= SWWMUtility.PortalDisplacement(csec,sec); + } + } + if ( min(abs(rv.x)-radius,abs(rv.y)-radius) > zoomview ) + continue; + // flip Y + rv.y *= -1; + // rotate by view + rv = Actor.RotateVector(rv,ViewRot.x-90); + // scale to minimap frame + rv *= (HALFMAPSIZE/zoomclip)*hs; + // offset to minimap center + rv += basepos; + // draw + int clipleft = int(basepos.x-HALFMAPSIZE*hs); + int cliptop = int(basepos.y-HALFMAPSIZE*hs); + int clipright = int(clipleft+HALFMAPSIZE*2*hs); + int clipbottom = int(cliptop+HALFMAPSIZE*2*hs); + Screen.DrawTexture(tx,false,rv.x,rv.y,DTA_ColorOverlay,isportal?Color(128,mm_portalcolor.r,mm_portalcolor.g,mm_portalcolor.b):Color(0,0,0,0),DTA_ScaleX,hs*scl.x,DTA_ScaleY,hs*scl.y,DTA_LegacyRenderStyle,m.GetRenderStyle(),DTA_Alpha,m.Alpha,DTA_FillColor,m.FillColor,DTA_TranslationIndex,m.Translation,DTA_ClipLeft,clipleft,DTA_ClipTop,cliptop,DTA_ClipRight,clipright,DTA_ClipBottom,clipbottom); + } + } private void DrawMapThings( Vector2 basepos ) { bool thesight = !!CPlayer.mo.FindInventory("Omnisight"); @@ -2052,6 +2146,7 @@ Class SWWMStatusBar : BaseStatusBar if ( swwm_mm_grid ) DrawMapGrid(basemappos*hs); DrawMapLines(basemappos*hs); DrawMapThings(basemappos*hs); + DrawMapMarkers(basemappos*hs); // finally, draw the player arrow Vector2 tv[3]; tv[0] = (0,-4);