gzz-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gzz-commits] gzz Documentation/Manuscripts/Irregu/Irregular_...


From: Janne V. Kujala
Subject: [Gzz-commits] gzz Documentation/Manuscripts/Irregu/Irregular_...
Date: Sat, 02 Nov 2002 09:51:37 -0500

CVSROOT:        /cvsroot/gzz
Module name:    gzz
Changes by:     Janne V. Kujala <address@hidden>        02/11/02 09:51:36

Modified files:
        Documentation/Manuscripts/Irregu: Irregular_shape_profiles.html 
        gfx/demo       : irregu3.py 
        gzz/gfx/gl     : GL.java 

Log message:
        Implement constant displacement border irregu profile

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gzz/gzz/Documentation/Manuscripts/Irregu/Irregular_shape_profiles.html.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gzz/gzz/gfx/demo/irregu3.py.diff?tr1=1.43&tr2=1.44&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gzz/gzz/gzz/gfx/gl/GL.java.diff?tr1=1.19&tr2=1.20&r1=text&r2=text

Patches:
Index: gzz/Documentation/Manuscripts/Irregu/Irregular_shape_profiles.html
diff -u gzz/Documentation/Manuscripts/Irregu/Irregular_shape_profiles.html:1.2 
gzz/Documentation/Manuscripts/Irregu/Irregular_shape_profiles.html:1.3
--- gzz/Documentation/Manuscripts/Irregu/Irregular_shape_profiles.html:1.2      
Sat Nov  2 06:57:18 2002
+++ gzz/Documentation/Manuscripts/Irregu/Irregular_shape_profiles.html  Sat Nov 
 2 09:51:36 2002
@@ -2,88 +2,58 @@
 <html>
 <head>
   <title>Irregular shape profiles</title>
-                    
+                           
   <meta http-equiv="content-type"
  content="text/html; charset=ISO-8859-1">
 </head>
   <body>
-     
+       
 <table cellpadding="2" cellspacing="2" border="1" width="100%">
