mirror of
https://github.com/stevenrobertson/cuburn.git
synced 2025-02-05 11:40:04 -05:00
Color palette (sort of)
This commit is contained in:
parent
a43973f0ff
commit
b710de4865
@ -2,7 +2,7 @@
|
|||||||
The main iteration loop.
|
The main iteration loop.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from ctypes import byref
|
from ctypes import byref, memset, sizeof
|
||||||
|
|
||||||
import pycuda.driver as cuda
|
import pycuda.driver as cuda
|
||||||
from pycuda.driver import In, Out, InOut
|
from pycuda.driver import In, Out, InOut
|
||||||
@ -25,6 +25,11 @@ class IterCode(HunkOCode):
|
|||||||
bodies.append(iterbody)
|
bodies.append(iterbody)
|
||||||
self.defs = '\n'.join(bodies)
|
self.defs = '\n'.join(bodies)
|
||||||
|
|
||||||
|
decls = """
|
||||||
|
// Note: for normalized lookups, uchar4 actually returns floats
|
||||||
|
texture<uchar4, cudaTextureType2D, cudaReadModeNormalizedFloat> palTex;
|
||||||
|
"""
|
||||||
|
|
||||||
def _xfbody(self, xfid, xform):
|
def _xfbody(self, xfid, xform):
|
||||||
px = self.packer.view('info', 'xf%d_' % xfid)
|
px = self.packer.view('info', 'xf%d_' % xfid)
|
||||||
px.sub('xf', 'cp.xforms[%d]' % xfid)
|
px.sub('xf', 'cp.xforms[%d]' % xfid)
|
||||||
@ -65,7 +70,7 @@ void iter(mwc_st *msts, const iter_info *infos, float *accbuf, float *denbuf) {
|
|||||||
const iter_info *info = &(infos[blockIdx.x]);
|
const iter_info *info = &(infos[blockIdx.x]);
|
||||||
|
|
||||||
int consec_bad = -{{features.fuse}};
|
int consec_bad = -{{features.fuse}};
|
||||||
int nsamps = 500;
|
int nsamps = 2560;
|
||||||
|
|
||||||
float x, y, color;
|
float x, y, color;
|
||||||
x = mwc_next_11(&rctx);
|
x = mwc_next_11(&rctx);
|
||||||
@ -106,11 +111,14 @@ void iter(mwc_st *msts, const iter_info *infos, float *accbuf, float *denbuf) {
|
|||||||
// TODO: dither?
|
// TODO: dither?
|
||||||
int i = ((int)((y + 1.0f) * 255.0f) * 512)
|
int i = ((int)((y + 1.0f) * 255.0f) * 512)
|
||||||
+ (int)((x + 1.0f) * 255.0f);
|
+ (int)((x + 1.0f) * 255.0f);
|
||||||
accbuf[i*4] += color < 0.5f ? (1.0f - 2.0f * color) : 0.0f;
|
|
||||||
accbuf[i*4+1] += 1.0f - 2.0f * fabsf(0.5f - color);
|
|
||||||
accbuf[i*4+2] += color > 0.5f ? color * 2.0f - 1.0f : 0.0f;
|
|
||||||
accbuf[i*4+3] += 1.0f;
|
|
||||||
|
|
||||||
|
// since info was declared const, C++ barfs unless it's loaded first
|
||||||
|
float cp_step_frac = {{packer.get('cp_step_frac')}};
|
||||||
|
float4 outcol = tex2D(palTex, cp_step_frac, color);
|
||||||
|
accbuf[i*4] += outcol.x;
|
||||||
|
accbuf[i*4+1] += outcol.y;
|
||||||
|
accbuf[i*4+2] += outcol.z;
|
||||||
|
accbuf[i*4+3] += outcol.w;
|
||||||
denbuf[i] += 1.0f;
|
denbuf[i] += 1.0f;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -137,16 +145,33 @@ def silly(features, cps):
|
|||||||
cps_as_array[i] = cp
|
cps_as_array[i] = cp
|
||||||
|
|
||||||
cp = Genome()
|
cp = Genome()
|
||||||
|
memset(byref(cp), 0, sizeof(cp))
|
||||||
infos = []
|
infos = []
|
||||||
|
|
||||||
|
# TODO: move this into a common function
|
||||||
|
pal = np.empty((16, 256, 4), dtype=np.uint8)
|
||||||
|
sampAt = [int(i/15.*(nsteps-1)) for i in range(16)]
|
||||||
|
|
||||||
for n in range(nsteps):
|
for n in range(nsteps):
|
||||||
flam3_interpolate(cps_as_array, 2, (n - nsteps/2) * 0.001, 0, byref(cp))
|
flam3_interpolate(cps_as_array, 2, (n - nsteps/2) * 0.001, 0, byref(cp))
|
||||||
cp._init()
|
cp._init()
|
||||||
infos.append(iter.packer.pack(cp=cp))
|
if n in sampAt:
|
||||||
|
pidx = sampAt.index(n)
|
||||||
|
for i, e in enumerate(cp.palette.entries):
|
||||||
|
pal[pidx][i] = np.uint8(np.array(e.color) * 255.0)
|
||||||
|
infos.append(iter.packer.pack(cp=cp, cp_step_frac=float(n)/nsteps))
|
||||||
infos = np.concatenate(infos)
|
infos = np.concatenate(infos)
|
||||||
|
|
||||||
|
dpal = cuda.make_multichannel_2d_array(pal, 'C')
|
||||||
|
tref = mod.get_texref('palTex')
|
||||||
|
tref.set_array(dpal)
|
||||||
|
tref.set_format(cuda.array_format.UNSIGNED_INT8, 4)
|
||||||
|
tref.set_flags(cuda.TRSF_NORMALIZED_COORDINATES)
|
||||||
|
|
||||||
fun = mod.get_function("iter")
|
fun = mod.get_function("iter")
|
||||||
fun(InOut(seeds), In(infos), InOut(abuf), InOut(dbuf),
|
t = fun(InOut(seeds), In(infos), InOut(abuf), InOut(dbuf),
|
||||||
block=(512,1,1), grid=(nsteps,1), time_kernel=True)
|
block=(512,1,1), grid=(nsteps,1), time_kernel=True)
|
||||||
|
print "Completed render in %g seconds" % t
|
||||||
|
|
||||||
return abuf, dbuf
|
return abuf, dbuf
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user