Merge branch 'Fix-photo-overlay'

master
Beq 2025-10-13 20:44:33 +01:00
commit abedbe4e32
12 changed files with 841 additions and 220 deletions

View File

@ -1521,9 +1521,6 @@ void LLShaderMgr::initAttribsAndUniforms()
// <FS:Beq> reserved uniforms for snapshot frame
mReservedUniforms.push_back("border_color");
mReservedUniforms.push_back("border_thickness");
mReservedUniforms.push_back("guide_color");
mReservedUniforms.push_back("guide_thickness");
mReservedUniforms.push_back("guide_style");
mReservedUniforms.push_back("frame_rect");
// </FS:Beq>
@ -1540,4 +1537,3 @@ void LLShaderMgr::initAttribsAndUniforms()
dupe_check.insert(mReservedUniforms[i]);
}
}

View File

@ -357,9 +357,6 @@ public:
// <FS:Beq> Uniforms for snapshot frame
SNAPSHOT_BORDER_COLOR, // "border_color"
SNAPSHOT_BORDER_THICKNESS, // "border_thickness"
SNAPSHOT_GUIDE_COLOR, // "guide_color"
SNAPSHOT_GUIDE_THICKNESS, // "guide_thickness"
SNAPSHOT_GUIDE_STYLE, // "guide_style"
SNAPSHOT_FRAME_RECT, // "frame_rect"
// </FS:Beq>
END_RESERVED_UNIFORMS

View File

@ -26650,6 +26650,28 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<real>1.0</real>
</map>
<key>FSSnapshotGuideVisibility</key>
<map>
<key>Comment</key>
<string>The blend factor used to color the snapshot framing guides</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>0.5</real>
</map>
<key>FSSnapshotGuideStyle</key>
<map>
<key>Comment</key>
<string>The framing guide layout to display inside the snapshot frame</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>rule_of_thirds</string>
</map>
<key>FSManipRotateJointUseNaturalDirection</key>
<map>
<key>Comment</key>

View File

@ -5,9 +5,6 @@ uniform vec2 screen_res;
uniform vec4 frame_rect; // x, y, width, height (normalized 0->1)
uniform vec3 border_color;
uniform float border_thickness; // in pixels
uniform vec3 guide_color;
uniform float guide_thickness; // in pixels
uniform float guide_style; // 0: no guide, 1: rule of thirds, 2: golden spiral
in vec2 vary_fragcoord;
@ -57,20 +54,6 @@ void main()
diff.rgb = mix(diff.rgb, border_color, 0.5);
}
// Draw guide based on guide_style
if (guide_style == 1)
{
// Draw rule of thirds guide
float third_x = (frame_rect_px.z - frame_rect_px.x) / 3.0;
float third_y = (frame_rect_px.w - frame_rect_px.y) / 3.0;
if ((tc.x > frame_rect_px.x + third_x - guide_thickness && tc.x < frame_rect_px.x + third_x + guide_thickness) ||
(tc.x > frame_rect_px.x + 2.0 * third_x - guide_thickness && tc.x < frame_rect_px.x + 2.0 * third_x + guide_thickness) ||
(tc.y > frame_rect_px.y + third_y - guide_thickness && tc.y < frame_rect_px.y + third_y + guide_thickness) ||
(tc.y > frame_rect_px.y + 2.0 * third_y - guide_thickness && tc.y < frame_rect_px.y + 2.0 * third_y + guide_thickness))
{
diff.rgb = mix(diff.rgb, guide_color, 0.05);
}
}
}
frag_color = diff;
}
}

View File

