This stuff sounds great!
I have another one for you guys.
How about H/W texture compression?
I didn't see projected textures either. Sure would like to have that!
(for shadows, headlights, etc.)
I could go on..... :-)
Charmaine Lee wrote:
>> The problem with using DECAL is that the surface is not shaded in DECAL
>> mode.
>
> True. You can only use MODULATE in the first texture unit state
> to attenuate the texture color. Doing DECAL in the second
> texture unit state will only control the amount of blend between
> the two textures, the primary color is lost for the
> second texture.
>
>
>
>> Could you give more explaination of COMBINE as well as "advanced
>> texturing" coming in Java3D 1.3.
>>
>
> We are still in the process of doing the spec for 1.3 right now.
> So nothing is final yet. The preliminary list of advanced texture
> features going into Java3D 1.3 includes,
> . cube environment mapping
> . anisotropic filtering
> . texture LOD & texture LOD bias
> . ImageComponent subimage modification
> . Texture Environment COMBINE
> . detail texture, sharpen texture, texture filter4
> . TexCoord4f
>
> The new COMBINE texture mode allows you to define a general
> operation of how colors are combined in a texture unit state.
> In particular, it allows you to specify where the colors are derived
> from for the operation, they can be from texture, primary color,
> constant color or result of previous texture unit.
>
> For example,
> currently, as mentioned above, primary color is only available
> to texture unit 0, but with COMBINE mode, you can specify primary
> color as one of the arguments to the MODULATE mode in the nth
> texture unit.
> Hence if you want to apply two textures 0.4*TexA and (1-0.4)*TexB to one
> shape, with the new COMBINE mode, what you can do is first
> use DECAL to blend the two textures according to the alpha factor
> using the first two texture units,
> and then assign MODULATE as the combine mode in the third texture unit
> with arg0 coming from the previous texture unit and arg1 coming from
> the primary color. The last step will effectively apply lighting
> to the blended textures.
>
> Another being proposed combine mode is DOT3, which allows you
> to do dot product of two arguments. This can be used to do
> bump mapping.
>
> We are working on the specification right now. More details
> will be available when the specification is ready for review.
> So stay tuned :)
>
> -Charmaine
>
>
>
>
>
>>> Shawn,
>>>
>>>
>>>
>>>> This example (as well as Java3D) will blend between two textures.
>>>> However, you can not set the amount of blend, it's always 50/50.
>>>
>>>
>>> Yes, the example that I included in the previous mail is just meant to
>>> show Mike how multiple textures can be applied to a shape node in Java3D.
>>>
>>>
>>>
>>>
>>>> And can you control the amount of blend/alpha (ex texture1.alpha = .2)
>>>> directly - other than the actual alpha of each pixels?
>>>
>>>
>>> Currently, you need to use the DECAL texture mode and use the
>>> texture alpha value to control the amount of blend of the two textures.
>>> In Java3D1.3, we are proposing a new COMBINE texture mode which will
>>> give you more control on how to combine textures or how to combine
>>> primary color with texture in general.
>>>
>>>
>>> -Charmaine Lee
>>> Java3D Engineering Team
>>>
>>>
>>>
>>>
>>>
>>>
>>>> Charmaine Lee wrote:
>>>>
>>>> > Mike,
>>>> >
>>>> > You can use multiple texture unit states to blend multiple
>>>> > textures onto a shape. Included in the attachment is an
>>>> > example of multi texturing in Java3D.
>>>> >
>>>> > -Charmaine Lee
>>>> > Java3D Engineering Team
>>>> >
>>>> >
>>>> >
>>>> >
>>>> >
>>>> >> X-Originating-IP: [128.187.171.43]
>>>> >> Mime-Version: 1.0
>>>> >> X-OriginalArrivalTime: 14 Feb 2001 22:50:46.0351 (UTC)
>>>> >
>>>> > FILETIME=[916FF5F0:01C096D8]
>>>> >
>>>> >> Date: Wed, 14 Feb 2001 15:03:13 -0800
>>>> >> From: Michael Smith <[EMAIL PROTECTED]>
>>>> >> Subject: [JAVA3D] texture map blending
>>>> >> To: [EMAIL PROTECTED]
>>>> >>
>>>> >> Java3D people,
>>>> >> I'm doing research in image morphing and animation. I'd like
>>>> to know
>>>> >> how you would recommend handling the problem of blending two different
>>>> >> textures onto a shape (triangulated grid) in Java3d. We'd like to do
>>>
> it
>
>>>> >> taking advantage of java3d's hardware acceleration if we can.
>>>> >> I've looked through the documentation on Java3D and couldn't find
>>>> >> anything that I thought would work for this. The BLEND option in the
>>>> >> TextureAppearance class only works with regaurd to the blend color.
>>>> >> One thing we've done in the past was to paint the first texture
>>>> map at
>>>> >> a fraction of it's value (ex texture1.alpha = .2 ) and then paint
>>>> the second
>>>> >> texture map on top of that with a the rest of the value(
>>>> texture2.alpha = .8
>>>> >> ). I don't know how you would do this in java3d.
>>>> >> I would be most grateful for any advice you would have.
>>>> >>
>>>> >> -Mike Smith.
>>>> >> _________________________________________________________________
>>>> >> Get your FREE download of MSN Explorer at http://explorer.msn.com
>>>> >>
>>>> >>
>>>> ===========================================================================
>>>> >> To unsubscribe, send email to [EMAIL PROTECTED] and include in
>>>> the body
>>>> >> of the message "signoff JAVA3D-INTEREST". For general help, send
>>>> email to
>>>> >> [EMAIL PROTECTED] and include in the body of the message "help".
>>>> >>
>>>> >>
>>>> >>
>>>
> ------------------------------------------------------------------------
>
>>>> >>
>>>> >> /*
>>>> >> * @(#)MultiTextureTest.java 1.8 01/01/11 07:40:34
>>>> >> *
>>>> >> * Copyright (c) 1996-2001 Sun Microsystems, Inc. All Rights Reserved.
>>>> >> *
>>>> >> * Sun grants you ("Licensee") a non-exclusive, royalty free,
>>>> license to use,
>>>> >> * modify and redistribute this software in source and binary code
>>>
> form,
>
>>>> >> * provided that i) this copyright notice and license appear on all
>>>> copies of
>>>> >> * the software; and ii) Licensee does not utilize the software in a
>>>> manner
>>>> >> * which is disparaging to Sun.
>>>> >> *
>>>> >> * This software is provided "AS IS," without a warranty of any
>>>> kind. ALL
>>>> >> * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
>>>> INCLUDING ANY
>>>> >> * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
>>>> PURPOSE OR
>>>> >> * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS
>>>> SHALL NOT BE
>>>> >> * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING,
>>>> MODIFYING
>>>> >> * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
>>>> SUN OR ITS
>>>> >> * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
>>>> DIRECT,
>>>> >> * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES,
>>>> HOWEVER
>>>> >> * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF
>>>> THE USE OF
>>>> >> * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
>>>> >> * POSSIBILITY OF SUCH DAMAGES.
>>>> >> *
>>>> >> * This software is not designed or intended for use in on-line
>>>> control of
>>>> >> * aircraft, air traffic, aircraft navigation or aircraft
>>>> communications; or in
>>>> >> * the design, construction, operation or maintenance of any nuclear
>>>> >> * facility. Licensee represents and warrants that it will not use or
>>>> >> * redistribute the Software for such purposes.
>>>> >> */
>>>> >>
>>>> >> import com.sun.j3d.utils.image.TextureLoader;
>>>> >> import com.sun.j3d.utils.geometry.Box;
>>>> >> import com.sun.j3d.utils.behaviors.vp.*;
>>>> >> import java.applet.Applet;
>>>> >> import java.awt.*;
>>>> >> import java.awt.event.*;
>>>> >> import com.sun.j3d.utils.applet.MainFrame;
>>>> >> import com.sun.j3d.utils.universe.*;
>>>> >> import javax.media.j3d.*;
>>>> >> import javax.vecmath.*;
>>>> >> import java.awt.image.BufferedImage;
>>>> >>
>>>> >> public class MultiTextureTest extends Applet implements ItemListener{
>>>> >>
>>>> >> Choice choice;
>>>> >> TextureUnitState textureUnitState[] = new TextureUnitState[2];
>>>> >> Texture stoneTex;
>>>> >> Texture skyTex;
>>>> >> Texture lightTex;
>>>> >>
>>>> >> private java.net.URL stoneImage = null;
>>>> >> private java.net.URL skyImage = null;
>>>> >>
>>>> >> private SimpleUniverse u = null;
>>>> >>
>>>> >> public Texture createLightMap(){
>>>> >>
>>>> >> int width = 128;
>>>> >> int height = 128;
>>>> >> BufferedImage bimage = new BufferedImage(width, height,
>>>> BufferedImage.TYPE_INT_RGB);
>>>> >> int [] rgbArray = new int[width * height];
>>>> >> int index, index2;
>>>> >> int rgbInc = 256 / (width / 2 - 20);
>>>> >> int rgbValue = 0;
>>>> >> int k = width/2 - 5;
>>>> >> int i, j, rgb;
>>>> >>
>>>> >> rgb = 0xff;
>>>> >> rgbValue = rgb | (rgb << 8) | (rgb << 16) | (rgb << 24);
>>>> >> for ( i = width / 2 - 1, j = 0; j < 10; j++, i--) {
>>>> >> rgbArray[i] = rgbValue;
>>>> >> }
>>>> >>
>>>> >> for (; i > 8; i--, rgb -= rgbInc) {
>>>> >> rgbValue = rgb | (rgb << 8) | (rgb << 16) | (rgb << 24);
>>>> >> rgbArray[i] = rgbValue;
>>>> >> }
>>>> >>
>>>> >> for (; i >= 0; i--) {
>>>> >> rgbArray[i] = rgbValue;
>>>> >> }
>>>> >>
>>>> >> for (i = 0; i < width/2; i++) {
>>>> >> rgbValue = rgbArray[i];
>>>> >> index = i;
>>>> >> index2 = (width - i - 1);
>>>> >> for (j = 0; j < height; j++) {
>>>> >> rgbArray[index] = rgbArray[index2] = rgbValue;
>>>> >> index += width;
>>>> >> index2 += width;
>>>> >> }
>>>> >> }
>>>> >>
>>>> >> bimage.setRGB(0, 0, width, height, rgbArray, 0, width);
>>>> >>
>>>> >>
>>>> >> ImageComponent2D grayImage = new
>>>> ImageComponent2D(ImageComponent.FORMAT_RGB, bimage);
>>>> >>
>>>> >> lightTex = new Texture2D(Texture.BASE_LEVEL, Texture.RGB, width,
>>>> height);
>>>> >> lightTex.setImage(0, grayImage);
>>>> >>
>>>> >> return lightTex;
>>>> >> }
>>>> >>
>>>> >>
>>>> >> public BranchGroup createSceneGraph() {
>>>> >> // Create the root of the branch graph
>>>> >> BranchGroup objRoot = new BranchGroup();
>>>> >>
>>>> >> // Create a Transformgroup to scale all objects so they
>>>> >> // appear in the scene.
>>>> >> TransformGroup objScale = new TransformGroup();
>>>> >> Transform3D t3d = new Transform3D();
>>>> >> t3d.setScale(0.4);
>>>> >> objScale.setTransform(t3d);
>>>> >> objRoot.addChild(objScale);
>>>> >>
>>>> >> TransformGroup objTrans = new TransformGroup();
>>>> >> //write-enable for behaviors
>>>> >> objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
>>>> >> objTrans.setCapability( TransformGroup.ALLOW_TRANSFORM_READ );
>>>> >> objTrans.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
>>>> >> objScale.addChild(objTrans);
>>>> >>
>>>> >> Appearance ap = new Appearance();
>>>> >>
>>>> >> // load textures
>>>> >> TextureAttributes texAttr1 = new TextureAttributes();
>>>> >> texAttr1.setTextureMode(TextureAttributes.DECAL);
>>>> >> TextureAttributes texAttr2 = new TextureAttributes();
>>>> >> texAttr2.setTextureMode(TextureAttributes.MODULATE);
>>>> >>
>>>> >> TextureLoader tex = new TextureLoader(stoneImage, new
>>>> String("RGB"), this);
>>>> >> if (tex == null)
>>>> >> return null;
>>>> >> stoneTex = tex.getTexture();
>>>> >>
>>>> >> tex = new TextureLoader(skyImage, new String("RGB"), this);
>>>> >> if (tex == null)
>>>> >> return null;
>>>> >> skyTex = tex.getTexture();
>>>> >>
>>>> >> lightTex = createLightMap();
>>>> >>
>>>> >>
>>>> >> textureUnitState[0] = new TextureUnitState(stoneTex, texAttr1,
>>>> null);
>>>> >>
>>>> textureUnitState[0].setCapability(TextureUnitState.ALLOW_STATE_WRITE);
>>>> >>
>>>> >> textureUnitState[1] = new TextureUnitState(lightTex, texAttr2,
>>>> null);
>>>> >>
>>>> textureUnitState[1].setCapability(TextureUnitState.ALLOW_STATE_WRITE);
>>>> >>
>>>> >> ap.setTextureUnitState(textureUnitState);
>>>> >>
>>>> >> //Create a Box
>>>> >> Box BoxObj = new Box(1.5f, 1.5f, 0.8f, Box.GENERATE_NORMALS |
>>>> >> Box.GENERATE_TEXTURE_COORDS, ap, 2);
>>>> >> // add it to the scene graph.
>>>> >> objTrans.addChild(BoxObj);
>>>> >>
>>>> >> BoundingSphere bounds =
>>>> >> new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
>>>> >>
>>>> >> //Shine it with two lights.
>>>> >> Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
>>>> >> Color3f lColor2 = new Color3f(0.2f, 0.2f, 0.1f);
>>>> >> Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, -1.0f);
>>>> >> Vector3f lDir2 = new Vector3f(0.0f, 0.0f, -1.0f);
>>>> >> DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
>>>> >> DirectionalLight lgt2 = new DirectionalLight(lColor2, lDir2);
>>>> >> lgt1.setInfluencingBounds(bounds);
>>>> >> lgt2.setInfluencingBounds(bounds);
>>>> >> objScale.addChild(lgt1);
>>>> >> objScale.addChild(lgt2);
>>>> >>
>>>> >> // Let Java 3D perform optimizations on this scene graph.
>>>> >> objRoot.compile();
>>>> >>
>>>> >> return objRoot;
>>>> >> }
>>>> >>
>>>> >> public MultiTextureTest (){
>>>> >> }
>>>> >>
>>>> >> public MultiTextureTest(java.net.URL stoneURL, java.net.URL skyURL) {
>>>> >> stoneImage = stoneURL;
>>>> >> skyImage = skyURL;
>>>> >> }
>>>> >>
>>>> >> public void init() {
>>>> >> if (stoneImage == null) {
>>>> >> // the path to the image for an applet
>>>> >> try {
>>>> >> stoneImage = new java.net.URL(getCodeBase().toString() +
>>>> >> "../images/stone.jpg");
>>>> >> }
>>>> >> catch (java.net.MalformedURLException ex) {
>>>> >> System.out.println(ex.getMessage());
>>>> >> System.exit(1);
>>>> >> }
>>>> >> }
>>>> >>
>>>> >> if (skyImage == null) {
>>>> >> // the path to the image for an applet
>>>> >> try {
>>>> >> skyImage = new java.net.URL(getCodeBase().toString() +
>>>> >> "../images/bg.jpg");
>>>> >> }
>>>> >> catch (java.net.MalformedURLException ex) {
>>>> >> System.out.println(ex.getMessage());
>>>> >> System.exit(1);
>>>> >> }
>>>> >> }
>>>> >>
>>>> >> setLayout(new BorderLayout());
>>>> >> GraphicsConfiguration config =
>>>> >> SimpleUniverse.getPreferredConfiguration();
>>>> >>
>>>> >> Canvas3D c = new Canvas3D(config);
>>>> >> add("Center", c);
>>>> >>
>>>> >> // create the gui
>>>> >> choice = new Choice();
>>>> >> choice.addItem("stone + light");
>>>> >> choice.addItem("stone");
>>>> >> choice.addItem("lightMap");
>>>> >> choice.addItem("sky");
>>>> >> choice.addItem("stone + sky");
>>>> >> choice.addItemListener(this);
>>>> >> add("North", choice);
>>>> >>
>>>> >> BranchGroup scene = createSceneGraph();
>>>> >> u = new SimpleUniverse(c);
>>>> >>
>>>> >> ViewingPlatform viewingPlatform = u.getViewingPlatform();
>>>> >> // This will move the ViewPlatform back a bit so the
>>>> >> // objects in the scene can be viewed.
>>>> >> viewingPlatform.setNominalViewingTransform();
>>>> >>
>>>> >> // add orbit behavior but disable translate
>>>> >> OrbitBehavior orbit =
>>>> >> new OrbitBehavior(c, OrbitBehavior.DISABLE_TRANSLATE);
>>>> >> BoundingSphere bounds =
>>>> >> new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
>>>> >> orbit.setSchedulingBounds(bounds);
>>>> >> viewingPlatform.setViewPlatformBehavior(orbit);
>>>> >>
>>>> >> u.addBranchGraph(scene);
>>>> >> }
>>>> >>
>>>> >> public void destroy() {
>>>> >> u.removeAllLocales();
>>>> >> }
>>>> >>
>>>> >> public void itemStateChanged(ItemEvent e)
>>>> >> {
>>>> >> int index = choice.getSelectedIndex();
>>>> >>
>>>> >> switch (index) {
>>>> >> case 0 : /* stone + light */
>>>> >> textureUnitState[0].setTexture(stoneTex);
>>>> >> textureUnitState[1].setTexture(lightTex);
>>>> >> break;
>>>> >> case 1 : /* stone */
>>>> >> textureUnitState[0].setTexture(stoneTex);
>>>> >> textureUnitState[1].setTexture(null);
>>>> >> break;
>>>> >> case 2 : /* light */
>>>> >> textureUnitState[0].setTexture(null);
>>>> >> textureUnitState[1].setTexture(lightTex);
>>>> >> break;
>>>> >> case 3 : /* sky */
>>>> >> textureUnitState[0].setTexture(null);
>>>> >> textureUnitState[1].setTexture(skyTex);
>>>> >> break;
>>>> >> case 4 : /* stone + sky */
>>>> >> textureUnitState[0].setTexture(stoneTex);
>>>> >> textureUnitState[1].setTexture(skyTex);
>>>> >> break;
>>>> >> default: /* both */
>>>> >> break;
>>>> >> }
>>>> >> }
>>>> >>
>>>> >> public static void main(String argv[])
>>>> >> {
>>>> >> java.net.URL stoneURL = null;
>>>> >> java.net.URL skyURL = null;
>>>> >> // the path to the image for an application
>>>> >> try {
>>>> >> stoneURL = new java.net.URL("file:../images/stone.jpg");
>>>> >> skyURL = new java.net.URL("file:../images/bg.jpg");
>>>> >> }
>>>> >> catch (java.net.MalformedURLException ex) {
>>>> >> System.out.println(ex.getMessage());
>>>> >> System.exit(1);
>>>> >> }
>>>> >> new MainFrame(new MultiTextureTest(stoneURL, skyURL), 750, 750);
>>>> >> }
>>>> >> }
>>>> >>
>>>> >> MultiTextureTest.java
>>>> >>
>>>> >> Content-Description:
>>>> >>
>>>> >> MultiTextureTest.java
>>>> >> Content-Type:
>>>> >>
>>>> >> TEXT/plain
>>>> >>
>>>> >>
>>>>
>>>>
>>>> --
>>>> ___________________________________________________________
>>>>
>>>> Shawn Kendall Full Sail Real World Education
>>>> Course Director 3300 University BLVD
>>>> Real Time 3D for Gaming Winter Park FL 32792
>>>> [EMAIL PROTECTED] http://www.fullsail.com
>>>> ___________________________________________________________
>>>>
>>>>
>>>> --
>>>> ___________________________________________________________
>>>>
>>>> Shawn Kendall Full Sail Real World Education
>>>> Course Director 3300 University BLVD
>>>> Real Time 3D for Gaming Winter Park FL 32792
>>>> [EMAIL PROTECTED] http://www.fullsail.com
>>>> ___________________________________________________________
>>>>
>>>> ===========================================================================
>>>> To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
>>>> of the message "signoff JAVA3D-INTEREST". For general help, send email to
>>>> [EMAIL PROTECTED] and include in the body of the message "help".
>>>
>>>
>>> ===========================================================================
>>> To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
>>> of the message "signoff JAVA3D-INTEREST". For general help, send email to
>>> [EMAIL PROTECTED] and include in the body of the message "help".
>>
>>
>> --
>> ___________________________________________________________
>>
>> Shawn Kendall Full Sail Real World Education
>> Course Director 3300 University BLVD
>> Real Time 3D for Gaming Winter Park FL 32792
>> [EMAIL PROTECTED] http://www.fullsail.com
>> ___________________________________________________________
>>
>> ===========================================================================
>> To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
>> of the message "signoff JAVA3D-INTEREST". For general help, send email to
>> [EMAIL PROTECTED] and include in the body of the message "help".
>
>
> ===========================================================================
> To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
> of the message "signoff JAVA3D-INTEREST". For general help, send email to
> [EMAIL PROTECTED] and include in the body of the message "help".
--
___________________________________________________________
Shawn Kendall Full Sail Real World Education
Course Director 3300 University BLVD
Real Time 3D for Gaming Winter Park FL 32792
[EMAIL PROTECTED] http://www.fullsail.com
___________________________________________________________
===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA3D-INTEREST". For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".