[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
parent
911b4e810c
commit
3b33e548f4
|
|
@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>);
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Reference in New Issue