@ -602,6 +602,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("stop_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotRunQueue>);
LLFloaterReg::add("snapshot", "floater_snapshot.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSnapshot>);
LLFloaterReg::add("simple_snapshot", "floater_simple_snapshot.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSimpleSnapshot>);
LLFloaterReg::add("snapshot_guide_settings", "floater_snapshot_guide_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloater>);// <FS:Beq/> photo guide settings
// <FS:CR> Search floater is deferred to login now so we can tell what grid we're in.
//LLFloaterReg::add("search", "floater_search.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSearch>);
LLFloaterReg::add("profile", "floater_profile.xml",(LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterProfile>);

View File

@ -4539,6 +4539,355 @@ void LLPipeline::recordTrianglesDrawn()
add(LLStatViewer::TRIANGLES_DRAWN, LLUnits::Triangles::fromValue(count));
}
// <FS:Beq> Rework Snapshot Guide Rendering
void LLPipeline::renderSnapshotGuidesOverlay()
{
if (!mSnapshotGuideState.active || !mSnapshotGuideState.show_guides)
{
mSnapshotGuideState.active = false;
return;
}
if (!gViewerWindow || !gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
{
mSnapshotGuideState.active = false;
return;
}
LLRect view_rect = gViewerWindow->getWorldViewRectRaw();
const F32 width = (F32)view_rect.getWidth();
const F32 height = (F32)view_rect.getHeight();
if (width <= 0.f || height <= 0.f)
{
mSnapshotGuideState.active = false;
return;
}
const F32 left_norm = llmin(mSnapshotGuideState.left, mSnapshotGuideState.right);
const F32 right_norm = llmax(mSnapshotGuideState.left, mSnapshotGuideState.right);
const F32 bottom_norm = llmin(mSnapshotGuideState.bottom, mSnapshotGuideState.top);
const F32 top_norm = llmax(mSnapshotGuideState.bottom, mSnapshotGuideState.top);
const F32 left_px = left_norm * width;
const F32 right_px = right_norm * width;
const F32 bottom_px = bottom_norm * height;
const F32 top_px = top_norm * height;
const F32 frame_width = right_px - left_px;
const F32 frame_height = top_px - bottom_px;
if (frame_width <= 0.f || frame_height <= 0.f)
{
mSnapshotGuideState.active = false;
return;
}
const F32 alpha = llclamp(mSnapshotGuideState.visibility, 0.f, 1.f);
if (alpha <= 0.f)
{
mSnapshotGuideState.active = false;
return;
}
LLGLDisable depth(GL_DEPTH_TEST);
LLGLDisable cull(GL_CULL_FACE);
LLGLDisable stencil(GL_STENCIL_TEST);
LLGLEnable blend(GL_BLEND);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
LLGLSLShader* ui_shader = &gUIProgram;
ui_shader->bind();
if (!LLViewerFetchedTexture::sWhiteImagep.isNull())
{
gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep);
}
else
{
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, LLTexUnit::sWhiteTexture);
}
gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
gGL.loadIdentity();
gGL.ortho(0.f, width, 0.f, height, -1.f, 1.f);
gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
gGL.loadIdentity();
gGLLastMatrix = NULL;
const LLColor4 line_color(mSnapshotGuideState.color, alpha);
gGL.color4fv(line_color.mV);
const F32 thickness = llmax(mSnapshotGuideState.thickness, 0.f);
const F32 half_thickness = thickness * 0.5f;
auto draw_filled_rect = [&](F32 l, F32 b, F32 r, F32 t)
{
const S32 left_i = ll_round(l);
const S32 right_i = ll_round(r);
const S32 top_i = ll_round(t);
const S32 bottom_i = ll_round(b);
gl_rect_2d(left_i, top_i, right_i, bottom_i, line_color, true);
};
auto draw_vertical_norm = [&](F32 norm)
{
const F32 x = left_px + frame_width * norm;
draw_filled_rect(x - half_thickness, bottom_px, x + half_thickness, top_px);
};
auto draw_horizontal_norm = [&](F32 norm)
{
const F32 y = bottom_px + frame_height * norm;
draw_filled_rect(left_px, y - half_thickness, right_px, y + half_thickness);
};
switch (mSnapshotGuideState.style)
{
case SnapshotGuideState::Style::RuleOfThirds:
{
const F32 offsets[] = { 1.f / 3.f, 2.f / 3.f };
for (F32 offset : offsets)
{
draw_vertical_norm(offset);
draw_horizontal_norm(offset);
}
break;
}
case SnapshotGuideState::Style::GoldenRatio:
{
constexpr F32 phi = 1.61803398875f;
const SnapshotGuideState::GoldenOrientation orientation = mSnapshotGuideState.golden_orientation;
const F32 scale = llmin(frame_width / phi, frame_height);
if (scale <= 0.f)
{
break;
}
const F32 golden_width = phi * scale;
const F32 golden_height = scale;
const F32 pad_x = frame_width - golden_width;
const F32 pad_y = frame_height - golden_height;
F32 anchor_x = left_px;
F32 anchor_y = bottom_px;
switch (orientation)
{
case SnapshotGuideState::GoldenOrientation::TopLeft:
anchor_y += pad_y;
break;
case SnapshotGuideState::GoldenOrientation::TopRight:
anchor_x += pad_x;
anchor_y += pad_y;
break;
case SnapshotGuideState::GoldenOrientation::BottomRight:
anchor_x += pad_x;
break;
case SnapshotGuideState::GoldenOrientation::BottomLeft:
default:
break;
}
auto map_point = [&](F32 local_x, F32 local_y) -> LLVector2
{
F32 x = local_x;
F32 y = local_y;
if (orientation == SnapshotGuideState::GoldenOrientation::TopLeft ||
orientation == SnapshotGuideState::GoldenOrientation::BottomLeft)
{
x = golden_width - local_x;
}
if (orientation == SnapshotGuideState::GoldenOrientation::BottomLeft ||
orientation == SnapshotGuideState::GoldenOrientation::BottomRight)
{
y = golden_height - local_y;
}
return LLVector2(anchor_x + x, anchor_y + y);
};
std::vector<std::pair<LLVector2, LLVector2>> line_segments;
line_segments.reserve(24);
auto add_line = [&](F32 x0, F32 y0, F32 x1, F32 y1)
{
line_segments.emplace_back(map_point(x0, y0), map_point(x1, y1));
};
// Outline of the fitted golden rectangle.
add_line(0.f, 0.f, golden_width, 0.f);
add_line(0.f, golden_height, golden_width, golden_height);
add_line(0.f, 0.f, 0.f, golden_height);
add_line(golden_width, 0.f, golden_width, golden_height);
// Generate subdivision lines while we walk the squares.
F32 x0 = 0.f;
F32 y0 = 0.f;
F32 x1 = golden_width;
F32 y1 = golden_height;
for (U32 step = 0; step < 12; ++step)
{
const F32 width = x1 - x0;
const F32 height = y1 - y0;
if (width <= 1.f || height <= 1.f)
{
break;
}
if (step % 4 == 0)
{
x0 += height;
add_line(x0, y0, x0, y1);
}
else if (step % 4 == 1)
{
y0 += width;
add_line(x0, y0, x1, y0);
}
else if (step % 4 == 2)
{
x1 -= height;
add_line(x1, y0, x1, y1);
}
else
{
y1 -= width;
add_line(x0, y1, x1, y1);
}
}
auto draw_golden_spiral = [&](U32 max_depth)
{
gGL.begin(LLRender::LINE_STRIP);
F32 spiral_x0 = 0.f;
F32 spiral_y0 = 0.f;
F32 spiral_x1 = golden_width;
F32 spiral_y1 = golden_height;
for (U32 step = 0; step < max_depth; ++step)
{
const F32 width = spiral_x1 - spiral_x0;
const F32 height = spiral_y1 - spiral_y0;
if (width <= 1.f || height <= 1.f)
{
break;
}
F32 size = 0.f;
F32 cx = 0.f;
F32 cy = 0.f;
F32 start_angle = 0.f;
F32 end_angle = 0.f;
switch (step % 4)
{
case 0: // left square
size = height;
cx = spiral_x0 + size;
cy = spiral_y0 + size;
start_angle = F_PI;
end_angle = 1.5f * F_PI;
spiral_x0 += size;
break;
case 1: // bottom square
size = width;
cx = spiral_x0;
cy = spiral_y0 + size;
start_angle = 1.5f * F_PI;
end_angle = 2.f * F_PI;
spiral_y0 += size;
break;
case 2: // right square
size = height;
cx = spiral_x1 - size;
cy = spiral_y0;
start_angle = 0.f;
end_angle = F_PI_BY_TWO;
spiral_x1 -= size;
break;
case 3: // top square
default:
size = width;
cx = spiral_x0 + size;
cy = spiral_y1 - size;
start_angle = F_PI_BY_TWO;
end_angle = F_PI;
spiral_y1 -= size;
break;
}
if (size <= 0.f)
{
break;
}
const S32 segments = llclamp((S32)(size / 4.f), 12, 64);
for (S32 i = 0; i <= segments; ++i)
{
const F32 t = start_angle + (end_angle - start_angle) * (F32)i / (F32)segments;
const F32 local_x = cx + cosf(t) * size;
const F32 local_y = cy + sinf(t) * size;
LLVector2 mapped = map_point(local_x, local_y);
gGL.vertex2f(mapped.mV[0], mapped.mV[1]);
}
}
gGL.end();
};
gGL.flush();
const F32 line_width = llmax(thickness, 1.f);
glLineWidth(line_width);
draw_golden_spiral(12);
glLineWidth(1.f);
if (!line_segments.empty())
{
gGL.flush();
glLineWidth(line_width);
gGL.begin(LLRender::LINES);
for (const auto& segment : line_segments)
{
gGL.vertex2f(segment.first.mV[0], segment.first.mV[1]);
gGL.vertex2f(segment.second.mV[0], segment.second.mV[1]);
}
gGL.end();
glLineWidth(1.f);
}
break;
}
case SnapshotGuideState::Style::Diagonal:
{
const F32 line_width = llmax(thickness, 1.f);
gGL.flush();
glLineWidth(line_width);
gGL.begin(LLRender::LINES);
gGL.vertex2f(left_px, bottom_px);
gGL.vertex2f(right_px, top_px);
gGL.vertex2f(left_px, top_px);
gGL.vertex2f(right_px, bottom_px);
gGL.end();
glLineWidth(1.f);
break;
}
}
gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.popMatrix();
gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.popMatrix();
gGLLastMatrix = NULL;
ui_shader->unbind();
mSnapshotGuideState.active = false;
}
// </FS:Beq>
// <FS:Beq> FIRE-32023 Focus Point Rendering
void LLPipeline::renderFocusPoint()
{
@ -8091,6 +8440,9 @@ bool LLPipeline::renderSnapshotFrame(LLRenderTarget* src, LLRenderTarget* dst)
static LLCachedControl<bool> show_frame(gSavedSettings, "FSSnapshotShowCaptureFrame", false);
static LLCachedControl<bool> show_guides(gSavedSettings, "FSSnapshotShowGuides", false);
mSnapshotGuideState.active = false;
mSnapshotGuideState.show_guides = false;
float left = 0.f;
float top = 0.f;
float right = 1.f;
@ -8101,12 +8453,41 @@ bool LLPipeline::renderSnapshotFrame(LLRenderTarget* src, LLRenderTarget* dst)
static LLCachedControl<LLColor3> guide_color(gSavedSettings, "FSSnapshotFrameGuideColor", LLColor3(1.f, 1.f, 0.f));
static LLCachedControl<F32> border_thickness(gSavedSettings, "FSSnapshotFrameBorderWidth", 2.0f);
static LLCachedControl<F32> guide_thickness(gSavedSettings, "FSSnapshotFrameGuideWidth", 2.0f);
static LLCachedControl<F32> guide_visibility(gSavedSettings, "FSSnapshotGuideVisibility", 0.5f);
static LLCachedControl<std::string> guide_style_setting(gSavedSettings, "FSSnapshotGuideStyle", std::string("rule_of_thirds"));
F32 guide_style = 1.f; // 0:off, 1:rule_of_thirds, others maybe in the future
if (!show_guides)
SnapshotGuideState::Style guide_style = SnapshotGuideState::Style::RuleOfThirds;
SnapshotGuideState::GoldenOrientation golden_orientation = SnapshotGuideState::GoldenOrientation::TopLeft;
const std::string style_value = guide_style_setting();
if (style_value == "golden_ratio" || style_value == "golden_ratio_top_left")
{
guide_style = 0.f;
guide_style = SnapshotGuideState::Style::GoldenRatio;
golden_orientation = SnapshotGuideState::GoldenOrientation::TopLeft;
}
else if (style_value == "golden_ratio_top_right")
{
guide_style = SnapshotGuideState::Style::GoldenRatio;
golden_orientation = SnapshotGuideState::GoldenOrientation::TopRight;
}
else if (style_value == "golden_ratio_bottom_left")
{
guide_style = SnapshotGuideState::Style::GoldenRatio;
golden_orientation = SnapshotGuideState::GoldenOrientation::BottomLeft;
}
else if (style_value == "golden_ratio_bottom_right")
{
guide_style = SnapshotGuideState::Style::GoldenRatio;
golden_orientation = SnapshotGuideState::GoldenOrientation::BottomRight;
}
else if (style_value == "diagonal")
{
guide_style = SnapshotGuideState::Style::Diagonal;
}
else
{
guide_style = SnapshotGuideState::Style::RuleOfThirds;
}
const F32 guide_visibility_value = show_guides ? (F32)guide_visibility : 0.f;
const bool simple_snapshot_visible = LLFloaterReg::instanceVisible("simple_snapshot");
const bool flickr_snapshot_visible = LLFloaterReg::instanceVisible("flickr");
const bool primfeed_snapshot_visible = LLFloaterReg::instanceVisible("primfeed"); // <FS:Beq/> Primfeed integration
@ -8220,17 +8601,7 @@ bool LLPipeline::renderSnapshotFrame(LLRenderTarget* src, LLRenderTarget* dst)
LLShaderMgr::SNAPSHOT_BORDER_THICKNESS,
(GLfloat)border_thickness);
shader->uniform3fv(
LLShaderMgr::SNAPSHOT_GUIDE_COLOR,
1,
guide_color().mV);
shader->uniform1f(
LLShaderMgr::SNAPSHOT_GUIDE_THICKNESS,
(GLfloat)guide_thickness);
shader->uniform1f(
LLShaderMgr::SNAPSHOT_GUIDE_STYLE,
(GLfloat)guide_style);
// Guides are rendered in a later UI pass; no additional uniforms required here.
mScreenTriangleVB->setBuffer();
mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
@ -8239,6 +8610,22 @@ bool LLPipeline::renderSnapshotFrame(LLRenderTarget* src, LLRenderTarget* dst)
shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage());
shader->unbind();
dst->flush();
if (show_frame && show_guides && gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
{
mSnapshotGuideState.active = true;
mSnapshotGuideState.show_guides = true;
mSnapshotGuideState.left = left;
mSnapshotGuideState.right = right;
mSnapshotGuideState.bottom = bottom;
mSnapshotGuideState.top = top;
mSnapshotGuideState.color = guide_color();
mSnapshotGuideState.thickness = guide_thickness();
mSnapshotGuideState.visibility = llclamp(guide_visibility_value, 0.f, 1.f);
mSnapshotGuideState.style = guide_style;
mSnapshotGuideState.golden_orientation = golden_orientation;
}
return true;
}
// </FS:Beq>
@ -8614,7 +9001,8 @@ void LLPipeline::renderFinalize()
gDeferredPostNoDoFNoiseProgram.unbind();
gGL.setSceneBlendType(LLRender::BT_ALPHA);
renderSnapshotGuidesOverlay(); // <FS:Beq/> Render snapshot guides as part of UI
renderFocusPoint(); // <FS:Beq/> FIRE-32023 render focus point
if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES))

