Java-Gaming.org    
Featured games (91)
games approved by the League of Dukes
Games in Showcase (581)
games submitted by our members
Games in WIP (500)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: [1] 2
  ignore  |  Print  
  Java OpenGL bindings the illusion  (Read 6669 times)
0 Members and 1 Guest are viewing this topic.
Offline zingbat

Senior Member




Java games rock!


« Posted 2003-07-21 20:42:49 »

Everyone is fascinated by that aproach and saying that binding open gl is the way to go for java games. Then they make some benchmarks showing some balls bouncing arround and pulling out great frame rates.

But this is just an illusion, Java3D does a lot more things than visualizing geometry. It does scene graph traversal and optimization, behavior and lod everything itegrated in the model. A game is much more than some balls bouncing on the screen, and thats why java bindings will never replace java 3d.

Read my avatar message: Java3D rules.  Tongue

Of course that many people report performance problems but Java3D is a high level graphics API. Most of the problems come from bad use of memory not leaving time for the gc to work, not calling the gc immedeatly after setup, not stoping the renderer during setup,  excess use of memory allocation during rendering times (which should be used only during setup phases), dangling sub-graph trees, you name it. In java3d there are one million ways to screw up your code if you don't read the specification right.

With all this said of course that java3d cannot compete with a C++ engine, neither an open gl binding running any real game. But we can use your imagination and make games that don't render so much polygons and don't use so much heavy textures. With this in mind java3d has anything we need to build great games. Remenber that a game quality is not measured by the number of polygons it is capable of drawing per frame.
Offline Mojomonkey

Senior Member




ooh ooh eee eeee


« Reply #1 - Posted 2003-07-21 21:12:40 »

Quote

Read my avatar message: Java3D rules.  


No... your avatar says Java games rock!

That being said... what's your point? Use Java3D. Nobody's stopping you.

Don't send a man to do a monkey's work.
Offline misterX

Junior Member




java forever!


« Reply #2 - Posted 2003-07-21 21:26:54 »

hey zingbat, i couldn't have say it better!
Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline cfmdobbie

Senior Member




Who, me?


« Reply #3 - Posted 2003-07-21 23:09:18 »

Yeah, but I *like* using OpenGL! Grin

Hellomynameis Charlie Dobbie.
Offline William

Junior Member




No Exit


« Reply #4 - Posted 2003-07-22 00:22:08 »

Well, the original poster's experience of Java3D certainly differs from mine.

The real problems that I have had with Java3D, the ones that can not be worked around and would be labeled 'showstoppers' in commercial applications, are none of the issues mentioned above. They also do not have to do with reading the specification wrong, rather they have had to do with core design decisions of the API and its proprietary nature. Those problems are also solved by an open API like JOGL.

Specificly,  Java3D's multi-threaded and opaque architecture as well as political issues surrounding the API is keeping Java3D from being a serious alternative for typical consumer-grade multimedia. The political issues have to do with the API being closed source so developers can not fix the architecture problems and the inter-company issues that is stopping Java3D from being available on Mac.

Just try playing sound with JavaSound or JMF (even worse with video) while rendering a slightly complex scene and watch the thread-chaos either turn the rendering into a slideshow or make the sound stutter. The opaque architecture offers very little opportunity for the programmer to affect any of this and the closed source policy prevents programmers from fixing or working around the bugs in Java3D's own sound API, bugs that have plagued the API from day one and are still not solved in the most recent release.

Sure, you can write some limited games, such as Law and Order, in Java3D, but I bet Shockwave3D would have been a much better alternative for the job. Especially with its tight integration with popular 3D-modeling apps and its Mac portability. The developers apparently had to port the game to GL4Java to get Mac portability, but that wasn not too hard because the game did not use much 3D at all (which is why they could even use Java3D).

Another reason for using an OpenGL binding is of course because such bindings tend to support extensions, such as programmable shaders, much quicker than Java3D, but that's not such a big problem YET since most consumers still seem to have cards without programmable shaders.

I hope I have cleared up some of the motivations behind using a 3rd party OpenGL binding. I am just curious, if Zingbat and MisterX really thinks that Java can't compete with C++ for real games, are you guys just here to learn how to use Java for scripting in your C++ engines? or are you maybe working strictly on the server side? Anyway, I don't think that belief is shared by most developers here.
Offline shawnkendall

