Skip to content

Commit

Permalink
Merge pull request #584 from openmobilemaps/feature/self-masking
Browse files Browse the repository at this point in the history
Self Masking for Vector Layers
  • Loading branch information
maurhofer-ubique authored Feb 1, 2024
2 parents 0aebab2 + 0d43778 commit df94302
Show file tree
Hide file tree
Showing 46 changed files with 295 additions and 135 deletions.
6 changes: 1 addition & 5 deletions android/src/main/cpp/graphics/objects/LineGroup2dOpenGl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -109,11 +109,7 @@ void LineGroup2dOpenGl::render(const std::shared_ptr<::RenderingContextInterface

std::shared_ptr<OpenGlContext> openGlContext = std::static_pointer_cast<OpenGlContext>(context);
if (isMasked) {
if (isMaskInversed) {
glStencilFunc(GL_EQUAL, 0, 255);
} else {
glStencilFunc(GL_EQUAL, 128, 255);
}
glStencilFunc(GL_EQUAL, isMaskInversed ? 0 : 128, 255);
} else {
glEnable(GL_STENCIL_TEST);
glStencilMask(0xFF);
Expand Down
21 changes: 15 additions & 6 deletions android/src/main/cpp/graphics/objects/Polygon2dOpenGl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,14 +104,23 @@ void Polygon2dOpenGl::render(const std::shared_ptr<::RenderingContextInterface>

std::shared_ptr<OpenGlContext> openGlContext = std::static_pointer_cast<OpenGlContext>(context);

GLuint stencilMask = 0;
GLuint validTarget = 0;
GLenum zpass = GL_KEEP;
if (isMasked) {
if (isMaskInversed) {
glStencilFunc(GL_EQUAL, 0, 255);
} else {
glStencilFunc(GL_EQUAL, 128, 255);
}
stencilMask += 128;
validTarget = isMaskInversed ? 0 : 128;
}
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
if (renderPass.isPassMasked) {
stencilMask += 127;
zpass = GL_INCR;
}

if (stencilMask != 0) {
glStencilFunc(GL_EQUAL, validTarget, stencilMask);
glStencilOp(GL_KEEP, GL_KEEP, zpass);
}

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);

drawPolygon(openGlContext, program, mvpMatrix);
Expand Down
16 changes: 14 additions & 2 deletions android/src/main/cpp/graphics/objects/PolygonGroup2dOpenGl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,21 @@ void PolygonGroup2dOpenGl::render(const std::shared_ptr<::RenderingContextInterf
if (!ready)
return;

GLuint stencilMask = 0;
GLuint validTarget = 0;
GLenum zpass = GL_KEEP;
if (isMasked) {
glStencilFunc(GL_EQUAL, isMaskInversed ? 0 : 128, 128);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
stencilMask += 128;
validTarget = isMaskInversed ? 0 : 128;
}
if (renderPass.isPassMasked) {
stencilMask += 127;
zpass = GL_INCR;
}

if (stencilMask != 0) {
glStencilFunc(GL_EQUAL, validTarget, stencilMask);
glStencilOp(GL_KEEP, GL_KEEP, zpass);
}

std::shared_ptr<OpenGlContext> openGlContext = std::static_pointer_cast<OpenGlContext>(context);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,9 +141,21 @@ void PolygonPatternGroup2dOpenGl::render(const std::shared_ptr<::RenderingContex

glUseProgram(program);

GLuint stencilMask = 0;
GLuint validTarget = 0;
GLenum zpass = GL_KEEP;
if (isMasked) {
glStencilFunc(GL_EQUAL, isMaskInversed ? 0 : 128, 128);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
stencilMask += 128;
validTarget = isMaskInversed ? 0 : 128;
}
if (renderPass.isPassMasked) {
stencilMask += 127;
zpass = GL_INCR;
}

if (stencilMask != 0) {
glStencilFunc(GL_EQUAL, validTarget, stencilMask);
glStencilOp(GL_KEEP, GL_KEEP, zpass);
}

prepareTextureDraw(program);
Expand Down
16 changes: 14 additions & 2 deletions android/src/main/cpp/graphics/objects/Quad2dInstancedOpenGl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -206,9 +206,21 @@ void Quad2dInstancedOpenGl::render(const std::shared_ptr<::RenderingContextInter

glUseProgram(program);

GLuint stencilMask = 0;
GLuint validTarget = 0;
GLenum zpass = GL_KEEP;
if (isMasked) {
glStencilFunc(GL_EQUAL, isMaskInversed ? 0 : 128, 128);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
stencilMask += 128;
validTarget = isMaskInversed ? 0 : 128;
}
if (renderPass.isPassMasked) {
stencilMask += 127;
zpass = GL_INCR;
}

if (stencilMask != 0) {
glStencilFunc(GL_EQUAL, validTarget, stencilMask);
glStencilOp(GL_KEEP, GL_KEEP, zpass);
}

if (usesTextureCoords) {
Expand Down
16 changes: 14 additions & 2 deletions android/src/main/cpp/graphics/objects/Quad2dOpenGl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -193,9 +193,21 @@ void Quad2dOpenGl::render(const std::shared_ptr<::RenderingContextInterface> &co

glUseProgram(program);

GLuint stencilMask = 0;
GLuint validTarget = 0;
GLenum zpass = GL_KEEP;
if (isMasked) {
glStencilFunc(GL_EQUAL, isMaskInversed ? 0 : 128, 128);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
stencilMask += 128;
validTarget = isMaskInversed ? 0 : 128;
}
if (renderPass.isPassMasked) {
stencilMask += 127;
zpass = GL_INCR;
}

if (stencilMask != 0) {
glStencilFunc(GL_EQUAL, validTarget, stencilMask);
glStencilOp(GL_KEEP, GL_KEEP, zpass);
}

if (usesTextureCoords) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -205,9 +205,21 @@ void Quad2dStretchedInstancedOpenGl::render(const std::shared_ptr<::RenderingCon

glUseProgram(program);

GLuint stencilMask = 0;
GLuint validTarget = 0;
GLenum zpass = GL_KEEP;
if (isMasked) {
glStencilFunc(GL_EQUAL, isMaskInversed ? 0 : 128, 128);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
stencilMask += 128;
validTarget = isMaskInversed ? 0 : 128;
}
if (renderPass.isPassMasked) {
stencilMask += 127;
zpass = GL_INCR;
}

if (stencilMask != 0) {
glStencilFunc(GL_EQUAL, validTarget, stencilMask);
glStencilOp(GL_KEEP, GL_KEEP, zpass);
}

if (usesTextureCoords) {
Expand Down
16 changes: 14 additions & 2 deletions android/src/main/cpp/graphics/objects/Text2dInstancedOpenGl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -200,9 +200,21 @@ void Text2dInstancedOpenGl::render(const std::shared_ptr<::RenderingContextInter

glUseProgram(program);

GLuint stencilMask = 0;
GLuint validTarget = 0;
GLenum zpass = GL_KEEP;
if (isMasked) {
glStencilFunc(GL_EQUAL, isMaskInversed ? 0 : 128, 128);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
stencilMask += 128;
validTarget = isMaskInversed ? 0 : 128;
}
if (renderPass.isPassMasked) {
stencilMask += 127;
zpass = GL_INCR;
}

if (stencilMask != 0) {
glStencilFunc(GL_EQUAL, validTarget, stencilMask);
glStencilOp(GL_KEEP, GL_KEEP, zpass);
}

if (usesTextureCoords) {
Expand Down
16 changes: 14 additions & 2 deletions android/src/main/cpp/graphics/objects/Text2dOpenGl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -209,9 +209,21 @@ void Text2dOpenGl::render(const std::shared_ptr<::RenderingContextInterface> &co
return;
}

GLuint stencilMask = 0;
GLuint validTarget = 0;
GLenum zpass = GL_KEEP;
if (isMasked) {
glStencilFunc(GL_EQUAL, isMaskInversed ? 0 : 128, 128);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
stencilMask += 128;
validTarget = isMaskInversed ? 0 : 128;
}
if (renderPass.isPassMasked) {
stencilMask += 127;
zpass = GL_INCR;
}

if (stencilMask != 0) {
glStencilFunc(GL_EQUAL, validTarget, stencilMask);
glStencilOp(GL_KEEP, GL_KEEP, zpass);
}

glUseProgram(program);
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 5 additions & 3 deletions bridging/android/jni/graphics/NativeRenderPassConfig.cpp

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion bridging/android/jni/graphics/NativeRenderPassConfig.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 4 additions & 2 deletions bridging/ios/MCRenderPassConfig+Private.mm

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 6 additions & 2 deletions bridging/ios/MCRenderPassConfig.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 6 additions & 2 deletions bridging/ios/MCRenderPassConfig.mm

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions djinni/graphics/core.djinni
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ render_pass_interface = interface +c +j +o {

render_pass_config = record {
render_pass_index: i32;
is_pass_masked: bool;
}

renderer_interface = interface +c +j +o {
Expand Down
34 changes: 34 additions & 0 deletions ios/graphics/Model/BaseGraphicsObject.swift
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,38 @@ extension BaseGraphicsObject: MCGraphicsObjectInterface {
isMasked: isMasked,
screenPixelAsRealMeterFactor: screenPixelAsRealMeterFactor)
}

// MARK: - Stencil

func maskStencilState(readMask: UInt32 = 0b1111_1111, writeMask: UInt32 = 0b0000_0000) -> MTLDepthStencilState? {
let s = MTLStencilDescriptor()
s.stencilCompareFunction = .equal
s.stencilFailureOperation = .zero
s.depthFailureOperation = .keep
s.depthStencilPassOperation = .keep
s.readMask = readMask
s.writeMask = writeMask

let desc = MTLDepthStencilDescriptor()
desc.frontFaceStencil = s
desc.backFaceStencil = s

return device.makeDepthStencilState(descriptor: desc)
}

func renderPassMaskStencilState() -> MTLDepthStencilState? {
let s = MTLStencilDescriptor()
s.stencilCompareFunction = .equal
s.stencilFailureOperation = .keep
s.depthFailureOperation = .keep
s.depthStencilPassOperation = .incrementWrap
s.readMask = 0b1111_1111
s.writeMask = 0b0000_0001

let desc = MTLDepthStencilDescriptor()
desc.frontFaceStencil = s
desc.backFaceStencil = s

return device.makeDepthStencilState(descriptor: desc)
}
}
Loading

0 comments on commit df94302

Please sign in to comment.