Java-Gaming.org Hi !
Featured games (90)
games approved by the League of Dukes
Games in Showcase (774)
Games in Android Showcase (230)
games submitted by our members
Games in WIP (856)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: 1 ... 201 202 [203] 204 205 ... 207
  ignore  |  Print  
  What I did today  (Read 2958256 times)
0 Members and 4 Guests are viewing this topic.
Offline kingroka123
« Reply #6060 - Posted 2018-08-02 02:09:20 »

I'm working on a fantasy console and I've gotten to the point where I'm drawing pixels  Cheesy. Here's a taste of what it takes to draw a box and move it around the screen ->
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
66  
67  
68  
69  
70  
71  
72  
      m.push((char)0x1000);
      m.push(Screen.toHexCoords(64, 128));
      m.push((char)1024);
     
     
      m.push((char)0x0600);
      m.push((char)1024);
      m.push((char)0xb000);

      m.push((char)0x5000);
      m.push(Screen.toHexCoords(1, 1));
      m.push((char)0xa107);
      m.push((char)0x0600);
      m.push((char)1024);
     
      m.push((char)0x5000);
      m.push(Screen.toHexCoords(0, 1));
      m.push((char)0xa107);
      m.push((char)0x0600);
      m.push((char)1024);
     
      m.push((char)0x5000);
      m.push(Screen.toHexCoords(0, 1));
      m.push((char)0x4000);
      m.push(Screen.toHexCoords(1, 0));
      m.push((char)0xa107);
      m.push((char)0x0600);
      m.push((char)1024);
     
      m.push((char)0x4000);
      m.push(Screen.toHexCoords(1, 1));
      m.push((char)0xa107);
      m.push((char)0x0600);
      m.push((char)1024);
     
      m.push((char)0x4000);
      m.push(Screen.toHexCoords(0, 1));
      m.push((char)0xa107);
      m.push((char)0x0600);
      m.push((char)1024);
     
      m.push((char)0x4000);
      m.push(Screen.toHexCoords(0, 1));
      m.push((char)0x5000);
      m.push(Screen.toHexCoords(1, 0));
      m.push((char)0xa107);
      m.push((char)0x0600);
      m.push((char)1024);
     
      m.push((char)0x5000);
      m.push(Screen.toHexCoords(1, 0));
      m.push((char)0xa107);
      m.push((char)0x0600);
      m.push((char)1024);
     
      m.push((char)0x4000);
      m.push(Screen.toHexCoords(1, 0));
      m.push((char)0xa107);
      m.push((char)0x0600);
      m.push((char)1024);
     
      m.push((char)0x0600);
      m.push((char)1024);
      m.push((char)0x4000);
      m.push(Screen.toHexCoords(2, 1));
      m.push((char)0x2000);
      m.push((char)1024);
     
      m.push((char)0xe000);

      m.push((char)0x9000);
      m.push((char)3077);


Draws This (the box moves and wraps around the screen):


I'm designing a low-level assembly-like language to make this process a lot easier but it's pretty fun to just input bytes like this
Offline dime26

JGO Ninja


Medals: 73
Projects: 7
Exp: 12 years


Should traffic wardens be armed?


« Reply #6061 - Posted 2018-08-02 15:47:44 »

Used some basic math last night to improve my car dust placement, when a vehicle is generated I use the middle point and one edge to calculate the radius of a circle that would surround the rectangle.

When I decide dust or smoke is to be added I can use that radius and the current angle of the car to place decals around the wheels of the car, not sure if this is the best way to do this but it works well. This also makes smoke and dust appear in the correct place of all the vehicles whose tires are at the edge of the rectangle.

I now have dust being added when the car is accelerating from a stand still and when it is skidding. Improved the skid mark placement as well:

Click to Play
Offline orange451

JGO Kernel


Medals: 439
Projects: 7
Exp: 7 years


Your face? Your ass? What's the difference?


« Reply #6062 - Posted 2018-08-04 07:14:44 »

Started implementing a property explorer:


First Recon. A java made online first person shooter!
Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline Gornova
« Reply #6063 - Posted 2018-08-05 09:28:09 »