Senior Member





« Reply #5 - Posted 2003-07-22 02:16:26 »

No stencil buffer access = no shadows #1
No hardware shader access, vertex or fragment. = no shadows #2

Shadows built with user defined and control geometry, yes.
I've doen it, but it is a pain and CPU intensive, especially for many objects.

Multi-pass rendering beyond the multi-texture support is extremely cumbersome is at best.

IMHO, it's non-extendible renderer is it's greatest weakness ( and would-be greatest revision effort)

Nuff for now.


I have been programming Java3D for 5 years now.  It did a great job for many different applications as well as games.
Unfortunately even low-end game graphics have raced passed J3D 1.3.1 renderer.

Yes, scene graphs are nice.  
Unfortunately, due to the way graphics hardware evolves, close access is probably going to be needed by most game developers to stay visually competitive.
Of course, graphics aren't everything.
But then again, movies stars aren't ugly. ;-)

Shawn Kendall
Cosmic Interactive, LLC
http://www.facebook.com/BermudaDash
Offline tortoise

Junior Member




<3 Shmups


« Reply #6 - Posted 2003-07-22 02:55:19 »

I've looked into Java3D a bit. But the lack of Mac support (and if memory serves its Linux support isn't so hot either), I stopped. It doesn't make sense to go with Java but then deny yourself one of Java's greatest strengths, relative ease of going cross platform.
Offline kevglass

JGO Kernel


Medals: 85
Projects: 25


Coder, Trainee Pixel Artist, Game Reviewer


« Reply #7 - Posted 2003-07-22 06:08:20 »

So what we're all saying is, Java 3D needs more development?

Kev

Archimedes
Guest
« Reply #8 - Posted 2003-07-22 06:24:09 »

There are many (2d and 3d) games out there which don't need a high level 3d API to blit some nice 2d or 3d textured images to the screen.
So using Java3d for such purposes meant pure overkill.

On the other hand, there are many 3d "thingies" out there which really are very good to program if you use a high level API like Java3d. So using Jogl for such purposes meant pure "re-inventing of the wheel". :-)

High level APIs are naturally general in some way and so don't fit to every purpose. You won't use a Quake style indoor engine for a flight simulator and the other way round.

I'd say: use the Java API which fits your needs best - as long as you stay with Java. :-)

Also, like Tortoise put it: because Java3d is currently only available to some platforms (but situation improves hopefully?) you've to consider this if you want to be platform neutral.

Generally, a low level API like OpenGL does not negate a high level API. And the other way round.

Actually I don't know why this thread has been started. ;-)
Offline misterX

Junior Member




java forever!


« Reply #9 - Posted 2003-07-22 10:50:55 »

Exactly, the world is big enough, everyone can take it's favorite piece of cake (API).  Roll Eyes
J3D is high-level and JOGL-LWJGL are low-level access libs. Both have their use.

Quote
...I am just curious, if Zingbat and MisterX really thinks that Java can't compete with C++ for real games...

...hmm...yes. I think that java will always be a little behind c++/c# technologies. However, i also think this distance is becoming smaller and smaller. (And i'm not making anything with c++ or engines nor anything like)
And now, let me ask you a question in return:
Why, if you're so concerned about performances, didn't you go with c# and managed DX by sacrifying multi-platform? Is it that important for you?! (the very large majority of end consumers are Windows after all, exept for special apps)

Personally, i have chosen java because of java3D, not the opposite. I found this easy api perfect for a hobbyist like me, to code is very intuitive with it and i like very much how it is structured. If j3d didn't existed, i would allready be on c# and DX!
Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline William

Junior Member




No Exit


« Reply #10 - Posted 2003-07-22 13:15:23 »

Quote
So what we're all saying is, Java 3D needs more development?

It would definitely be a good thing if Sun turned Java3D open source and allowed developers to dig into it. I think mr Yazel's Xith3D renderer may soon make the core functionality of Java3D obsolete though (we still need Java3D's data structures since Xith3D uses those).

Quote
Why, if you're so concerned about performances,

