Skip to content

Instantly share code, notes, and snippets.

@z0w0
Created March 18, 2011 04:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save z0w0/875604 to your computer and use it in GitHub Desktop.
Save z0w0/875604 to your computer and use it in GitHub Desktop.
A Perlin Noise class for TorqueScript.
function perlin::onAdd(%this)
{
%this.pl = "151160\t137\t91\t90\t15\t131\t13\t201\t95\t96\t53\t194\t233\t7\t225\t140\t36\t103\t30\t69\t142\t8\t99\t37\t240\t21\t10\t23\t190\t6\t148\t247\t120\t234\t75\t0\t26\t197\t62\t94\t252\t219\t203\t117\t35\t11\t32\t57\t177\t33\t88\t237\t149\t56\t87\t174\t20\t125\t136\t171\t168\t68\t175\t74\t165\t71\t134\t139\t48\t27\t166\t77\t146\t158\t231\t83\t111\t229\t122\t60\t211\t133\t230\t220\t105\t92\t41\t55\t46\t245\t40\t244\t102\t143\t54\t65\t25\t63\t161\t1\t216\t80\t73\t209\t76\t132\t187\t208\t89\t18\t169\t200\t196\t135\t130\t116\t188\t159\t86\t164\t100\t109\t198\t173\t186\t3\t64\t52\t217\t226\t250\t124\t123\t5\t202\t38\t147\t118\t126\t255\t82\t85\t212\t207\t206\t59\t227\t47\t16\t58\t17\t182\t189\t28\t42\t223\t183\t170\t213\t119\t248\t152\t2\t44\t154\t163\t70\t221\t153\t101\t155\t167\t43\t172\t9\t129\t22\t39\t253\t19\t98\t108\t110\t79\t113\t224\t232\t178\t185\t112\t104\t218\t246\t97\t228\t251\t34\t242\t193\t238\t210\t144\t12\t191\t179\t162\t241\t81\t51\t145\t235\t249\t14\t239\t107\t49\t192\t214\t31\t181\t199\t106\t157\t184\t84\t204\t176\t115\t121\t50\t45\t127\t4\t150\t254\t138\t236\t205\t93\t222\t114\t67\t29\t24\t72\t243\t141\t128\t195\t78\t66\t215\t61\t156\t180";
for(%i=0;%i<256;%i++)
{
%field = getField(%this.pl,%i);
if(%field $= "")
continue;
%this.p[%i] = %field;
%this.p[256 + %i] = %field;
}
}
function perlin::fade(%this,%t)
{
return %t * %t * %t * (%t * (%t * 6 - 15) + 10);
}
function perlin::lerp(%this,%t,%a,%b)
{
return %a + %t * (%b - %a);
}
function perlin::grad(%this,%hash,%x,%y,%z)
{
%h = %hash & 15;
%u = %h < 8 ? %x : %y;
%v = %h < 4 ? %y : %h == 12 || %h == 14 ? %x : %z;
return ((%h & 1) == 0 ? %u : -%u) + ((%h & 2) == 0 ? %v : -%v);
}
function perlin::noise(%this,%x,%y,%z)
{
%floorX = mFloor(%x);
%floorY = mFloor(%y);
%floorZ = mFloor(%z);
%nx = %floorX & 255;
%ny = %floorY & 255;
%nz = %floorZ & 255;
%x -= %floorX;
%y -= %floorY;
%z -= %floorZ;
%xMinus1 = %x - 1;
%yMinus1 = %y - 1;
%zMinus1 = %z - 1;
%u = %this.fade(%x);
%v = %this.fade(%y);
%w = %this.fade(%z);
%a = %this.p[%nx] + %ny;
%aa = %this.p[%a] + %nz;
%ab = %this.p[%a + 1] + %nz;
%b = %this.p[%nx + 1] + %ny;
%ba = %this.p[%b] + %nz;
%bb = %this.p[%b + 1] + %nz;
return %this.lerp(%w,%this.lerp(%v,%this.lerp(%u,%this.grad(%this.p[%aa],%x,%y,%z),%this.grad(%this.p[%ba],%xMinus1,%y,%z)),%this.lerp(%u,%this.grad(%this.p[%ab],%x,%yMinus1,%z),%this.grad(%this.p[%bb],%xMinus1,%yMinus1,%z))),%this.lerp(%v,%this.lerp(%u,%this.grad(%this.p[%aa + 1],%x,%y,%zMinus1),%this.grad(%this.p[%ba + 1],%xMinus1,%y,%z - 1)),%this.lerp(%u,%this.grad(%this.p[%ab + 1],%x,%yMinus1,%zMinus1),%this.grad(%this.p[%bb + 1],%xMinus1,%yMinus1,%zMinus1))));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment