亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? rectangularnormaltessellator.java

?? world wind java sdk 源碼
?? JAVA
?? 第 1 頁 / 共 5 頁
字號:
/*
Copyright (C) 2001, 2009 United States Government
as represented by the Administrator of the
National Aeronautics and Space Administration.
All Rights Reserved.
*/
package gov.nasa.worldwind.examples.sunlight;

import com.sun.opengl.util.BufferUtil;
import gov.nasa.worldwind.*;
import gov.nasa.worldwind.terrain.*;
import gov.nasa.worldwind.avlist.AVKey;
import gov.nasa.worldwind.cache.*;
import gov.nasa.worldwind.geom.*;
import gov.nasa.worldwind.globes.Globe;
import gov.nasa.worldwind.pick.*;
import gov.nasa.worldwind.render.*;
import gov.nasa.worldwind.util.Logging;

import javax.media.opengl.GL;
import java.awt.*;
import java.nio.*;
import java.util.*;
import java.util.List;

/**
 * @author tag
 * @version $Id: RectangularNormalTessellator.java 10406 2009-04-22 18:28:45Z patrickmurris $
 *
 *          Modified by Michael de Hoog to add simple normals based on globe
 *          ellipse, (globe.computeSurfaceNormalAtPoint()), also added more
 *          exact normal calculator for terrain tiles, see getNormals()
 */
public class RectangularNormalTessellator extends WWObjectImpl implements Tessellator
{
    protected static class RenderInfo
    {
        private final int density;
        private final Vec4 referenceCenter;
        private final DoubleBuffer vertices;
        private final DoubleBuffer normals;
        private final DoubleBuffer texCoords;
        private final IntBuffer indices;
        private final long time;

        private RenderInfo(int density, DoubleBuffer vertices, DoubleBuffer texCoords, DoubleBuffer normals, Vec4 refCenter)
        {
            this.density = density;
            this.vertices = vertices;
            this.texCoords = texCoords;
            this.referenceCenter = refCenter;
            this.indices = getIndices(this.density);
            this.normals = normals;
            this.time = System.currentTimeMillis();
        }

        private long getSizeInBytes()
        {
            // Texture coordinates are shared among all tiles of the same density, so do not count towards size.
            // 8 references, doubles in buffer.
            return 8 * 4 + (this.vertices.limit()) * Double.SIZE;
        }
    }

	public static class RectTile implements SectorGeometry
	{
		private final RectangularNormalTessellator tessellator;
		private final int level;
		private final Sector sector;
		private final int density;
		private final double log10CellSize;
		private Extent extent; // extent of sector in object coordinates
		private RenderInfo ri;

		private int minColorCode = 0;
		private int maxColorCode = 0;

		public RectTile(RectangularNormalTessellator tessellator, Extent extent,
				int level, int density, Sector sector, double cellSize)
		{
			this.tessellator = tessellator;
			this.level = level;
			this.density = density;
			this.sector = sector;
			this.extent = extent;
			this.log10CellSize = Math.log10(cellSize);
		}

		public Sector getSector()
		{
			return this.sector;
		}

		public Extent getExtent()
		{
			return this.extent;
		}

		public void renderMultiTexture(DrawContext dc, int numTextureUnits)
		{
			this.tessellator.renderMultiTexture(dc, this, numTextureUnits);
		}

		public void render(DrawContext dc)
		{
			this.tessellator.render(dc, this);
		}

		public void renderWireframe(DrawContext dc, boolean showTriangles,
				boolean showTileBoundary)
		{
			this.tessellator.renderWireframe(dc, this, showTriangles,
					showTileBoundary);
		}

		public void renderBoundingVolume(DrawContext dc)
		{
			this.tessellator.renderBoundingVolume(dc, this);
		}

		public PickedObject[] pick(DrawContext dc, List<? extends Point> pickPoints)
		{
			return this.tessellator.pick(dc, this, pickPoints);
		}

		public void pick(DrawContext dc, Point pickPoint)
		{
			this.tessellator.pick(dc, this, pickPoint);
		}

		public Vec4 getSurfacePoint(Angle latitude, Angle longitude,
				double metersOffset)
		{
			return this.tessellator.getSurfacePoint(this, latitude, longitude,
					metersOffset);
		}

        public double getResolution()
        {
            return this.sector.getDeltaLatRadians() / this.density;
        }

        public Intersection[] intersect(Line line)
        {
            return this.tessellator.intersect(this, line);
        }

        public Intersection[] intersect(double elevation)
        {
            return this.tessellator.intersect(this,elevation);
        }

        public DoubleBuffer makeTextureCoordinates(GeographicTextureCoordinateComputer computer)
        {
            return this.tessellator.makeGeographicTexCoords(this, computer);
        }

