Could someone please help with the converstion of the Vector and ray commands in to blitz3d.
Here is the C Code.
Here is the C Code.
int intersect_map(const vector3& iv,const ray& r,Image* hm,float fHeightScale){ int w,hits; float d,h,D; vector3 v,dir; v = iv + r.direction; w = hm->w; hits = 0; while (!(( v.x >= w-1 ) || ( v.x <= 0 ) || ( v.z >= w-1 ) || ( v.z <= 0 ))){ D = Magnitude(vector3(v.x,0,v.z)-vector3(r.origin.x,0,r.origin.z)); // length of lightdir's projection d = Magnitude(iv-v); // light direction h = iv.y + (d*r.origin.y) / D; // X(P) point if (hm->data[ifloor(v.z)* w + ifloor(v.x)] * fHeightScale > h){ // check if height in point P is bigger than point X's height hits++; // if so, mark as hit, and skip this work point. break; }; dir = r.direction; dir.y = 0; v += Normalize(dir); // fetch new working point }; return hits; }; Image* genLightmap(char* normal,Image* hm,vector3 fSunDir,int w,float fAmbient){ int i,j,hits; float f,dot; vector3 n,fVertex; Image* lmap; ray r; float fHeightScale = 10.0f / 255.0f; lmap = new Image(w,w,1); if (!lmap){printf("(!) Error: cannot alloc lightmap!\n");return 0;}; for (j=0; j<w; j++){ for (i=0; i<w; i++){ fVertex.x = i; fVertex.y = hm->data[j*w+i] * fHeightScale; fVertex.z = j; f = fAmbient ; r.origin = fVertex + fSunDir * 2000.0f; r.direction = fSunDir; if (!intersect_map(fVertex,r,hm,fHeightScale)){ // checks current working point for intersection // computing the lighting equation n.x = (float)(normal[3*(j*w+i)+0]); n.y = (float)(normal[3*(j*w+i)+1]); n.z = (float)(normal[3*(j*w+i)+2]); f += 0.5f*(1.0f+DotProduct(Normalize(n),Normalize(fSunDir))); if (f>1.0f) f = 1.0f; }; dot = f * 255.0f; lmap->data[j*w+i] = (unsigned char)dot; }; }; return lmap; };