-     <tbody>
-       <tr>
-         <td valign="top">Profile<br>
-         </td>
-         <td valign="top">Required extensions<br>
-         </td>
-         <td valign="top">displacement resolution (bits)<br>
-         </td>
-         <td valign="top">texture units<br>
-         </td>
-         <td valign="top">register combiners<br>
-         </td>
-         <td valign="top">inner edge textures<br>
-         </td>
-         <td valign="top">outer edge textures<br>
-         </td>
-         <td valign="top">texture bits<br>
-         </td>
-         <td valign="top">stored angles (--&gt; works for only one ripple
+      <tbody>
+        <tr>
+          <td valign="top">Profile<br>
+          </td>
+          <td valign="top">Required extensions<br>
+          </td>
+          <td valign="top">displacement resolution (bits)<br>
+          </td>
+          <td valign="top">texture units<br>
+          </td>
+          <td valign="top">register combiners<br>
+          </td>
+          <td valign="top">inner edge textures<br>
+          </td>
+          <td valign="top">outer edge textures<br>
+          </td>
+          <td valign="top">texture bits<br>
+          </td>
+          <td valign="top">stored angles (--&gt; works for only one ripple 
 amplitude/period ratio)<br>
-         </td>
-         <td valign="top">Draw color/texture w/o stencil<br>
-         </td>
-         <td valign="top">1-pass border + inside color/texture w/o stencil<br>
-         </td>
-         <td valign="top">Minification<br>
-         </td>
-         <td valign="top">Magnification<br>
-         </td>
-        <td valign="top">sqrt(scale)-border width option (currently only
+          </td>
+          <td valign="top">Draw color/texture w/o stencil<br>
+          </td>
+          <td valign="top">1-pass border + inside color/texture w/o stencil<br>
+          </td>
+          <td valign="top">Minification<br>
+          </td>
+          <td valign="top">Magnification<br>
+          </td>
+         <td valign="top">sqrt(scale)-border width option (currently only 
 implemented for mipmaps)<br>
-        </td>
-       </tr>
-       <tr>
-        <td valign="top">NV_PROG (NV30)<br>
-        </td>
-        <td valign="top">GL_NV_fragment_program<br>
-        </td>
-        <td valign="top">16 (can also use float)<br>
-        </td>
-        <td valign="top">1 (w/ multiple accesses)<br>
-        </td>
-        <td valign="top"><br>
-        </td>
-        <td valign="top">1xHILO<br>
-        </td>
-        <td valign="top">-<br>
-        </td>
-        <td valign="top">32<br>
-        </td>
-        <td valign="top"><br>
-        </td>
-        <td valign="top">Yes<br>
-        </td>
-        <td valign="top">Yes<br>
-        </td>
-        <td valign="top">Works the same for any scale<br>
-        </td>
-        <td valign="top">Works the same for any scale<br>
-        </td>
-        <td valign="top">Yes (but thick border may require too many 
accesses)<br>
-        </td>
-      </tr>
-      <tr>
-         <td valign="top">NV_SHAD (NV20)<br>
          </td>
-         <td valign="top">GL_NV_texture_shader<br>
+        </tr>
+        <tr>
+         <td valign="top">NV_PROG (NV30)<br>
          </td>
-         <td valign="top">16<br>
+         <td valign="top">GL_NV_fragment_program<br>
          </td>
-         <td valign="top">3 (2 w/ NV25)<br>
+         <td valign="top">16 (can also use float)<br>
+         </td>
+         <td valign="top">1 (w/ multiple accesses)<br>
          </td>
          <td valign="top"><br>
          </td>
-         <td valign="top">1xHILO (+ 1D-ALPHA edge)<br>
+         <td valign="top">1xHILO<br>
          </td>
          <td valign="top">-<br>
          </td>
@@ -93,139 +63,199 @@
          </td>
          <td valign="top">Yes<br>
          </td>
-         <td valign="top">Yes (w/ more combiners)<br>
-         </td>
-         <td valign="top">1D-texture mipmap<br>
-         </td>
-         <td valign="top">Up to 1D texture size<br>
-         </td>
-        <td valign="top">No (thick border looks bad)<br>
-        </td>
-       </tr>
-       <tr>
-         <td valign="top">NV_COMB_MULTITEX (NV20)<br>
-         </td>
-         <td valign="top">GL_NV_register_combiners<br>
-         </td>
-         <td valign="top">8<br>
-         </td>
-         <td valign="top">3<br>
-         </td>
-         <td valign="top">4<br>
-         </td>
-         <td valign="top">2xINTENSITY<br>
-         </td>
-         <td valign="top">-<br>
-         </td>
-         <td valign="top">16<br>
-         </td>
-         <td valign="top"><br>
-         </td>
          <td valign="top">Yes<br>
          </td>
-         <td valign="top">Yes (w/ more combiners)<br>
+         <td valign="top">Works the same for any scale<br>
          </td>
          <td valign="top">Works the same for any scale<br>
          </td>
-         <td valign="top">Up to displacement resolution<br>
+         <td valign="top">Yes (but thick border may require too many 
accesses)<br>
          </td>
-        <td valign="top">Possible, but thick border may look bad with only
- 3 accesses<br>
-        </td>
        </tr>
        <tr>
-         <td valign="top">NV_COMB_DOT3 (NV10)<br>
-         </td>
-         <td valign="top">GL_NV_register_combiners<br>
-         </td>
-         <td valign="top">7-8<br>
-         </td>
-         <td valign="top">1<br>
-         </td>
-         <td valign="top">2<br>
-         </td>
-         <td valign="top">(alpha of outer)<br>
-         </td>
-         <td valign="top">2xRGBA<br>
-         </td>
-         <td valign="top">64<br>
-         </td>
-         <td valign="top">3<br>
+          <td valign="top">NV_SHAD (NV20)<br>
+          </td>
+          <td valign="top">GL_NV_texture_shader<br>
+          </td>
+          <td valign="top">16<br>
+          </td>
+          <td valign="top">3 (2 w/ NV25)<br>
+          </td>
+          <td valign="top"><br>
+          </td>
+          <td valign="top">1xHILO (+ 1D-ALPHA edge)<br>
+          </td>
+          <td valign="top">-<br>
+          </td>
+          <td valign="top">32<br>
+          </td>
+          <td valign="top"><br>
+          </td>
+          <td valign="top">Yes<br>
+          </td>
+          <td valign="top">Yes (w/ more combiners)<br>
+          </td>
+          <td valign="top">1D-texture mipmap<br>
+          </td>
+          <td valign="top">Up to 1D texture size<br>
+          </td>
+         <td valign="top">No (thick border looks bad)<br>
+         </td>
+        </tr>
+        <tr>
+          <td valign="top">NV_COMB_MULTITEX (NV20)<br>
+          </td>
+          <td valign="top">GL_NV_register_combiners<br>
+          </td>
+          <td valign="top">8<br>
+          </td>
+          <td valign="top">3<br>
+          </td>
+          <td valign="top">4<br>
+          </td>
+          <td valign="top">2xINTENSITY<br>
+          </td>
+          <td valign="top">-<br>
+          </td>
+          <td valign="top">16<br>
+          </td>
+          <td valign="top"><br>
+          </td>
+          <td valign="top">Yes<br>
+          </td>
+          <td valign="top">Yes (w/ more combiners)<br>
+          </td>
+          <td valign="top">Works the same for any scale<br>
+          </td>
+          <td valign="top">Up to displacement resolution<br>
+          </td>
+         <td valign="top">Possible, but thick border may look bad with only 
+ 3 accesses<br>
          </td>
+        </tr>
+        <tr>
+          <td valign="top">NV_COMB_DOT3 (NV10)<br>
+          </td>
+          <td valign="top">GL_NV_register_combiners<br>
+          </td>
+          <td valign="top">7-8<br>
+          </td>
+          <td valign="top">1<br>
+          </td>
+          <td valign="top">2<br>
+          </td>
+          <td valign="top">(alpha of outer)<br>
+          </td>
+          <td valign="top">2xRGBA<br>
+          </td>
+          <td valign="top">64<br>
+          </td>
+          <td valign="top">3<br>
+          </td>
+          <td valign="top">Yes<br>
+          </td>
+          <td valign="top">(w/ more combiners)<br>
+          </td>
+          <td valign="top">Outer texture mipmap<br>
+          </td>
+          <td valign="top">Can interpolate outer edge towards inner edge
+(up   to displacement resolution)<br>
+          </td>
          <td valign="top">Yes<br>
          </td>
-         <td valign="top">(w/ more combiners)<br>
-         </td>
-         <td valign="top">Outer texture mipmap<br>
-         </td>
-         <td valign="top">Can interpolate outer edge towards inner edge (up 
- to displacement resolution)<br>
-         </td>
-        <td valign="top">Yes<br>
-        </td>
-       </tr>
-       <tr>
-         <td valign="top">NV_COMB_DOT4 (NV10)<br>
-         </td>
-         <td valign="top">GL_NV_register_combiners<br>
-         </td>
-         <td valign="top">7-8<br>
-         </td>
-         <td valign="top">1<br>
-         </td>
-         <td valign="top">2<br>
-         </td>
-         <td valign="top">2xINTENSITY<br>
-         </td>
-         <td valign="top">2xRGBA<br>
-         </td>
-         <td valign="top">80<br>
-         </td>
-         <td valign="top">4<br>
-         </td>
+        </tr>
+        <tr>
+          <td valign="top">NV_COMB_DOT4 (NV10)<br>
+          </td>
+          <td valign="top">GL_NV_register_combiners<br>
+          </td>
+          <td valign="top">7-8<br>
+          </td>
+          <td valign="top">1<br>
+          </td>
+          <td valign="top">2<br>
+          </td>
+          <td valign="top">2xINTENSITY<br>
+          </td>
+          <td valign="top">2xRGBA<br>
+          </td>
+          <td valign="top">80<br>
+          </td>
+          <td valign="top">4<br>
+          </td>
+          <td valign="top">Yes<br>
+          </td>
+          <td valign="top">(w/ more combiners)<br>
+          </td>
+          <td valign="top">Outer texture mipmap<br>
+          </td>
+          <td valign="top">Edge width increases<br>
+          </td>
          <td valign="top">Yes<br>
          </td>
-         <td valign="top">(w/ more combiners)<br>
-         </td>
-         <td valign="top">Outer texture mipmap<br>
-         </td>
-         <td valign="top">Edge width increases<br>
-         </td>
-        <td valign="top">Yes<br>
-        </td>
-       </tr>
-       <tr>
-         <td valign="top">DOT3<br>
-         </td>
-         <td valign="top">GL_EXT_texture_env_dot3 <br>
-         </td>
-         <td valign="top">5-6<br>
-         </td>
-         <td valign="top">1<br>
-         </td>
-         <td valign="top"><br>
-         </td>
-         <td valign="top">(alpha of outer)<br>
-         </td>
-         <td valign="top">2xRGBA<br>
-         </td>
-         <td valign="top">64<br>
-         </td>
-         <td valign="top">3<br>
-         </td>
-         <td valign="top">(black w/ blend)<br>
-         </td>
-         <td valign="top">No<br>
-         </td>
-         <td valign="top">Outer texture mipmap<br>
-         </td>
-         <td valign="top">Edge width increases<br>
+        </tr>
+        <tr>
+          <td valign="top">DOT3<br>
+          </td>
+          <td valign="top">GL_EXT_texture_env_dot3 <br>
+          </td>
+          <td valign="top">5-6<br>
+          </td>
+          <td valign="top">1<br>
+          </td>
+          <td valign="top"><br>
+          </td>
+          <td valign="top">(alpha of outer)<br>
+          </td>
+          <td valign="top">2xRGBA<br>
+          </td>
+          <td valign="top">64<br>
+          </td>
+          <td valign="top">3<br>
+          </td>
+          <td valign="top">(black w/ blend)<br>
+          </td>
+          <td valign="top">No<br>
+          </td>
+          <td valign="top">Outer texture mipmap<br>
+          </td>
+          <td valign="top">Edge width increases<br>
+          </td>
+         <td valign="top">Yes<br>
          </td>
-        <td valign="top">Yes<br>
-        </td>
-       </tr>
-       <tr>
-         <td valign="top">STD (multi pass perturbed border)<br>
+        </tr>
+        <tr>
+          <td valign="top">STD_MULTIPASS (perturbed border)<br>
+          </td>
+          <td valign="top">GL_EXT_texture_env_add<br>
+          </td>
+          <td valign="top">8 (4 with G400)<br>
+          </td>
+          <td valign="top">1<br>
+          </td>
+          <td valign="top"><br>
+          </td>
+          <td valign="top">2xINTENSITY<br>
+          </td>
+          <td valign="top">-<br>
+          </td>
+          <td valign="top">16<br>
+          </td>
+          <td valign="top"><br>
+          </td>
+          <td valign="top">(black w/ blend)<br>
+          </td>
+          <td valign="top">No<br>
+          </td>
+          <td valign="top">Works the same for any scale<br>
+          </td>
+          <td valign="top">Works the same for any scale<br>
+          </td>
+         <td valign="top">Possible, but large perturbation looks bad<br>
+         </td>
+        </tr>
+        <tr>
+         <td valign="top">STD_CONSTD (constant displacement border)<br>
          </td>
          <td valign="top">GL_EXT_texture_env_add<br>
          </td>
@@ -249,76 +279,46 @@
          </td>
          <td valign="top">Works the same for any scale<br>
          </td>
-         <td valign="top">Works the same for any scale<br>
+         <td valign="top">Up to displacement resolution<br>
+         </td>
+         <td valign="top">Yes<br>
          </td>
-        <td valign="top">Possible, but large perturbation looks bad<br>
-        </td>
        </tr>
        <tr>
-        <td valign="top">STD (constant displacement border; not currently 
-implemented)<br>
-        </td>
-        <td valign="top">GL_EXT_texture_env_add<br>
-        </td>
-        <td valign="top">8 (4 with G400)<br>
-        </td>
-        <td valign="top">1<br>
-        </td>
-        <td valign="top"><br>
-        </td>
-        <td valign="top">2xINTENSITY<br>
-        </td>
-        <td valign="top">-<br>
-        </td>
-        <td valign="top">16<br>
-        </td>
-        <td valign="top"><br>
-        </td>
-        <td valign="top">(black w/ blend)<br>
-        </td>
-        <td valign="top">No<br>
-        </td>
-        <td valign="top">Works the same for any scale<br>
-        </td>
-        <td valign="top">Up to displacement resolution<br>
-        </td>
-        <td valign="top">Yes<br>
-        </td>
-      </tr>
-      <tr>
-         <td valign="top">STD_4<br>
-         </td>
-         <td valign="top">GL_EXT_texture_env_add<br>
-         </td>
-         <td valign="top">8 (4 with G400)<br>
-         </td>
-         <td valign="top">1<br>
-         </td>
-         <td valign="top"><br>
-         </td>
-         <td valign="top">2xINTENSITY<br>
-         </td>
-         <td valign="top">2x4xRGBA<br>
-         </td>
-         <td valign="top">80<br>
-         </td>
-         <td valign="top">4<br>
-         </td>
-         <td valign="top">(black w/ blend)<br>
-         </td>
-         <td valign="top">No<br>
-         </td>
-         <td valign="top">Outer texture mipmap<br>
-         </td>
-         <td valign="top">Edge width increases<br>
+          <td valign="top">STD_4<br>
+          </td>
+          <td valign="top">GL_EXT_texture_env_add<br>
+          </td>
+          <td valign="top">8 (4 with G400)<br>
+          </td>
+          <td valign="top">1<br>
+          </td>
+          <td valign="top"><br>
+          </td>
+          <td valign="top">2xINTENSITY<br>
+          </td>
+          <td valign="top">2x4xRGBA<br>
+          </td>
+          <td valign="top">80<br>
+          </td>
+          <td valign="top">4<br>
+          </td>
+          <td valign="top">(black w/ blend)<br>
+          </td>
+          <td valign="top">No<br>
+          </td>
+          <td valign="top">Outer texture mipmap<br>
+          </td>
+          <td valign="top">Edge width increases<br>
+          </td>
+         <td valign="top">Yes<br>
          </td>
-        <td valign="top">Yes<br>
-        </td>
-       </tr>
-           
-  </tbody>   
+        </tr>
+               
+  </tbody>    
 </table>
-   <br>
+    <br>
+    <br>
    <br>
   <br>
  <br>
Index: gzz/gfx/demo/irregu3.py
diff -u gzz/gfx/demo/irregu3.py:1.43 gzz/gfx/demo/irregu3.py:1.44
--- gzz/gfx/demo/irregu3.py:1.43        Sat Nov  2 07:29:55 2002
+++ gzz/gfx/demo/irregu3.py     Sat Nov  2 09:51:36 2002
@@ -37,7 +37,8 @@
 if GL.hasExtension("GL_EXT_texture_env_dot3"):
     profiles.append("DOT3")
 
-profiles.append("STD")
+profiles.append("STD_MULTIPASS")
+profiles.append("STD_CONSTD")
 profiles.append("STD_4")
 
 def getIrreguTex(components, iformat, format, scale = 1, bias = 0, angle = 0, 
angles = 0, invert = 0):
@@ -73,12 +74,17 @@
     using_secondary_color = 0
     using_multitex = 0
 
+    print "Using profile:", profile
+
     if profile == "NV_PROG":
+        print "Using 2-vector HILO displacement texture with 
GL_NV_fragment_program"
         using_fragprog = 1
         
         radius = 2
         dh = [ sqrt(radius**2 - d**2) for d in range(0,radius+1) ]
 
+        global prog_inner, prog_outer
+        
         prog_inner = GL.createProgram("""!!FP1.0
         # f[TEX0].xyw texture coordinates
         # f[TEX2].xy texture HI and LO component weights
@@ -376,7 +382,7 @@
                 getIrreguTex(4, "RGBA", "RGBA", scale = .25, bias = .75, 
angles = 3, invert = 1),
                 )
 
-    elif profile == "STD" or profile == "STD_4":
+    elif profile == "STD_MULTIPASS" or profile == "STD_CONSTD" or profile == 
"STD_4":
         print "Using full displacement resolution texture with standard GL 
(texture_env_add)"
 
         texenv = """
@@ -427,7 +433,7 @@
         global scaling
         scaling = scalings[int(k) - 1]
         init()
-    elif "F1" <= k <= "F12":
+    elif "F1" <= k <= "F9":
         global profile
         profile = profiles[int(k[1]) - 1]
         init()
@@ -505,6 +511,9 @@
     Enable TEXTURE_2D
     """ % locals()
 
+    # One-pixel difference of displacement
+    borderalpha = 1.0 / (scale * ripple_scale * texscale)
+
     if using_multitex and outer:
         # XXX: scaling doesn't work properly because the coordinate
         #      transformation is not known here
@@ -513,8 +522,8 @@
         # alpha: value added to the displacement values
         # blue:  value added to the middle displacement (in addition to alpha)
         m = 1.0 / (striplen * scale)
-        alpha = 1.5 / (scale * ripple_scale * texscale)
-        blue = 1.0 / (scale * ripple_scale * texscale)
+        alpha = 1.5 * borderalpha
+        blue = 1.0 * borderalpha
 
         #print m*scale,alpha*256,blue*256
         
@@ -570,12 +579,11 @@
         dx = cos(angle)
         dy = sin(angle)
 
-        m = 1.0 / (striplen * scale)
         # Note: dx,dy below are applied after texture matrix
         vec = (dx / scale,
                dy / scale,
                0,
-               1.0 / (scale * ripple_scale * texscale),
+               borderalpha,
                )
 
         texcoords += [ [ vec, vec, vec, vec, ],
@@ -627,11 +635,14 @@
         ActiveTexture TEXTURE0
         """ % edgelodbias
 
+
     if alphalevel:
+        da = (profile == "STD_CONSTD") * outer * borderalpha * 3
+        
         code += """
         Enable ALPHA_TEST
         AlphaFunc LESS %s
-        """ % alphalevel
+        """ % (alphalevel - da)
 
     if outer:
         code += texenv_outer % locals()
@@ -801,7 +812,7 @@
         self.initIrregu()
 
         if self.use_stencil:
-            if texenv_inner == texenv_outer and angles == 0:
+            if profile == "STD_MULTIPASS":
                 vs.map.put(getDListNocoords("PushMatrix\n"
                                             "Translate -2 0 0"))
                 vs.map.put(self.stencil_init)
Index: gzz/gzz/gfx/gl/GL.java
diff -u gzz/gzz/gfx/gl/GL.java:1.19 gzz/gzz/gfx/gl/GL.java:1.20
--- gzz/gzz/gfx/gl/GL.java:1.19 Tue Oct 29 14:55:36 2002
+++ gzz/gzz/gfx/gl/GL.java      Sat Nov  2 09:51:36 2002
@@ -506,29 +506,29 @@
                    String internalFormat, int x, int y,
                    int w, int h, int border) ;
 
-//--------- VertexProgramNV
-    /** A vertex program object.
-     * Like Texture, id = directly VP id
+//--------- OpenGL Program
+    /** An OpenGL program object.
+     * Like Texture, id = directly the program id
      */
-    static public class VertexProgramNV extends NonRenderableJavaObject {
-       private VertexProgramNV(int id) { super(id); }
-       protected void deleteObj() { impl_deleteVertexProgramNV(getId()); }
-       public int getVPId() { return getId(); }
+    static public class Program extends NonRenderableJavaObject {
+       private Program(int id) { super(id); }
+       protected void deleteObj() { impl_deleteProgram(getId()); }
+       public int getProgId() { return getId(); }
        public int load(String program) {
-           return impl_VertexProgramNV_load(getId(), program);
+           return impl_Program_load(getId(), program);
        }
     }
-    static public VertexProgramNV createVertexProgramNV() { 
-       return new VertexProgramNV(impl_createVertexProgramNV());
+    static public Program createProgram() { 
+       return new Program(impl_createProgram());
     }
-    static public VertexProgramNV createVertexProgramNV(String program) { 
-       VertexProgramNV vp = new VertexProgramNV(impl_createVertexProgramNV());
-       vp.load(program);
-       return vp;
+    static public Program createProgram(String program) { 
+       Program prog = new Program(impl_createProgram());
+       prog.load(program);
+       return prog;
     }
-    static private native int impl_createVertexProgramNV();
-    static private native void impl_deleteVertexProgramNV(int id);
-    static private native int impl_VertexProgramNV_load(int id, String 
program);
+    static private native int impl_createProgram();
+    static private native void impl_deleteProgram(int id);
+    static private native int impl_Program_load(int id, String program);
 
 
 //--------- ShaderRect




reply via email to

[Prev in Thread] Current Thread [Next in Thread]