Make seed fixed for random number generator when using <texture mark="random"/>
Also improve documentation regarding texture height and width attributes. PiperOrigin-RevId: 648427167 Change-Id: I59a0fe75d3526f8563a5252584ed60ef7fb8fd70
This commit is contained in:
committed by
Copybara-Service
parent
c1ade85490
commit
f2c3be470f
+21
-15
@@ -1564,17 +1564,21 @@ still be specified here but this functionality is now deprecated and will be rem
|
|||||||
This and the remaining attributes control the generation of procedural textures. If the value of this attribute is
|
This and the remaining attributes control the generation of procedural textures. If the value of this attribute is
|
||||||
different from "none", the texture is treated as procedural and any file names are ignored. The keywords have the
|
different from "none", the texture is treated as procedural and any file names are ignored. The keywords have the
|
||||||
following meaning:
|
following meaning:
|
||||||
The **gradient** type generates a color gradient from rgb1 to rgb2. The interpolation in color space is done through
|
|
||||||
a sigmoid function. For cube and skybox textures the gradient is along the +Y axis, i.e., from top to bottom for
|
|
||||||
skybox rendering.
|
|
||||||
|
|
||||||
The **checker** type generates a 2-by-2 checker pattern with alternating colors given by rgb1 to rgb2. This is
|
**gradient**
|
||||||
suitable for rendering ground planes and also for marking objects with rotational symmetries. Note that 2d textures
|
Generates a color gradient from rgb1 to rgb2. The interpolation in color space is done through
|
||||||
can be scaled so as to repeat the pattern as many times as necessary. For cube and skybox textures, the checker
|
a sigmoid function. For cube and skybox textures the gradient is along the +Y axis, i.e., from top to bottom for
|
||||||
pattern is painted on each side of the cube.
|
skybox rendering.
|
||||||
|
|
||||||
The **flat** type fills the entire texture with rgb1, except for the bottom face of cube and skybox textures which is
|
**checker**
|
||||||
filled with rgb2.
|
Generates a 2-by-2 checker pattern with alternating colors given by rgb1 and rgb2. This is suitable for rendering
|
||||||
|
ground planes and also for marking objects with rotational symmetries. Note that 2d textures can be scaled so as
|
||||||
|
to repeat the pattern as many times as necessary. For cube and skybox textures, the checker pattern is painted on
|
||||||
|
each side of the cube.
|
||||||
|
|
||||||
|
**flat**
|
||||||
|
Fills the entire texture with rgb1, except for the bottom face of cube and skybox textures which is
|
||||||
|
filled with rgb2.
|
||||||
|
|
||||||
.. _asset-texture-rgb1:
|
.. _asset-texture-rgb1:
|
||||||
|
|
||||||
@@ -1604,21 +1608,23 @@ still be specified here but this functionality is now deprecated and will be rem
|
|||||||
|
|
||||||
:at:`random`: :at-val:`real, "0.01"`
|
:at:`random`: :at-val:`real, "0.01"`
|
||||||
When the mark attribute is set to "random", this attribute determines the probability of turning on each pixel. Note
|
When the mark attribute is set to "random", this attribute determines the probability of turning on each pixel. Note
|
||||||
that larger textures have more pixels, and the probability here is applied independently to each pixel - thus the
|
that larger textures have more pixels, and the probability here is applied independently to each pixel -- thus the
|
||||||
texture size and probability need to be adjusted jointly. Together with a gradient skybox texture, this can create
|
texture size and probability need to be adjusted jointly. Together with a gradient skybox texture, this can create
|
||||||
the appearance of a night sky with stars.
|
the appearance of a night sky with stars. The random number generator is initialized with a fixed seed.
|
||||||
|
|
||||||
.. _asset-texture-width:
|
.. _asset-texture-width:
|
||||||
|
|
||||||
:at:`width`: :at-val:`int, "0"`
|
:at:`width`: :at-val:`int, "0"`
|
||||||
The width of the procedural texture, i.e., the number of columns in the image. For cube and skybox procedural
|
The width of a procedural texture, i.e., the number of columns in the image. Larger values usually result in higher
|
||||||
textures the width and height must be equal. Larger values usually result in higher quality images, although in some
|
quality images, although in some cases (e.g. checker patterns) small values are sufficient. For textures loaded from
|
||||||
cases (e.g. checker patterns) small values are sufficient.
|
files, this attribute is ignored.
|
||||||
|
|
||||||
.. _asset-texture-height:
|
.. _asset-texture-height:
|
||||||
|
|
||||||
:at:`height`: :at-val:`int, "0"`
|
:at:`height`: :at-val:`int, "0"`
|
||||||
The height of the procedural texture, i.e., the number of rows in the image.
|
The height of the procedural texture, i.e., the number of rows in the image. For cube and skybox textures, this
|
||||||
|
attribute is ignored and the height is set to 6 times the width. For textures loaded from files, this attribute is
|
||||||
|
ignored.
|
||||||
|
|
||||||
.. _asset-texture-hflip:
|
.. _asset-texture-hflip:
|
||||||
|
|
||||||
|
|||||||
@@ -19,11 +19,11 @@
|
|||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cstdlib>
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
#include <random>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
@@ -3227,9 +3227,15 @@ mjCTexture::~mjCTexture() {
|
|||||||
// insert random dots
|
// insert random dots
|
||||||
static void randomdot(unsigned char* rgb, const double* markrgb,
|
static void randomdot(unsigned char* rgb, const double* markrgb,
|
||||||
int width, int height, double probability) {
|
int width, int height, double probability) {
|
||||||
|
// make distribution using fixed seed
|
||||||
|
std::mt19937_64 rng;
|
||||||
|
rng.seed(42);
|
||||||
|
std::uniform_real_distribution<double> dist(0, 1);
|
||||||
|
|
||||||
|
// sample
|
||||||
for (int r=0; r<height; r++) {
|
for (int r=0; r<height; r++) {
|
||||||
for (int c=0; c<width; c++) {
|
for (int c=0; c<width; c++) {
|
||||||
if (rand()<probability*RAND_MAX) {
|
if (dist(rng)<probability) {
|
||||||
for (int j=0; j<3; j++) {
|
for (int j=0; j<3; j++) {
|
||||||
rgb[3*(r*width+c)+j] = (mjtByte)(255*markrgb[j]);
|
rgb[3*(r*width+c)+j] = (mjtByte)(255*markrgb[j]);
|
||||||
}
|
}
|
||||||
@@ -3779,14 +3785,18 @@ void mjCTexture::Compile(const mjVFS* vfs) {
|
|||||||
|
|
||||||
// builtin
|
// builtin
|
||||||
if (builtin != mjBUILTIN_NONE) {
|
if (builtin != mjBUILTIN_NONE) {
|
||||||
// check size
|
// check width
|
||||||
if (width<1 || height<1) {
|
if (width<1) {
|
||||||
throw mjCError(this, "Invalid width or height of builtin texture");
|
throw mjCError(this, "Invalid width of builtin texture");
|
||||||
}
|
}
|
||||||
|
|
||||||
// adjust height of cube texture
|
// adjust height of cube texture
|
||||||
if (type != mjTEXTURE_2D) {
|
if (type != mjTEXTURE_2D) {
|
||||||
height = 6*width;
|
height = 6*width;
|
||||||
|
} else {
|
||||||
|
if (height<1) {
|
||||||
|
throw mjCError(this, "Invalid height of builtin texture");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// allocate data
|
// allocate data
|
||||||
|
|||||||
@@ -815,6 +815,26 @@ TEST_F(MjCHFieldTest, PngMap) {
|
|||||||
mj_deleteModel(model);
|
mj_deleteModel(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ------------- test textures -------------------------------------------------
|
||||||
|
|
||||||
|
using MjCTextureTest = MujocoTest;
|
||||||
|
|
||||||
|
TEST_F(MjCTextureTest, TexturesLoad) {
|
||||||
|
static constexpr char xml[] = R"(
|
||||||
|
<mujoco>
|
||||||
|
<asset>
|
||||||
|
<texture name="body" type="cube" builtin="flat" mark="cross" width="8"
|
||||||
|
rgb1="0.8 0.6 0.4" rgb2="0.8 0.6 0.4" markrgb="1 1 1"/>
|
||||||
|
</asset>
|
||||||
|
</mujoco>
|
||||||
|
)";
|
||||||
|
std::array<char, 1024> error;
|
||||||
|
mjModel* m = LoadModelFromString(xml, error.data(), error.size());
|
||||||
|
ASSERT_THAT(m, NotNull()) << error.data();
|
||||||
|
|
||||||
|
mj_deleteModel(m);
|
||||||
|
}
|
||||||
|
|
||||||
// ------------- test quaternion normalization----------------------------------
|
// ------------- test quaternion normalization----------------------------------
|
||||||
|
|
||||||
using QuatNorm = MujocoTest;
|
using QuatNorm = MujocoTest;
|
||||||
|
|||||||
Reference in New Issue
Block a user