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.d3d; 27 28 import com.sun.prism.Image; 29 import com.sun.prism.PhongMaterial; 30 import com.sun.prism.Texture; 31 import com.sun.prism.TextureMap; 32 import com.sun.prism.impl.BaseGraphicsResource; 33 import com.sun.prism.impl.Disposer; 34 import sun.util.logging.PlatformLogger; 35 36 /** 37 * TODO: 3D - Need documentation 38 */ 39 class D3DPhongMaterial extends BaseGraphicsResource implements PhongMaterial { 40 41 static int count = 0; 42 43 private final D3DContext context; 44 private final long nativeHandle; 45 private TextureMap maps[] = new TextureMap[MAX_MAP_TYPE]; 46 47 private D3DPhongMaterial(D3DContext context, long nativeHandle, 48 Disposer.Record disposerRecord) { 49 super(disposerRecord); 50 this.context = context; 51 this.nativeHandle = nativeHandle; 52 count++; 53 } 54 55 static D3DPhongMaterial create(D3DContext context) { 56 long nativeHandle = context.createD3DPhongMaterial(); 57 return new D3DPhongMaterial(context, nativeHandle, new D3DPhongMaterialDisposerRecord(context, nativeHandle)); 58 } 59 60 long getNativeHandle() { 61 return nativeHandle; 62 } 63 64 @Override 65 public void setDiffuseColor(float r, float g, float b, float a) { 66 context.setDiffuseColor(nativeHandle, r, g, b, a); 67 } 68 69 @Override 70 public void setSpecularColor(boolean set, float r, float g, float b, float a) { 71 context.setSpecularColor(nativeHandle, set, r, g, b, a); 72 } 73 74 public void setTextureMap(TextureMap map) { 75 maps[map.getType().ordinal()] = map; 76 } 77 78 private Texture setupTexture(TextureMap map, boolean useMipmap) { 79 Image image = map.getImage(); 80 Texture texture = (image == null) ? null 81 : context.getResourceFactory().getCachedTexture(image, Texture.WrapMode.REPEAT, useMipmap); 82 long hTexture = (texture != null) ? ((D3DTexture) texture).getNativeTextureObject() : 0; 83 context.setMap(nativeHandle, map.getType().ordinal(), hTexture); 84 return texture; 85 } 86 87 public void lockTextureMaps() { 88 for (int i = 0; i < MAX_MAP_TYPE; i++) { 89 Texture texture = maps[i].getTexture(); 90 if (!maps[i].isDirty() && texture != null) { 91 texture.lock(); 92 if (!texture.isSurfaceLost()) { 93 continue; 94 } 95 } 96 // Enable mipmap if map is diffuse or self illum. 97 boolean useMipmap = (i == PhongMaterial.DIFFUSE) || (i == PhongMaterial.SELF_ILLUM); 98 texture = setupTexture(maps[i], useMipmap); 99 maps[i].setTexture(texture); 100 maps[i].setDirty(false); 101 if (maps[i].getImage() != null && texture == null) { 102 String logname = PhongMaterial.class.getName(); 103 PlatformLogger.getLogger(logname).warning( 104 "Warning: Low on texture resources. Cannot create texture."); 105 } 106 } 107 } 108 109 public void unlockTextureMaps() { 110 for (int i = 0; i < MAX_MAP_TYPE; i++) { 111 Texture texture = maps[i].getTexture(); 112 if (texture != null) { 113 texture.unlock(); 114 } 115 } 116 } 117 118 @Override 119 public void dispose() { 120 disposerRecord.dispose(); 121 count--; 122 } 123 124 public int getCount() { 125 return count; 126 } 127 128 static class D3DPhongMaterialDisposerRecord implements Disposer.Record { 129 130 private final D3DContext context; 131 private long nativeHandle; 132 133 D3DPhongMaterialDisposerRecord(D3DContext context, long nativeHandle) { 134 this.context = context; 135 this.nativeHandle = nativeHandle; 136 } 137 138 void traceDispose() { 139 } 140 141 public void dispose() { 142 if (nativeHandle != 0L) { 143 traceDispose(); 144 context.releaseD3DPhongMaterial(nativeHandle); 145 nativeHandle = 0L; 146 } 147 } 148 } 149 }