View File

@ -354,6 +354,7 @@ public:
void renderHighlights();
bool renderVignette(LLRenderTarget* src, LLRenderTarget* dst);
bool renderSnapshotFrame(LLRenderTarget* src, LLRenderTarget* dst); // <FS:Beq/> Add snapshot frame rendering
void renderSnapshotGuidesOverlay(); // <FS:Beq/> Add snapshot composition guide rendering
void renderDebug();
void renderPhysicsDisplay();
@ -1023,6 +1024,39 @@ protected:
U32 mLightMask;
U32 mLightMovingMask;
// <FS:Beq> Add snapshot guides as part of UI rendering to avoid issues in compositor
struct SnapshotGuideState
{
enum class Style : U8
{
RuleOfThirds,
GoldenRatio,
Diagonal
};
enum class GoldenOrientation : U8
{
TopLeft,
TopRight,
BottomLeft,
BottomRight
};
bool active = false;
bool show_guides = false;
F32 left = 0.f;
F32 right = 1.f;
F32 bottom = 0.f;
F32 top = 1.f;
LLColor3 color = LLColor3(1.f, 1.f, 1.f);
F32 thickness = 0.f;
F32 visibility = 0.f;
Style style = Style::RuleOfThirds;
GoldenOrientation golden_orientation = GoldenOrientation::TopLeft;
};
SnapshotGuideState mSnapshotGuideState;
// </FS:Beq>
static bool sRenderPhysicalBeacons;
static bool sRenderMOAPBeacons;
static bool sRenderScriptedTouchBeacons;

View File

@ -10,10 +10,10 @@
single_instance="true"
reuse_instance="true"
title="Share to Primfeed"
height="638"
height="650"
width="272">
<panel
height="638"
height="650"
width="272"
visible="true"
name="background"
@ -27,7 +27,7 @@
tab_height="21"
tab_position="top"
top="7"
height="605"
height="625"
follows="all"
halign="center">
<panel

View File

@ -219,14 +219,27 @@
layout="topleft"
left="30"
top_pad="7"
width="180"
width="150"
name="show_guides" />
<button
enabled_control="FSSnapshotShowCaptureFrame"
layout="topleft"
left_pad="5"
top_delta="-20"
width="24"
height="24"
label="#"
font="SansSerifLarge"
tool_tip="Open frame guide settings"
name="guide_settings_btn">
<button.commit_callback function="Floater.Show" parameter="snapshot_guide_settings" />
</button>
<check_box
label="Freeze frame (fullscreen)"
layout="topleft"
height="16"
left="10"
top_pad="1"
top_pad="9"
width="180"
name="freeze_frame_check" />
<check_box

View File

@ -0,0 +1,114 @@
<?xml version="1.0" encoding="utf-8"?>
<floater
name="snapshot_guide_settings"
title="Frame Guide Settings"
can_dock="false"
can_resize="false"
width="250"
height="140"
min_height="140"
min_width="280"
layout="topleft"
translate="false">
<panel
follows="all"
border="false"
top="20"
left="10"
right="-10"
bottom="-10"
layout="topleft">
<text
top="0"
layout="topleft"
follows="top|left"
left="0"
height="16">
Guide Color and Appearance
</text>
<color_swatch
enabled_control="FSSnapshotShowGuides"
control_name="FSSnapshotFrameGuideColor"
layout="topleft"
left="0"
top_pad="0"
width="40"
height="65"
can_apply_immediately="true"
name="guide_color"
follows="left|top"
label="" />
<spinner
enabled_control="FSSnapshotShowGuides"
control_name="FSSnapshotFrameGuideWidth"
layout="topleft"
left_pad="10"
top_delta="0"
width="160"
label_width="120"
height="20"
decimal_digits="1"
increment="0.1"
min_val="0.0"
max_val="20.0"
label="Thickness (px)"
name="guide_thickness" />
<slider
enabled_control="FSSnapshotShowGuides"
control_name="FSSnapshotGuideVisibility"
label="Opacity"
layout="topleft"
left_pad="-160"
top_pad="8"
width="160"
height="18"
initial_value="0.5"
min_val="0.0"
max_val="1.0"
decimal_digits="2"
name="guide_opacity" />
<text
layout="topleft"
follows="top|left"
left="0"
height="16">
Guide Style
</text>
<combo_box
enabled_control="FSSnapshotShowGuides"
control_name="FSSnapshotGuideStyle"
layout="topleft"
left="0"
top_pad="4"
width="180"
height="23"
name="guide_style_combo"
tool_tip="Choose which framing guide to display">
<combo_box.item
name="rule_of_thirds"
label="Rule of Thirds"
value="rule_of_thirds" />
<combo_box.item
name="golden_ratio_top_left"
label="Golden Ratio (Top Left)"
value="golden_ratio_top_left" />
<combo_box.item
name="golden_ratio_top_right"
label="Golden Ratio (Top Right)"
value="golden_ratio_top_right" />
<combo_box.item
name="golden_ratio_bottom_left"
label="Golden Ratio (Bottom Left)"
value="golden_ratio_bottom_left" />
<combo_box.item
name="golden_ratio_bottom_right"
label="Golden Ratio (Bottom Right)"
value="golden_ratio_bottom_right" />
<combo_box.item
name="diagonal"
label="Diagonal"
value="diagonal" />
</combo_box>
</panel>
</floater>

