1 /* 2 * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package com.sun.prism.es2; 27 28 import com.sun.javafx.PlatformUtil; 29 import com.sun.prism.Image; 30 import com.sun.prism.PhongMaterial; 31 import com.sun.prism.Texture; 32 import com.sun.prism.TextureMap; 33 import com.sun.prism.impl.BaseGraphicsResource; 34 import com.sun.prism.impl.Disposer; 35 import com.sun.prism.paint.Color; 36 import sun.util.logging.PlatformLogger; 37 38 /** 39 * TODO: 3D - Need documentation 40 */ 41 class ES2PhongMaterial extends BaseGraphicsResource implements PhongMaterial { 42 43 static int count = 0; 44 private final ES2Context context; 45 private final long nativeHandle; 46 TextureMap maps[] = new TextureMap[MAX_MAP_TYPE]; 47 48 Color diffuseColor = Color.WHITE; 49 Color specularColor = Color.WHITE; 50 boolean specularColorSet = false; 51 52 private ES2PhongMaterial(ES2Context context, long nativeHandle, 53 Disposer.Record disposerRecord) { 54 super(disposerRecord); 55 this.context = context; 56 this.nativeHandle = nativeHandle; 57 count++; 58 } 59 60 static ES2PhongMaterial create(ES2Context context) { 61 long nativeHandle = context.createES2PhongMaterial(); 62 return new ES2PhongMaterial(context, nativeHandle, new ES2PhongMaterialDisposerRecord(context, nativeHandle)); 63 } 64 65 long getNativeHandle() { 66 return nativeHandle; 67 } 68 69 @Override 70 public void setDiffuseColor(float r, float g, float b, float a) { 71 diffuseColor = new Color(r,g,b,a); 72 } 73 74 @Override 75 public void setSpecularColor(boolean set, float r, float g, float b, float a) { 76 specularColorSet = set; 77 specularColor = new Color(r,g,b,a); 78 } 79 80 public void setTextureMap(TextureMap map) { 81 maps[map.getType().ordinal()] = map; 82 } 83 84 private Texture setupTexture(TextureMap map, boolean useMipmap) { 85 Image image = map.getImage(); 86 Texture texture = (image == null) ? null 87 : context.getResourceFactory().getCachedTexture(image, Texture.WrapMode.REPEAT, useMipmap); 88 return texture; 89 } 90 91 public void lockTextureMaps() { 92 for (int i = 0; i < MAX_MAP_TYPE; i++) { 93 Texture texture = maps[i].getTexture(); 94 if (!maps[i].isDirty() && texture != null) { 95 texture.lock(); 96 if (!texture.isSurfaceLost()) { 97 continue; 98 } 99 } 100 // Enable mipmap if platform isn't embedded and map is diffuse or self illum 101 boolean useMipmap = (!PlatformUtil.isEmbedded()) && (i == PhongMaterial.DIFFUSE || i == PhongMaterial.SELF_ILLUM); 102 texture = setupTexture(maps[i], useMipmap); 103 maps[i].setTexture(texture); 104 maps[i].setDirty(false); 105 if (maps[i].getImage() != null && texture == null) { 106 String logname = PhongMaterial.class.getName(); 107 PlatformLogger.getLogger(logname).warning( 108 "Warning: Low on texture resources. Cannot create texture."); 109 } 110 } 111 } 112 113 public void unlockTextureMaps() { 114 for (int i = 0; i < MAX_MAP_TYPE; i++ ) { 115 Texture texture = maps[i].getTexture(); 116 if (texture != null) { 117 texture.unlock(); 118 } 119 } 120 } 121 122 @Override 123 public void dispose() { 124 disposerRecord.dispose(); 125 count--; 126 } 127 128 public int getCount() { 129 return count; 130 } 131 132 static class ES2PhongMaterialDisposerRecord implements Disposer.Record { 133 134 private final ES2Context context; 135 private long nativeHandle; 136 137 ES2PhongMaterialDisposerRecord(ES2Context context, long nativeHandle) { 138 this.context = context; 139 this.nativeHandle = nativeHandle; 140 } 141 142 void traceDispose() { 143 } 144 145 public void dispose() { 146 if (nativeHandle != 0L) { 147 traceDispose(); 148 context.releaseES2PhongMaterial(nativeHandle); 149 nativeHandle = 0L; 150 } 151 } 152 } 153 }