[FIRE-35342] Fix frame guide rendering inside the scene

Add UI for controlling the settings, add new styles.
Snapshot guide with golden ratio options
Adds golden ratio composition guides to the snapshot tool, including options for different orientations (top-left, top-right, bottom-left, bottom-right).
Also refactors the snapshot guide settings into a separate floater for better organization.
master
Beq 2025-10-11 18:39:38 +01:00
parent 911b4e810c
commit 3b33e548f4
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>