@Gornova Looks nice! Any specific reason for using Swing instead of JavaFX? I think working with the JavaFX canvas is easier and faster (performance wise) than the canvas in Swing (correct me if I'm wrong). Plus, JavaFX has some nice effects, and if you combine them with a timeline you can do cool stuff (ofcourse, not AAA-quality, but cool nonetheless).

@beeaware  was just a prototype and in this case.. work with something I already know is the must Cheesy

Blog | Last game Drone Swarm
Offline SkyAphid
« Reply #6064 - Posted 2018-08-05 21:53:10 »

The new Robot Farm changelog video is out, finally:

<a href="http://www.youtube.com/v/hiG780Hx-RY?version=3&amp;hl=en_US&amp;start=" target="_blank">http://www.youtube.com/v/hiG780Hx-RY?version=3&amp;hl=en_US&amp;start=</a>

And here's a link to the thread for it:
http://www.java-gaming.org/topics/robot-farm/38013/msg/369921/view.html#new

Time for a short a break. Lol

it just werks
Offline orange451

JGO Kernel


Medals: 439
Projects: 7
Exp: 7 years


Your face? Your ass? What's the difference?


« Reply #6065 - Posted 2018-08-08 13:18:59 »

Implemented Saving/Loading, Physics, and a way to "start" and "reset" the simulation (So that you can edit the project in a paused state, and then start it to play-test)


First Recon. A java made online first person shooter!
Offline orange451

JGO Kernel


Medals: 439
Projects: 7
Exp: 7 years


Your face? Your ass? What's the difference?


« Reply #6066 - Posted 2018-08-10 15:40:15 »

More work on the PBR shader. Saw an interesting property called Reflectiveness in the google filament project. I tried to emulate it with my current implementation (top line only)


First Recon. A java made online first person shooter!
Offline Sickan
« Reply #6067 - Posted 2018-08-11 11:29:25 »

I rewrote the rendering in my strategy game to use meshes, which made it trivial to add rivers.



Offline FabulousFellini
« Reply #6068 - Posted 2018-08-11 22:54:19 »

I finally figured out a nice way to load my game world.  It's probably old news to most of you but here's how I did it.  The game world is divided into "chunks", 8 x 8, so 64 chunks in all.  Each chunk consists of a tile based grid of a tile map, the tile map being a grid of 68 x 50 "smaller tiles" ("smaller tiles" are each 32 x 32 pixels).  So that makes the world 17,280 x 12,860 (I think).  But only one or two chunks are rendered at a time, depending on if the player is within the chunk's bounds.  Is that how you guys do it for a large tile based world?  This is like my fourth iteration trying to get this to work and this seems like the best way to go about it but I'm super open to advice! 

I also got my hair cut.   And going to McDonalds later to get a happy meal to get a Super Mario toy. 

Cheers guys, happy Saturday!

-FabulousFellini
www.fabulousfellini.com
Offline SHC
« Reply #6069 - Posted 2018-08-12 13:18:17 »

Getting back to the good old VIM (NeoVim)



I'm not so good at it, but just finished out making my own configuration for the NVIM + TMUX.

Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline jonjava
« Reply #6070 - Posted 2018-08-12 16:19:26 »

@SHC

Higly recommend:

tmux
https://github.com/tmux-plugins/tpm
https://github.com/tmux-plugins/tmux-resurrect

vim
https://github.com/junegunn/vim-plug
https://github.com/junegunn/fzf
https://github.com/junegunn/fzf.vim

vim colorschemes
https://github.com/morhetz/gruvbox
https://github.com/junegunn/seoul256.vim

vimrc
set synmaxcol=199 "syntax anti-choke!

Offline philfrei
« Reply #6071 - Posted 2018-08-17 00:21:23 »

Just posted a draft (in Chit-chat Monster) of what will eventually be an article or wiki here.
It is a long one, took three posts to put up the complete.
I did not do any formatting except for some code tags. The article will be fully formatted.

Topic: Packaging a custom, self-contained Java program for deploying on Windows 64.

It was very difficult to do the packaging, as I could not figure out how to alter the examples given in the deployment guide to work with a jlink file system. So after struggling with and giving up on both JavaPackager and Ant, I went through the process via the cmd.exe shell.

After getting it to work (for my ToneCircleDrone project) I decided to spend a couple days writing up the steps for others. But it turned into a two-week project. Going on three weeks.

Part of the reason it is so long is that my DOS is weak and I spent a lot of time thrashing with that aspect. I wrote up a bunch of explanations to help other programmers like myself who have jumped into it self-taught and rely on Eclipse or another DAW and are weak with system aspects.

music and music apps: http://adonax.com
Offline ral0r2
« Reply #6072 - Posted 2018-08-17 08:26:18 »

Started on implementing simple shops to my game, where you can buy and sell items.



Data for shops are stored in simple .json files:

Offline philfrei
« Reply #6073 - Posted 2018-08-17 23:38:49 »

I posted a major trimming edit of tutorial posted yesterday. Took out a LOT of verbiage/explanation on cmd.exe basics and Windows OS basics. This might be a more generally useful targeting of audience, and a lot easier to read. Maybe a fully formatted version of this will end up being the finished Article/Tutorial.

I went to a meet-up the other day, asking other game programmers about "signing" and "certificates". I am still researching these things, how to handle issue while not spending too much. Universal reply: "Oh, I use [Unreal/Unity/whatever] so I don't worry about that."

How big a factor is this for why new coders gravitate to these platforms? If we show that packaging a Java game can be accomplished without too much hassle, will people be more encouraged to code games with Java/JavaFX?

music and music apps: http://adonax.com
Offline br0ken_m1nd

Junior Devvie


Medals: 13
Projects: 1



« Reply #6074 - Posted 2018-08-18 19:35:58 »

Speaking of Phantasy Console, I've also been working on one. I call it Singulair 64. It's pretty much a Pico 8 clone. There are a few differences tho.



(Console)


(Code Editor)


(SpriteEditor)


(MapEditor)


(SFXEditor)


(A simple animation)
Click to Play




Right now it's using a 24 color palette. 16 of the colors are from Pico 8 palette, the rest were chosen by me. In the future, I'll create a palette of 24 colors from scratch, this one is temporary.

I still need to add stuff to every component and bugs need to fixed and polish is needed also ofc. But it was enough to create an entry for the lowrezjam 2018.

Here's the url btw: https://itch.io/jam/lowrezjam-2018/rate/293637

PS: It's also missing the music editor.

Offline princec

« JGO Spiffy Duke »


Medals: 1059
Projects: 3
Exp: 20 years


Eh? Who? What? ... Me?


« Reply #6075 - Posted 2018-08-19 08:28:07 »

How big a factor is this for why new coders gravitate to these platforms? If we show that packaging a Java game can be accomplished without too much hassle, will people be more encouraged to game code with Java/JavaFX?
It is a massive factor. Deployment is just bullshit irritating busywork that gets in the way of people playing your stuff. If you can make it trivially easy to deploy to multiple platforms that helps a lot. Unity is several steps ahead though with deployment to web and consoles too... but that's because Java still doesn't run on a single console.

Cas Smiley

Offline CommanderKeith
« Reply #6076 - Posted 2018-08-19 09:22:36 »

Really great work Philfrei.
I used your guide together with Java 10 and it worked brilliantly in only 15 minutes. I was only interested in using JLink and not Innosetup so I stopped at step 5B.
Some things that I thought could help make it easier for others:

-Small typo, change Demo.Java to Demo.java in "Our package statement, for Demo.Java, is the following:"

-To make it more clear what the project folder is, remind the user it's dpproject: "From within the current directory dpproject, run the following cmd.exe command:"

-Maybe suggest how to set the current directory using the 'cd' command in windows: "cd C:\Users\You\Desktop\dpproject\".

-In step 5B it's hard to find the two executable files since they're nestled amongst a bunch of random other files in 'dpproject\dist\bin\'. Maybe add the following: "With the inclusion of this option, two files are created in 'dpproject\dist\bin\' based on the name "LaunchDemo". These files are named LaunchDemo and LaunchDemo.bat.

-Perhaps add a zipped downloadable folder with the directory structure together with the compiled and dist directory output there in case someone made a small mistake in these steps.

-Java 11 will be released soon and it will decouple javafx, so to future-proof the demo, maybe make it use AWT rather than javafx or modify the instructions to cope with an external javafx.jar file.

Thanks so much for your guide. I tried using JLink to make a slim distributable exe file a few months ago and gave up. I thought the netbeans IDE would automatically use JLink to make an installer but I couldn't work it out. Your guide will help lots of people. You might consider posting a question and your answer guide on StackOverflow for maximum visibility.

Cheers,
Keith

Offline orange451

JGO Kernel


Medals: 439
Projects: 7
Exp: 7 years


Your face? Your ass? What's the difference?


« Reply #6077 - Posted 2018-08-20 02:15:42 »

Started prefab importing.


First Recon. A java made online first person shooter!
Offline philfrei
« Reply #6078 - Posted 2018-08-20 02:41:30 »

OK, posted the walk-through in the wiki section. It ended up taking most of the day, so this really is a "What I did today" post.

I figure we should have a more general wiki for deployment and packaging regardless. I hope that was an okay choice to start that up. The tutorial I wrote only covers one of many possibilities. I'm thinking we can use the thread to have more help for this important topic.

Big thank you CommanderKeith for the excellent suggestions and encouragement. I tried to respond to all suggestions with positive changes.

Am very much open to more thoughts and corrections.

music and music apps: http://adonax.com
Offline ral0r2
« Reply #6079 - Posted 2018-08-20 10:42:13 »

OK, posted the walk-through in the wiki section. It ended up taking most of the day, so this really is a "What I did today" post.

I figure we should have a more general wiki for deployment and packaging regardless. I hope that was an okay choice to start that up. The tutorial I wrote only covers one of many possibilities. I'm thinking we can use the thread to have more help for this important topic.

Big thank you CommanderKeith for the excellent suggestions and encouragement. I tried to respond to all suggestions with positive changes.

Am very much open to more thoughts and corrections.

Really, really appreciating your work on this. Building / Packaging my Java game has been a huge challenge for me quite a while. Especially because of the embedded JRE part. Hopefully I can test your guide out asap with Slick2D and Maven (I'm not sure if Slick2D works with Java9 tho, since they remove Java Applet in WebStart functionality and Slick2D still has dependencies to those) and provide you some feedback. I really think something like this might help a lot of people.

Something I just noticed: I think at the top of your entry you might add something like: Requires Java9 (since we use jlink). Just in case someone is reading your tutorial step by step and is wondering why there is no "%JAVA9_HOME%\bin\jlink". In case I simply did not see the hint that this tutorial requires Java9 or this is the wrong place for feedback I'm sorry Smiley
Offline Gjallar

JGO Knight


Medals: 44
Projects: 1


Follower of Nurgle


« Reply #6080 - Posted 2018-08-22 16:01:50 »

Today I met a celebrity by chance. Stumbled across @badlogicgames in a little restaurant  Smiley
Offline KaiHH

JGO Kernel


Medals: 635



« Reply #6081 - Posted 2018-08-23 16:33:38 »

Today I resumed work on my real-time path tracing implementations which I started a while ago and added some demos to the LWJGL/lwjgl3-demos repository. After having implemented the first bits of Edge-Avoiding À-Trous Filtering there is a much more promising technique (no, I am not yet talking about Nvidia's neural network approach to image reconstruction), but about temporal accumulation of previous samples via screen-space reprojection, which effectively increases the sample count in animations. Previously, whenever the camera moved, all accumulations have been discarded which made the image look very noisy during movements.
Reprojection has been used earlier to cache fragment shader calculations in order to reduce run time:
- http://w3.impa.br/~diego/publications/TR-749-06.pdf
- http://cheetah.cs.virginia.edu/~jdl/papers/reproj/amorn_gh08.pdf
Reprojection has also been implemented in https://research.nvidia.com/publication/2017-07_Spatiotemporal-Variance-Guided-Filtering%3A as well as the more recent master thesis https://dspace.cvut.cz/bitstream/handle/10467/76944/F3-DP-2018-Dundr-Jan-ctutest.pdf submitted to CESCG 2018.
This is a first impression without any sort of spatial filtering (such as variance-guided filtering for the spots of disocclusion where variance is still very high). It just shows accumulation of previous reprojected frames based on the lifetime of that particular sample (time since first disocclusion):
<a href="http://www.youtube.com/v/6OpfYU1Mv3E?version=3&amp;hl=en_US&amp;start=" target="_blank">http://www.youtube.com/v/6OpfYU1Mv3E?version=3&amp;hl=en_US&amp;start=</a>
<a href="http://www.youtube.com/v/Bt3XDKrXJY0?version=3&amp;hl=en_US&amp;start=" target="_blank">http://www.youtube.com/v/Bt3XDKrXJY0?version=3&amp;hl=en_US&amp;start=</a>
<a href="http://www.youtube.com/v/-ZiwVIEimRA?version=3&amp;hl=en_US&amp;start=" target="_blank">http://www.youtube.com/v/-ZiwVIEimRA?version=3&amp;hl=en_US&amp;start=</a>
<a href="http://www.youtube.com/v/v6uqub4IYag?version=3&amp;hl=en_US&amp;start=" target="_blank">http://www.youtube.com/v/v6uqub4IYag?version=3&amp;hl=en_US&amp;start=</a>
(sorry for the jaggy movements; haven't implemented smooth camera controls yet Smiley

Here are some images of specularity based on fresnel factor:

Offline orange451

JGO Kernel


Medals: 439
Projects: 7
Exp: 7 years


Your face? Your ass? What's the difference?


« Reply #6082 - Posted 2018-08-23 18:59:55 »

@KaiHH Do you think the speeds of this will vastly improve with the new NVidia cards coming out?

First Recon. A java made online first person shooter!
Offline KaiHH

JGO Kernel


Medals: 635



« Reply #6083 - Posted 2018-08-23 19:27:36 »

The thing with path tracing is that cards still need to become ~1000 times faster to avoid any sorts of tricks and allowing to use 1000 samples per pixel. But that is not going to become a reality, so we end up with lots of noise in the traced image, and so far there have only been two promising techniques to get rid of that:
- various image filtering techniques
- image reconstruction (Nvidia proposes to use convolutional neural networks for this)
Since image filtering is basically a solved problem and is absolutely real-time capable, the only thing Nvidia can dramatically improve on is to accelerate image reconstruction using dedicated hardware for neural networks, which is exactly what they are doing with the Tensor chips.
So I think we will see great improvements in real-time path tracing based global illumination and new rendering engines facilitating this in the near future, such as EA's SEED project which seems to be the most state-of-the-art right now: https://www.ea.com/seed/news/hpg-2018-keynote
Offline orange451

JGO Kernel


Medals: 439
Projects: 7
Exp: 7 years


Your face? Your ass? What's the difference?


« Reply #6084 - Posted 2018-08-24 05:30:20 »

Made a little test showing everything being integrated together.

- Model loading
- Game engine
- Physics engine
- Script engine
- Rendering engine

The idea is that the user can import models via the Assets folder. The final asset object is called a Prefab (created from meshes/materials). You can create a game object in the world, which is backed by a prefab. The prefab is just used for drawing. Then you can add a physics object into the game object. When a physics object is inside a game object it "links" to it, which is where it creates a rigid body representation of that game object in the physics engine. The player game object (in the GIF) contains a controlling script (shown below). That captures user-input, and updates the camera to stay with the player.

Click to Play


Here's the controller for the player:

First Recon. A java made online first person shooter!
Offline KaiHH

JGO Kernel


Medals: 635



« Reply #6085 - Posted 2018-08-24 09:29:13 »

Still brushing up on what's hot and what's not in current ray/path tracing computer graphics. There have been some great papers at the High-Performance Graphics 2018 conference. The second-best voted paper "Gradient Estimation for Real-Time Adaptive Temporal Filtering" discusses how the weights for blending between previous frame and current frame in temporal antialiasing can be adapted based on the change in scene color/light information (light bulb going on and off) or through specular reflections in order to avoid the "ghosting" effect which is inherent in temporal antialiasing techniques.
They do this by re-evaluating a path traced sample from a previous frame using the same random number sequence/seed and checking whether the sample still evaluates to the same color/intensity. If not, then obviously something has changed and the previous frame information should be discarded or at least weighted less based on how much the color/light changed (the gradient) and based on material properties (specular reflections should be weighted even less). Quite a clever solution.

But all papers are really good and should be checked out: https://www.highperformancegraphics.org/2018/best-paper/
Offline Longarmx
« Reply #6086 - Posted 2018-08-24 23:10:09 »

Finished everything on vulkan-tutorial.com - after a couple of weeks. I'm going to need to spend a lot more time thinking about how everything in Vulkan even comes together.


Offline KaiHH

JGO Kernel


Medals: 635



« Reply #6087 - Posted 2018-08-25 08:08:34 »

I find that Sascha Willems' Vulkan examples on GitHub are just pure gold: https://github.com/SaschaWillems/Vulkan/tree/master/examples
Offline Longarmx
« Reply #6088 - Posted 2018-08-25 15:40:44 »

I find that Sascha Willems' Vulkan examples on GitHub are just pure gold: https://github.com/SaschaWillems/Vulkan/tree/master/examples

This is definitely pure gold. Thank you!

There is an absolute ton of content on here, enough to keep me going for months.

Offline philfrei
« Reply #6089 - Posted 2018-08-27 07:15:02 »

I came across this tutorial just now. Wondering what the best place to post a link to it might be. Should it be on the new Deployment wiki?

Its for making a cross platform mobile app with Java/JavaFX. It's not clear to me yet how much of Java is supported--I think they indicated some of Java 8 won't work.

How to make a Cross-Platform Mobile App in Java

Quote
Did you know that you can use Java to make cross platform mobile apps? Yes, pinch yourself, you read that right the first time! I’ll teach you the basics of how to use your existing Java knowledge to create performant apps on Android and iOS in 12 easy steps. We will do this all using JavaFX as the GUI toolkit.

Working on the deployment issues has me quite bottled up. I try to push forward with it, but decided to not make that my only Java activity. Since so much time is spent in resisting unpleasant tasks, I decided to start giving myself an hour or two on actual coding of other projects instead of allocating all available programming time to deployment issues. Working on the PTheremin today, to set up an experiment for an alternate sound source that makes use of the phase modulation feedback loops (or rather, simulates them). It would be neat, also, to try an experiment I've been wanting to do with coding vowel formants. Better that than simply blocking on the unpleasant tasks of setting up sales site and dealing with certificates and other stuff. Yes?

music and music apps: http://adonax.com
Pages: 1 ... 201 202 [203] 204 205 ... 207
  ignore  |  Print  
 
 

 
EgonOlsen (1865 views)
2018-06-10 19:43:48

EgonOlsen (1888 views)
2018-06-10 19:43:44

EgonOlsen (1256 views)
2018-06-10 19:43:20

DesertCoockie (1688 views)
2018-05-13 18:23:11

nelsongames (1357 views)
2018-04-24 18:15:36

nelsongames (1976 views)
2018-04-24 18:14:32

ivj94 (2743 views)
2018-03-24 14:47:39

ivj94 (1945 views)
2018-03-24 14:46:31

ivj94 (3036 views)
2018-03-24 14:43:53

Solater (1088 views)
2018-03-17 05:04:08
Deployment and Packaging
by mudlee
2018-08-22 18:09:50

Java Gaming Resources
by gouessej
2018-08-22 08:19:41

Deployment and Packaging
by gouessej
2018-08-22 08:04:08

Deployment and Packaging
by gouessej
2018-08-22 08:03:45

Deployment and Packaging
by philfrei
2018-08-20 02:33:38

Deployment and Packaging
by philfrei
2018-08-20 02:29:55

Deployment and Packaging
by philfrei
2018-08-19 23:56:20

Deployment and Packaging
by philfrei
2018-08-19 23:54:46
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!