Fix walkway and wall trims; not sure why shore frills don't also work

This commit is contained in:
2014-04-18 16:59:33 -04:00
parent 55c3f83d22
commit 4f741b440f
7 changed files with 106 additions and 1 deletions

5
osx/.gitignore vendored
View File

@@ -1,4 +1,9 @@
# XCode Junk Files
*.xcodeproj/xcuserdata
*.xcodeproj/*.xcworkspace/xcuserdata
*.xcodeproj/*.mode*
*.xcodeproj/*.pbxuser
# Shader Builder projects
# It's an sqlite3 database and not particularly important, so exclude it
*.sbproj

View File

@@ -11,6 +11,7 @@
isa = PBXAggregateTarget;
buildConfigurationList = 912CF36F0FE44A2A0063B614 /* Build configuration list for PBXAggregateTarget "Common Data Files" */;
buildPhases = (
91A0B15F1900FFDA00EF438F /* Copy Shaders */,
912CF3560FE4494C0063B614 /* Copy Scenarios */,
91ACCE6218FFB5F300FAEF8B /* Copy Base Scenarios */,
912CF36D0FE44A2A0063B614 /* Copy Mac Graphics */,
@@ -433,6 +434,7 @@
919DDC0D19007517003E7FED /* freetype.framework in Copy Libraries and Frameworks */ = {isa = PBXBuildFile; fileRef = 919DDC091900750D003E7FED /* freetype.framework */; };
919DDC0E1900751C003E7FED /* freetype.framework in Copy Libraries and Frameworks */ = {isa = PBXBuildFile; fileRef = 919DDC091900750D003E7FED /* freetype.framework */; };
919DDC0F1900751F003E7FED /* freetype.framework in Copy Libraries and Frameworks */ = {isa = PBXBuildFile; fileRef = 919DDC091900750D003E7FED /* freetype.framework */; };
91A0B1601900FFE500EF438F /* mask.frag in Copy Shaders */ = {isa = PBXBuildFile; fileRef = 91A0B15A1900F73E00EF438F /* mask.frag */; };
91A32B770FDB5F6800C4E957 /* arena-names.txt in Copy String Lists */ = {isa = PBXBuildFile; fileRef = 91A32B720FDB5F6800C4E957 /* arena-names.txt */; };
91A32B780FDB5F6800C4E957 /* ter-flag1.txt in Copy String Lists */ = {isa = PBXBuildFile; fileRef = 91A32B730FDB5F6800C4E957 /* ter-flag1.txt */; };
91A32B790FDB5F6800C4E957 /* ter-flag2.txt in Copy String Lists */ = {isa = PBXBuildFile; fileRef = 91A32B740FDB5F6800C4E957 /* ter-flag2.txt */; };
@@ -498,6 +500,7 @@
91B3EF5A0F969F3000BF5B67 /* scen.btnmg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91B3EEF50F969BA700BF5B67 /* scen.btnmg.cpp */; };
91B3EF5B0F969F3000BF5B67 /* scen.dlgutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91B3EEF60F969BA700BF5B67 /* scen.dlgutil.cpp */; };
91B3F1850F97894A00BF5B67 /* scen.graphics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91B3EEF30F969BA700BF5B67 /* scen.graphics.cpp */; };
91BFA3D71901B18F001686E4 /* mask.vert in Copy Shaders */ = {isa = PBXBuildFile; fileRef = 91BFA3D61901B024001686E4 /* mask.vert */; };
91C1FCA60FCB6F7000EBAA65 /* button.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 910BBA890FB8EC57001E34EA /* button.cpp */; };
91C1FCA70FCB6F7100EBAA65 /* control.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 910BBA3C0FB8DA8E001E34EA /* control.cpp */; };
91C1FCA80FCB6F7100EBAA65 /* dialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 910BBA180FB8BECA001E34EA /* dialog.cpp */; };
@@ -1015,6 +1018,18 @@
name = "Copy Strings";
runOnlyForDeploymentPostprocessing = 0;
};
91A0B15F1900FFDA00EF438F /* Copy Shaders */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = data/shaders;
dstSubfolderSpec = 16;
files = (
91A0B1601900FFE500EF438F /* mask.frag in Copy Shaders */,
91BFA3D71901B18F001686E4 /* mask.vert in Copy Shaders */,
);
name = "Copy Shaders";
runOnlyForDeploymentPostprocessing = 0;
};
91A32B660FDB5EF100C4E957 /* Copy Dialogs */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@@ -1525,6 +1540,7 @@
919DDBFA19006CC9003E7FED /* libboost_filesystem.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libboost_filesystem.dylib; path = /usr/local/lib/libboost_filesystem.dylib; sourceTree = "<absolute>"; };
919DDBFB19006CC9003E7FED /* libboost_system.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libboost_system.dylib; path = /usr/local/lib/libboost_system.dylib; sourceTree = "<absolute>"; };
919DDC091900750D003E7FED /* freetype.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = freetype.framework; path = ../../../../../../Library/Frameworks/freetype.framework; sourceTree = "<group>"; };
91A0B15A1900F73E00EF438F /* mask.frag */ = {isa = PBXFileReference; explicitFileType = sourcecode.glsl; fileEncoding = 4; path = mask.frag; sourceTree = "<group>"; };
91A32B720FDB5F6800C4E957 /* arena-names.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "arena-names.txt"; sourceTree = "<group>"; };
91A32B730FDB5F6800C4E957 /* ter-flag1.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "ter-flag1.txt"; sourceTree = "<group>"; };
91A32B740FDB5F6800C4E957 /* ter-flag2.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "ter-flag2.txt"; sourceTree = "<group>"; };
@@ -1587,6 +1603,7 @@
91B3F10F0F9779D000BF5B67 /* soundtool.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = soundtool.cpp; sourceTree = "<group>"; };
91B3F11D0F97801F00BF5B67 /* mathutil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mathutil.h; sourceTree = "<group>"; };
91B3F11E0F97801F00BF5B67 /* mathutil.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mathutil.cpp; sourceTree = "<group>"; };
91BFA3D61901B024001686E4 /* mask.vert */ = {isa = PBXFileReference; explicitFileType = sourcecode.glsl; fileEncoding = 4; path = mask.vert; sourceTree = "<group>"; };
91C688E60FD702B9000F6D01 /* cursors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cursors.h; sourceTree = "<group>"; };
91C688E70FD702B9000F6D01 /* cursors.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = cursors.m; sourceTree = "<group>"; };
91D62F330F8EB84800674AB3 /* bladesofexile.rsrc */ = {isa = PBXFileReference; lastKnownFileType = archive.rsrc; path = bladesofexile.rsrc; sourceTree = "<group>"; };
@@ -2080,6 +2097,8 @@
912283C80FD0E16C00B21642 /* undo.cpp */,
919145FF18E63B70005CF3A4 /* winutil.mac.mm */,
91EC481018FBABB100BB1E86 /* prefs.mac.mm */,
91A0B15A1900F73E00EF438F /* mask.frag */,
91BFA3D61901B024001686E4 /* mask.vert */,
);
name = src;
sourceTree = "<group>";

