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

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

?? rectangularnormaltessellator.java

?? world wind java sdk 源碼
?? JAVA
?? 第 1 頁 / 共 5 頁
字號:
	private void selectVisibleTiles(DrawContext dc, RectTile tile)
	{
		Extent extent = tile.getExtent();
		if (extent != null && !extent.intersects(this.currentFrustum))
			return;

		if (this.currentLevel < this.maxLevel - 1 && this.needToSplit(dc, tile))
		{
			++this.currentLevel;
			RectTile[] subtiles = this.split(dc, tile);
			for (RectTile child : subtiles)
			{
				this.selectVisibleTiles(dc, child);
			}
			--this.currentLevel;
			return;
		}
		this.currentCoverage = tile.getSector().union(this.currentCoverage);
		this.currentTiles.add(tile);
	}

	private boolean needToSplit(DrawContext dc, RectTile tile)
	{
		Vec4[] corners = tile.sector.computeCornerPoints(dc.getGlobe(), dc.getVerticalExaggeration());
		Vec4 centerPoint = tile.sector.computeCenterPoint(dc.getGlobe(), dc.getVerticalExaggeration());

		View view = dc.getView();
		double d1 = view.getEyePoint().distanceTo3(corners[0]);
		double d2 = view.getEyePoint().distanceTo3(corners[1]);
		double d3 = view.getEyePoint().distanceTo3(corners[2]);
		double d4 = view.getEyePoint().distanceTo3(corners[3]);
		double d5 = view.getEyePoint().distanceTo3(centerPoint);

		double minDistance = d1;
		if (d2 < minDistance)
			minDistance = d2;
		if (d3 < minDistance)
			minDistance = d3;
		if (d4 < minDistance)
			minDistance = d4;
		if (d5 < minDistance)
			minDistance = d5;

		double logDist = Math.log10(minDistance);
		boolean useTile = tile.log10CellSize <= (logDist - DEFAULT_LOG10_RESOLUTION_TARGET);

		return !useTile;
	}

	private RectTile[] split(DrawContext dc, RectTile tile)
	{
		Sector[] sectors = tile.sector.subdivide();

		RectTile[] subTiles = new RectTile[4];
		subTiles[0] = this.createTile(dc, sectors[0], tile.level + 1);
		subTiles[1] = this.createTile(dc, sectors[1], tile.level + 1);
		subTiles[2] = this.createTile(dc, sectors[2], tile.level + 1);
		subTiles[3] = this.createTile(dc, sectors[3], tile.level + 1);

		return subTiles;
	}

    private RectangularNormalTessellator.CacheKey createCacheKey(DrawContext dc, RectTile tile)
    {
        return new CacheKey(dc, tile.sector, tile.density);
    }

    private void makeVerts(DrawContext dc, RectTile tile)
    {
        // First see if the vertices have been previously computed and are in the cache. Since the elevation model
        // can change between frames, regenerate and re-cache vertices every second.
        MemoryCache cache = WorldWind.getMemoryCache(CACHE_ID);
        CacheKey cacheKey = this.createCacheKey(dc, tile);
        tile.ri = (RenderInfo) cache.getObject(cacheKey);
        if (tile.ri != null && tile.ri.time >= System.currentTimeMillis() - 1000) // Regenerate cache after one second
            return;

        tile.ri = this.buildVerts(dc, tile, this.makeTileSkirts);
        if (tile.ri != null)
        {
            cacheKey = this.createCacheKey(dc, tile);
            cache.add(cacheKey, tile.ri, tile.ri.getSizeInBytes());
        }
    }

	public RenderInfo buildVerts(DrawContext dc, RectTile tile, boolean makeSkirts)
	{
		int density = tile.density;
		int side = density + 3;
		int numVertices = side * side;
		java.nio.DoubleBuffer verts = BufferUtil.newDoubleBuffer(numVertices * 3);
        ArrayList<LatLon> latlons = this.computeLocations(tile);
        double[] elevations = new double[latlons.size()];
        dc.getGlobe().getElevations(tile.sector, latlons, tile.getResolution(), elevations);

		Globe globe = dc.getGlobe();

		Angle dLat = tile.sector.getDeltaLat().divide(density);
		Angle latMin = tile.sector.getMinLatitude();
		Angle latMax = tile.sector.getMaxLatitude();

		Angle dLon = tile.sector.getDeltaLon().divide(density);
		Angle lonMin = tile.sector.getMinLongitude();
		Angle lonMax = tile.sector.getMaxLongitude();

		Angle lat, lon;
		int iv = 0;
		double elevation, verticalExaggeration = dc.getVerticalExaggeration();
		Vec4 p;

		LatLon centroid = tile.sector.getCentroid();
		Vec4 refCenter = globe.computePointFromPosition(centroid.getLatitude(), centroid.getLongitude(), 0d);

        int ie = 0;
        Iterator<LatLon> latLonIter = latlons.iterator();

        // Compute verts without skirts
		for (int j = 0; j < side; j++)
		{
			for (int i = 0; i < side; i++)
			{
                LatLon latlon = latLonIter.next();
                elevation = verticalExaggeration * elevations[ie++];
				p = globe.computePointFromPosition(latlon.getLatitude(), latlon.getLongitude(), elevation);
				verts.put(iv++, p.x - refCenter.x).put(iv++, p.y - refCenter.y).put(iv++, p.z - refCenter.z);
			}
		}

		// Compute indices and normals
		java.nio.IntBuffer indices = getIndices(density);
		java.nio.DoubleBuffer norms = getNormals(density, verts, indices, refCenter);

		// Fold down the sides as skirts
		double exaggeratedMinElevation = makeSkirts ? Math.abs(globe.getMinElevation() * verticalExaggeration) : 0;
		lat = latMin;
		for (int j = 0; j < side; j++)
		{
			//min longitude side
            ie = j * side + 1;
            elevation = verticalExaggeration * elevations[ie];
			elevation -= exaggeratedMinElevation >= 0 ? exaggeratedMinElevation : -exaggeratedMinElevation;
			p = globe.computePointFromPosition(lat, lonMin, elevation);
			iv = (j * side) * 3;
			verts.put(iv++, p.x - refCenter.x).put(iv++, p.y - refCenter.y)
					.put(iv++, p.z - refCenter.z);

			//max longitude side
            ie += side - 2;
            elevation = verticalExaggeration * elevations[ie];
			elevation -= exaggeratedMinElevation >= 0 ? exaggeratedMinElevation : -exaggeratedMinElevation;
			p = globe.computePointFromPosition(lat, lonMax, elevation);
			iv = ((j + 1) * side - 1) * 3;
			verts.put(iv++, p.x - refCenter.x).put(iv++, p.y - refCenter.y)
					.put(iv++, p.z - refCenter.z);

			if (j > density)
				lat = latMax;
			else if (j != 0)
				lat = lat.add(dLat);
		}

		lon = lonMin;
		for (int i = 0; i < side; i++)
		{
			//min latitude side
            ie = i + side;
            elevation = verticalExaggeration * elevations[ie];
			elevation -= exaggeratedMinElevation >= 0 ? exaggeratedMinElevation : -exaggeratedMinElevation;
			p = globe.computePointFromPosition(latMin, lon, elevation);
			iv = i * 3;
			verts.put(iv++, p.x - refCenter.x).put(iv++, p.y - refCenter.y)
					.put(iv++, p.z - refCenter.z);

			//max latitude side
            ie += (side - 2) * side;
            elevation = verticalExaggeration * elevations[ie];
			elevation -= exaggeratedMinElevation >= 0 ? exaggeratedMinElevation : -exaggeratedMinElevation;
			p = globe.computePointFromPosition(latMax, lon, elevation);
			iv = (side * (side - 1) + i) * 3;
			verts.put(iv++, p.x - refCenter.x).put(iv++, p.y - refCenter.y)
					.put(iv++, p.z - refCenter.z);

			if (i > density)
				lon = lonMax;
			else if (i != 0)
				lon = lon.add(dLon);
		}

		return new RenderInfo(density, verts, getTextureCoordinates(density), norms, refCenter);
	}

    private ArrayList<LatLon> computeLocations(RectTile tile)
    {
        int density = tile.density;
        int numVertices = (density + 3) * (density + 3);

        Angle latMax = tile.sector.getMaxLatitude();
        Angle dLat = tile.sector.getDeltaLat().divide(density);
        Angle lat = tile.sector.getMinLatitude().subtract(dLat);

        Angle lonMin = tile.sector.getMinLongitude();
        Angle lonMax = tile.sector.getMaxLongitude();
        Angle dLon = tile.sector.getDeltaLon().divide(density);

        ArrayList<LatLon> latlons = new ArrayList<LatLon>(numVertices);
        for (int j = 0; j <= density + 2; j++)
        {
            Angle lon = lonMin.subtract(dLon);
            for (int i = 0; i <= density + 2; i++)
            {
                latlons.add(new LatLon(lat, lon));

                lon = lon.add(dLon);

                if (lon.degrees < -180)
                    lon = Angle.NEG180;
                else if (lon.degrees > 180)
                    lon = Angle.POS180;
            }

            lat = lat.add(dLat);
        }

        return latlons;
    }

    private void renderMultiTexture(DrawContext dc, RectTile tile,
			int numTextureUnits)
	{
		if (dc == null)
		{
			String msg = Logging.getMessage("nullValue.DrawContextIsNull");
			Logging.logger().severe(msg);
			throw new IllegalArgumentException(msg);
		}

		if (numTextureUnits < 1)
		{
			String msg = Logging
					.getMessage("generic.NumTextureUnitsLessThanOne");
			Logging.logger().severe(msg);
			throw new IllegalArgumentException(msg);
		}

		this.render(dc, tile, numTextureUnits);
	}

	private void render(DrawContext dc, RectTile tile)
	{
		if (dc == null)
		{
			String msg = Logging.getMessage("nullValue.DrawContextIsNull");
			Logging.logger().severe(msg);
			throw new IllegalArgumentException(msg);
		}

		this.render(dc, tile, 1);
	}

	private long render(DrawContext dc, RectTile tile, int numTextureUnits)
	{
		if (tile.ri == null)
		{
			String msg = Logging.getMessage("nullValue.RenderInfoIsNull");
			Logging.logger().severe(msg);
			throw new IllegalStateException(msg);
		}

		dc.getView().pushReferenceCenter(dc, tile.ri.referenceCenter);

        if (!dc.isPickingMode() && this.lightDirection != null)
            beginLighting(dc);

        GL gl = dc.getGL();
		gl.glPushClientAttrib(GL.GL_CLIENT_VERTEX_ARRAY_BIT);
		gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
		gl.glVertexPointer(3, GL.GL_DOUBLE, 0, tile.ri.vertices.rewind());

		gl.glEnableClientState(GL.GL_NORMAL_ARRAY);
		gl.glNormalPointer(GL.GL_DOUBLE, 0, tile.ri.normals.rewind());

		for (int i = 0; i < numTextureUnits; i++)
		{
			gl.glClientActiveTexture(GL.GL_TEXTURE0 + i);
			gl.glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY);
            Object texCoords = dc.getValue(AVKey.TEXTURE_COORDINATES);
            if (texCoords != null && texCoords instanceof DoubleBuffer)
                gl.glTexCoordPointer(2, GL.GL_DOUBLE, 0, ((DoubleBuffer) texCoords).rewind());
            else
                gl.glTexCoordPointer(2, GL.GL_DOUBLE, 0, tile.ri.texCoords.rewind());
		}

		gl.glDrawElements(javax.media.opengl.GL.GL_TRIANGLE_STRIP,
				tile.ri.indices.limit(), javax.media.opengl.GL.GL_UNSIGNED_INT,
				tile.ri.indices.rewind());

		gl.glDisableClientState(GL.GL_NORMAL_ARRAY);
		gl.glPopClientAttrib();

        if (!dc.isPickingMode() && this.lightDirection != null)
            endLighting(dc);

        dc.getView().popReferenceCenter(dc);

		return tile.ri.indices.limit() - 2; // return number of triangles rendered
	}

    private void beginLighting(DrawContext dc)
    {
        GL gl = dc.getGL();
        gl.glPushAttrib(GL.GL_ENABLE_BIT | GL.GL_CURRENT_BIT | GL.GL_LIGHTING_BIT);

        this.material.apply(gl, GL.GL_FRONT);
        gl.glDisable(GL.GL_COLOR_MATERIAL);

        float[] lightPosition = {(float)-lightDirection.x, (float)-lightDirection.y, (float)-lightDirection.z, 0.0f};
        float[] lightDiffuse = new float[4];
        float[] lightAmbient = new float[4];
        lightColor.getRGBComponents(lightDiffuse);
        ambientColor.getRGBComponents(lightAmbient);

        gl.glLightfv(GL.GL_LIGHT1, GL.GL_POSITION, lightPosition, 0);
        gl.glLightfv(GL.GL_LIGHT1, GL.GL_DIFFUSE, lightDiffuse, 0);
        gl.glLightfv(GL.GL_LIGHT1, GL.GL_AMBIENT, lightAmbient, 0);

        gl.glDisable(GL.GL_LIGHT0);
        gl.glEnable(GL.GL_LIGHT1);
        gl.glEnable(GL.GL_LIGHTING);
    }

    private void endLighting(DrawContext dc)
    {
        GL gl = dc.getGL();

        gl.glDisable(GL.GL_LIGHT1);
        gl.glEnable(GL.GL_LIGHT0);
        gl.glDisable(GL.GL_LIGHTING);

        gl.glPopAttrib();
    }

    private void renderWireframe(DrawContext dc, RectTile tile,
			boolean showTriangles, boolean showTileBoundary)
	{
		if (dc == null)
		{
			String msg = Logging.getMessage("nullValue.DrawContextIsNull");
			Logging.logger().severe(msg);
			throw new IllegalArgumentException(msg);
		}

		if (tile.ri == null)
		{
			String msg = Logging.getMessage("nullValue.RenderInfoIsNull");
			Logging.logger().severe(msg);
			throw new IllegalStateException(msg);
		}

		java.nio.IntBuffer indices = getIndices(tile.ri.density);
		indices.rewind();

		dc.getView().pushReferenceCenter(dc, tile.ri.referenceCenter);

		javax.media.opengl.GL gl = dc.getGL();
		gl.glPushAttrib(GL.GL_DEPTH_BUFFER_BIT | GL.GL_POLYGON_BIT
				| GL.GL_TEXTURE_BIT | GL.GL_ENABLE_BIT | GL.GL_CURRENT_BIT);
		gl.glEnable(GL.GL_BLEND);
		gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE);
		gl.glDisable(javax.media.opengl.GL.GL_DEPTH_TEST);
		gl.glEnable(javax.media.opengl.GL.GL_CULL_FACE);
		gl.glCullFace(javax.media.opengl.GL.GL_BACK);
		gl.glDisable(javax.media.opengl.GL.GL_TEXTURE_2D);
		gl.glColor4d(1d, 1d, 1d, 0.2);
		gl.glPolygonMode(javax.media.opengl.GL.GL_FRONT,
				javax.media.opengl.GL.GL_LINE);

		if (showTriangles)
		{
			gl.glPushClientAttrib(GL.GL_CLIENT_VERTEX_ARRAY_BIT);
			gl.glEnableClientState(GL.GL_VERTEX_ARRAY);

			gl.glVertexPointer(3, GL.GL_DOUBLE, 0, tile.ri.vertices);
			gl.glDrawElements(javax.media.opengl.GL.GL_TRIANGLE_STRIP, indices
					.limit(), javax.media.opengl.GL.GL_UNSIGNED_INT, indices);

			gl.glPopClientAttrib();
		}

		dc.getView().popReferenceCenter(dc);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费观看成人av| 日韩av二区在线播放| 国产成人精品亚洲777人妖| 26uuu亚洲综合色| 国产精品99久久久| 国产午夜亚洲精品午夜鲁丝片 | 亚洲免费在线视频一区 二区| 99久久久久久99| 亚洲已满18点击进入久久| 色狠狠一区二区| 丝袜亚洲精品中文字幕一区| 日韩一级免费一区| 国产a级毛片一区| 国产午夜一区二区三区| 91在线视频观看| 午夜精品一区二区三区电影天堂 | 最新热久久免费视频| 色婷婷av一区二区三区gif| 婷婷国产在线综合| 国产精品国产三级国产有无不卡 | 国产欧美日韩激情| 99久久精品国产一区二区三区 | 自拍视频在线观看一区二区| 欧美日韩在线一区二区| 久久99精品国产| 一区二区三区在线看| 日韩精品一区二区三区视频播放| 国产精品一二三在| 亚洲精品视频免费观看| 精品美女一区二区| 成人av资源在线| 日本中文字幕一区二区视频| 国产性做久久久久久| 欧美日韩国产影片| 国产91精品一区二区麻豆亚洲| 玉米视频成人免费看| 日韩精品一区二区在线观看| 91免费视频大全| 狠狠狠色丁香婷婷综合久久五月| 亚洲人成影院在线观看| 日韩精品影音先锋| 欧美亚洲国产一区在线观看网站 | 国产裸体歌舞团一区二区| 国产精品毛片久久久久久| 日韩欧美亚洲国产精品字幕久久久| www.日韩大片| 国产在线精品免费| 午夜影院在线观看欧美| 国产精品无码永久免费888| 欧美一二三区在线观看| 在线观看av一区二区| 国产suv精品一区二区三区| 日韩国产一区二| 亚洲成av人片在线观看无码| 国产精品电影一区二区| 国产亚洲福利社区一区| 精品久久久久久久久久久久久久久久久 | 国产精品综合网| 免费观看一级特黄欧美大片| 亚洲综合免费观看高清完整版在线 | 午夜久久福利影院| 亚洲男人天堂av网| 亚洲国产成人在线| 久久久美女艺术照精彩视频福利播放| 欧美日韩激情在线| 欧美日韩一区二区电影| 99re亚洲国产精品| 97久久超碰国产精品| 成人黄色电影在线 | 成人理论电影网| 国产在线不卡一区| 国内精品国产成人| 国产曰批免费观看久久久| 老司机午夜精品99久久| 欧美aaaaa成人免费观看视频| 污片在线观看一区二区| 亚洲成人手机在线| 亚洲国产wwwccc36天堂| 亚洲欧美电影一区二区| 亚洲欧美一区二区三区孕妇| 国产精品女主播在线观看| 国产精品水嫩水嫩| 国产精品不卡视频| 亚洲黄网站在线观看| 亚洲一区二区中文在线| 午夜电影一区二区三区| 欧美aa在线视频| 国产一本一道久久香蕉| 国产999精品久久久久久绿帽| 成人免费黄色大片| 91视频观看视频| 欧美调教femdomvk| 欧美一区二区三区精品| 精品日韩一区二区三区免费视频| xvideos.蜜桃一区二区| 精品国产露脸精彩对白| 欧美国产激情一区二区三区蜜月| 国产精品美女久久久久久久久| 亚洲日本护士毛茸茸| 亚洲综合色区另类av| 美国一区二区三区在线播放| 激情文学综合丁香| 91免费视频网| 日韩一区二区三区免费看| 久久久一区二区三区| 亚洲私人影院在线观看| 紧缚捆绑精品一区二区| 成人精品鲁一区一区二区| 色噜噜久久综合| 欧美xxx久久| 1024成人网色www| 亚洲成人自拍一区| 国产自产视频一区二区三区| www.亚洲在线| 欧美一激情一区二区三区| 国产精品欧美一级免费| 亚洲成人免费观看| 成人一区二区三区中文字幕| 欧美三级日韩在线| 国产午夜亚洲精品羞羞网站| 亚洲成a人v欧美综合天堂| 国产一区中文字幕| 欧美性极品少妇| 国产日韩av一区二区| 亚洲bdsm女犯bdsm网站| 成人一区二区视频| 在线不卡免费av| 中文字幕一区二区三区精华液| 日本视频中文字幕一区二区三区| 成人国产视频在线观看| 日韩一区二区三区在线观看| 亚洲免费三区一区二区| 国产剧情一区在线| 91精品欧美福利在线观看| 亚洲日本在线视频观看| 国产一区二区三区综合| 欧美一区二区黄色| 一区二区视频在线| 成人永久免费视频| 精品国产免费人成电影在线观看四季 | 日韩主播视频在线| 91在线国产福利| 久久女同精品一区二区| 日本中文字幕一区二区有限公司| 91在线观看免费视频| 国产亚洲欧洲997久久综合| 五月婷婷激情综合网| 色天使色偷偷av一区二区| 国产日韩欧美制服另类| 日本不卡不码高清免费观看| 欧美系列一区二区| 亚洲精品乱码久久久久久黑人| 国产精品 日产精品 欧美精品| 日韩视频在线你懂得| 日韩国产一二三区| 欧美日韩国产一级二级| 一区二区欧美精品| 色综合天天综合狠狠| 成人欧美一区二区三区1314| 国产91丝袜在线播放0| 国产亚洲综合av| 国产美女精品在线| 久久精品一区二区| 国产一区激情在线| 久久亚洲二区三区| 国产精品99久| 国产精品每日更新| 91影视在线播放| 18成人在线观看| 欧美专区亚洲专区| 亚洲国产精品影院| 欧美另类videos死尸| 亚洲1区2区3区4区| 337p亚洲精品色噜噜噜| 奇米色一区二区| 欧美www视频| 国产精品系列在线观看| 中文字幕+乱码+中文字幕一区| 岛国av在线一区| 中文字幕一区在线| 色94色欧美sute亚洲线路一ni| 亚洲成人综合视频| 日韩三区在线观看| 精品制服美女丁香| 日本一区二区久久| 91丨九色丨蝌蚪富婆spa| 亚洲国产日韩a在线播放性色| 欧美体内she精视频| 免费成人性网站| 久久这里只有精品6| 成人av在线影院| 亚洲午夜激情网页| 国产亚洲精品超碰| 色综合天天综合| 日韩主播视频在线| 亚洲国产精品ⅴa在线观看| 在线观看不卡视频| 国产在线精品一区二区不卡了| 国产精品对白交换视频| 欧美理论电影在线|