        public ExtractedShapeDescription getIntersectingTessellationPieces(Plane[] p)
        {
            return this.tessellator.getIntersectingTessellationPieces(this,p);
        }

        public ExtractedShapeDescription getIntersectingTessellationPieces(Vec4 Cxyz,
            Vec4 uHat, Vec4 vHat, double uRadius, double vRadius)
        {
            return this.tessellator.getIntersectingTessellationPieces(this,Cxyz,
                uHat,vHat,uRadius,vRadius);
        }
	}

    private static class CacheKey
    {
        private final Sector sector;
        private final int density;
        private final Object globeStateKey;

        public CacheKey(DrawContext dc, Sector sector, int density)
        {
            this.sector = sector;
            this.density = density;
            this.globeStateKey = dc.getGlobe().getStateKey(dc);
        }

        @SuppressWarnings({"EqualsWhichDoesntCheckParameterClass"})
        public boolean equals(Object o)
        {
            if (this == o) return true;

            CacheKey cacheKey = (CacheKey) o; // Note: no check of class type equivalence, for performance

            if (density != cacheKey.density) return false;
            if (globeStateKey != null ? !globeStateKey.equals(cacheKey.globeStateKey) : cacheKey.globeStateKey != null)
                return false;
            //noinspection RedundantIfStatement
            if (sector != null ? !sector.equals(cacheKey.sector) : cacheKey.sector != null) return false;

            return true;
        }

        public int hashCode()
        {
            int result;
            result = (sector != null ? sector.hashCode() : 0);
            result = 31 * result + density;
            result = 31 * result + (globeStateKey != null ? globeStateKey.hashCode() : 0);
            return result;
        }
    }

	// TODO: Make all this configurable
	private static final double DEFAULT_LOG10_RESOLUTION_TARGET = 1.3;
	private static final int DEFAULT_MAX_LEVEL = 12;
	private static final int DEFAULT_NUM_LAT_SUBDIVISIONS = 5;
	private static final int DEFAULT_NUM_LON_SUBDIVISIONS = 10;
	private static final int DEFAULT_DENSITY = 20;
	private static final String CACHE_NAME = "Terrain";
	private static final String CACHE_ID = RectangularNormalTessellator.class.getName();

	// Tri-strip indices and texture coordinates. These depend only on density and can therefore be statically cached.
	private static final HashMap<Integer, DoubleBuffer> parameterizations = new HashMap<Integer, DoubleBuffer>();
	private static final HashMap<Integer, IntBuffer> indexLists = new HashMap<Integer, IntBuffer>();

	private ArrayList<RectTile> topLevels;
	private PickSupport pickSupport = new PickSupport();
	private SectorGeometryList currentTiles = new SectorGeometryList();
	private Frustum currentFrustum;
	private Sector currentCoverage; // union of all tiles selected during call to render()
	private boolean makeTileSkirts = true;
	private int currentLevel;
	private int maxLevel = DEFAULT_MAX_LEVEL;
	private Globe globe;
	private int density = DEFAULT_DENSITY;

    // Lighting
    private Vec4 lightDirection;
    private Material material = new Material(Color.WHITE);
    private Color lightColor = Color.WHITE;
    private Color ambientColor = new Color(.1f, .1f, .1f);

    public SectorGeometryList tessellate(DrawContext dc)
	{
		if (dc == null)
		{
			String msg = Logging.getMessage("nullValue.DrawContextIsNull");
			Logging.logger().severe(msg);
			throw new IllegalArgumentException(msg);
		}

		if (dc.getView() == null)
		{
			String msg = Logging.getMessage("nullValue.ViewIsNull");
			Logging.logger().severe(msg);
			throw new IllegalStateException(msg);
		}

		if (!WorldWind.getMemoryCacheSet().containsCache(CACHE_ID))
		{
			long size = Configuration.getLongValue(
					AVKey.SECTOR_GEOMETRY_CACHE_SIZE, 20000000L);
			MemoryCache cache = new BasicMemoryCache((long) (0.85 * size), size);
			cache.setName(CACHE_NAME);
			WorldWind.getMemoryCacheSet().addCache(CACHE_ID, cache);
		}

		if (this.topLevels == null)
			this.topLevels = this.createTopLevelTiles(dc);

		this.currentTiles.clear();
		this.currentLevel = 0;
		this.currentCoverage = null;

		this.currentFrustum = dc.getView().getFrustumInModelCoordinates();
		for (RectTile tile : this.topLevels)
		{
			this.selectVisibleTiles(dc, tile);
		}

		this.currentTiles.setSector(this.currentCoverage);

		for (SectorGeometry tile : this.currentTiles)
		{
			this.makeVerts(dc, (RectTile) tile);
		}

		return this.currentTiles;
	}

	private ArrayList<RectTile> createTopLevelTiles(DrawContext dc)
	{
		ArrayList<RectTile> tops = new ArrayList<RectTile>(
				DEFAULT_NUM_LAT_SUBDIVISIONS * DEFAULT_NUM_LON_SUBDIVISIONS);

		this.globe = dc.getGlobe();
		double deltaLat = 180d / DEFAULT_NUM_LAT_SUBDIVISIONS;
		double deltaLon = 360d / DEFAULT_NUM_LON_SUBDIVISIONS;
		Angle lastLat = Angle.NEG90;

		for (int row = 0; row < DEFAULT_NUM_LAT_SUBDIVISIONS; row++)
		{
			Angle lat = lastLat.addDegrees(deltaLat);
			if (lat.getDegrees() + 1d > 90d)
				lat = Angle.POS90;

			Angle lastLon = Angle.NEG180;

			for (int col = 0; col < DEFAULT_NUM_LON_SUBDIVISIONS; col++)
			{
				Angle lon = lastLon.addDegrees(deltaLon);
				if (lon.getDegrees() + 1d > 180d)
					lon = Angle.POS180;

				Sector tileSector = new Sector(lastLat, lat, lastLon, lon);
				tops.add(this.createTile(dc, tileSector, 0));
				lastLon = lon;
			}
			lastLat = lat;
		}

		return tops;
	}

	private RectTile createTile(DrawContext dc, Sector tileSector, int level)
	{
		Cylinder cylinder = dc.getGlobe().computeBoundingCylinder(
				dc.getVerticalExaggeration(), tileSector);
		double cellSize = tileSector.getDeltaLatRadians()
				* dc.getGlobe().getRadius() / this.density;

		return new RectTile(this, cylinder, level, this.density, tileSector,
				cellSize);
	}

	public boolean isMakeTileSkirts()
	{
		return makeTileSkirts;
	}

	public void setMakeTileSkirts(boolean makeTileSkirts)
	{
		this.makeTileSkirts = makeTileSkirts;
	}

    public Vec4 getLightDirection()
    {
        return this.lightDirection;
    }

    public void setLightDirection(Vec4 direction)
    {
        this.lightDirection = direction;
    }

    public Color getLightColor()
    {
        return this.lightColor;
    }

    public void setLightColor(Color color)
    {
        if (color == null)
        {
            String msg = Logging.getMessage("nullValue.ColorIsNull");
            Logging.logger().severe(msg);
            throw new IllegalArgumentException(msg);
        }
        this.lightColor = color;
    }

    public Color getAmbientColor()
    {
        return this.ambientColor;
    }