View File

@@ -1307,7 +1307,7 @@ void draw_trim(short q,short r,short which_trim,ter_num_t ground_ter)
to_rect.top += 18;
}
rect_draw_some_item(*from_gworld, from_rect, terrain_screen_gworld, to_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gworld, from_rect, roads_gworld, mask_rect, terrain_screen_gworld, to_rect);
}

View File

@@ -34,6 +34,8 @@ sf::Texture bg_gworld;
TextStyle TEXT;
bool use_win_graphics = false;
CursorRef GetCursorFromPath(std::string filename, location hotspot);
sf::Shader maskShader;
extern fs::path progDir;
// TODO: Shouldn't need this
extern sf::RenderWindow mainPtr;
@@ -44,6 +46,34 @@ void clean_up_graphtool(){
}
void init_graph_tool(){
fs::path shaderPath = progDir/"data"/"shaders";
fs::path fragPath = shaderPath/"mask.frag", vertPath = shaderPath/"mask.vert";
std::ifstream fin;
fin.open(fragPath.c_str());
if(!fin.good()) perror("Error loading fragment shader");
fin.seekg(0, std::ios::end);
int size = fin.tellg();
fin.seekg(0);
char* fbuf = new char[size + 1];
fbuf[size] = 0;
fin.read(fbuf, size);
fin.close();
fin.open(vertPath.c_str());
if(!fin.good()) perror("Error loading vertex shader");
fin.seekg(0, std::ios::end);
size = fin.tellg();
fin.seekg(0);
char* vbuf = new char[size + 1];
vbuf[size] = 0;
fin.read(vbuf, size);
if(!maskShader.loadFromMemory(vbuf, fbuf)) {
fprintf(stderr,"Error: Failed to load shaders from %s\nVertex:\n%s\nFragment:\n%s",shaderPath.c_str(),vbuf,fbuf);
}
delete[] fbuf;
delete[] vbuf;
int i,j;
// TODO: The duplication of location here shouldn't be necessary
// TODO: Store the hotspots on disk instead of hardcoded here
@@ -146,11 +176,17 @@ void restore_cursor(){
set_cursor(current_cursor);
}
static void rect_draw_some_item(const sf::Texture& src_gworld,RECT src_rect,sf::RenderTarget& targ_gworld,RECT targ_rect,sf::RenderStates mode);
void rect_draw_some_item(sf::RenderTarget& targ_gworld,RECT targ_rect) {
fill_rect(targ_gworld, targ_rect, sf::Color::Black);
}
void rect_draw_some_item(const sf::Texture& src_gworld,RECT src_rect,sf::RenderTarget& targ_gworld,RECT targ_rect,sf::BlendMode mode){
rect_draw_some_item(src_gworld, src_rect, targ_gworld, targ_rect, sf::RenderStates(mode));
}
void rect_draw_some_item(const sf::Texture& src_gworld,RECT src_rect,sf::RenderTarget& targ_gworld,RECT targ_rect,sf::RenderStates mode) {
setActiveRenderTarget(targ_gworld);
sf::Sprite tile(src_gworld, src_rect);
tile.setPosition(targ_rect.left, targ_rect.top);
@@ -166,6 +202,25 @@ void rect_draw_some_item(const sf::Texture& src_gworld,RECT src_rect,RECT targ_r
rect_draw_some_item(src_gworld,src_rect,mainPtr,targ_rect,mode);
}
void rect_draw_some_item(const sf::Texture& src_gworld,RECT src_rect,const sf::Texture& mask_gworld,RECT mask_rect,sf::RenderTarget& targ_gworld,RECT targ_rect) {
sf::RenderTexture src;
src.create(src_rect.width(), src_rect.height());
RECT dest_rect = src_rect;
dest_rect.offset(-dest_rect.left,-dest_rect.top);
rect_draw_some_item(src_gworld, src_rect, src, dest_rect);
src.display();
sf::RenderTexture mask;
mask.create(mask_rect.width(), mask_rect.height());
dest_rect = mask_rect;
dest_rect.offset(-dest_rect.left,-dest_rect.top);
rect_draw_some_item(mask_gworld, mask_rect, mask, dest_rect);
mask.display();
maskShader.setParameter("texture", sf::Shader::CurrentTexture);
maskShader.setParameter("mask", mask.getTexture());
rect_draw_some_item(src.getTexture(), dest_rect, targ_gworld, targ_rect, &maskShader);
}
void TextStyle::applyTo(sf::Text& text) {
text.setFont(*ResMgr::get<FontRsrc>(font));
text.setCharacterSize(pointSize);

View File

@@ -101,6 +101,7 @@ void restore_cursor();
void rect_draw_some_item(sf::RenderTarget& targ_gworld,RECT targ_rect);
void rect_draw_some_item(const sf::Texture& src_gworld,RECT src_rect,sf::RenderTarget& targ_gworld,RECT targ_rect,sf::BlendMode mode = sf::BlendNone);
void rect_draw_some_item(const sf::Texture& src_gworld,RECT src_rect,RECT targ_rect,location offset,sf::BlendMode mode = sf::BlendNone);
void rect_draw_some_item(const sf::Texture& src_gworld,RECT src_rect,const sf::Texture& mask_gworld,RECT mask_rect,sf::RenderTarget& targ_gworld,RECT targ_rect);
void win_draw_string(sf::RenderTarget& dest_window,RECT dest_rect,std::string str,short mode,short line_height,location offset = {0,0});
short string_length(std::string str);
//OSStatus flip_pict(OSType domain, OSType type, short id, void *ptr, UInt32 size, bool isNative, void *refcon);

15
osx/tools/mask.frag Normal file
View File

@@ -0,0 +1,15 @@
uniform sampler2D texture;
uniform sampler2D mask;
uniform vec2 offset;
uniform vec2 src;
void main() {
// Lookup the pixels in the textures
vec4 maskpix = texture2D(mask, gl_TexCoord[0].xy);
vec4 texpix = texture2D(texture, gl_TexCoord[0].xy);
// If the mask is black, carry the soruce texture through
if(maskpix.rgb == vec3(0.0,0.0,0.0))
gl_FragColor = texpix;
else gl_FragColor = vec4(0.0,0.0,0.0,0.0);
}

10
osx/tools/mask.vert Normal file
View File

@@ -0,0 +1,10 @@
uniform mat4 trans;
void main() {
// transform the vertex position
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
// transform the texture coordinates
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
}