forked from bartvdbraak/blender
ce06d6d795
* Avoid some unneeded int castings, they were only needed in the original Texture Nodes implementation as custom1 and custom2 were shorts.
101 lines
2.8 KiB
Plaintext
101 lines
2.8 KiB
Plaintext
/*
|
|
* Copyright 2012, Blender Foundation.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#include "stdosl.h"
|
|
#include "node_texture.h"
|
|
|
|
/* Brick */
|
|
|
|
float brick_noise(int n) /* fast integer noise */
|
|
{
|
|
int nn;
|
|
n = (n >> 13) ^ n;
|
|
nn = (n * (n * n * 60493 + 19990303) + 1376312589) & 2147483647;
|
|
return 0.5 * ((float)nn / 1073741824.0);
|
|
}
|
|
|
|
float brick(point p, float mortar_size, float bias,
|
|
float BrickWidth, float row_height, float offset_amount, int offset_frequency,
|
|
float squash_amount, int squash_frequency, float tint)
|
|
{
|
|
int bricknum, rownum;
|
|
float offset = 0.0;
|
|
float brick_width = BrickWidth;
|
|
float x, y;
|
|
|
|
rownum = (int)floor(p[1] / row_height);
|
|
|
|
if (offset_frequency && squash_frequency) {
|
|
brick_width *= (rownum % squash_frequency) ? 1.0 : squash_amount; /* squash */
|
|
offset = (rownum % offset_frequency) ? 0.0 : (brick_width * offset_amount); /* offset */
|
|
}
|
|
|
|
bricknum = (int)floor((p[0] + offset) / brick_width);
|
|
|
|
x = (p[0] + offset) - brick_width * bricknum;
|
|
y = p[1] - row_height * rownum;
|
|
|
|
tint = clamp((brick_noise((rownum << 16) + (bricknum & 65535)) + bias), 0.0, 1.0);
|
|
|
|
return (x < mortar_size || y < mortar_size ||
|
|
x > (brick_width - mortar_size) ||
|
|
y > (row_height - mortar_size)) ? 1.0 : 0.0;
|
|
}
|
|
|
|
shader node_brick_texture(
|
|
int use_mapping = 0,
|
|
matrix mapping = matrix(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
float Offset = 0.5,
|
|
int OffsetFrequency = 2,
|
|
float Squash = 1.0,
|
|
int SquashFrequency = 1,
|
|
point Vector = P,
|
|
color Color1 = 0.2,
|
|
color Color2 = 0.8,
|
|
color Mortar = 0.0,
|
|
float Scale = 5.0,
|
|
float MortarSize = 0.02,
|
|
float Bias = 0.0,
|
|
float BrickWidth = 0.5,
|
|
float RowHeight = 0.25,
|
|
output float Fac = 0.0,
|
|
output color Color = 0.2)
|
|
{
|
|
point p = Vector;
|
|
|
|
if (use_mapping)
|
|
p = transform(mapping, p);
|
|
|
|
float tint = 0.0;
|
|
color Col = Color1;
|
|
|
|
Fac = brick(p * Scale, MortarSize, Bias, BrickWidth, RowHeight,
|
|
Offset, OffsetFrequency, Squash, SquashFrequency, tint);
|
|
|
|
if (Fac != 1.0) {
|
|
float facm = 1.0 - tint;
|
|
|
|
Col[0] = facm * (Color1[0]) + tint * Color2[0];
|
|
Col[1] = facm * (Color1[1]) + tint * Color2[1];
|
|
Col[2] = facm * (Color1[2]) + tint * Color2[2];
|
|
}
|
|
|
|
Color = (Fac == 1.0) ? Mortar: Col;
|
|
}
|
|
|