Cleaner version but same acuracy problem frown

main.c
Code:
#include <acknex.h>

// Material skills
#define skPosX       skill17 // X coord in map coords relative to the center of the map (centered on the screen)
#define skPosY       skill18 // Y coord...
#define skScale      skill19 // scale of the map
#define skScaleNext  skill20 // needed a map scale smooth transition variable

void main ()
{
	video_mode = 10;
	mouse_mode = 4;
	fps_max = 60;
	wait(1);
	
	BMAP *bmpMap = bmap_create ( "grid.tga" );
	BMAP *bmpScreen = bmap_createblack ( screen_size.x, screen_size.y, 24 );
	PANEL *panScreen = pan_create ( "flags=SHOW", 1 );
	panScreen->bmap = bmpScreen;
	MATERIAL *mtlCamMap = mtl_create ();
	mtlCamMap->skPosX = 0;
	mtlCamMap->skPosY = 0;
	mtlCamMap->skScale = 1;
	mtlCamMap->skScaleNext = mtlCamMap->skScale;
	
	mtlCamMap->skill1 = floatv ( bmap_width(bmpScreen) );
	mtlCamMap->skill2 = floatv ( bmap_height(bmpScreen) );
	mtlCamMap->skill3 = floatd ( 1, bmap_width(bmpMap) );
	mtlCamMap->skill4 = floatd ( 1, bmap_height(bmpMap) );
	effect_load ( mtlCamMap, "display_map.fx" );
	
	while ( !key_esc )
	{
		if ( mouse_left )
		{
			mtlCamMap->skPosX -= mickey.x / mtlCamMap->skScale;
			mtlCamMap->skPosY -= mickey.y / mtlCamMap->skScale;
		}
		if ( mickey.z > 0 )
		{
			mtlCamMap->skScaleNext = minv ( mtlCamMap->skScaleNext * 1.414, 2 ); // 1.414 ~= sqrt(2)
		}
		if ( mickey.z < 0 )
		{
			mtlCamMap->skScaleNext = maxv ( mtlCamMap->skScaleNext / 1.414, 0.25 );
		}
		var nTemp = ( mtlCamMap->skScaleNext - mtlCamMap->skScale ) * time_step * 0.75;
		if ( nTemp )
			mtlCamMap->skScale += nTemp;
		else
			mtlCamMap->skScale = mtlCamMap->skScaleNext;
		
		mtlCamMap->skill5 = floatv ( mtlCamMap->skPosX );
		mtlCamMap->skill6 = floatv ( mtlCamMap->skPosY );
		mtlCamMap->skill7 = floatd ( 1, mtlCamMap->skScale );
		bmap_process ( bmpScreen, bmpMap, mtlCamMap );
		
		wait(1);
	}
	
	mtl_remove ( mtlCamMap );
	pan_remove ( panScreen );
	bmap_remove ( bmpScreen );
	bmap_remove ( bmpMap );
	
	sys_exit ( NULL );
}



display_map.fx
Code:
float4 vecSkill1;
float4 vecSkill5;
texture TargetMap;
sampler ColorSampler = sampler_state { 
	Texture=<TargetMap>; 
	MipFilter=Linear; MinFilter=Linear; MagFilter=Linear; 
	AddressU=Border; AddressV=Border; 
	BorderColor=0xFF000000; }; // ARGB format

float2 fOffset3x3[9] = { -0.5,-0.5, 0,-0.5, 0.5,-0.5, -0.5,0, 0,0, 0.5,0, -0.5,0.5, 0,0.5, 0.5,0.5 };
float fGauss3x3[9] = { 0.0625, 0.125, 0.0625, 0.125, 0.25, 0.125, 0.0625, 0.125, 0.0625 };

float4 PS ( in float2 inTex: TEXCOORD0 ) : COLOR0
{
	inTex.xy -= 0.5f;
	inTex.xy *= vecSkill1.xy;
	inTex.xy *= vecSkill5.z;
	inTex.xy += vecSkill5.xy;
	inTex.xy *= vecSkill1.zw;
	inTex.xy += 0.5f;
	float4 Color = 0;
	for ( int i=0; i<9; i+=1 )
		Color.rgb += tex2D ( ColorSampler, inTex + fOffset3x3[i] * vecSkill1.zw * vecSkill5.z ).rgb * fGauss3x3[i];
	Color.a = 1.0f;
	return Color;
}

technique
{
	pass
	{
		VertexShader = null;
		PixelShader  = compile ps_2_0 PS();
	}
}



Salud!