Converting c++ to VB
I need to convert the c++ code written by druid called "Spectral Synthesis for Creating Terrain" located here on this website
http://www.gamedev.net/reference/programming/features/noiseterrain
It has been a long time since I have worked with c++ and I just cannot remember/grasp some of the concepts.
I have converted almost all of it (it is pretty short), but I still have a few questions.
Will anyone help me?
Chris
Here is the code... There is a function that he uses called spline() that I found in some of his other code.. it is at the bottom. He also uses SRANDOM. I found the definition of it in some of this other code... it is this...
I hope I provided enough info.
Chris
[edited by - Yann L on May 7, 2003 6:38:15 PM]
#define RANDMASK RAND_MAX#define MRANDOM (float)(rand() & (RANDMASK))/(RANDMASK)#define SRANDOM ((MRANDOM) * 2) - 1// Here is the main code./* * fracSynthPass(...) * * generate basic points * interpolate along spline & scale * add to existing hbuffer */void fracSynthPass( float *hbuf, float freq, float zscale, int xres, int zres ){ int i; int x, z; float *val; int max; float dfx, dfz; float *zknots, *knots; float xk, zk; float *hlist; float *buf; // how many to generate (need 4 extra for smooth 2d spline interpolation) max = freq + 2; // delta x and z - pixels per spline segment dfx = xres / (freq-1); dfz = zres / (freq-1); // the generated values - to be equally spread across buf val = (float*)calloc( sizeof(float)*max*max, 1 ); // intermediately calculated spline knots (for 2d) zknots = (float*)calloc( sizeof(float)*max, 1 ); // horizontal lines through knots hlist = (float*)calloc( sizeof(float)*max*xres, 1 ); // local buffer - to be added to hbuf buf = (float*)calloc( sizeof(float)*xres*zres, 1 ); // start at -dfx, -dfz - generate knots for( z=0; z < max; z++ ) { for( x=0;x < max;x++ ) { val[z*max+x] = SRANDOM; } } // interpolate horizontal lines through knots for( i=0;i < max;i++ ) { knots = &val[i*max]; xk = 0; for( x=0;x < xres;x++ ) { hlist[i*xres+x] = spline( xk/dfx, 4, knots ); xk += 1; if( xk >= dfx ) { xk -= dfx; knots++; } } } // interpolate all vertical lines for( x=0;x < xres;x++ ) { zk = 0; knots = zknots; // build knot list for( i=0;i < max;i++ ) { knots[i] = hlist[i*xres+x]; } for( z=0;z < zres;z++ ) { buf[z*xres+x] = spline( zk/dfz, 4, knots ) * zscale; zk += 1; if( zk >= dfz ) { zk -= dfz; knots++; } } } // update hbuf for( z=0;z < zres;z++ ) for( x=0;x < xres;x++ ) hbuf[z*xres+x] += buf[z*xres+x]; free( val ); free( buf ); free( hlist ); free( zknots );}// here is the spline function codefloat spline( float x, int nknots, float *knot ){ int span; int nspans = nknots - 3; float c0, c1, c2, c3; // coefficients of the cubic if( nspans < 1) { // illegal return 0; } // find the appropriate 4-point span of the spline x = (x < 0 ? 0 : (x > 1 ? 1 : x)) * nspans; span = (int) x; if( span >= nknots -3 ) span = nknots - 3; x -= span; knot += span; // evaluate the span cubic at x using horner's rule c3 = CR00*knot[0] + CR01*knot[1] + CR02*knot[2] + CR03*knot[3]; c2 = CR10*knot[0] + CR11*knot[1] + CR12*knot[2] + CR13*knot[3]; c1 = CR20*knot[0] + CR21*knot[1] + CR22*knot[2] + CR23*knot[3]; c0 = CR30*knot[0] + CR31*knot[1] + CR32*knot[2] + CR33*knot[3]; return ((c3*x + c2)*x + c1)*x + c0;}// here are the definitions of CR00 thru CR33#define CR00 -0.5#define CR01 1.5#define CR02 -1.5#define CR03 0.5#define CR10 1.0#define CR11 -2.5#define CR12 2.0#define CR13 -0.5#define CR20 -0.5#define CR21 0.0#define CR22 0.5#define CR23 0.0#define CR30 0.0#define CR31 1.0#define CR32 0.0#define CR33 0.0
I hope I provided enough info.
Chris
[edited by - Yann L on May 7, 2003 6:38:15 PM]
Here is what I have so far...
I know it is not the most optimized, but I can do that later.
Thank you for any help
[edited by - Yann L on May 7, 2003 6:39:05 PM]
I know it is not the most optimized, but I can do that later.
Thank you for any help
Public Sub fracSynthPass(ByRef hbuf() As Double, freq As Double, zscale As Double, xres As Integer, zres As Integer) Dim SRANDOM As Double SRANDOM = (((Rnd And (32767)) / (32767)) * 2) - 1 Dim i As Integer Dim x As Integer Dim z As Integer Dim val() As Double Dim max As Integer Dim dfx As Double Dim dfz As Double Dim zknots() As Double Dim knots() As Double Dim xk As Double Dim zk As Double Dim hlist() As Double Dim buf() As Double max = freq + 2' // delta x and z - pixels per spline segment dfx = xres / (freq - 1) dfz = zres / (freq - 1)'' // the generated values - to be equally spread across buf ReDim val(max * max)' // intermediately calculated spline knots (for 2d) ReDim zknots(max)'' // horizontal lines through knots ReDim hlist(max * xres)' // local buffer - to be added to hbuf ReDim buf(xres * zres)' For z = 0 To max For x = 0 To max val(z * max + x) = (((Rnd And (32767)) / (32767)) * 2) - 1 Next Next Dim knotscounter As Integer knotscounter = 0 For i = 0 To max knots(xk) = val(i * max) xk = 0 For x = 0 To xres hlist(i * xres + x) = spline(xk / dfx, 4, knots) xk = xk + 1 If xk >= dfx Then xk = xk - dfx knotscounter = knotscounter + 1 End If Next Next knotscounter = 0 For x = 0 To xres zk = 0 ReDim knots(UBound(zknots, 1)) For i = 0 To UBound(zknots, 1) knots(i) = zknots(i) Next For i = 0 To max knots(i) = hlist(i * xres + x) Next For z = 0 To zres buf(z * xres + x) = spline(zk / dfz, 4, knots) * zscale zk = zk + 1 If zk >= dfz Then zk = zk - dfz knotscounter = knotscounter + 1 End If Next Next For z = 0 To zres For x = 0 To xres hbuf(z * xres + x) = hbuf(z * xres + x) + buf(z * xres + x) Next NextEnd SubFunction spline(x As Double, nknots As Integer, knot() As Double) As Double '// basis matrix for spline interpolation Dim CR00 As Double Dim CR01 As Double Dim CR02 As Double Dim CR03 As Double Dim CR10 As Double Dim CR11 As Double Dim CR12 As Double Dim CR13 As Double Dim CR20 As Double Dim CR21 As Double Dim CR22 As Double Dim CR23 As Double Dim CR30 As Double Dim CR31 As Double Dim CR32 As Double Dim CR33 As Double CR00 = -0.5 CR01 = 1.5 CR02 = -1 CR03 = 0.5 CR10 = 1 CR11 = -2 CR12 = 2 CR13 = -0 CR20 = -0 CR21 = 0 CR22 = 0.5 CR23 = 0 CR30 = 0 CR31 = 1 CR32 = 0 Dim span As Integer Dim nspans As Integer nspans = nknots - 3 Dim c0 As Double Dim c1 As Double Dim c2 As Double Dim c3 As Double If nspans < 1 Then 'illegal spline = 0 Exit Function End If If x < 0 Then x = 0 Else If x > 1 Then x = 1 * nspans Else x = x * nspans End If End If span = CInt(x) If span >= nknots - 3 Then span = nknots - 3 End If x = x - span knot = knot + span ' // evaluate the span cubic at x using horner's rule c3 = CR00 * knot(0) + CR01 * knot(1) + CR02 * knot(2) + CR03 * knot(3) c2 = CR10 * knot(0) + CR11 * knot(1) + CR12 * knot(2) + CR13 * knot(3) c1 = CR20 * knot(0) + CR21 * knot(1) + CR22 * knot(2) + CR23 * knot(3) c0 = CR30 * knot(0) + CR31 * knot(1) + CR32 * knot(2) + CR33 * knot(3) spline = ((c3 * x + c2) * x + c1) * x + c0End Function
[edited by - Yann L on May 7, 2003 6:39:05 PM]
Mine eyes. I''ll give you the best advice I can. Not intending to be a putz or anything, but it truly is the best way to go about it.
Use C++.
Use C++.
nexguy, if you''re posting more than a few lines of code, then please use the source tags. Thanks.
Other than that, I really can''t help you, sorry. I''ve never used VB in my life...
Other than that, I really can''t help you, sorry. I''ve never used VB in my life...
quote:Original post by nexguy
Here is what I have so far...
I know it is not the most optimized, but I can do that later.
Thank you for any help
Public Sub fracSynthPass(ByRef hbuf() As Double, freq As Double, zscale As Double, xres As Integer, _ zres As Integer) 'when text goes out of the immediate window(not debug mode), _ you can use the underscore char to tell the _ compiler that the statement continues on the next line Dim SRANDOM As Double SRANDOM = (((Rnd And (32767)) / (32767)) * 2) - 1 Dim i As Integer Dim x As Integer Dim z As Integer Dim val() As Double Dim max As Integer Dim dfx As Double Dim dfz As Double Dim zknots() As Double Dim knots() As Double Dim xk As Double Dim zk As Double Dim hlist() As Double Dim buf() As Double max = freq + 2' // delta x and z - pixels per spline segment dfx = xres / (freq - 1) dfz = zres / (freq - 1)'' // the generated values - to be equally spread across buf ReDim val(max * max)' // intermediately calculated spline knots (for 2d) ReDim zknots(max)'' // horizontal lines through knots ReDim hlist(max * xres)' // local buffer - to be added to hbuf ReDim buf(xres * zres)' For z = 0 To max For x = 0 To max val(z * max + x) = (((Rnd And (32767)) / (32767)) * 2) - 1 Next Next Dim knotscounter As Integer knotscounter = 0 For i = 0 To max knots(xk) = val(i * max) xk = 0 For x = 0 To xres hlist(i * xres + x) = spline(xk / dfx, 4, knots) xk = xk + 1 If xk >= dfx Then xk = xk - dfx knotscounter = knotscounter + 1 End If Next Next knotscounter = 0 For x = 0 To xres zk = 0 ReDim knots(UBound(zknots, 1)) For i = 0 To UBound(zknots, 1) knots(i) = zknots(i) Next For i = 0 To max knots(i) = hlist(i * xres + x) Next For z = 0 To zres buf(z * xres + x) = spline(zk / dfz, 4, knots) * zscale zk = zk + 1 If zk >= dfz Then zk = zk - dfz knotscounter = knotscounter + 1 End If Next Next For z = 0 To zres For x = 0 To xres hbuf(z * xres + x) = hbuf(z * xres + x) + buf(z * xres + x) Next NextEnd SubFunction spline(x As Double, nknots As Integer, knot() As Double) As Double '// basis matrix for spline interpolation Dim CR00 As Double Dim CR01 As Double Dim CR02 As Double Dim CR03 As Double Dim CR10 As Double Dim CR11 As Double Dim CR12 As Double Dim CR13 As Double Dim CR20 As Double Dim CR21 As Double Dim CR22 As Double Dim CR23 As Double Dim CR30 As Double Dim CR31 As Double Dim CR32 As Double Dim CR33 As Double CR00 = -0.5 CR01 = 1.5 CR02 = -1 CR03 = 0.5 CR10 = 1 CR11 = -2 CR12 = 2 CR13 = -0 CR20 = -0 CR21 = 0 CR22 = 0.5 CR23 = 0 CR30 = 0 CR31 = 1 CR32 = 0 Dim span As Integer Dim nspans As Integer nspans = nknots - 3 Dim c0 As Double Dim c1 As Double Dim c2 As Double Dim c3 As Double If nspans < 1 Then 'illegal spline = 0 Exit Function End If If x < 0 Then x = 0 Else If x > 1 Then x = 1 * nspans Else x = x * nspans End If End If span = CInt(x) If span >= nknots - 3 Then span = nknots - 3 End If x = x - span knot = knot + span ' // evaluate the span cubic at x using horner's rule c3 = CR00 * knot(0) + CR01 * knot(1) + CR02 * knot(2) + CR03 * knot(3) c2 = CR10 * knot(0) + CR11 * knot(1) + CR12 * knot(2) + CR13 * knot(3) c1 = CR20 * knot(0) + CR21 * knot(1) + CR22 * knot(2) + CR23 * knot(3) c0 = CR30 * knot(0) + CR31 * knot(1) + CR32 * knot(2) + CR33 * knot(3) spline = ((c3 * x + c2) * x + c1) * x + c0End Function
[edited by - Yann L on May 7, 2003 6:39:05 PM]
and a little bit of thought: vb uses broken english, except for function calls not made by you, or other people/companies ie:
private sub form_load()
list1.additem "vb uses english for basic function calls"
list1.refresh
end sub
------------------------------------------------------------
I really need to update this signature...
[edited by - demonrazor2003 on May 8, 2003 9:44:51 AM]
This code doesn''t compile does it? Because ''val'' is also a VB-function converting strings to doubles.
Just my 2 cents,
Edo
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement