diff --git a/indra/llmath/llquantize.h b/indra/llmath/llquantize.h index 10c950abbb01e1a2d346014212ed168663f7d526..f685309e658ce1413358e914f07d6cb7609ec209 100644 --- a/indra/llmath/llquantize.h +++ b/indra/llmath/llquantize.h @@ -43,6 +43,7 @@ LL_ALIGN_16( const F32 F_OOU8MAX_4A[4] ) = { OOU8MAX, OOU8MAX, OOU8MAX, OOU8MAX const U8 FIRSTVALIDCHAR = 54; const U8 MAXSTRINGVAL = U8MAX - FIRSTVALIDCHAR; //we don't allow newline or null +const U32 U24MAX = 16777215; inline U16 F32_to_U16_ROUND(F32 val, F32 lower, F32 upper) { @@ -107,6 +108,16 @@ inline U8 F32_to_U8(F32 val, F32 lower, F32 upper) return (U8)(llfloor(val*U8MAX)); } +inline U32 F32_to_U32(F32 val, F32 lower, F32 upper) +{ + val = llclamp(val, lower, upper); + // make sure that the value is positive and normalized to <0, 1> + val -= lower; + val /= (upper - lower); + + return (U32)(ll_round(val*U24MAX)); +} + inline F32 U8_to_F32(U8 ival, F32 lower, F32 upper) { F32 val = ival*OOU8MAX; @@ -130,7 +141,7 @@ inline U8 F32_TO_STRING(F32 val, F32 lower, F32 upper) val -= lower; //[0, upper-lower] val /= (upper - lower); //[0,1] val = val * MAXSTRINGVAL; //[0, MAXSTRINGVAL] - val = floor(val + 0.5f); //[0, MAXSTRINGVAL] + val = floorf(val + 0.5f); //[0, MAXSTRINGVAL] U8 stringVal = (U8)(val) + FIRSTVALIDCHAR; //[FIRSTVALIDCHAR, MAXSTRINGVAL + FIRSTVALIDCHAR] return stringVal; diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 5f77a55092b22147dd1a9323bfe161ecb3c05b67..448e081a1cd26a880ca1490adc7eb8c9671207fe 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -140,6 +140,8 @@ LLSnapshotModel::ESnapshotLayerType LLFloaterSnapshot::Impl::getLayerType(LLFloa type = LLSnapshotModel::SNAPSHOT_TYPE_COLOR; else if (id == "depth") type = LLSnapshotModel::SNAPSHOT_TYPE_DEPTH; + else if (id == "depth24") + type = LLSnapshotModel::SNAPSHOT_TYPE_DEPTH24; return type; } diff --git a/indra/newview/llsnapshotmodel.h b/indra/newview/llsnapshotmodel.h index fd251349ba5efcd4fb90bf427e14945ae713004b..77a151060cc601a538c1bb9813163789249f1a70 100644 --- a/indra/newview/llsnapshotmodel.h +++ b/indra/newview/llsnapshotmodel.h @@ -49,7 +49,8 @@ class LLSnapshotModel typedef enum { SNAPSHOT_TYPE_COLOR, - SNAPSHOT_TYPE_DEPTH + SNAPSHOT_TYPE_DEPTH, + SNAPSHOT_TYPE_DEPTH24 } ESnapshotLayerType; }; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index e1dd9fd374092f87c24e5d7f761cf0129a349bc3..ae4c340500926bf6409b58e4f3d39151a46e1aa0 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -5141,7 +5141,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei if ((image_width <= gGLManager.mGLMaxTextureSize && image_height <= gGLManager.mGLMaxTextureSize) && (image_width > window_width || image_height > window_height) && LLPipeline::sRenderDeferred && !show_ui) { - U32 color_fmt = type == LLSnapshotModel::SNAPSHOT_TYPE_DEPTH ? GL_DEPTH_COMPONENT : GL_RGBA; + U32 color_fmt = (type == LLSnapshotModel::SNAPSHOT_TYPE_DEPTH || type == LLSnapshotModel::SNAPSHOT_TYPE_DEPTH24) ? GL_DEPTH_COMPONENT : GL_RGBA; if (scratch_space.allocate(image_width, image_height, color_fmt, true, true)) { original_width = gPipeline.mDeferredScreen.getWidth(); @@ -5287,6 +5287,36 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei raw->getData() + output_buffer_offset ); } + else if (type == LLSnapshotModel::SNAPSHOT_TYPE_DEPTH24) + { + LLPointer<LLImageRaw> depth_line_buffer = new LLImageRaw(read_width, 1, sizeof(GLfloat)); // need to store floating point values + glReadPixels( + subimage_x_offset, out_y + subimage_y_offset, + read_width, 1, + GL_DEPTH_COMPONENT, GL_FLOAT, + depth_line_buffer->getData()// current output pixel is beginning of buffer... + ); + + for (S32 i = 0; i < (S32)read_width; i++) + { + F32 depth_float = *(F32*)(depth_line_buffer->getData() + (i * sizeof(F32))); + + F32 linear_depth_float = 1.f / (depth_conversion_factor_1 - (depth_float * depth_conversion_factor_2)); + U32 RGB24 = F32_to_U32(linear_depth_float, viewerCamera.getNear(), viewerCamera.getFar()); + //A max value of 16777215 for RGB24 evaluates to black when it shold be white. The clamp assures that the divisions do not somehow become >=256. + U8 depth_byteR = (U8)(llclamp(llfloor(RGB24 / 65536.f), 0, 255)); + U8 depth_byteG = (U8)(llclamp(llfloor((RGB24 - depth_byteR * 65536) / 256.f), 0, 255)); + U8 depth_byteB = (U8)(llclamp((RGB24 - depth_byteR * 65536 - depth_byteG * 256), 0u, 255u)); + // write converted scanline out to result image + *(raw->getData() + output_buffer_offset + (i * raw->getComponents())) = depth_byteR; + *(raw->getData() + output_buffer_offset + (i * raw->getComponents()) + 1) = depth_byteG; + *(raw->getData() + output_buffer_offset + (i * raw->getComponents()) + 2) = depth_byteB; + for (S32 j = 3; j < raw->getComponents(); j++) + { + *(raw->getData() + output_buffer_offset + (i * raw->getComponents()) + j) = depth_byteR; + } + } + } else // LLSnapshotModel::SNAPSHOT_TYPE_DEPTH { LLPointer<LLImageRaw> depth_line_buffer = new LLImageRaw(read_width, 1, sizeof(GLfloat)); // need to store floating point values diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index f441e3cbd7eba15775786768876423e3caf7a086..bccf0426bfbbee89ad988428ee6384a476d70d11 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -160,6 +160,10 @@ label="Depth" name="Depth" value="depth" /> + <combo_box.item + label="Depth (24 bit)" + name="Depth24" + value="depth24" /> </combo_box> <check_box label="Interface"