View File

@ -136,24 +136,49 @@
width="251">
Refreshing...
</text>
<check_box
control_name="FSSnapshotShowCaptureFrame"
label="Show capture frame"
tool_tip="Show a frame on-screen that surrounds the areas of the snapshot. Parts of the scene that are outside of the snapshot will be de-saturated and slightly blurred."
layout="topleft"
left="10"
top_pad="7"
width="124"
name="show_frame" />
<check_box
enabled_control="FSSnapshotShowCaptureFrame"
control_name="FSSnapshotShowGuides"
label="Framing guide"
tool_tip="Show framing guide (rule of thirds) inside the snapshot frame."
layout="topleft"
left_pad="10"
width="60"
name="show_guides" />
<panel
height="38"
width="250"
visible="true"
name="options_panel"
top_pad="3"
follows="left|top|right"
layout="topleft"
right="-10"
left="10">
<check_box
control_name="FSSnapshotShowCaptureFrame"
label="Show Snapshot Frame"
tool_tip="Show a frame on-screen that surrounds the areas of the snapshot. Parts of the scene that are outside of the snapshot will be de-saturated and slightly blurred."
layout="topleft"
left="10"
top_pad="8"
width="110"
name="show_frame" />
<check_box
top_pad="8"
enabled_control="FSSnapshotShowCaptureFrame"
control_name="FSSnapshotShowGuides"
label="Show Composition Guide"
tool_tip="Show composition helper inside the snapshot frame."
layout="topleft"
left="10"
width="110"
name="show_guides" />
<button
enabled_control="FSSnapshotShowCaptureFrame"
layout="topleft"
left="226"
top_delta="-20"
width="25"
height="25"
label="#"
font="SansSerifLarge"
tool_tip="Open frame guide settings"
name="guide_settings_btn">
<button.commit_callback function="Floater.Show" parameter="snapshot_guide_settings" />
</button>
</panel>
<view_border
bevel_style="in"
follows="left|top"
@ -269,7 +294,7 @@
<text_editor
follows="left|top"
layout="topleft"
height="70"
height="35"
width="249"
left="10"
length="1"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<panel
height="590"
height="610"
width="272"
follows="all"
layout="topleft"
@ -137,33 +137,59 @@
width="251">
Refreshing...
</text>
<check_box
control_name="FSSnapshotShowCaptureFrame"
label="Show capture frame"
tool_tip="Show a frame on-screen that surrounds the areas of the snapshot. Parts of the scene that are outside of the snapshot will be de-saturated and slightly blurred."
layout="topleft"
left="10"
top_pad="7"
width="124"
name="show_frame" />
<check_box
enabled_control="FSSnapshotShowCaptureFrame"
control_name="FSSnapshotShowGuides"
label="Framing guide"
tool_tip="Show framing guide (rule of thirds) inside the snapshot frame."
layout="topleft"
left_pad="10"
width="60"
name="show_guides" />
<view_border
bevel_style="in"
follows="left|top"
layout="topleft"
height="1"
left="10"
name="refresh_border"
width="250"
top_pad="0" />
<panel
height="25"
width="250"
visible="true"
name="options_panel"
top_pad="3"
follows="left|top|right"
layout="topleft"
right="-10"
left="10"
>
<check_box
control_name="FSSnapshotShowCaptureFrame"
label="Show Snapshot Frame"
tool_tip="Show a frame on-screen that surrounds the areas of the snapshot. Parts of the scene that are outside of the snapshot will be de-saturated and slightly blurred."
layout="topleft"
left="10"
top_pad="8"
width="110"
name="show_frame" />
<check_box
top_pad="8"
enabled_control="FSSnapshotShowCaptureFrame"
control_name="FSSnapshotShowGuides"
label="Show Composition Guide"
tool_tip="Show composition helper inside the snapshot frame."
layout="topleft"
left="10"
width="110"
name="show_guides" />
<button
enabled_control="FSSnapshotShowCaptureFrame"
layout="topleft"
left="226"
top_delta="-20"
width="25"
height="25"
label="#"
font="SansSerifLarge"
tool_tip="Open frame guide settings"
name="guide_settings_btn">
<button.commit_callback function="Floater.Show" parameter="snapshot_guide_settings" />
</button>
</panel>
<view_border
bevel_style="in"
follows="left|top"
layout="topleft"
height="1"
left="10"
name="refresh_border"
width="250"
top_pad="14" />
<button
follows="left|top"
layout="topleft"
@ -242,133 +268,155 @@
type="string"
word_wrap="true">
</text_editor>
<check_box
follows="left|top"
<panel
height="90"
width="250"
visible="true"
name="options_panel"
top_pad="0"
follows="left|top|right"
layout="topleft"
initial_value="false"
label="Include location"
name="add_location_cb"
left="9"
height="16"
top_pad="8" />
<check_box
control_name="FSPrimfeedAddToPublicGallery"
follows="top|left"
layout="topleft"
initial_value="false"
label="Add to public gallery"
name="primfeed_add_to_public_gallery"
left="9"
height="16"
top_pad="8" />
<button
follows="top|left"
layout="topleft"
height="16"
image_pressed="Info_Press"
image_unselected="Info_Over"
name="info_btn_pub_gallery"
right="-3"
top_delta="-2"
width="16"
commit_callback.function="Primfeed.Info"
commit_callback.parameter="https://docs.primfeed.com/featured-content/public-gallery"
/>
<check_box
enabled_control="FSPrimfeedAddToPublicGallery"
control_name="FSPrimfeedCommercialContent"
follows="top|left"
layout="topleft"
initial_value="false"
label="Commercial content"
name="primfeed_commercial_content"
left="9"
height="16"
top_pad="8" />
<button
follows="top|left"
layout="topleft"
height="16"
image_pressed="Info_Press"
image_unselected="Info_Over"
right="-3"
top_delta="-2"
name="info_btn_commercial_content"
width="16"
commit_callback.function="Primfeed.Info"
commit_callback.parameter="https://docs.primfeed.com/legal/terms-of-service#commercial-content"
/>
<combo_box
control_name="FSPrimfeedPhotoRating"
follows="left|top"
layout="topleft"
top_pad="8"
left="10"
name="rating_combobox"
tool_tip="Primfeed content rating"
height="21"
width="235">
<combo_box.item
label="General"
name="GeneralRating"
value="1" />
<combo_box.item
label="Moderate"
name="ModerateRating"
value="2" />
<combo_box.item
label="Adult"
name="AdultRating"
value="3" />
<combo_box.item
label="Adult+"
name="AdultPlusRating"
value="4" />
</combo_box>
<button
follows="top|left"
layout="topleft"
height="16"
image_pressed="Info_Press"
image_unselected="Info_Over"
right="-3"
name="info_btn_ratings"
top_delta="0"
width="16"
commit_callback.function="Primfeed.Info"
commit_callback.parameter="https://docs.primfeed.com/help-and-faq/maturity-ratings"
/>
<check_box
control_name="FSPrimfeedOpenURLOnPost"
follows="top|left"
layout="topleft"
initial_value="false"
label="Open in browser after posting"
tool_tip="Automatically open the Primfeed post in your web browser after posting."
name="primfeed_open_url_on_post"
left="9"
height="16"
top_pad="8" />
<button
follows="left|top"
layout="topleft"
top_pad="8"
left="10"
height="23"
label="Share"
name="post_photo_btn"
width="100">
<button.commit_callback function="SocialSharing.SendPhoto" />
</button>
<button
follows="right|top"
layout="topleft"
height="23"
label="Cancel"
name="cancel_photo_btn"
right="-10"
top_delta="0"
width="100">
<button.commit_callback function="SocialSharing.Cancel" />
</button>
</panel>
left="10">
<check_box
follows="left|top"
layout="topleft"
initial_value="false"
label="Include location"
name="add_location_cb"
left="9"
height="16"
top_pad="4" />
<check_box
control_name="FSPrimfeedAddToPublicGallery"
follows="top|left"
layout="topleft"
initial_value="false"
label="Add to public gallery"
name="primfeed_add_to_public_gallery"
left="9"
height="16"
top_pad="4" />
<button
follows="top|left"
layout="topleft"
height="16"
image_pressed="Info_Press"
image_unselected="Info_Over"
name="info_btn_pub_gallery"
right="-3"
top_delta="-2"
width="16"
commit_callback.function="Primfeed.Info"
commit_callback.parameter="https://docs.primfeed.com/featured-content/public-gallery"
/>
<check_box
enabled_control="FSPrimfeedAddToPublicGallery"
control_name="FSPrimfeedCommercialContent"
follows="top|left"
layout="topleft"
initial_value="false"
label="Commercial content"
name="primfeed_commercial_content"
left="9"
height="16"
top_pad="4" />
<button
follows="top|left"
layout="topleft"
height="16"
image_pressed="Info_Press"
image_unselected="Info_Over"
right="-3"
top_delta="-2"
name="info_btn_commercial_content"
width="16"
commit_callback.function="Primfeed.Info"
commit_callback.parameter="https://docs.primfeed.com/legal/terms-of-service#commercial-content"
/>
<combo_box
control_name="FSPrimfeedPhotoRating"
follows="left|top"
layout="topleft"
top_pad="4"
left="10"
name="rating_combobox"
tool_tip="Primfeed content rating"
height="21"
width="215">
<combo_box.item
label="General"
name="GeneralRating"
value="1" />
<combo_box.item
label="Moderate"
name="ModerateRating"
value="2" />
<combo_box.item
label="Adult"
name="AdultRating"
value="3" />
<combo_box.item
label="Adult+"
name="AdultPlusRating"
value="4" />
</combo_box>
<button
follows="top|left"
layout="topleft"
height="16"
image_pressed="Info_Press"
image_unselected="Info_Over"
right="-3"
name="info_btn_ratings"
top_delta="0"
width="16"
commit_callback.function="Primfeed.Info"
commit_callback.parameter="https://docs.primfeed.com/help-and-faq/maturity-ratings"
/>
</panel>
<panel
height="50"
width="250"
visible="true"
name="options_panel"
top_pad="0"
follows="left|top|right"
layout="topleft"
right="-10"
left="10">
<check_box
control_name="FSPrimfeedOpenURLOnPost"
follows="top|left"
layout="topleft"
initial_value="false"
label="Open in browser after posting"
tool_tip="Automatically open the Primfeed post in your web browser after posting."
name="primfeed_open_url_on_post"
left="0"
height="16"
top="0"/>
<button
follows="left|top"
layout="topleft"
top_pad="4"
left="0"
height="23"
label="Share"
name="post_photo_btn"
width="100">
<button.commit_callback function="SocialSharing.SendPhoto" />
</button>
<button
follows="right|top"
layout="topleft"
height="23"
label="Cancel"
name="cancel_photo_btn"
right="-10"
top_delta="0"
width="100">
<button.commit_callback function="SocialSharing.Cancel" />
</button>
</panel>
</panel>