public warp_Texture getClone() { warp_Texture t = new warp_Texture(width, height); warp_Math.copyBuffer(pixel, t.pixel); return(t); }
public void setTexture(warp_Texture t) { texture = t; if (texture != null) { texture.resize(); } }
public warp_TextureSettings(warp_Texture tex, int w, int h, int t, float p, float d, int s, int[] c) { texture=tex; width=w; height=h; type=t; persistency=p; density=d; samples=s; colors=c; }
public warp_TextureSettings(warp_Texture tex, int w, int h, int t, float p, float d, int s, int[] c) { texture = tex; width = w; height = h; type = t; persistency = p; density = d; samples = s; colors = c; }
public static warp_Texture CHECKERBOARD(int w, int h, int cellbits, int oddColor, int evenColor) { warp_Texture t = new warp_Texture(w, h); int pos = 0; for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { int c = ( ( (x >> cellbits) + (y >> cellbits)) & 1) == 0 ? evenColor : oddColor; t.pixel[pos++] = c; } } return t; }
public static warp_Texture CHECKERBOARD(int w, int h, int cellbits, int oddColor, int evenColor) { warp_Texture t = new warp_Texture(w, h); int pos = 0; for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { int c = (((x >> cellbits) + (y >> cellbits)) & 1) == 0 ? evenColor : oddColor; t.pixel[pos++] = c; } } return(t); }
public static warp_Texture PERLIN(int w, int h, float persistency, float density, int samples, int scale) { initNoiseBuffer(); warp_Texture t = new warp_Texture(w, h); int pos = 0; float wavelength = (float)((w > h) ? w : h) / density; for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { t.pixel[pos++] = (int)((float)scale * perlin2d(x, y, wavelength, persistency, samples)); } } return(t); }
public static warp_Texture PERLIN(int w, int h, float persistency, float density, int samples, int scale) { initNoiseBuffer(); warp_Texture t = new warp_Texture(w, h); int pos = 0; float wavelength = (float)((w > h) ? w : h) / density; for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { t.pixel[pos++] = (int)((float)scale * perlin2d(x, y, wavelength, persistency, samples)); } } return t; }
// Material loader public void loadMaterial(warp_Material material) { color = material.color; transparency = material.transparency; reflectivity = material.reflectivity; texture = material.texture; if (material.envmap != null) { envmap = material.envmap.pixel; } else { envmap = null; } if (texture != null) { tw = texture.width - 1; th = texture.height - 1; tbitW = texture.bitWidth; tbitH = texture.bitHeight; } mode = 0; if (!material.flat) { mode |= P; } if (envmap != null) { mode |= E; } if (texture != null) { mode |= T; } if (material.wireframe) { mode |= W; } materialLoaded = true; ready = lightmapLoaded && materialLoaded; }
private warp_Texture createRadialTexture(int w, int h, int[] colormap, int[] alphamap) { int offset; float relX, relY; warp_Texture newTexture = new warp_Texture(w, h); int[] palette = getPalette(colormap, alphamap); for (int y = h - 1; y >= 0; y--) { offset = y * w; for (int x = w - 1; x >= 0; x--) { relX = (float)(x - (w >> 1)) / (float)(w >> 1); relY = (float)(y - (h >> 1)) / (float)(h >> 1); newTexture.pixel[offset + x] = palette[warp_Math.crop((int)(255 * Math.Sqrt(relX * relX + relY * relY)), 0, 255)]; } } return(newTexture); }
private void draw(int width, int height, warp_Texture texture, int posx, int posy, int xsize, int ysize) { if (texture == null) { return; } int w = xsize; int h = ysize; int xBase = posx; int yBase = posy; int tx = texture.width * 255; int ty = texture.height * 255; int tw = texture.width; int dtx = tx / w; int dty = ty / h; int txBase = warp_Math.crop(-xBase * dtx, 0, 255 * tx); int tyBase = warp_Math.crop(-yBase * dty, 0, 255 * ty); int xend = warp_Math.crop(xBase + w, 0, width); int yend = warp_Math.crop(yBase + h, 0, height); int offset1, offset2; xBase = warp_Math.crop(xBase, 0, width); yBase = warp_Math.crop(yBase, 0, height); ty = tyBase; for (int j = yBase; j < yend; j++) { tx = txBase; offset1 = j * width; offset2 = (ty >> 8) * tw; for (int i = xBase; i < xend; i++) { pixels[i + offset1] = unchecked ((int)0xff000000) | texture.pixel[(tx >> 8) + offset2]; tx += dtx; } ty += dty; } }
private void draw(int width, int height, warp_Texture texture, int posx, int posy, int xsize, int ysize) { if (texture == null) { return; } int w = xsize; int h = ysize; int xBase = posx; int yBase = posy; int tx = texture.width * 255; int ty = texture.height * 255; int tw = texture.width; int dtx = tx / w; int dty = ty / h; int txBase = warp_Math.crop( -xBase * dtx, 0, 255 * tx); int tyBase = warp_Math.crop( -yBase * dty, 0, 255 * ty); int xend = warp_Math.crop(xBase + w, 0, width); int yend = warp_Math.crop(yBase + h, 0, height); int offset1, offset2; xBase = warp_Math.crop(xBase, 0, width); yBase = warp_Math.crop(yBase, 0, height); ty = tyBase; for (int j = yBase; j < yend; j++) { tx = txBase; offset1 = j * width; offset2 = (ty >> 8) * tw; for (int i = xBase; i < xend; i++) { pixels[ i + offset1 ] = unchecked( (int)0xff000000) | texture.pixel[ ( tx >> 8 ) + offset2 ]; tx += dtx; } ty += dty; } }
private void addFlare(warp_Texture texture, float relPos) { flares++; if (flares == 1) { flare = new warp_Texture[1]; flareDist = new float[1]; } else { warp_Texture[] temp1 = new warp_Texture[flares]; System.Array.Copy(flare, 0, temp1, 0, flares - 1); // check this flare = temp1; float[] temp2 = new float[flares]; System.Array.Copy(flareDist, 0, temp2, 0, flares - 1); flareDist = temp2; } flare[flares - 1] = texture; flareDist[flares - 1] = relPos; }
public static warp_Texture GRAIN(int w, int h, float persistency, float density, int samples, int levels, int scale) // TIP: For wooden textures { initNoiseBuffer(); warp_Texture t = new warp_Texture(w, h); int pos = 0; float wavelength = (float)((w > h) ? w : h) / density; float perlin; for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { perlin = (float)levels * perlin2d(x, y, wavelength, persistency, samples); t.pixel[pos++] = (int)((float)scale * (perlin - (float)(int)perlin)); } } return(t); }
private warp_Texture createRays(int size, int rays, int rad, int color) { int pos; float relPos; warp_Texture texture = new warp_Texture(size, size); int[] radialMap = new int [1024]; warp_Math.clearBuffer(radialMap, 0); for (int i = 0; i < rays; i++) { pos = (int)warp_Math.random(rad, 1023 - rad); for (int k = pos - rad; k <= pos + rad; k++) { relPos = (float)(k - pos + rad) / (float)(rad * 2); radialMap[k] += (int)(255 * (1 + Math.Sin((relPos - 0.25) * 3.14159 * 2)) / 2); } } int angle, offset, reldist; float xrel, yrel; for (int y = size - 1; y >= 0; y--) { offset = y * size; for (int x = size - 1; x >= 0; x--) { xrel = (float)(2 * x - size) / (float)size; yrel = (float)(2 * y - size) / (float)size; angle = (int)(1023 * Math.Atan2(xrel, yrel) / 3.14159 / 2) & 1023; reldist = Math.Max((int)(255 - 255 * warp_Math.pythagoras(xrel, yrel)), 0); texture.pixel[x + offset] = warp_Color.scale(color, radialMap[angle] * reldist / 255); } } return(texture); }
public bool SetBackgroundTexture(string path) { if (_scene == null) { return false; } warp_Texture texture = null; try { texture = new warp_Texture(path); } catch (Exception) { return false; } _scene.environment.setBackground(texture); return true; }
private warp_Texture GetTexture(UUID id) { warp_Texture ret = null; byte[] asset = m_scene.AssetService.GetData(id.ToString()); if (asset != null) { IJ2KDecoder imgDecoder = m_scene.RequestModuleInterface<IJ2KDecoder>(); try { using (Bitmap img = (Bitmap)imgDecoder.DecodeToImage(asset)) ret = new warp_Texture(img); } catch (Exception e) { m_log.Warn(string.Format("[WARP 3D IMAGE MODULE]: Failed to decode asset {0}, exception ", id), e); } } return ret; }
public void add(warp_Texture texture, int posx, int posy, int xsize, int ysize) { add(width, height, texture, posx, posy, xsize, ysize); }
public void drawBackground(warp_Texture texture, int posx, int posy, int xsize, int ysize) { draw(width, height, texture, posx, posy, xsize, ysize); }
public warp_Material(warp_Texture t) { setTexture(t); reflectivity = 255; }
public warp_Texture getClone() { warp_Texture t = new warp_Texture(width, height); warp_Math.copyBuffer(pixel, t.pixel); return t; }
public void setBackground(warp_Texture t) { environment.setBackground(t); }
private void CreateTerrain(WarpRenderer renderer, bool textureTerrain) { ITerrainChannel terrain = m_scene.Heightmap; float[] heightmap = terrain.GetFloatsSerialised(); warp_Object obj = new warp_Object(256 * 256, 255 * 255 * 2); for (int y = 0; y < 256; y++) { for (int x = 0; x < 256; x++) { int v = y * 256 + x; float height = heightmap[v]; warp_Vector pos = ConvertVector(new Vector3(x, y, height)); obj.addVertex(new warp_Vertex(pos, (float)x / 255f, (float)(255 - y) / 255f)); } } for (int y = 0; y < 256; y++) { for (int x = 0; x < 256; x++) { if (x < 255 && y < 255) { int v = y * 256 + x; // Normal Vector3 v1 = new Vector3(x, y, heightmap[y * 256 + x]); Vector3 v2 = new Vector3(x + 1, y, heightmap[y * 256 + x + 1]); Vector3 v3 = new Vector3(x, y + 1, heightmap[(y + 1) * 256 + x]); warp_Vector norm = ConvertVector(SurfaceNormal(v1, v2, v3)); norm = norm.reverse(); obj.vertex(v).n = norm; // Triangle 1 obj.addTriangle( v, v + 1, v + 256); // Triangle 2 obj.addTriangle( v + 256 + 1, v + 256, v + 1); } } } renderer.Scene.addObject("Terrain", obj); UUID[] textureIDs = new UUID[4]; float[] startHeights = new float[4]; float[] heightRanges = new float[4]; RegionSettings regionInfo = m_scene.RegionInfo.RegionSettings; textureIDs[0] = regionInfo.TerrainTexture1; textureIDs[1] = regionInfo.TerrainTexture2; textureIDs[2] = regionInfo.TerrainTexture3; textureIDs[3] = regionInfo.TerrainTexture4; startHeights[0] = (float)regionInfo.Elevation1SW; startHeights[1] = (float)regionInfo.Elevation1NW; startHeights[2] = (float)regionInfo.Elevation1SE; startHeights[3] = (float)regionInfo.Elevation1NE; heightRanges[0] = (float)regionInfo.Elevation2SW; heightRanges[1] = (float)regionInfo.Elevation2NW; heightRanges[2] = (float)regionInfo.Elevation2SE; heightRanges[3] = (float)regionInfo.Elevation2NE; uint globalX, globalY; Utils.LongToUInts(m_scene.RegionInfo.RegionHandle, out globalX, out globalY); Bitmap image = TerrainSplat.Splat(heightmap, textureIDs, startHeights, heightRanges, new Vector3d(globalX, globalY, 0.0), m_scene.AssetService, textureTerrain); warp_Texture texture = new warp_Texture(image); warp_Material material = new warp_Material(texture); material.setReflectivity(50); renderer.Scene.addMaterial("TerrainColor", material); renderer.Scene.material("TerrainColor").setReflectivity(0); // reduces tile seams a bit thanks lkalif renderer.SetObjectMaterial("Terrain", "TerrainColor"); }
public void setBackground(warp_Texture t) { background=t; }
public void setBackground(warp_Texture t) { background = t; }
// Material loader public void loadMaterial(warp_Material material) { color=material.color; transparency=material.transparency; reflectivity=material.reflectivity; texture=material.texture; if (material.envmap!=null) envmap=material.envmap.pixel; else envmap=null; if (texture!=null) { tw=texture.width-1; th=texture.height-1; tbitW=texture.bitWidth; tbitH=texture.bitHeight; } mode=0; if (!material.flat) mode|=P; if (envmap!=null) mode|=E; if (texture!=null) mode|=T; if (material.wireframe) mode|=W; materialLoaded=true; ready=lightmapLoaded&&materialLoaded; }
public bool SetTexture(string name, string path) { if (_scene == null) { return false; } warp_Texture texture = null; try { texture = new warp_Texture( path ); } catch(Exception) { return false; } warp_Material material = (warp_Material)_scene.materialData[name]; if (material == null) { return false; } material.setTexture(texture); return true; }
public static warp_Texture GRAIN(int w, int h, float persistency, float density, int samples, int levels, int scale) // TIP: For wooden textures { initNoiseBuffer(); warp_Texture t = new warp_Texture(w, h); int pos = 0; float wavelength = (float)((w > h) ? w : h) / density; float perlin; for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { perlin = (float)levels * perlin2d(x, y, wavelength, persistency, samples); t.pixel[pos++] = (int)((float)scale * (perlin - (float)(int)perlin)); } } return t; }
private void addFlare(warp_Texture texture, float relPos) { flares++; if (flares == 1) { flare=new warp_Texture[1]; flareDist=new float[1]; } else { warp_Texture[] temp1=new warp_Texture[flares]; System.Array.Copy(flare,0,temp1,0,flares-1); // check this flare=temp1; float[] temp2=new float[flares]; System.Array.Copy(flareDist, 0, temp2, 0, flares - 1 ); flareDist=temp2; } flare[flares-1]=texture; flareDist[flares-1]=relPos; }
private warp_Texture GetTexture(UUID id) { warp_Texture ret = null; AssetBase asset = m_scene.AssetService.Get(id.ToString()); if (asset != null) { IJ2KDecoder imgDecoder = m_scene.RequestModuleInterface<IJ2KDecoder>(); Bitmap img = (Bitmap) imgDecoder.DecodeToImage(asset.Data); if (img != null) { ret = new warp_Texture(img); img.Dispose(); } asset.Dispose(); } return ret; }
public void setTexture(warp_Texture t) { texture = t; if (texture != null) texture.resize(); }
public void setEnvmap(warp_Texture env) { envmap = env; env.resize(256, 256); }
private void readTexture(BinaryReader inStream, bool textureId) { warp_Texture t = null; int id = inStream.ReadSByte(); if (id == 1) { t = new warp_Texture("c:/source/warp3d/materials/skymap.jpg"); if (t != null && textureId) { texturePath = t.path; textureSettings = null; setTexture(t); } if (t != null && !textureId) { envmapPath = t.path; envmapSettings = null; setEnvmap(t); } } if (id == 2) { int w = readInt(inStream); int h = readInt(inStream); int type = inStream.ReadSByte(); float persistency = readInt(inStream); float density = readInt(inStream); persistency = .5f; density = .5f; int samples = inStream.ReadByte(); int numColors = inStream.ReadByte(); int[] colors = new int[numColors]; for (int i = 0; i < numColors; i++) { colors[i] = readInt(inStream); } if (type == 1) { t = warp_TextureFactory.PERLIN(w, h, persistency, density, samples, 1024).colorize(warp_Color.makeGradient(colors, 1024)); } if (type == 2) { t = warp_TextureFactory.WAVE(w, h, persistency, density, samples, 1024).colorize(warp_Color.makeGradient(colors, 1024)); } if (type == 3) { t = warp_TextureFactory.GRAIN(w, h, persistency, density, samples, 20, 1024).colorize(warp_Color.makeGradient(colors, 1024)); } if (textureId) { texturePath = null; textureSettings = new warp_TextureSettings(t, w, h, type, persistency, density, samples, colors); setTexture(t); } else { envmapPath = null; envmapSettings = new warp_TextureSettings(t, w, h, type, persistency, density, samples, colors); setEnvmap(t); } } }
private void CreateTerrain(IScene scene, WarpRenderer renderer, ITerrain terrain, RegionInfo regionInfo) { float[] heightmap = (terrain != null) ? terrain.GetHeightmap() : new float[256 * 256]; warp_Object obj = new warp_Object(256 * 256, 255 * 255 * 2); for (int y = 0; y < 256; y++) { for (int x = 0; x < 256; x++) { int v = y * 256 + x; float height = heightmap[v]; warp_Vector pos = ConvertVector(new Vector3(x, y, height)); obj.addVertex(new warp_Vertex(pos, (float)x / 255f, (float)(255 - y) / 255f)); } } for (int y = 0; y < 256; y++) { for (int x = 0; x < 256; x++) { if (x < 255 && y < 255) { int v = y * 256 + x; // Normal Vector3 v1 = new Vector3(x, y, heightmap[y * 256 + x]); Vector3 v2 = new Vector3(x + 1, y, heightmap[y * 256 + x + 1]); Vector3 v3 = new Vector3(x, y + 1, heightmap[(y + 1) * 256 + x]); warp_Vector norm = ConvertVector(SurfaceNormal(v1, v2, v3)); norm = norm.reverse(); obj.vertex(v).n = norm; // Triangle 1 obj.addTriangle( v, v + 1, v + 256); // Triangle 2 obj.addTriangle( v + 256 + 1, v + 256, v + 1); } } } renderer.Scene.addObject("Terrain", obj); UUID[] textureIDs = new UUID[4]; float[] startHeights = new float[4]; float[] heightRanges = new float[4]; if (regionInfo != null) { textureIDs[0] = regionInfo.TerrainDetail0; textureIDs[1] = regionInfo.TerrainDetail1; textureIDs[2] = regionInfo.TerrainDetail2; textureIDs[3] = regionInfo.TerrainDetail3; startHeights[0] = regionInfo.TerrainStartHeight00; startHeights[1] = regionInfo.TerrainStartHeight01; startHeights[2] = regionInfo.TerrainStartHeight10; startHeights[3] = regionInfo.TerrainStartHeight11; heightRanges[0] = regionInfo.TerrainHeightRange00; heightRanges[1] = regionInfo.TerrainHeightRange01; heightRanges[2] = regionInfo.TerrainHeightRange10; heightRanges[3] = regionInfo.TerrainHeightRange11; } Bitmap image = TerrainSplat.Splat(heightmap, textureIDs, startHeights, heightRanges, scene.MinPosition, m_assetClient); warp_Texture texture = new warp_Texture(image); warp_Material material = new warp_Material(texture); material.setReflectivity(50); renderer.Scene.addMaterial("TerrainColor", material); renderer.SetObjectMaterial("Terrain", "TerrainColor"); }
private void CreateTerrain(WarpRenderer renderer, bool textureTerrain) { ITerrainChannel terrain = m_scene.RequestModuleInterface<ITerrainChannel>(); warp_Object obj = new warp_Object (m_scene.RegionInfo.RegionSizeX * m_scene.RegionInfo.RegionSizeY, (m_scene.RegionInfo.RegionSizeX - 1) * (m_scene.RegionInfo.RegionSizeY - 1) * 2); for (int y = 0; y < m_scene.RegionInfo.RegionSizeY; y++) { for (int x = 0; x < m_scene.RegionInfo.RegionSizeX; x++) { float height = terrain[x, y]; warp_Vector pos = ConvertVector(new Vector3(x, y, height)); obj.addVertex (new warp_Vertex (pos, (float)x / (m_scene.RegionInfo.RegionSizeX - 1), (float)((m_scene.RegionInfo.RegionSizeX - 1) - y) / (m_scene.RegionInfo.RegionSizeX - 1))); } } for (float y = 0; y < m_scene.RegionInfo.RegionSizeY; y += 1) { for (float x = 0; x < m_scene.RegionInfo.RegionSizeX; x += 1) { if (x < m_scene.RegionInfo.RegionSizeX - 1 && y < m_scene.RegionInfo.RegionSizeY - 1) { float v = y * m_scene.RegionInfo.RegionSizeX + x; // Normal warp_Vector norm = new warp_Vector(x, y, terrain.GetNormalizedGroundHeight((int)x, (int)y)); norm = norm.reverse(); obj.vertex ((int)v).n = norm; // Triangle 1 obj.addTriangle( (int)v, (int)v + 1, (int)v + m_scene.RegionInfo.RegionSizeX); // Triangle 2 obj.addTriangle( (int)v + m_scene.RegionInfo.RegionSizeX + 1, (int)v + m_scene.RegionInfo.RegionSizeX, (int)v + 1); } } } renderer.Scene.addObject("Terrain", obj); UUID[] textureIDs = new UUID[4]; float[] startHeights = new float[4]; float[] heightRanges = new float[4]; RegionSettings regionInfo = m_scene.RegionInfo.RegionSettings; textureIDs[0] = regionInfo.TerrainTexture1; textureIDs[1] = regionInfo.TerrainTexture2; textureIDs[2] = regionInfo.TerrainTexture3; textureIDs[3] = regionInfo.TerrainTexture4; startHeights[0] = (float)regionInfo.Elevation1SW; startHeights[1] = (float)regionInfo.Elevation1NW; startHeights[2] = (float)regionInfo.Elevation1SE; startHeights[3] = (float)regionInfo.Elevation1NE; heightRanges[0] = (float)regionInfo.Elevation2SW; heightRanges[1] = (float)regionInfo.Elevation2NW; heightRanges[2] = (float)regionInfo.Elevation2SE; heightRanges[3] = (float)regionInfo.Elevation2NE; uint globalX, globalY; Utils.LongToUInts(m_scene.RegionInfo.RegionHandle, out globalX, out globalY); Bitmap image = TerrainSplat.Splat(terrain, textureIDs, startHeights, heightRanges, new Vector3d(globalX, globalY, 0.0), m_scene.AssetService, textureTerrain); warp_Texture texture = new warp_Texture(image); warp_Material material = new warp_Material(texture); material.setReflectivity(50); renderer.Scene.addMaterial("TerrainColor", material); renderer.SetObjectMaterial("Terrain", "TerrainColor"); }
private warp_Texture createRadialTexture(int w, int h, int[] colormap, int[] alphamap) { int offset; float relX,relY; warp_Texture newTexture=new warp_Texture(w,h); int[] palette=getPalette(colormap, alphamap); for(int y=h-1;y>=0;y--) { offset=y*w; for (int x=w-1;x>=0;x--) { relX=(float)(x-(w>>1))/(float)(w>>1); relY=(float)(y-(h>>1))/(float)(h>>1); newTexture.pixel[offset+x]=palette[warp_Math.crop((int)(255*Math.Sqrt(relX*relX+relY*relY)),0,255)]; } } return newTexture; }
// Add a terrain to the renderer. // Note that we create a 'low resolution' 256x256 vertex terrain rather than trying for // full resolution. This saves a lot of memory especially for very large regions. private void CreateTerrain(WarpRenderer renderer, bool textureTerrain) { ITerrainChannel terrain = m_scene.Heightmap; // 'diff' is the difference in scale between the real region size and the size of terrain we're buiding float diff = (float)m_scene.RegionInfo.RegionSizeX / 256f; warp_Object obj = new warp_Object(256 * 256, 255 * 255 * 2); // Create all the vertices for the terrain for (float y = 0; y < m_scene.RegionInfo.RegionSizeY; y += diff) { for (float x = 0; x < m_scene.RegionInfo.RegionSizeX; x += diff) { warp_Vector pos = ConvertVector(x, y, (float)terrain[(int)x, (int)y]); obj.addVertex(new warp_Vertex(pos, x / (float)m_scene.RegionInfo.RegionSizeX, (((float)m_scene.RegionInfo.RegionSizeY) - y) / m_scene.RegionInfo.RegionSizeY)); } } // Now that we have all the vertices, make another pass and create // the normals for each of the surface triangles and // create the list of triangle indices. for (float y = 0; y < m_scene.RegionInfo.RegionSizeY; y += diff) { for (float x = 0; x < m_scene.RegionInfo.RegionSizeX; x += diff) { float newX = x / diff; float newY = y / diff; if (newX < 255 && newY < 255) { int v = (int)newY * 256 + (int)newX; // Normal for a triangle made up of three adjacent vertices Vector3 v1 = new Vector3(newX, newY, (float)terrain[(int)x, (int)y]); Vector3 v2 = new Vector3(newX + 1, newY, (float)terrain[(int)(x + 1), (int)y]); Vector3 v3 = new Vector3(newX, newY + 1, (float)terrain[(int)x, ((int)(y + 1))]); warp_Vector norm = ConvertVector(SurfaceNormal(v1, v2, v3)); norm = norm.reverse(); obj.vertex(v).n = norm; // Make two triangles for each of the squares in the grid of vertices obj.addTriangle( v, v + 1, v + 256); obj.addTriangle( v + 256 + 1, v + 256, v + 1); } } } renderer.Scene.addObject("Terrain", obj); UUID[] textureIDs = new UUID[4]; float[] startHeights = new float[4]; float[] heightRanges = new float[4]; OpenSim.Framework.RegionSettings regionInfo = m_scene.RegionInfo.RegionSettings; textureIDs[0] = regionInfo.TerrainTexture1; textureIDs[1] = regionInfo.TerrainTexture2; textureIDs[2] = regionInfo.TerrainTexture3; textureIDs[3] = regionInfo.TerrainTexture4; startHeights[0] = (float)regionInfo.Elevation1SW; startHeights[1] = (float)regionInfo.Elevation1NW; startHeights[2] = (float)regionInfo.Elevation1SE; startHeights[3] = (float)regionInfo.Elevation1NE; heightRanges[0] = (float)regionInfo.Elevation2SW; heightRanges[1] = (float)regionInfo.Elevation2NW; heightRanges[2] = (float)regionInfo.Elevation2SE; heightRanges[3] = (float)regionInfo.Elevation2NE; uint globalX, globalY; Util.RegionHandleToWorldLoc(m_scene.RegionInfo.RegionHandle, out globalX, out globalY); warp_Texture texture; using ( Bitmap image = TerrainSplat.Splat( terrain, textureIDs, startHeights, heightRanges, new Vector3d(globalX, globalY, 0.0), m_scene.AssetService, textureTerrain)) { texture = new warp_Texture(image); } warp_Material material = new warp_Material(texture); material.setReflectivity(50); renderer.Scene.addMaterial("TerrainColor", material); renderer.Scene.material("TerrainColor").setReflectivity(0); // reduces tile seams a bit thanks lkalif renderer.SetObjectMaterial("Terrain", "TerrainColor"); }
private warp_Object CreateTerrain(WarpRenderer renderer, bool textureTerrain) { ITerrainChannel terrain = m_scene.RequestModuleInterface<ITerrainChannel>(); float diff = (float) m_scene.RegionInfo.RegionSizeY/(float) Constants.RegionSize; warp_Object obj = new warp_Object(Constants.RegionSize*Constants.RegionSize, ((Constants.RegionSize - 1)*(Constants.RegionSize - 1)*2)); for (float y = 0; y < m_scene.RegionInfo.RegionSizeY; y += diff) { for (float x = 0; x < m_scene.RegionInfo.RegionSizeX; x += diff) { warp_Vector pos = ConvertVector(x, y, terrain[(int) x, (int) y]); obj.addVertex(new warp_Vertex(pos, x/(float) (m_scene.RegionInfo.RegionSizeX), (((float) m_scene.RegionInfo.RegionSizeX) - y)/ (m_scene.RegionInfo.RegionSizeX))); } } for (float y = 0; y < m_scene.RegionInfo.RegionSizeY; y += diff) { for (float x = 0; x < m_scene.RegionInfo.RegionSizeX; x += diff) { float newX = x/diff; float newY = y/diff; if (newX < Constants.RegionSize - 1 && newY < Constants.RegionSize - 1) { int v = (int) (newY*Constants.RegionSize + newX); // Normal Vector3 v1 = new Vector3(newX, newY, (terrain[(int) x, (int) y])/Constants.TerrainCompression); Vector3 v2 = new Vector3(newX + 1, newY, (terrain[(int) x + 1, (int) y])/Constants.TerrainCompression); Vector3 v3 = new Vector3(newX, newY + 1, (terrain[(int) x, (int) (y + 1)])/Constants.TerrainCompression); warp_Vector norm = ConvertVector(SurfaceNormal(v1, v2, v3)); norm = norm.reverse(); obj.vertex(v).n = norm; // Triangle 1 obj.addTriangle( v, v + 1, v + Constants.RegionSize); // Triangle 2 obj.addTriangle( v + Constants.RegionSize + 1, v + Constants.RegionSize, v + 1); } } } renderer.Scene.addObject("Terrain", obj); UUID[] textureIDs = new UUID[4]; float[] startHeights = new float[4]; float[] heightRanges = new float[4]; RegionSettings regionInfo = m_scene.RegionInfo.RegionSettings; textureIDs[0] = regionInfo.TerrainTexture1; textureIDs[1] = regionInfo.TerrainTexture2; textureIDs[2] = regionInfo.TerrainTexture3; textureIDs[3] = regionInfo.TerrainTexture4; startHeights[0] = (float) regionInfo.Elevation1SW; startHeights[1] = (float) regionInfo.Elevation1NW; startHeights[2] = (float) regionInfo.Elevation1SE; startHeights[3] = (float) regionInfo.Elevation1NE; heightRanges[0] = (float) regionInfo.Elevation2SW; heightRanges[1] = (float) regionInfo.Elevation2NW; heightRanges[2] = (float) regionInfo.Elevation2SE; heightRanges[3] = (float) regionInfo.Elevation2NE; uint globalX, globalY; Utils.LongToUInts(m_scene.RegionInfo.RegionHandle, out globalX, out globalY); Bitmap image = TerrainSplat.Splat(terrain, textureIDs, startHeights, heightRanges, new Vector3d(globalX, globalY, 0.0), m_scene.AssetService, textureTerrain); warp_Texture texture = new warp_Texture(image); warp_Material material = new warp_Material(texture); material.setReflectivity(0); // reduces tile seams a bit thanks lkalif renderer.Scene.addMaterial("TerrainColor", material); renderer.SetObjectMaterial("Terrain", "TerrainColor"); return obj; }
private warp_Texture createRays(int size, int rays, int rad, int color) { int pos; float relPos; warp_Texture texture=new warp_Texture(size,size); int[] radialMap=new int [1024]; warp_Math.clearBuffer(radialMap, 0); for (int i=0;i<rays;i++) { pos=(int)warp_Math.random(rad,1023-rad); for (int k=pos-rad; k<=pos+rad; k++) { relPos=(float)(k-pos+rad)/(float)(rad*2); radialMap[k]+=(int)(255*(1+Math.Sin((relPos-0.25)*3.14159*2))/2); } } int angle,offset,reldist; float xrel,yrel; for (int y=size-1;y>=0;y--) { offset=y*size; for (int x=size-1;x>=0;x--) { xrel=(float)(2*x-size)/(float)size; yrel=(float)(2*y-size)/(float)size; angle=(int)(1023*Math.Atan2(xrel,yrel)/3.14159/2)&1023; reldist=Math.Max((int)(255-255*warp_Math.pythagoras(xrel,yrel)),0); texture.pixel[x+offset]=warp_Color.scale(color, radialMap[angle]*reldist/255); } } return texture; }
public void add( warp_Texture texture, int posx, int posy, int xsize, int ysize ) { add( width, height, texture, posx, posy, xsize, ysize ); }
public void drawBackground(warp_Texture texture, int posx, int posy,int xsize, int ysize) { draw(width, height, texture, posx, posy, xsize, ysize); }