    public void setAmbientColor(Color color)
    {
        if (color == null)
        {
            String msg = Logging.getMessage("nullValue.ColorIsNull");
            Logging.logger().severe(msg);
            throw new IllegalArgumentException(msg);
        }
        this.ambientColor = color;
    }

//	public int getTargetResolution(DrawContext dc, RectTile tile)
//	{
//		return dc.getGlobe().getElevationModel().getTargetResolution(dc, tile.sector, tile.density);
//	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91在线国产福利| 欧美日韩国产首页| 免费看黄色91| 首页综合国产亚洲丝袜| 偷拍日韩校园综合在线| 亚洲成人av中文| 日韩国产精品久久| 另类欧美日韩国产在线| 国产精品综合二区| 成人动漫视频在线| 在线观看日韩毛片| 欧美美女一区二区| 精品国产乱码91久久久久久网站| 日韩精品一区二区三区视频在线观看 | 亚洲激情自拍视频| 亚洲国产另类精品专区| 视频在线观看91| 国产乱码精品一区二区三区忘忧草| 国产精品91一区二区| 99视频超级精品| 欧美日韩在线观看一区二区 | 亚洲视频一二区| 一区二区欧美国产| 蜜臀av亚洲一区中文字幕| 国产一级精品在线| 日韩欧美一区二区免费| 久久久午夜精品理论片中文字幕| 久久久99久久| 夜夜嗨av一区二区三区四季av| 香蕉加勒比综合久久| 国产成人夜色高潮福利影视| 97se亚洲国产综合在线| 欧美一区二区三区成人| 国产精品久久久久久久久免费丝袜| 一区二区三区日韩欧美| 精品一区二区在线观看| 色噜噜夜夜夜综合网| 久久影院午夜论| 夜夜精品浪潮av一区二区三区| 美日韩黄色大片| 色系网站成人免费| 久久久精品一品道一区| 午夜一区二区三区在线观看| 国产成人精品免费| 777a∨成人精品桃花网| 亚洲特级片在线| 免费人成黄页网站在线一区二区| 成人免费三级在线| 亚洲精品在线免费播放| 亚洲国产精品影院| 91影院在线免费观看| 精品动漫一区二区三区在线观看 | 在线观看一区日韩| 国产精品午夜电影| 久久99久久精品| 欧美一区二区三区不卡| 一区二区成人在线| 99re这里都是精品| 国产精品三级av在线播放| 免费成人美女在线观看| 欧美精品一区二区不卡 | 欧美日韩亚洲不卡| 亚洲人成影院在线观看| 国产黄色成人av| 精品国产sm最大网站免费看| 日本少妇一区二区| 日韩一区二区在线观看| 视频一区国产视频| 欧美美女一区二区在线观看| 亚洲最快最全在线视频| 91麻豆123| 亚洲激情自拍视频| 在线观看一区日韩| 亚洲最新视频在线播放| 欧美视频一区二区三区在线观看 | 成人激情小说乱人伦| 日韩欧美在线网站| 日韩国产精品久久| 日韩免费高清视频| 国产一区在线看| 亚洲国产精品高清| 91亚洲男人天堂| 亚洲欧美色图小说| 欧美午夜电影一区| 日本中文字幕一区二区有限公司| 欧美日韩精品一二三区| 五月婷婷激情综合| 欧美国产成人在线| 99久久婷婷国产综合精品 | 欧美一区二区国产| 麻豆视频观看网址久久| 久久久久国产精品厨房| 成人性生交大片免费看中文| 国产精品欧美综合在线| 色天使色偷偷av一区二区| 亚洲一区二区高清| 日韩欧美黄色影院| 成人中文字幕电影| 亚洲码国产岛国毛片在线| 91 com成人网| 大白屁股一区二区视频| 一区二区三区久久久| 日韩欧美一区二区视频| 国产成人精品一区二| 一区二区在线观看不卡| 91精品国产一区二区三区蜜臀| 久久国产精品免费| 国产日产欧美一区二区三区 | 欧美日本精品一区二区三区| 美日韩一区二区| 中文字幕在线免费不卡| 欧美日韩激情一区二区| 国产不卡视频在线播放| 五月激情丁香一区二区三区| 久久久久久久av麻豆果冻| 在线观看视频91| 国产成人在线影院| 日韩中文字幕91| 亚洲人成精品久久久久| 欧美成人免费网站| 色婷婷狠狠综合| 国产精品一级黄| 天堂蜜桃91精品| 国产精品久久久久久久久快鸭 | 亚洲欧美韩国综合色| 26uuu欧美| 欧美一区二区免费观在线| jvid福利写真一区二区三区| 免费日本视频一区| 午夜精品久久久久久不卡8050| 国产精品女主播av| 久久精品亚洲精品国产欧美kt∨| 欧美精品在线一区二区| 日本电影亚洲天堂一区| 成人一级视频在线观看| 久久不见久久见中文字幕免费| 一区二区三区四区不卡在线| 最近中文字幕一区二区三区| 久久精品亚洲乱码伦伦中文 | 国产91在线看| 国产一区二区剧情av在线| 免费看精品久久片| 日韩综合在线视频| 日本视频中文字幕一区二区三区| 玉米视频成人免费看| 成人免费在线播放视频| 国产精品久久久久四虎| 国产精品天美传媒| 欧美激情在线观看视频免费| 久久久亚洲精品石原莉奈| 久久午夜色播影院免费高清 | 欧美色偷偷大香| 欧美午夜精品免费| 欧美中文字幕一区二区三区亚洲| 91色乱码一区二区三区| 97久久久精品综合88久久| eeuss国产一区二区三区| 不卡的看片网站| 色婷婷综合视频在线观看| 色拍拍在线精品视频8848| 色狠狠综合天天综合综合| 91色视频在线| 欧美精品在欧美一区二区少妇| 欧美日韩中文字幕一区| 91麻豆精品91久久久久久清纯 | 99久久国产免费看| av在线不卡观看免费观看| 91丨porny丨蝌蚪视频| 色综合久久久网| 欧美日韩在线亚洲一区蜜芽| 7777精品伊人久久久大香线蕉经典版下载 | 99久久婷婷国产| 在线影院国内精品| 日韩女同互慰一区二区| 久久色中文字幕| 亚洲图片欧美激情| 亚洲成av人片一区二区三区| 蜜桃视频一区二区| 成人午夜av电影| 欧美日韩精品一区二区三区四区| 日韩免费电影网站| 中文字幕一区二区三中文字幕| 亚洲国产一区二区视频| 韩日欧美一区二区三区| 成人三级在线视频| 欧美日韩日本视频| 久久九九全国免费| 亚洲成人黄色影院| 国产成人精品aa毛片| 欧美日韩国产一二三| 久久久久久久久久久99999| 一区二区三区日韩在线观看| 久久精品99国产国产精| 色综合久久综合网欧美综合网 | 成人a区在线观看| 91精品久久久久久久99蜜桃 | 日韩午夜激情电影| 国产精品国产自产拍高清av| 美国毛片一区二区| 欧美影片第一页|