Add with-software-renderer combinator to cocoa.views . Hack up shader code in line-art to make it display properly with the Apple software OpenGL implementation
parent
d56acaab86
commit
ae31bc65d2
|
@ -1,7 +1,8 @@
|
||||||
! Copyright (C) 2006, 2007 Slava Pestov
|
! Copyright (C) 2006, 2007 Slava Pestov
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: alien.c-types arrays kernel math namespaces cocoa
|
USING: alien.c-types arrays kernel math namespaces cocoa
|
||||||
cocoa.messages cocoa.classes cocoa.types sequences ;
|
cocoa.messages cocoa.classes cocoa.types sequences
|
||||||
|
continuations ;
|
||||||
IN: cocoa.views
|
IN: cocoa.views
|
||||||
|
|
||||||
: NSOpenGLPFAAllRenderers 1 ;
|
: NSOpenGLPFAAllRenderers 1 ;
|
||||||
|
@ -35,11 +36,23 @@ IN: cocoa.views
|
||||||
: NSOpenGLPFAPixelBuffer 90 ;
|
: NSOpenGLPFAPixelBuffer 90 ;
|
||||||
: NSOpenGLPFAVirtualScreenCount 128 ;
|
: NSOpenGLPFAVirtualScreenCount 128 ;
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
|
SYMBOL: +software-renderer+
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
|
: with-software-renderer ( quot -- )
|
||||||
|
t +software-renderer+ set
|
||||||
|
[ f +software-renderer+ set ]
|
||||||
|
[ ] cleanup ; inline
|
||||||
|
|
||||||
: <PixelFormat> ( -- pixelfmt )
|
: <PixelFormat> ( -- pixelfmt )
|
||||||
NSOpenGLPixelFormat -> alloc [
|
NSOpenGLPixelFormat -> alloc [
|
||||||
NSOpenGLPFAWindow ,
|
NSOpenGLPFAWindow ,
|
||||||
NSOpenGLPFADoubleBuffer ,
|
NSOpenGLPFADoubleBuffer ,
|
||||||
NSOpenGLPFADepthSize , 16 ,
|
NSOpenGLPFADepthSize , 16 ,
|
||||||
|
+software-renderer+ get [ NSOpenGLPFARobust , ] when
|
||||||
0 ,
|
0 ,
|
||||||
] { } make >c-int-array
|
] { } make >c-int-array
|
||||||
-> initWithAttributes:
|
-> initWithAttributes:
|
||||||
|
|
|
@ -57,13 +57,7 @@ uniform sampler2D colormap, normalmap, depthmap;
|
||||||
uniform vec4 line_color;
|
uniform vec4 line_color;
|
||||||
varying vec2 coord;
|
varying vec2 coord;
|
||||||
|
|
||||||
const float DEPTH_RATIO_THRESHOLD = 1.001, NORMAL_DOT_THRESHOLD = 1.0, SAMPLE_SPREAD = 1.0/512.0;
|
const float DEPTH_RATIO_THRESHOLD = 1.001, SAMPLE_SPREAD = 1.0/512.0;
|
||||||
|
|
||||||
bool
|
|
||||||
is_normal_border(vec3 norm1, vec3 norm2)
|
|
||||||
{
|
|
||||||
return dot(norm1, norm2) < NORMAL_DOT_THRESHOLD;
|
|
||||||
}
|
|
||||||
|
|
||||||
float
|
float
|
||||||
depth_sample(vec2 c)
|
depth_sample(vec2 c)
|
||||||
|
@ -97,33 +91,39 @@ border_factor(vec2 c)
|
||||||
coord3 = c + vec2(-SAMPLE_SPREAD, SAMPLE_SPREAD),
|
coord3 = c + vec2(-SAMPLE_SPREAD, SAMPLE_SPREAD),
|
||||||
coord4 = c + vec2( SAMPLE_SPREAD, SAMPLE_SPREAD);
|
coord4 = c + vec2( SAMPLE_SPREAD, SAMPLE_SPREAD);
|
||||||
|
|
||||||
vec4 depths = vec4(depth_sample(coord1),
|
|
||||||
depth_sample(coord2),
|
|
||||||
depth_sample(coord3),
|
|
||||||
depth_sample(coord4));
|
|
||||||
if (depths == vec4(1, 1, 1, 1))
|
|
||||||
return 0.0;
|
|
||||||
|
|
||||||
vec3 ratios1 = depths.xxx/depths.yzw, ratios2 = depths.yyz/depths.zww;
|
|
||||||
|
|
||||||
if (are_depths_border(ratios1) || are_depths_border(ratios2))
|
|
||||||
return 1.0;
|
|
||||||
|
|
||||||
vec3 normal1 = normal_sample(coord1),
|
vec3 normal1 = normal_sample(coord1),
|
||||||
normal2 = normal_sample(coord2),
|
normal2 = normal_sample(coord2),
|
||||||
normal3 = normal_sample(coord3),
|
normal3 = normal_sample(coord3),
|
||||||
normal4 = normal_sample(coord4);
|
normal4 = normal_sample(coord4);
|
||||||
|
|
||||||
float normal_border = 1.0 - min6(
|
if (dot(normal1, normal1) < 0.5
|
||||||
dot(normal1, normal2),
|
&& dot(normal2, normal2) < 0.5
|
||||||
dot(normal1, normal3),
|
&& dot(normal3, normal3) < 0.5
|
||||||
dot(normal1, normal4),
|
&& dot(normal4, normal4) < 0.5) {
|
||||||
dot(normal2, normal3),
|
return 0.0;
|
||||||
dot(normal2, normal4),
|
} else {
|
||||||
dot(normal3, normal4)
|
vec4 depths = vec4(depth_sample(coord1),
|
||||||
);
|
depth_sample(coord2),
|
||||||
|
depth_sample(coord3),
|
||||||
|
depth_sample(coord4));
|
||||||
|
|
||||||
return normal_border;
|
vec3 ratios1 = depths.xxx/depths.yzw, ratios2 = depths.yyz/depths.zww;
|
||||||
|
|
||||||
|
if (are_depths_border(ratios1) || are_depths_border(ratios2)) {
|
||||||
|
return 1.0;
|
||||||
|
} else {
|
||||||
|
float normal_border = 1.0 - min6(
|
||||||
|
dot(normal1, normal2),
|
||||||
|
dot(normal1, normal3),
|
||||||
|
dot(normal1, normal4),
|
||||||
|
dot(normal2, normal3),
|
||||||
|
dot(normal2, normal4),
|
||||||
|
dot(normal3, normal4)
|
||||||
|
);
|
||||||
|
|
||||||
|
return normal_border;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
Loading…
Reference in New Issue