package clientdata.visitors.terrain.layers; import org.apache.mina.core.buffer.IoBuffer; import clientdata.visitors.TerrainVisitor; import clientdata.visitors.terrain.TargaBitmap; /* double __userpurge sub_6A08D0<st0>(int a1<ecx>, int a2<esi>, float a3, int a4, int a5, int a6, float a7) { int v7; // ebp@1 int v8; // ST0C_4@1 float v9; // eax@1 float v11; // edx@3 signed int v12; // ebx@3 int v13; // esi@3 double v14; // st7@3 double v15; // st7@3 float *v16; // eax@7 double v17; // st7@9 float *v18; // eax@9 signed int v19; // ebp@11 float *v20; // eax@11 float *v21; // eax@13 int v22; // edi@15 int v23; // eax@15 int v24; // ecx@15 int v25; // esi@15 int v26; // edx@15 int v27; // eax@15 unsigned __int8 v28; // bl@15 double v29; // st7@15 double v30; // st6@15 double v31; // st4@15 double v32; // st5@15 double v33; // qt0@15 double v34; // st7@15 double v35; // st7@19 int v36; // [sp+8h] [bp-3Ch]@3 signed int v37; // [sp+18h] [bp-2Ch]@7 float v38; // [sp+1Ch] [bp-28h]@9 float v39; // [sp+20h] [bp-24h]@7 int v40; // [sp+24h] [bp-20h]@3 float v41; // [sp+28h] [bp-1Ch]@1 float v42; // [sp+2Ch] [bp-18h]@11 int v43; // [sp+30h] [bp-14h]@1 float v44; // [sp+3Ch] [bp-8h]@3 float v45; // [sp+40h] [bp-4h]@3 v7 = a1; v8 = *(_DWORD *)(a1 + 28); v43 = a1; LODWORD(v9) = sub_677750(v8); v41 = v9; if ( !LODWORD(v9) ) return 1.0; LODWORD(v11) = *LODWORD(v9); v12 = *(_DWORD *)(LODWORD(v9) + 16); v36 = a2; v13 = *(_DWORD *)(LODWORD(v9) + 4); v44 = *(float *)(v7 + 48) - *(float *)(v7 + 40); v14 = *(float *)(v7 + 52); a7 = v11; v15 = v14 - *(float *)(v7 + 44); v40 = v13; v45 = v15; if ( 0.0 == v44 ) DebugFatal("FilterBitmap::isWithin: rect.x1 is 0.0f", v36); if ( 0.0 == v45 ) DebugFatal("FilterBitmap::isWithin: rect.y1 is 0.0f", v36); v39 = (double)SLODWORD(a7); *(float *)&v37 = v39 - 1.0; a3 = v39 * (a3 - *(float *)(v7 + 40)) / v44; v16 = (float *)&v37; if ( a3 <= (double)*(float *)&v37 ) v16 = &a3; v38 = *v16; a3 = (double)v40; v17 = a3; a3 = a3 - 1.0; *(float *)&a4 = v17 * (*(float *)&a4 - *(float *)(v7 + 44)) / v45; v18 = &a3; if ( *(float *)&a4 <= (double)a3 ) v18 = (float *)&a4; v39 = *v18; v37 = (signed int)v38; v19 = (signed int)v39; LODWORD(a3) = LODWORD(a7) - 1; LODWORD(v42) = (signed int)v39; a4 = v37 + 1; v20 = &a3; if ( LODWORD(a7) - 1 >= v37 + 1 ) v20 = (float *)&a4; v40 = *(_DWORD *)v20; LODWORD(a3) = v13 - 1; a4 = v19 + 1; v21 = &a3; if ( v13 - 1 >= v19 + 1 ) v21 = (float *)&a4; a4 = *(_DWORD *)v21; v22 = sub_4C9410(0); v23 = v12 / SLODWORD(a7); v24 = v12 * (v13 - v19 - 1); v25 = v12 * (v13 - a4 - 1); v26 = v37 * v12 / SLODWORD(a7); LOBYTE(a7) = *(_BYTE *)(v26 + v24 + v22); v27 = v40 * v23; LOBYTE(v24) = *(_BYTE *)(v27 + v24 + v22); v28 = *(_BYTE *)(v25 + v26 + v22); LOBYTE(v27) = *(_BYTE *)(v27 + v25 + v22); LOBYTE(a3) = v24; LOBYTE(a4) = v27; sub_4C9460(LODWORD(v41)); v41 = v38 - (double)v37; v29 = v41; v41 = 1.0 - v41; v42 = v39 - (double)SLODWORD(v42); v30 = v42; v42 = 1.0 - v42; a7 = (double)LOBYTE(a7) * 0.003921568859368563; v31 = v42 * v41 * a7; a7 = (double)LOBYTE(a3) * 0.003921568859368563; v32 = v42 * v29 * a7 + v31; a7 = (double)v28 * 0.003921568859368563; v33 = v32 + v41 * v30 * a7; a7 = 0.003921568859368563 * (double)(unsigned __int8)a4; a7 = v29 * v30 * a7 + v33; a7 = a7 + *(float *)(v43 + 56); v34 = 0.0; if ( a7 < 0.0 ) goto LABEL_18; if ( a7 >= 1.0 ) { v34 = 0.99998999; LABEL_18: a7 = v34; } a3 = *(float *)(v43 + 24); v35 = *(float *)(v43 + 32); sub_69F440(*(float *)(v43 + 32), a7, *(float *)(v43 + 36), a3); return (float)(v35 * a7); } */ public class FilterBitmap extends FilterLayer { private int bitmapId; private float min, max, gain; private TargaBitmap bitmap; public FilterBitmap() { } @Override public void loadData(IoBuffer buffer) throws Exception { this.bitmapId = buffer.getInt(); this.feather_type = buffer.getInt(); this.feather_amount = buffer.getFloat(); this.min = buffer.getFloat(); this.max = buffer.getFloat(); if(buffer.remaining() >= 4) this.gain = buffer.getFloat(); } @Override public float process(float x, float z, float transform_value, float base_value, TerrainVisitor ti, FilterRectangle rectangle) { if(bitmap == null) { bitmap = ti.getBitmapGroup().getBitmaps().get(bitmapId); if(bitmap == null) { System.out.println("Didnt find bitmap for filter"); return 1; } } //System.out.println("Using bitmap: " + bitmap.getFileName()); //System.out.println("rect minx : " + rectangle.minX + " rect minZ : " + rectangle.minZ + " rect maxX: " + rectangle.maxX + " rect maxZ: " + rectangle.maxZ); float width = bitmap.getWidth(); float height = bitmap.getHeight(); float same_as_width_height = width; long v44 = (long) same_as_width_height; float arg6 = width; float transformedX = (x - rectangle.minX) * width / (rectangle.maxX - rectangle.minX); float transformedZ = (z - rectangle.minZ) * height / (rectangle.maxZ - rectangle.minZ); if (transformedX > width - 1) { System.out.println("transformed x exceeded boundary"); transformedX = width - 1; } if (transformedZ > height - 1) { System.out.println("transformed z exceeded boundary"); transformedZ = height - 1; } int v41 = (int) transformedZ; float v39 = transformedX + 1; int v43 = (int) transformedX; float v42 = transformedX; float v40 = transformedZ; float arg1 = (int) transformedZ + 1; int v25 = (int) (v44 * (height - v41 - 1)); int v26 = (int) (v39 * v44 / arg6); int v27 = (int) (v43 * v44 / arg6); float v28 = bitmap.getData(v27 + v25) & 0xFF; //byte mapValue = v28; float arg2 = 0; arg2 = bitmap.getData(v26 + v25) & 0xFF; int v29 = (int) (v44 * (height - arg1 - 1)); v25 = bitmap.getData(v29 + v27) & 0xFF; v27 = bitmap.getData(v26 + v29) & 0xFF; arg6 = v25; arg1 = v27; double v30 = v42 - (double) v43; double v31 = v40 - (double) v41; float mapResult = (float) (v31 * (1.0 - v30) * arg6 * 0.003921568859368563 + v31 * v30 * arg1 * 0.003921568859368563 + (1.0 - v31) * (1.0 - v30) * v28 * 0.003921568859368563 + (1.0 - v31) * v30 * arg2 * 0.003921568859368563); mapResult += gain; if (mapResult >= 1.0) mapResult = (float) 0.9999899864196777; if (mapResult < 0) mapResult = 0; float v32 = feather_amount; float v33 = max; arg6 = min; arg2 = v32; arg1 = v33; float result = 0; //System.out.println("map result: " + mapResult + " min: " + min + " max: " + max); if (mapResult > arg6 && mapResult < arg1) { float v35 = (float) ((arg1 - arg6) * arg2 * 0.5); if (mapResult >= arg6 + v35) { if (mapResult <= arg1 - v35) result = mapResult; else result = mapResult * (arg1 - mapResult) / v35; } else { result = mapResult * (mapResult - arg6) / v35; //result = 0; } } return result; } @Override public float process(float x, float y, float transform_value, float base_value, TerrainVisitor ti) { // TODO Auto-generated method stub return 0; } }