summaryrefslogtreecommitdiff
path: root/utils/Texturesynth
diff options
context:
space:
mode:
Diffstat (limited to 'utils/Texturesynth')
-rw-r--r--utils/Texturesynth/texturesynth.vpc35
-rw-r--r--utils/Texturesynth/tsynth.cpp102
2 files changed, 137 insertions, 0 deletions
diff --git a/utils/Texturesynth/texturesynth.vpc b/utils/Texturesynth/texturesynth.vpc
new file mode 100644
index 0000000..1e86f1d
--- /dev/null
+++ b/utils/Texturesynth/texturesynth.vpc
@@ -0,0 +1,35 @@
+//-----------------------------------------------------------------------------
+// TEXTURESYNTH.VPC
+//
+// Project Script
+//-----------------------------------------------------------------------------
+
+$Macro SRCDIR "..\.."
+$Macro OUTBINDIR "$SRCDIR\..\game\bin"
+
+$Include "$SRCDIR\vpc_scripts\source_exe_con_base.vpc"
+
+$Configuration
+{
+ $Compiler
+ {
+ $AdditionalIncludeDirectories "$BASE;..\common"
+ }
+}
+
+$Project "Texturesynth"
+{
+ $Folder "Source Files"
+ {
+ -$File "$SRCDIR\public\tier0\memoverride.cpp"
+
+ $File "tsynth.cpp"
+ }
+
+ $Folder "Link Libraries"
+ {
+ $Lib bitmap
+ $Lib mathlib
+ $Lib tier2
+ }
+}
diff --git a/utils/Texturesynth/tsynth.cpp b/utils/Texturesynth/tsynth.cpp
new file mode 100644
index 0000000..86a634e
--- /dev/null
+++ b/utils/Texturesynth/tsynth.cpp
@@ -0,0 +1,102 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//===========================================================================//
+
+#include "tier0/platform.h"
+#include "bitmap/float_bm.h"
+#include "mathlib/mathlib.h"
+#include "tier2/tier2.h"
+#include "bitmap/tgaloader.h"
+
+#define NEIGHBORHOOD_SIZE 5
+
+void SynthesizeTexture(FloatBitMap_t & output, FloatBitMap_t const & input)
+{
+ // init output with histogram-equalized random pixels
+ output.InitializeWithRandomPixelsFromAnotherFloatBM(input);
+
+ // build image pyramids
+ FloatImagePyramid_t input_pyramid(input,PYRAMID_MODE_GAUSSIAN);
+ FloatImagePyramid_t output_pyramid(output,PYRAMID_MODE_GAUSSIAN);
+
+ // now, synthesize texture from lowest res to highest
+ for(int level=min(input_pyramid.m_nLevels,output_pyramid.m_nLevels)-2;level>=0;level--)
+ {
+ FloatBitMap_t & output=*(output_pyramid.Level(level));
+ FloatBitMap_t & output0=*(output_pyramid.Level(level+1));
+ FloatBitMap_t & input=*(input_pyramid.Level(level));
+ FloatBitMap_t & input0=*(input_pyramid.Level(level+1));
+ if (
+ (input.Width < NEIGHBORHOOD_SIZE*3) ||
+ (input.Height < NEIGHBORHOOD_SIZE*3)
+ )
+ {
+ printf("skip level %d\n",level);
+ continue;
+ }
+ // now, synthesize each pixel
+ for(int yloop=0;yloop<output.Height;yloop++)
+ {
+ int yo=((yloop+NEIGHBORHOOD_SIZE) % output.Height);
+ printf("level %d line %d\n",level,yo);
+ for(int xo=0;xo<output.Width;xo++)
+ {
+ int best_pixel_x=-1, best_pixel_y=-1;
+ float best_error=1.0e22;
+ // traverse all neighborhoods of src
+ for(int nblk_y=NEIGHBORHOOD_SIZE;nblk_y<input.Height;nblk_y++)
+ for(int nblk_x=NEIGHBORHOOD_SIZE;nblk_x<input.Width-NEIGHBORHOOD_SIZE;nblk_x++)
+ {
+ float our_error=0;
+ // now, compare this block to the neighborhood around our output pixel
+ for(int oy=-NEIGHBORHOOD_SIZE;oy<=0;oy++)
+ {
+ int xlimit=NEIGHBORHOOD_SIZE/2;
+ if (oy==0)
+ xlimit=-1; // on last line, don't step past our output pixel
+ for(int ox=-NEIGHBORHOOD_SIZE/2;ox<=xlimit;ox++)
+ for(int c=0;c<3;c++)
+ {
+ float pix_diff=
+ output.PixelWrapped(xo+ox,yo+oy,c)-
+ input.Pixel(nblk_x+ox,nblk_y+oy,c);
+ our_error+=pix_diff*pix_diff;
+ float pix_diff0=
+ output0.PixelWrapped(xo+ox,yo+oy,c)-
+ input0.PixelClamped(nblk_x+ox,nblk_y+oy,c);
+ our_error+=pix_diff0*pix_diff0;
+ }
+ }
+ if (our_error < best_error)
+ {
+ best_pixel_x=nblk_x;
+ best_pixel_y=nblk_y;
+ best_error=our_error;
+ }
+ }
+ for(int c=0;c<3;c++)
+ output.Pixel(xo,yo,c)=input.Pixel(best_pixel_x,best_pixel_y,c);
+ }
+ }
+ }
+ output_pyramid.WriteTGAs("synth_out");
+}
+
+
+
+void main(int argc,char **argv)
+{
+ InitCommandLineProgram( argc, argv );
+ FloatBitMap_t src_texture(argv[1]);
+
+ int out_width = atoi( argv[2] );
+ int out_height = atoi( argv[3] );
+
+
+ FloatBitMap_t output_map(out_width,out_height);
+
+ SynthesizeTexture(output_map,src_texture);
+
+}