To say that I'm "concerned with performances" because I want to render 3D graphics and play sound at the same time on a consumer-grade machine is a bit of stretch I think. It is also you who seem to think that the statement  "java will always be a little behind c++" means the same as "java can't compete with C++". Personally, I do value platform independence and productivity over a 1 fps performance increase and I think both those things make Java very competitive against C++.

I am not going into a language war with you about C#, sorry. I applaud Microsoft for making the C# effort and using its influence to legitimize JIT-compiled languages to skeptical audiences.
Offline Breakfast

Senior Member




for great justice!


« Reply #11 - Posted 2003-07-22 14:04:01 »

I've done a bit of C# and D3d, although only a little bit, and not only was it quite annoying to use but installing the DirectX9 runtime completely broke all the DirectX powered games I had installed and gave me no way to rollback the installation. That was quite annoying.
Offline DavidYazel

Junior Member




Java games rock!


« Reply #12 - Posted 2003-07-22 14:11:20 »

I have used Java3D for 4 years and I think it is a wonderful API.  I think our project has stretched its capabilities to its limits.  But there is no doubt that we pay a price for all that capability and generality. In fact I am just now beginning to realize how much work we went to over the years to circumvent the limitations imposed by Java3D.

After about 3 weeks of effort we are very close to being able to render Magicosm with the Xith3D engine running on JOGL.

A test scene:

http://www.magicosm.net/xith3d/snapshot.jpg

Shawn is right... try to implement shadows in Java3d... pretty impossible.  But we were able to implement dynamic shadow volumes in one day with Xith3D:

http://www.magicosm.net/xith3d/snapshot1.png

I think for gaming the perfect solution lies somwhere in the middle. A scenegraph is a great way to assemble your virtual world, but its not a great way to render overlays, particle systems, do dynamic lighting, shadows, reflections, render to textures for dynamic imposters, etc.  Basically 90 percent of the tricks in the game developer's tool box cannot be used in Java3D.  Read Game Programming Gems I, II and III and then try to implement almost anything in there without access to the renderer and you are in for a heap of frustration.


David Yazel
Xith3D Project Founder
http://xith3d.dev.java.net

It may look complicated, but in the end it is just a bunch of triangles
Offline Breakfast

Senior Member




for great justice!


« Reply #13 - Posted 2003-07-22 16:16:16 »

Looking good already - the armour on the knight type dude is particularly impressive. The impression of them all having just appeared several miles above the ground made me smile as well...

I always thought it was possible to do many of the things you mention with J3D, it was just that the ways to do them just seemed to be clunking workarounds rather than elegant solutions.

Offline zingbat

Senior Member




Java games rock!


« Reply #14 - Posted 2003-07-25 21:09:08 »

I think there are some misconceptions about Java3d here. There is nothing in Java3d that can be considered a mistake or a bad design decision. You need to know the engine limitations, make some benchmarks to sound and graphics and design your game to stay bellow those limits.  

So you like good lookings make your textures look good with 64 pixels wide, dont use too much textures. Its just a matter on how you do the textures.

For instance the last rock wall texture i made used an images of 512x512 pixels to work with the spray tools and all the other tools well. Also used three layers for: one for the rock texture, another for dirt and slime in the walls, another for deficiencies in the bricks; plus some other for give bright in some areas and relief to the bricks.
Finnaly the texture was shrinked to 64x64 pixels .png and it looks very good. I just avoid making simplistic tiles, these textures tile even if they are rotated at any angle. Tried it with a level but i need to had special textures with special corners, ceilling guides and floor guides for places where walls joins with ceillings and floors.

Sound is not good enough use midis not mp3 and sounds with a low sampling. Most sound cards with intruments banks and can play midi better than an mp3 and can also filter low sampled wavs to sound nicer.

OK you don't have shadows or pixels shaders. Neither fallout or deusex or half-life or system shock or even thief. These are some of the greatest games that have been made and many people prefer them to some new games that are nothing more than visuals.

So you can't use as much polygons as a C++ engine like Quake3 or Unreal2. This depends on the type of game you are doing. If it is a MMORPG the landscape must be very big. In that case use advanced lod techniques and benchmark the engine. If it is a dungeon crawl or a quake3 like game closed environment use lod to disable rooms that arent visible in the players proximity.  Use different geometries for distance objects. Once the distance of an object from the player doubles you can lod it. Every polygon counts

Dont use brute force rendering with Java3D, thats what a scene graph is for. If you don't take advantage of Java3D best features your game will crawl.

Look at Gothic 2 for instance. I have a 1Ghz cpu with a DirectX 8.1 card (low price). I can play with the max features at high but sometimes the game crashes to desktop because its pushing the limits. This is not just a problem of Java3D. The LOD in this game is amazing. You have distance LOD, interior and exterior LOD, once you enter an interior the fps rate rases considerably, but outside in the town it drops. For this you need a mix of several lod techniques  and a good api with a scene graph like java3d.

The other aproach is to bind opengl to java and use the new hardware godies like shaders and everything that comes with OpenGL 1.4. Of course that if yiu want to do this, when you get your engine running OpenGL 1.5 is out and then its all over again.  Grin
Offline Mojomonkey

Senior Member




ooh ooh eee eeee


« Reply #15 - Posted 2003-07-25 21:24:41 »

Quote
Sound is not good enough use midis not mp3 and sounds with a low sampling. Most sound cards with intruments banks and can play midi better than an mp3 and can also filter low sampled wavs to sound nicer.


So you are saying that because sound runs like crap, I should make the sound's quality crap? No thanks.

Quote
OK you don't have shadows or pixels shaders. Neither fallout or deusex or half-life or system shock or even thief. These are some of the greatest games that have been made and many people prefer them to some new games that are nothing more than visuals.


We are talking about technology, right? Then we are talking about 5 year old games. I'd sure as hell hope Java3D could match that. But here we are 5 years later, and guess what we can do a lot more. No reason we shouldn't just because good games back then didn't.

Quote
Look at Gothic 2 for instance. I have a 1Ghz cpu with a DirectX 8.1 card (low price). I can play with the max features at high but sometimes the game crashes to desktop because its pushing the limits. This is not just a problem of Java3D. The LOD in this game is amazing. You have distance LOD, interior and exterior LOD, once you enter an interior the fps rate rases considerably, but outside in the town it drops. For this you need a mix of several lod techniques  and a good api with a scene graph like java3d.


You can solve this problem in many ways. Java3D doesn't magically make it disappear.

Quote
The other aproach is to bind opengl to java and use the new hardware godies like shaders and everything that comes with OpenGL 1.4. Of course that if yiu want to do this, when you get your engine running OpenGL 1.5 is out and then its all over again.


At least I'd be using OGL 1.4 what's J3D's capabilities? 1.2? 1.3?

Hell, man, I'm not even anti-Java3D but you sure are making me wish I was.

Don't send a man to do a monkey's work.
Offline Markus_Persson

JGO Wizard


Medals: 12
Projects: 19


Mojang Specifications


« Reply #16 - Posted 2003-07-25 21:27:21 »

<tingle source="spidersense">I sense a religious war.</tingle>

The problem with J3d is that it's just a scenegraph that tries to "almost-kinda" be a low level renderer as well (they provide immediate mode rendering, after all). It's way too high level for any kind of cutting edge development.


I'd MUCH rather use something like the Xith3d scenegraph/renderer than J3d.


Oh, and for crying out loud, j3d is slower than painting by hand and faxing the images to the user. Wink

Play Minecraft!
Offline Breakfast

Senior Member




for great justice!


« Reply #17 - Posted 2003-07-25 23:13:57 »

zingbat, although it is very kind of you to tell us all this, you are probably talking to some of the most informed Java3D programmers there are. And a bunch of well meaning incompetents like me Smiley . Preaching to the converted doesn't even begin to express it. So appreciate that pretty much everyone here takes most of what you have said in favour of Java3D pretty much as granted. I mean have you seen the screenshots of what David Yazel has achieved in Magicosm?

You're not barking up the wrong tree, by any means, but if (as it seems) Java3d is going to die soon anyway, and if we can replace it with something more open that has all those "wouldn't it be nice if" features or at least, being open source, enables us to add them if we want, then who is losing out?  Ultimately, it will make it easier to put together the 3D part of the games we want to write.

It won't mean that the 3D part is any more than 10% of the game engine and it won't make it any quicker or easier to create the content or gameplay that will make it interesting, but after all, that's the fun bit...

Offline Markus_Persson

JGO Wizard


Medals: 12
Projects: 19


Mojang Specifications


« Reply #18 - Posted 2003-07-25 23:18:50 »

Quote
So appreciate that pretty much everyone here takes most of what you have said in favour of Java3D pretty much as granted. I mean have you seen the screenshots of what David Yazel has achieved in Magicosm?


Kill me if I'm wrong, but I thought Magicosm was using Xith3D (based on Jogl) now..

Play Minecraft!
Offline DavidYazel

Junior Member




Java games rock!


« Reply #19 - Posted 2003-07-26 00:03:39 »

Not yet Markus, but soon.

BTW your Wurm demo is bitchin!

David Yazel
Xith3D Project Founder
http://xith3d.dev.java.net

It may look complicated, but in the end it is just a bunch of triangles
Offline Markus_Persson

JGO Wizard


Medals: 12
Projects: 19


Mojang Specifications


« Reply #20 - Posted 2003-07-26 00:24:37 »

Ahh, ok. Nevermind me, then.


And, thank you. =)
Any chance of there being a Magicosm tech demo any time soon? Smiley

[edit:]
I forgot to say that Magicosm is looking real good as well. =) But it's hard to tell from screenshots.

Play Minecraft!
Offline swpalmer

JGO Coder




Where's the Kaboom?


« Reply #21 - Posted 2003-07-26 01:27:21 »

So when do we kill you?  Grin

Offline Markus_Persson

JGO Wizard


Medals: 12
Projects: 19


Mojang Specifications


« Reply #22 - Posted 2003-07-26 22:25:37 »

Please don't. I was attempting to be funny. Wink

Play Minecraft!
Offline Mojomonkey

Senior Member




ooh ooh eee eeee


« Reply #23 - Posted 2003-07-26 22:46:56 »

You'll slide *THIS* time.

Don't send a man to do a monkey's work.
Offline zingbat

Senior Member




Java games rock!


« Reply #24 - Posted 2003-07-27 14:27:48 »

Quote

So you are saying that because sound runs like crap, I should make the sound's quality crap? No thanks.


No because its possible to make very good sounds with low sampling and midis with new sound cards. Its also possible to create very crapy musics and sounds with high samples and mp3s.

Quote

We are talking about technology, right? Then we are talking about 5 year old games. I'd sure as hell hope Java3D could match that. But here we are 5 years later, and guess what we can do a lot more. No reason we shouldn't just because good games back then didn't.


It means you don't have to rely on the latest graphics to make an excellent game. And if a game only relys in good graphics its probably going to be forgotten very soon.

Quote

At least I'd be using OGL 1.4 what's J3D's capabilities? 1.2? 1.3?


OpenGL is not a game engine.

Java3D has a scene graph and a very clean API to manage behaviors, lods, colliision, so people can spend time making content instead of building the engine.

Quote

Hell, man, I'm not even anti-Java3D but you sure are making me wish I was.


Play some classics and study their requests then think again. Most of the new games, these days, the more graphics they have the more crap they are.
Offline zingbat

Senior Member




Java games rock!


« Reply #25 - Posted 2003-07-27 14:46:21 »

Quote
zingbat, although it is very kind of you to tell us all this, you are probably talking to some of the most informed Java3D programmers there are. And a bunch of well meaning incompetents like me Smiley . Preaching to the converted doesn't even begin to express it. So appreciate that pretty much everyone here takes most of what you have said in favour of Java3D pretty much as granted. I mean have you seen the screenshots of what David Yazel has achieved in Magicosm?


Yup. Its very impressive.

Quote

You're not barking up the wrong tree, by any means, but if (as it seems) Java3d is going to die soon anyway, and if we can replace it with something more open that has all those "wouldn't it be nice if" features or at least, being open source, enables us to add them if we want, then who is losing out?  Ultimately, it will make it easier to put together the 3D part of the games we want to write.


I very much doubt Java3D is going to die any time soon. Its free, has plenty of downloadable documentation and is stable if well used. The free part is very important, most universities are using it to simulate AI and its te only realiable thing to do applets with 3D content.

Quote

It won't mean that the 3D part is any more than 10% of the game engine and it won't make it any quicker or easier to create the content or gameplay that will make it interesting, but after all, that's the fun bit...


I don't discuss that. In fact i think the only perfromance advantage is in being able to use OpenGL 1.4 api and shader technology. But still its only the low level api, if it worked on top of an high level API like Java3D and still being programable in the shaders level then it would be realy impressive.

But still there will be a lot of things missing in that engine . For instance loaders for 3d art, a game editor, an editor for adanced stuff like shaders. I would not mind helping with that but i am having a lot of fun with Java3D at the moment.  Grin
Offline Markus_Persson

JGO Wizard


Medals: 12
Projects: 19


Mojang Specifications


« Reply #26 - Posted 2003-07-27 15:00:25 »

Quote
OpenGL is not a game engine.


Neither is Java3D.

Play Minecraft!
Offline Mojomonkey

Senior Member




ooh ooh eee eeee


« Reply #27 - Posted 2003-07-27 15:05:49 »

Quote
It means you don't have to rely on the latest graphics to make an excellent game. And if a game only relys in good graphics its probably going to be forgotten very soon.


You don't think these relied on the latest graphics when they came out? I guarantee, if Halflife *looked* five years old when it came out, it would not have took off. Sure, they are still good games now, but pretend for an instant that they didn't come out until tomorrow. Nobody ever heard of them until then. Do you think they'd do nearly as well? If you say anything other than no, you are fooling yourself.

Don't send a man to do a monkey's work.
Offline kevglass

JGO Kernel


Medals: 85
Projects: 25


Coder, Trainee Pixel Artist, Game Reviewer


« Reply #28 - Posted 2003-07-27 15:21:02 »

Whilst a small subset of people here are writing commerical games, the majority just play with hobby games for fun.

In this case, Java3D and OpenGL have their place. Its just a matter of whats good for what you're doing and what you happen to be interested in at the time.

However, it is a fact that many games today wouldn't get past the starting blocks without some vary increadible graphics (hence why so many games sites show screenshots before things are even close to ready). It doesn't make the game, but it does help.

I'm not sure why we go on and on with this argument. Generalisation causes peformance degredation (generally Smiley ) since you're trying to cover all bases. It does however make things easier. Java3D is a generalisation of scene graph built ontop of GL/DirectX.

In short, it isn't an either/or, right tool for the job.

Kev

Offline Mojomonkey

Senior Member




ooh ooh eee eeee


« Reply #29 - Posted 2003-07-27 15:52:42 »

Damn it, Kevin! Why do you have to come in a ruin the fun with logic and sense??

Don't send a man to do a monkey's work.
Pages: [1] 2
  ignore  |  Print  
 
 
You cannot reply to this message, because it is very, very old.

 

Add your game by posting it in the WIP section,
or publish it in Showcase.

The first screenshot will be displayed as a thumbnail.

xsi3rr4x (58 views)
2014-04-15 18:08:23

BurntPizza (56 views)
2014-04-15 03:46:01

UprightPath (69 views)
2014-04-14 17:39:50

UprightPath (52 views)
2014-04-14 17:35:47

Porlus (69 views)
2014-04-14 15:48:38

tom_mai78101 (95 views)
2014-04-10 04:04:31

BurntPizza (155 views)
2014-04-08 23:06:04

tom_mai78101 (250 views)
2014-04-05 13:34:39

trollwarrior1 (206 views)
2014-04-04 12:06:45

CJLetsGame (213 views)
2014-04-01 02:16:10
List of Learning Resources
by SHC
2014-04-18 03:17:39

List of Learning Resources
by Longarmx
2014-04-08 03:14:44

Good Examples
by matheus23
2014-04-05 13:51:37

Good Examples
by Grunnt
2014-04-03 15:48:46

Good Examples
by Grunnt
2014-04-03 15:48:37

Good Examples
by matheus23
2014-04-01 18:40:51

Good Examples
by matheus23
2014-04-01 18:40:34

Anonymous/Local/Inner class gotchas
by Roquen
2014-03-11 15:22:30
java-gaming.org is not responsible for the content posted by its members, including references to external websites, and other references that may or may not have a relation with our primarily gaming and game production oriented community. inquiries and complaints can be sent via email to the info‑account of the company managing the website of java‑gaming.org
Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2013, Simple Machines | Managed by Enhanced Four Valid XHTML 1.0! Valid CSS!