Flash CS5 for Designers: TLF and ActionScript + Win 1 of 3 Signed Copies!

A lot has changed between how text was handled in Flash CS4 and Flash CS5. We think now is a good time to pull up a stool, sit down, and review, in very broad terms, what one needs to know about TLF before “wiring up” an exercise or project using ActionScript.

The following is an exercise from Foundation Flash CS5 For Designers by Tom Green & Tiago Dias.
 
If you’re feeling lucky, enter the Activetuts+ competition to win one of 3 signed copies! (Of course, you can always purchase a copy..)

Introduction

With the new TextLayoutFramework (TLF), text is found in these things called containers. They either can be physically drawn on the stage using the Text tool and given an instance name or, as is more common, can be created at runtime. You also know that the text can be formatted and manipulated using the Properties panel. The neat thing here is the word properties. If there is a property in the panel, its counterpart is found in ActionScript. The bad news is, ActionScript is stone, cold stupid. It doesn’t have a clue, for example, what a container is until you tell it to create one. It won’t format text until you tell it what to do. It won’t even put the text on the stage until it is told to do so.

Most projects will start with you telling Flash to create a Configuration() object, which is used to tell Flash there is a container on the stage and how to manage the Text Layout Framework for the stuff in the container. The actual appearance is handled by the TextFlow() class, which takes its orders, so to speak, from the Configuration() object.

Naturally, being stupid, the Configuration() object needs to be told exactly how to manage the text in the container. The default format is set through a property of the Configuration class called textFlowInitialFormat. To change it, you simply use the TextlayoutFormat () class to set the fonts, colors, alignment, and so on, and then tell the boss—Configuration ()—that its textFlowInitialFormathas changed to the ones you set using TextLayoutFormat().The boss will get that, but he isn’t terribly bright, so you next need to tell him to hand the actual work to another member of the management team, the TextFlow() class. This class has overall responsibility for any words in a container. Being just as dim as the boss, TextFlow() needs to be told what a paragraph is (ParagraphElement), how wide the paragraph is (SpanElement), whether any graphics are embedded in the paragraph (InLineGraphicElement), whether any of the text contains links (Link Element), and so on. Not only that, but it needs to be told what text is being added to the container so it can handle the line length and to add any children (addChild) that contain that formatting so the user can actually see it.

The TextFlow() class, again not being too terribly bright, will then hand the job over to another member of the management team, the IFlowComposer() class, whose only job is to manage the layout and display of the text flow within or among the containers. The flow composer finishes the process by deciding how much text goes into a container and then adds the lines of text to the sprite. This is accomplished through the use of the addController() method, which creates a ContainerController() object whose parameters identify the container and its properties.

The usual last step is to tell the FlowComposer to update the controllers and put the text on the stage according to how the other members of the team have told the Configuration() object how their piece of the project is to be managed.

With this information in hand, let’s move on to working with TLF in ActionScript. We’re going to create a column of text with ActionScript.


Step 1: New Document

Open a new Flash ActionScript 3.0 document, rename Layer 1 to actions, select the first frame of the actions layer, and open the Actions panel.


Step 2: ActionScript

Click once in the Script pane, and enter the following:

var myDummyText:String = "The introduction of the Adobe CS5 product line puts some powerful typographic tools in your hands—notably, a new API (Application Programming Interface) called Type Layout Framework (TLF)—and with as more tools in the Adobe line up nudge closer to a confluence point with Flash, the field of typographic motion graphics on the Web is about to move into territory that has yet to be explored. To start that exploration, you need understand what type is in Flash and, just as importantly, what you can do with it to honor the communication messengers of your content.";

You need some text to add to the stage. This string is the third paragraph of this chapter. Now that you have the text to go into the container, you need to load the class that will manage it.


Step 3: Configuration()

Press the Enter (Windows) or Return (Mac) key, and add the following line of code:

var config:Configuration = new Configuration();

As you may have noticed, as soon as you created the Configuration() object, Flash imported the class—flashx.textLayout.elements.Configuration —whose primary task is to control how TLF behaves. The next code block tells TLF how the text will appear on the stage.


Step 4: TextLayoutFormat Class

Press the Enter (Windows) or Return (Mac) key twice, and enter the following:

var charFormat:TextLayoutFormat = new TextLayoutFormat();
   charFormat.fontFamily = "Arial, Helvetica, _sans";
   charFormat.fontSize = 14;
   charFormat.color = 0x000000;
   charFormat.textAlign = TextAlign.LEFT;
   charFormat.paddingLeft =100;
 charFormat.paddingTop = 100;

The TextLayoutFormat class, as we said earlier, is how the text in a container is formatted. The properties in this class affect the format and style of the text in a container, a paragraph, or even a single line of text. In this case, we are telling Flash which fonts to use, the size, the color, how it is to be aligned (note the uppercase used for the alignment), and the padding that moves it off the edges of the container.

Before you move on, you need you to do something. There is a coding issue. Scroll up to the import statements. If you see this line—import flashx.textLayout.elements.TextAlign;—proceed to the next code block. If you don’t, delete this line in the code block just entered: charFormat.textAlign = TextAlign.LEFT;. Reenter charFormat.textAlign =. Type in the first two letters of the class (Te), press Ctrl+spacebar, and the code hint should appear. Find TextAlign, and double-click it. This should add the missing import statement. To preserve your sanity, we will be providing a list of the import statements that should appear at the end of each exercise. We strongly suggest that you compare your list of import statements against the list presented and, if you are missing any, add them into your code.

Now that you know how the text will be formatted, you need to tell the Configuration() object to use the formatting. If you don’t, it will apply whatever default setting it chooses.


Step 5: textFlowInitialFormat

Press the Enter (Windows) or Return (Mac) key twice, and enter the following:

config.textFlowInitialFormat = charFormat;

Step 6: TextFlow ()

Press the Enter (Windows) or Return (Mac) key, and enter the following code block:

var textFlow:TextFlow = new TextFlow( config );
   var p:ParagraphElement = new ParagraphElement();
   var span:SpanElement = new SpanElement();
   span.text = myDummyText;
   p.addChild( span );
 textFlow.addChild( p );
 

The TextFlow () object needs to be here because its job is to manage all the text in the container. The constructor—TextFlow (config)—lets TLF know that it is to use the config object created earlier so it now knows how to format the contents of the container and even the container itself.
The next constructor—ParagraphElement()—essentially tells Flash how a paragraph is to be handled. There is only one here, so it really doesn’t need a parameter.

The final step is to get all the formatting and layout into the container on the stage.


Step 7: ContainerController

Press the Enter (Windows) or Return (Mac) key, and add these final two lines:

textFlow.flowComposer.addController( new ContainerController( this, 500, 350 ) );
 textFlow.flowComposer.updateAllControllers();

The first line adds the ContainerController and tells Flash the container being managed is the current DisplayObject (this), which currently is the stage, and to set its dimensions to 500 pixels wide by 350 pixels high.


Step 8: Test

Save the project, and test the movie. The text, as shown below, appears using the formatting instructions you set.

Import Statements for this Exercise

These are the import statements for this exercise:

   import flashx.textLayout.elements.Configuration;
   import flashx.textLayout.formats.TextLayoutFormat;
   import flashx.textLayout.formats.TextAlign;
   import flashx.textLayout.elements.TextFlow;
   import flashx.textLayout.elements.ParagraphElement;
   import flashx.textLayout.elements.SpanElement;
   import flashx.textLayout.container.ContainerController;

Using ActionScript to create and format the container and its text

Though this coding task may, at first, appear to be a rather convoluted process, we can assure it isn’t; it will become almost second nature as you start using ActionScript to play with text in the containers.

With the introduction of the Text Layout Format, your ability to create text, format text, put it in columns, and generally manipulate it using ActionScript has greatly expanded your creative possibilities. Before you get all excited about this, you need to know that the word Framework is there for a reason.

Any TLF text objects you create will rely on a specific TLF ActionScript library, also called a runtime shared library (RSL). When you work on the stage in the Flash interface, Flash provides the library. This is not the case when you publish the SWF and place it in a web page. It needs to be available, much like Flash Player, on the user’s machine. When the SWF loads, it is going to hunt for the Library in three places:

  • The local computer: Flash Player looks for a copy of the library on the local machine it is playing on. If it is not there, it heads for Adobe.com.
  • Adobe.com: If no local copy is available, Flash Player will query Adobe’s servers for a copy of the library. The library, like the Flash Player plug-in, has to download only once per computer. After that, all subsequent SWF files that play on the same computer will use the previously downloaded copy of the library. If, for some reason, it can’t grab it there, it will look in the folder containing the SWF.
  • In the folder containing the SWF: If Adobe’s servers are not available for some reason, Flash Player looks for the library in the web server directory where the SWF file resides. To provide this extra level of backup, manually upload the library file to the web server along with your SWF file. We provide more information around how to do this in Chapter 15.

    When you publish a SWF file that uses TLF text, Flash creates an additional file named textLayout_X.X.X.XXX.swz (where the Xs are replaced by the version number) next to your SWF file. You can optionally choose to upload this file to your web server along with your SWF file. This allows for the rare case where Adobe’s servers are not available for some reason. If you open the file where you saved this exercise, you will see both the SWF and, as shown in Figure 6-25, the SWZ file.

The .swz file contains the Text Layout Framework.


The Giveaway!

We’re running this giveaway a little differently since Adam from Aetuts+ pushed Wildfire my way.. Wildfire is a brilliant promotion builder and makes entering competitions a piece of cake! If you’d like to be in with a chance of winning one of three signed copies of “Foundation Flash CS5 for Designers”, just enter!

How do I Enter?

  1. Send a tweet from the entry page. For every Twitter follower that enters through your link you get an extra entry.
  2. Fill in your details once you’ve done so. That’s it!

The three winners will be announced on Monday 6th September. Good luck!

Modelling and Rendering a Dumbbells Scene in C4D – Day 1

In this fantastic new 2-part tutorial series, Moises Perez walks us through how to model, texture and render a dumbbells scene in Cinema 4D. Today’s part covers the dumbbell modelling and the overall scene layout, and is an awesome way to brush up on your C4D modelling skills! Get started after the jump…


Video 1

Download

Note: click the ‘Monitor’ icon to view tutorial in full-screen HD.


Video 2

Download

Note: click the ‘Monitor’ icon to view tutorial in full-screen HD.


Don’t miss more CG tutorials and guides, published daily – subscribe to Cgtuts+ by RSS.

26 Amazing Abstract Artworks

Today, Topher Welsh is back with another awesome 3D roundup. Here’s what he has to say: “Abstract artwork is really beautiful sometimes… I mean, it can be anything you want it to be, and with the capabilities of 3D, you can make some really cool stuff! I have a ton of really cool images, plus some tutorials at the end for you to learn how to do this yourself!”



Don’t miss more CG tutorials and guides, published daily – subscribe to Cgtuts+ by RSS.

A Comprehensive Beginners Guide to UDK – Day 1

In this new tutorial series, Ivan Krushkov will be walking us through the very basics of the Unreal Development Kit (UDK). In this first part Ivan covers the actual interface itself, whilst in Day 2 he shows you how to use that knowledge to produce your very first playable level! If you want to get started creating your own content in UDK, this tutorial is for you.


Video 1

Download

Note: click the ‘Monitor’ icon to view tutorial in full-screen HD.


Video 2

Download

Note: click the ‘Monitor’ icon to view tutorial in full-screen HD.


Video 3

Download

Note: click the ‘Monitor’ icon to view tutorial in full-screen HD.


Video 4

Download

Note: click the ‘Monitor’ icon to view tutorial in full-screen HD.


Don’t miss more CG tutorials and guides, published daily – subscribe to Cgtuts+ by RSS.

Quick Tip: Depth of field with 3DS Max and V-ray

In today’s tutorial, Ben Henry walks us through how he sets up Depth of Field (or DOF) in his renders using 3Ds Max and Vray. After covering the camera settings and adding DOF to the scene, Ben also takes a quick look at how to add Bokeh effects to your final render. If you’re looking to create more photo-realistic results with 3Ds Max, look no further than today’s Quick-tip.

Background Knowledge

Depth of Field (also known as DOF) is the effect of your foreground being in focus, while your background is blurred (or out of focus) or vice versa (the other way around).

Before we begin with the tutorial however, we need to talk a little about some of the VrayPhysicalCamera properties and how they relate to a real camera :

  • The film gate is the part of the camera behind the shutter that catches the light and determines the final Aspect Ratio of the image. This works the same way on real life cameras as it does with the VrayPhysicalCamera.
  • The focal length is the range between the front of the lens to the place where the camera is focused, which can make the camera have a bigger viewing range or smaller viewing range. If you want the viewing range to be bigger then make that number smaller, and vice versa. Again this works the same way on both real life cameras and the VrayPhysicalCamera.
  • The zoom factor, as you can probably guess, is the zoom of the camera.
  • The f-number basically describes the iris of the camera; the lower the value, the more open the camera?s iris will be, which in turn creates a more blurred background. This works the same way on both real life cameras and the VrayPhysicalCamera.
  • The shutter speed is a camera’?s exposure time – the length of time that the shutter is open. It affects the motion blur in that the lower the shutter speed, the longer the streaks of the blur there will be and vice versa. This works the same way on both real life cameras and the VrayPhysicalCamera.
  • The ISO or film speed is the camera’s sensitivity to light. The higher the value, the more sensitive the camera is, making the images/renders brighter, and vice versa. This works the same way on both real life cameras and the VrayPhysicalCamera.

So as you can see, the VrayPhysicalCamera is identical to a real camera in a lot of ways. Now that you have learned a little about the different camera settings, let?s put it into action!


Step 1

Before we begin, we need to make sure that we change our renderer to V-ray. Bring up the Render Setup window, go to the Common tab, and then scroll down to the bottom where it says Assign Renderer. Click the button to the right of the Production line and choose V-ray in the dialog box that pops up. Click Ok.

Step 1

Step 2

In order to test the DOF we need to out together a test scene. Head to the Create panel, select Geometry, and place a few boxes a little like I’ve done in the image below.

Step 2

Step 3

Next, click on the Cameras button in the Create panel, click the Standard roll-down menu, click V-ray, and then create a VrayPhysicalCamera. Once created, move it into position as show, making sure that it’s aimed at your objects, and that the target is where you want your focus to be.

Step 3

Step 4

Next we are going to go in and change the settings on our camera. Select the camera, and go to Modify. Here we will set the F-Number to 1, the Shutter Speed to 1000, and then check the box that says Specify focus, which allows us greater control over the focal planes of the camera.

Change the Focus Distance value until the blue grids in the top viewport are in the section you want to focus on. Then go down to the Sampling parameter and check the box next to Depth of Field, setting the Subdivs to 15.

Step 4

TIP : Changing the Subdivs will make the depth of field effect smoother. The higher the number, the smoother it will be, but the longer it will take to render.

TIP 2 : The smaller you make the scene, the blurrier the depth of field will be, as shown in the image below. If your scene is far too big you might have trouble getting the depth of field effect at all. In essence, always try to scale your scene realistically.

Tip 1

Step 5

Make your left viewport the camera-view by clicking Left > Cameras > VrayPhysicalCamera01. Now adjust the position of the camera using the other viewports until you get something you like!

Step 5

Step 6

To create a Rack Focus effect (changing the focus point from one object in your scene to another over time), you can animate the Focus Distance parameter in the camera settings. Click Auto Key to create a first key for the value, and then move the timeline to frame 60 (2 seconds at 30fps) and change the value of the Focus Distance until the grids are where you want the camera to focus on at the end of the move. Now make sure to turn off Auto Key so you don’t accidentally animate any more values!

Step 6

Step 7

Now make a Vraylight in the top viewport by clicking Create > Lights >Vray and then choosing Vraylight. Make it as big as your scene. Then, in the camera viewport, click the VrayPhysicalCamera text and turn on Show Safe Frames?.

Step 7

Step 8

Move the light up on the Z axis in the front view until it sits right above our scene as shown.

Step 8

Step 9

With our focal distance set and our VRayLight in place, we’ll now cover how to make bokeh effects in your final render. To do this, we’re first going to need to create a few more lights in our scene. I added in four small VrayLights, stacked on top of each other, as shown below.

Step 9

Step 10

Now click on the VrayPhysCamera, go to Modify, and scroll down to the bokeh tab. Lets go over the settings for bokeh:

  • Blades – If checked, the shape of the aperture (and therefore the shape of the bokeh itself) is polygonal, with the number of sides depending on the number of blades. If this is not checked, the aperture shape will be circular, as will the bokeh.
  • Rotation – If Blades is checked on, this controls the rotation of that polygonal shape.
  • Center Bias – This makes the brightness of each bokeh greater on either the inside or the outside of the shape. Negative values makes the center brighter, whilst positive values make the outer rim brighter, as shown below :
Step 10

Step 11

Now let’s take a look at the anisotropy setting. Anisotropy basically distorts the bokeh shape either horizontally (if you input a positive value) or vertically (if you use a negative value) as shown below.

Step 11

Step 12

You’re now ready to render! For more efficient results, you can change the Image Sampler in the Render Settings to Adaptive DMC, which gets us slightly better looking DOF in the scene.

Step 12

I hope you enjoyed this quick look at DOF and Bokeh in 3Ds Max and Vray. If you have any questions please feel free to leave me a comment below!


Don’t miss more CG tutorials and guides, published daily – subscribe to Cgtuts+ by RSS.

Introduction to Smoke/Fire Simulation in Blender 2.5 – Day 5

In the final part of his hi-res flame setup, Gottfried Hofmann, the man behind the official Blender smoke/fire documents, continues his look at smoke and fire simulation techniques within Blender 2.5 by adding in the scene camera and compositing together the final product. Prepare to be amazed at just what Blender can do for free!


Video 1

Download

Note: click the ‘Monitor’ icon to view tutorial in full-screen HD.

The Screencast Key Status Tool used in this tutorial is available here.


This tutorial is Day 5 in a series – Go to Day 1, Day 2, Day 3, and Day 4.


Don’t miss more CG tutorials and guides, published daily – subscribe to Cgtuts+ by RSS.

An Introduction to Xpresso in Cinema 4D

In today’s tutorial, rigging artist Aleksey Voznesenski takes us through the basics of Cinema 4D’s Xpresso scripting system. If utilised correctly, Xpresso can be an incredibly powerful system allowing you an amazing level of control over your rigs, animations – even the UI itself. If you want to speed up your workflow in C4d and you’re not using Xpresso, this tutorial is for you!

Aleksey previously recorded our ‘Cinema 4D 101′ tutorial, which can be found here : A Quick-Start Guide to Cinema 4D


Video 1

Download

Note: click the ‘Monitor’ icon to view tutorial in full-screen HD.


Don’t miss more CG tutorials and guides, published daily – subscribe to Cgtuts+ by RSS.

Quick Tip: Setting up an HDRI using Vray for Maya

In today’s Quick-tip tutorial, Edgar Mihailov shows artists new to Maya, and/or it’s relatively new Vray plugin, how to utilise High Dynamic Range Images (HDRIs) to illuminate your scenes, providing realistic reflections in the process. HDRI is now a standard across almost all rendering software and it’s an extremely useful thing to learn how to use!


Hi everyone! In this tutorial I will be showing you how to first enable Global Illumination (GI) within your scene, and then we’ll add an HDRi map using Vray for Maya. I will be using Maya 2011, but the process is extremely similar in some of the older versions of Maya (up to a point of course!) This tutorial is intended for people who are new to Vray itself, or just the Vray for Maya plugin.

I can’t actually share the HDR image I use in the tutorial, however there are a reat many places on the web where you can download free HDRIs to use in your scenes (though please always be aware of commercial restrictions.) A great website for free HDRi maps is http://www.openfootage.net/, but I would advise you to buy at least one good HDRi map pack, as they are typically of higher quality and allow you to achieve the results below in your commercial projects.

Step 1

For the purpose of this tutorial I made this very simple scene. It’s essentially just a sphere, a plane for the floor, and a cross shape (which is nothing more than an extruded cube). Although simple, this will be more than enough to allow us to correctly set up our HDRI, and clearly see the results.

Step 1 Image

Step 2

Before we can start we first have to make sure that the Vray plugin is loaded. To do this, click Window on the top menu bar, and then hover your cursor over Settings/Preferences and a menu will pop up. Once it’s opened, choose the very bottom Plug-in Manager.

Step 2 Image

Step 3

Maya’s Plugin Manager menu will appear. Scroll all the way down to the bottom and make sure that vrayformaya.mll is checked as Loaded. If you do a lot of work with Vray, you might want to check Auto-load as well, which will make the plugin load up everytime Maya starts.

Note : If you don’t see a vrayformaya.mll entry in the list, make sure you have installed the plugin correctly. If you reinstall the plugin, make sure you restart Maya before re-checking the Plugin Manager.

Step 3 Image

Step 4

Now we have to switch our rendering engine to Vray. To do so, switch to the Rendering menu-set (by using the dropdown menu underneath the File and Edit menus on the top bar), then go to Render > Render Using > V-Ray.

Note: You can also see here the other renderers you have access to on the system. By default, Maya comes with Maya Software, Maya Hardware, Maya Vector and Mental Ray – all of which are covered heavily in the documentation.

Step 4 Image

Step 5

After that is done we have to go in and set up our materials. Go to Window > Rendering Editors > Hypershade to open Maya’s main material editor/creator.

Step 5 Image

Step 6

In the image below you can see the Hypershade. On the right are the 3 existing material nodes in the scene, and on the left is a list of all of the material nodes you can create. We want to create a standard Vray material, so click twice where it says “VRay Mtl” to create two materials. As you do this, the new materials will pop up in the right hand side of the Hypershade. For this tutorial only these two materials will be needed.

Step 6 Image

Step 7

Now double-click on one of the materials that we just created to open up the Attribute Editor. (This may appear as a floating panel, or docked to the right hand side of the main window.) In the Attribute Editor go to the Reflection section and change the Reflection Color to white by sliding the slider all the way to the right. This makes the material fully reflective – it is essentially now a mirror. We don’t need to alter the other material as the standard settings will do for this test. Whilst I won’t name the materials here, I strongly advise you to give each material a descriptive name if you’re putting together a complex scene.

Note : If the Attribute Editor doesn’t open, click once on your new material and hit CTRL+A to open it.

Step 7 Image

Step 8

To apply our new materials to our objects, hover your cursor over the material in the right side of the Hypershade, hold down the middle mouse button, move your mouse over the object you want to apply your material to, and then release to apply it. Using this method, I applied our mirror material to the sphere object, and the other default grey material to the floor plane and the cross object.

Step 8 Image

Step 9

Now we have to change our render settings and add in our HDRI. To do this, go to Window > Rendering Editors > Render Settings

Step 9 Image

Step 10

We’re now going to enable Global Illumination, a key part of making the HDRI work as it allows us to take into account any light coming from our environment within the scene. Switch to the Indirect Illumination tab and make sure that the first check box is turned on to enable GI. For this simple test I’ll leave the rest of the settings at their default values, but you should feel free to experiment. For instance, the Primary Bounces Multiplier can be increased to brighten up a dark scene, which can be useful for some HDR images.

Step 10 Image

Step 11

In order to use an HDRi map for our overall lighting, we have to switch to the VRay tab and tick Override Environment. If we were to do a test render now, the scene would be a light blue color instead of pitch black. That blue color is coming from the GI texture swatch as shown in the image below. This is where we’re going to need to add in our HDRI.

Step 11 Image

Step 12

Before we can do that however, we have to create a material for our HDRi map. So head back into the Hypershade (Window > Rendering Editors > Hypershade) and click the Textures tab as shown at 1 in the below image. We need to create a File texture to load in our HDRI, but it might not be easy to find in the list of available materials/textures. To speed up this process, type File into the search bar shown at 2 in the below image. This will quickly allow you to find a specific texture node. Once done, click once on the File node shown at 3 – it should appear in the right hand side of the Hypershade.

If you have stuff in your “Work Area”, click the eraser icon to clear it.

Step 12 Image

Step 13

Click once on the new File node to select it and hit CTRL+A to bring back the Attribute Editor. Once there, click on the folder icon next to Image Name and navigate to/select your HDRI map. It might take a while to load depending on the speed of your computer and size of the map.

Step 13 Image

Step 14

Now open both the Render Settings window and the Hypershade window side-by-side. Just like when we applied the materials to our objects, we need to hover over the HDRI File node in the Hypershade, hold down the middle mouse button, move the mouse over to the black swatch next to Background Texture and then release. Maya will automatically add the File texture into this slot for us. We now need to repeat this process for the GI texture, Reflection texture and Refraction texture slots.

Note: Ideally you should use a low-res, slightly blurred version of your HDRI in the GI Texture slot, as it provides much smoother lighting throughout the scene. The 3 other slots should all use the high-res version.

Step 14 Image

Step 15

You may notice that you can now see your image in the main viewport. If it looks as expected feel free to skip this step, however if your HDRi map is rotated sideways you may need to do the following…

Go back to the Render Settings, and in the Environment tab click where it says Edit UV Placement. As all of our maps are using the same file, altering one UV Placement affects all of the maps, however if you’re using multiple maps you would need to repeat this fix for each one of them.

In the Attribute Editor, change the Vertical rotation from 0 to 90, which will rotate our image map 90 degrees, hopefully lining it up straight! If it’s still not straight, feel free to change the number until it looks correct.

Step 15 Image

Step 16

Our materials and HDRI are now all in place so it’s time to render! From the top menu, go to Render > Render Current Frame.

Step 16 Image

Step 17

Once completed, your render should look something like this. Now go and experiment with different HDRIs to see the wide range of results you can achieve! If you have any questions feel free to leave them below. Thanks!

Step 17 Image

Don’t miss more CG tutorials and guides, published daily – subscribe to Cgtuts+ by RSS.

Introducing the Tuts+ Marketplace – Making Premium Accessible to Everyone

We’ve just launched the Tuts+ Marketplace, where Premium quality tutorials – both from our Tuts+ Premium program and from unaffiliated authors – are available to purchase individually. Our Tuts+ Premium program will still stay exactly the same – you’ll get all the same things, for the same price. But now, non-members will be able to purchase selected Premium tutorials on a one-off basis, without a Premium membership.



Hey! Look for this link!

So far we’ve added nearly half our Premium tutorials to the Tuts+ Marketplace, and will be adding more over time. To find out if a Premium tutorial is available for sale on the Tuts+ Marketplace, look for this link:

Item Link

Q + A More Information

Here are answers to some of your likely questions about the Tuts+ Marketplace. Please read through these, and if you have any more questions they may be answered in the special edition podcast Introducing the Tuts+ Marketplace (with me and Sean Hodge as a special guests :) hehe). If not, leave a comment!


QWhat does this mean for Premium members?

That it’s a lot easier to see the value you’re getting as part of Premium. With files on the marketplace priced between $3 and $7, your Premium subscription gives you access to thousands of dollars worth of files for $9 a month. Premium will still work exactly the same and cost the same – so you’ve got nothing to worry about! The marketplace is more for people who aren’t Premium members, and for those who want access to user-submitted tutorials that aren’t available as part of Premium – or anywhere else.


QWhat will be sold on the Tuts+ Marketplace?

We’ve seeded the site with our Tuts+ Premium tutorials, but anyone can submit a tutorial for sale on the Tuts+ Marketplace. If it’s ‘Premium’ quality, it will be accepted. Eventually, the marketplace will be filled with tutorials you can’t find anywhere else.


QWho benefits from the Tuts+ Marketplace?

If you only have time to go through 1 or 2 Premium tutorials a month, or only want to pay for the Premium tutorials you need, the Tuts+ Marketplace is perfect for you. You can purchase tutorials on a one off basis, and files are priced between $3 – $7.

As the marketplace grows, authors will come in from elsewhere to sell their tutorials. There will be high-quality tutorials on the Tuts+ Marketplace that you can’t get anywhere else, so if you love learning from great tutorials, you should keep tabs on the Tuts+ Marketplace.

If you go through lots of Premium tutorials, the Tuts+ Premium subscription is better value for you. The option that’s right for you will depend on your needs.


QWhat categories does the marketplace cover?

We currently host the following categories, and will be expanding our selection over time:



Forums Have your say!

Because the Tuts+ Marketplace is built on our Envato Marketplaces app, we have dedicated Forums. Head on over, sign up for the marketplaces, and tell us what you think of the Tuts+ Marketplace.

Presenting a Brand Using 3Ds Max – Day 2

When designing an identity and brand materials for a client, good presentation is crucial! In the second and final part of his 3Ds Max tutorial, Hussain Almossawi takes us through how to light, apply materials to and render the models we previously created in Day 1, before completing post-production within Photoshop. So let’s get started!


This tutorial is Day 2 in a series – Visit Day 1.


Step 1

Welcome back to the second part of the tutorial. In this part we’ll cover adding materials, setting up the lighting and the rendering, and finally take a look at some post-production work. So open up your file and load the scene from Part 1.


Step 2

Create a Vray Plane and place it anywhere in the scene. (Geometry Menu > VRay > VRayPlane)


Step 3

Create a Vray light with the following parameters, Half-length: 13.5″, Half-width: 20.8″


Step 4

Rotate the light from your top view-port 15 degrees to the left on the z axis.


Step 5

Rotate it 20 degrees to the right on the y axis. Now your light should be slanted sideways and aiming slightly upwards.


Step 6

Set the light color to the following shade of yellow: (240, 242, 215, 45, 28, 242).


Step 7

Apply the following settings to your light:


Step 8

Place the light to the left of your scene, leave some distance so the light can look natural.


Step 9

Select your light and choose the “Mirror” tool. Use the following settings:


Step 10

Place the light to the right of your scene, make sure the spacing is proportional with the light on the left.


Step 11

Change the Intensity of the light on the right to 8.


Step 12

Select the first light on the left, and under Parameters choose “Exclude”. Move the “Calendar” and “Folder” models to the Exclude box.


Step 13

Now our scene has the right amount of lighting, Let’s move on to applying material. Start by opening a new file in Adobe Illustrator


Step 14

To avoid going into much detail into the Illustrator part, basically, we will be creating designs for each of the stationary materials we created, with the same size, in order to fit them into our scene later on. The reason I’m using Illustrator, is that in the professional world, collateral’s and such designs are made in Illustrator which makes it easier for printing purposes. Although, feel free to use any program you like or are used to. We will start by creating our letter head, make a new box, with the following size, width: 8.5″, height: 11″.


Step 15

Apply your design to the letterhead.


Step 16

Copy your letterhead design and open up Photoshop, Create a new Document.


Step 17

Change the resolution to 300.


Step 18

Paste your design into the new document as “Pixels”.


Step 19

Make sure your design fills the document, and press enter.


Step 20

Go to Layer > Flatten Image.


Step 21

Save your file as .TIF format (File > Save As).


Step 22

Now go back to Illustrator, and repeat the steps for the other stationary materials. This is an example of what I have.


Step 23

Let’s go back to 3D Max, and start applying the materials. Let’s start with the Letter Head, Select the Letter Head.


Step 24

Open the Material Editor, and click “Standard”. Set your material as VRayMt.


Step 25

Click the small box next to Diffuse, and double click Bitmap.


Step 26

Choose the file we just saved in Photoshop, Letter Head.tif


Step 27

“Assign Material to Selection”, and “Show Standard Map in Viewport”.


Step 28

Our Material is applied now, but it’s facing the wrong way, set the angle “W” to -90.


Step 29

Repeat steps 14 to 28 to the rest of the stationary materials, making sure everything is facing the right way, you should end up with something like this:


Step 30

Open the Material Editor, Create a new material and call it “Scene”, set the Diffuse Color to 226 (light gray).


Step 31

Apply the material to the VRayPlane.


g”

Step 32

Moving on to the Render Settings, open up the Render Setup, starting with the global switches, use the following settings.


Step 33

VRay Image Sampler, set the Image Sampler type to “Adaptive Subdivision”, and the Antialiasing filter to “Catmull-Rom” to allow a sharp result.


Step 34

Set the following for the Adaptive Subdivision image sampler settings, Min Rate: -1, Max rate: 3, Clr thresh: 0.1, and check Randomize Samples.


Step 35

Set the GI Environment to 4.


Step 36

We will now create a map for our environment, which will allow a smoother outcome when rendering. Open up the Material Editor, and select a new material. Click on the small box next to Diffuse.


Step 37

Select Gradient Ramp.


Step 38

Set the Angle for the W to -90, this will make the gradient vertical.


Step 39

Go to the Gradient Ramp Parameters, double click the middle marker and set the color to 5.


Step 40

Create a new marker right next to it by clicking, and set the color of the new marker to the following (164, 146, 164, 213, 28, 164).


Step 41

Select the marker to the right, the one in the white area, and set the color to (206, 212, 239 162, 35, 239).


Step 42

Select the Gradient Ramp title at the top, and drag into the Map box for Environment in Render Setup. Make it copy as Instance.


Step 43

Moving on to the Color Mapping, choose Exponential as Type, and apply the following settings, Dark Multiplier: 1.2, Bright Multiplier: 2.7, Gamma: 1.0


Step 44

Move on to the Indirect Illumination, and apply the settings as follows:


Step 45

Set your camera/view to however you like best, keep in mind that you might need to have it from somewhat of a upper to lower angle, to avoid showing the horizon line.


Step 46

Render your scene and you should end up with something like this. Save it as “Stationary.jpg”


Step 47

Open the rendered image in Photoshop. Go to Image > Adjustments > Curves.


Step 48

Click in the middle of the curve, and raise it somewhat to the top, use your judgment to make sure the lighting on the scene looks natural.


Step 49

Notice the background isn’t very smooth, duplicate your layer (ctrl+J / cmd+J).


Step 50

Apply Gaussian Blur with a radius of 4 (Filter > Blur > Gaussian Blur).


Step 51

Using the eraser tool, erase the parts that have the stationary materials.


Step 52

Now you’re all set! Save your image at high quality and impress some clients with your work!


This tutorial is Day 2 in a series – Visit Day 1.


Don’t miss more CG tutorials and guides, published daily – subscribe to Cgtuts+ by RSS.

Modelling the Audi R8 in 3Ds Max, Day 2 – Premium Tutorial

On day 2 of this amazing tutorial series, Madhan continues to walk us through how he modelled this photorealistic Audi R8 using 3Ds Max. This second part (6 videos in total including an updated reference image pack) concentrates on completing the overall body work, after which we begin to add in the details. This tutorial series is a must-watch for any artists looking to expand their portfolio and learn the sought-after art of car creation in 3Ds Max! Can’t wait to get started? Login to Premium, become a Premium member, or learn more after the jump!

Step by step car creation

Follow freelance CG artist, Madhan, as he walks us through the modelling workflows he uses to create stunning, photorealistic car models such as the Bugatti Veyron, previously featured on the site, and the Audi R8 shown above. An expert in pushing a programs basic toolset to it’s limit, Madhan_2005′s tutorial is a must-have for any artists interested in either vehicle or product design.

Want to Join Plus?

The Tuts+ network runs a membership service called Premium. For $9 per month, you gain access to exclusive high quality screencast tutorials, downloadable content packs, and freebies at CGtuts+, Psdtuts+, Vectortuts+, Audiotuts+, Nettuts+ and Aetuts+! For less than the price of a movie, you’ll learn from some of the best minds in the business all month long!!. Become a Premium member today!

Don’t miss more CG Premium tutorials and content packs, published weekly – subscribe to Cgtuts+ by RSS.

55 Ways to Relax After Work

Do you ever feel like a zombie after a long day at work? You feel so depleted and tired. You hardly have any energy left at all. The only thing you want to do is eat comfort food, pop open a brewski and watch television until bedtime.

We’ve all been there. Zoning out in front of the TV can be a great way to relax, but more often than not, it just makes you feel even more useless. Sitting immobile on the couch for extended periods of time can reinforce your own sense of helplessness and exhaustion, especially if it becomes your regular evening routine.

Although it can be difficult to rally enough energy after a tough day, sometimes the best thing you can do for yourself is to get off the couch, turn off the TV and find something better to do (sorry to sound so much like your mother, but she was right). If you’re drawing a blank on what else to do with your time, don’t worry. We’ve got a few ways to relax that will help you feel less like a soulless blob and more like a happy, fulfilled human being.

  1. Just go to sleep.
  2. Take a bath, soak in a hot tub or relax in a steam room.
  3. Change into your comfiest clothes.
  4. Listen to soothing music.
  5. Cook one of your favorite recipes for dinner.
  6. Go for a walk in a park or take a short hike.
  7. Kick it up a notch and go for a run instead.
  8. Play a sport with friends like Frisbee golf, soccer or basketball.
  9. Try yoga or do some gentle stretches.
  10. Visit Oprah.com for guided meditation podcasts.
  11. Light scented candles.
  12. Look through old photo albums.
  13. Write in your journal, try art journaling or make a collage.
  14. Trade massages with your partner.
  15. Knit, crochet or sew.
  16. Bake cup cakes or muffins.
  17. Go for a drive in the country.
  18. Play with your kids (if you are a parent).
  19. Escape into a great novel.
  20. Take a bike ride.
  21. Sing karaoke.
  22. Cuddle with your cat or play fetch with your dog.
  23. Relax by the pool with a magazine.
  24. Play tennis, racquetball or squash.
  25. Spend time gardening.
  26. Sit on your front porch and watch the world go by.
  27. Brainstorm your “bucket list.”
  28. De-clutter, clean and make your living space as comfortable as possible.
  29. Start planning a vacation.
  30. Window shop in a new part of town.
  31. Play a musical instrument.
  32. Talk to your family.
  33. Invite a friend over to play video games.
  34. Go dancing.
  35. Play pool or shuffle board.
  36. Swim laps.
  37. Build your own community with a blog.
  38. Take an art class or a pottery class.
  39. Bead a necklace with chunky gemstones.
  40. Get ahead of schedule and make a Christmas gift for someone special.
  41. Pray.
  42. Write a letter or send a card…just because.
  43. Mail a bunch of photos of yourself to your grandparent or an elderly relative so they know what you’ve been up to.
  44. Make a cup of tea or warm up some hot apple cider.
  45. Enjoy some deep cleansing breaths.
  46. Sit quietly by the beach, a lake or a creek.
  47. Savor a meal in a local café or pub.
  48. Make plans for the weekend.
  49. Challenge a friend to a game of foosball or go bowling.
  50. Reconnect with a favorite childhood pastime.
  51. Volunteer.
  52. Call your funniest friend.
  53. Get your adrenaline pumping with a kickboxing or spinning class.
  54. Have a picnic.
  55. Watch the sunset.

5 Links to Boost Your Facebook Marketing Leverage

These days, it seems like everyone from celebrities to small businesses has a Facebook page. If you’re going to market on Facebook, though, it pays to spend the time working out a solid strategy. Otherwise, you’re just wasting your time and shooting status updates into a black hole. Sure, you could always automate your Facebook page, but giving it that personal interaction and paying attention to your users will often give you a higher ROI.

Here are five articles that offer insights into effective Facebook marketing leverage:

10 Musts for Marketing to Women on Facebook

Though this Mashable piece is geared towards companies that want to market specifically to women, many of the tips (like “Keep Your Fans in the Loop” and “Complement, Don’t Complicate”) apply universally.

15 Status Update Ideas for Your Company Page on Facebook

Muse away on summer vacation and not sure what to write on your company’s Facebook page? The blogger behind Ask the Copy Bitch offers several ideas that focus on the consumer, not your company’s sales goals.

How to Target Your Facebook Ad

Not everyone needs to spend money on Facebook ads. But if you or your company is planning on buying ads, this article offers some excellent ideas about targeting according to education, gender, birthday, and more. After all, hyper-targeting is one of the main appeals of Facebook ads.

Are You Using Facebook Ads to Promote Your Business?

Our  sister site, FreelanceSwitch, examines the usefulness (or not) of Facebook ads. Check out the comments for even more insights on this hot topic.

10 Ways to Create a More Engaging Facebook Page

This post offers a solid, albeit basic primer on Facebook pages, including using contests, tagging fans, creating an eye-catching landing page, and more.

Do you or your company use Facebook? What strategies have you found most useful?

Understanding and Applying Polymorphism in PHP




















In object oriented programming, polymorphism is a powerful and fundamental tool. It can be used to create a more organic flow in your application. This tutorial will describe the general concept of polymorphism, and how it can easily be deployed in PHP.


What is Polymorphism?

Polymorphism is a long word for a very simple concept.

Polymorphism describes a pattern in object oriented programming in which classes have different functionality while sharing a common interface.

The beauty of polymorphism is that the code working with the different classes does not need to know which class it is using since they’re all used the same way.

A real world analogy for polymorphism is a button. Everyone knows how to use a button: you simply apply pressure to it. What a button “does,” however, depends on what it is connected to and the context in which it is used — but the result does not affect how it is used. If your boss tells you to press a button, you already have all the information needed to perform the task.

In the programming world, polymorphism is used to make applications more modular and extensible. Instead of messy conditional statements describing different courses of action, you create interchangeable objects that you select based on your needs. That is the basic goal of polymorphism.


Interfaces

An integral part of polymorphism is the common interface. There are two ways to define an interface in PHP: interfaces and abstract classes. Both have their uses, and you can mix and match them as you see fit in your class hierarchy.

Using an Interface

An interface is similar to a class, except that it cannot contain code. It can define method names and arguments, but not the contents of the methods. Any classes implementing an interface must implement all methods defined by the interface. A class can implement multiple interfaces.

An interface is declared using the ‘interface‘ keyword:

interface MyInterface {
    // methods
}

and is attached to a class using the ‘implements‘ keyword:

class MyClass implements MyInterface {
    // methods
}

Methods can be defined in the interface just like in a class, except without the body (the part between the braces):

interface MyInterface {
    public function doThis();
    private function doThat();
    public function setName($name);
}

All methods defined here will need to be included in any implementing classes exactly as described. (Note the code comments below.)

// VALID
class MyClass implements MyInterface {
    protected $name;
    public function doThis() {
        // code that does this
    }
    private function doThat() {
        // code that does that
    }
    public function setName($name) {
        $this->name = $name;
    }
}

// INVALID
class MyClass implements MyInterface {
    // missing doThis()!
    public function doThat() {
        // this should be private!
    }
    public function setName() {
        // missing the name argument!
    }
}

Using an Abstract Class

An abstract class is a mix between an interface and a class. It can define functionality as well as interface (in the form of abstract methods). Classes extending an abstract class must implement all of the abstract methods defined in the abstract class.

An abstract class is declared the same way as classes with the addition of the ‘abstract‘ keyword:

abstract class MyAbstract {
    // methods
}

and is attached to a class using the ‘extends‘ keyword:

class MyClass extends MyAbstract {
    // class methods
}

Regular methods can be defined in an abstract class just like in a regular class, as well as any abstract methods (using the ‘abstract‘ keyword). Abstract methods behave just like methods defined in an interface, and must be implemented exactly as defined by extending classes.

abstract class MyAbstract {
    protected $name;
    public function doThis() {
        // do this
    }
    abstract private function doThat();
    abstract public function setName($name);
}

Step 1: Identify The Problem

Let’s imagine that you have an Article class that is responsible for managing articles on your website. It contains information about an article, including the title, author, date, and category. Here’s what it looks like:

class poly_base_Article {
    public $title;
    public $author;
    public $date;
    public $category;

    public function  __construct($title, $author, $date, $category = 0) {
        $this->title = $title;
        $this->author = $author;
        $this->date = $date;
        $this->category = $category;
    }
}

Note: The example classes in this tutorial use the naming convention of “package_component_Class.” This is a common way to separate classes into virtual namespaces to avoid name collisions.

Now you want to add a method to output the information into different formats, such as XML and JSON. You might be tempted to do something like this:

class poly_base_Article {
    //...
    public function write($type) {
        $ret = '';
        switch($type) {
            case 'XML':
                $ret = '<article>';
                $ret .= '<title>' . $obj->title . '</title>';
                $ret .= '<author>' . $obj->author . '</author>';
                $ret .= '<date>' . $obj->date . '</date>';
                $ret .= '<category>' . $obj->category . '</category>';
                $ret .= '</article>';
                break;
            case 'JSON':
                $array = array('article' => $obj);
                $ret = json_encode($array);
                break;
        }
        return $ret;
    }
}

This is kind of an ugly solution, but it works — for now. Ask yourself what happens in the future, though, when we want to add more formats? You can keep editing the class, adding more and more cases, but now you’re only diluting your class.

One important principle of OOP is that a class should do one thing, and it should do it well.

With this in mind, conditional statements should be a red flag indicating that your class is trying to do too many different things. This is where polymorphism comes in.

In our example, it is clear that there are two tasks presented: managing articles and formatting their data. In this tutorial, we will refactor our formatting code into a new set of classes and discover how easy it is use polymorphism.


Step 2: Define Your Interface

The first thing we should do is define the interface. It is important to think hard about your interface, because any changes to it may require changes to calling code. In our example, we’ll be using a simple interface to define our one method:

interface poly_writer_Writer {
    public function write(poly_base_Article $obj);
}

It’s that simple; we have defined a public write() method that accepts an Article object as an argument. Any classes implementing the Writer interface will be sure to have this method.

Tip: If you want to restrict the type of arguments that can be passed to your functions and methods, you can use type hints, as we’ve done in the write() method; it only accepts objects of type poly_base_Article. Unfortunately, return type hinting is not supported in current versions of PHP, so it is up to you to take care of return values.


Step 3: Create Your Implementation

With your interface defined, it is time to create the classes that actually do stuff. In our example, we have two formats that we want to output. Thus we have two Writer classes: XMLWriter and JSONWriter. It’s up to these to extract the data from the passed Article object and format the information.

Here’s what XMLWriter looks like:

class poly_writer_XMLWriter implements poly_writer_Writer {
    public function write(poly_base_Article $obj) {
        $ret = '<article>';
        $ret .= '<title>' . $obj->title . '</title>';
        $ret .= '<author>' . $obj->author . '</author>';
        $ret .= '<date>' . $obj->date . '</date>';
        $ret .= '<category>' . $obj->category . '</category>';
        $ret .= '</article>';
        return $ret;
    }
}

As you can see from the class declaration, we use the implements keyword to implement our interface. The write() method contains functionality specific to formatting XML.

Now here’s our JSONWriter class:

class poly_writer_JSONWriter implements poly_writer_Writer {
    public function write(poly_base_Article $obj) {
        $array = array('article' => $obj);
        return json_encode($array);
    }
}

All of our code specific to each format is now contained within individual classes. These classes each have the sole responsibility of handling a specific format, and nothing else. No other part of your application needs to care about how these work in order to use it, thanks to our interface.


Step 4: Use Your Implementation

With our new classes defined, it’s time to revisit our Article class. All the code that lived in the original write() method has been factored out into our new set of classes. All our method has to do now is to use the new classes, like this:

class poly_base_Article {
    //...
    public function write(poly_writer_Writer $writer) {
        return $writer->write($this);
    }
}

All this method does now is accept an object of the Writer class (that is any class implementing the Writer interface), call its write() method, passing itself ($this) as the argument, then forward its return value straight to the client code. It no longer needs to worry about the details of formatting data, and it can focus on its main task.

Obtaining A Writer

You may be wondering where you get a Writer object to begin with, since you need to pass one to this method. That’s up to you, and there are many strategies. For example, you might use a factory class to grab request data and create an object:

class poly_base_Factory {
    public static function getWriter() {
        // grab request variable
        $format = $_REQUEST['format'];
        // construct our class name and check its existence
        $class = 'poly_writer_' . $format . 'Writer';
        if(class_exists($class)) {
            // return a new Writer object
            return new $class();
        }
        // otherwise we fail
        throw new Exception('Unsupported format');
    }
}

Like I said, there are many other strategies to use depending on your requirements. In this example, a request variable chooses which format to use. It constructs a class name from the request variable, checks if it exists, then returns a new Writer object. If none exists under that name, an exception is thrown to let client code figure out what to do.


Step 5: Put It All Together

With everything in place, here is how our client code would put it all together:

$article = new poly_base_Article('Polymorphism', 'Steve', time(), 0);

try {
    $writer = poly_base_Factory::getWriter();
}
catch (Exception $e) {
    $writer = new poly_writer_XMLWriter();
}

echo $article->write($writer);

First we created an example Article object to work with. Then we try to get a Writer object from the Factory, falling back to a default (XMLWriter) if an exception is thrown. Finally, we pass the Writer object to our Article’s write() method, printing the result.


Conclusion

In this tutorial, I’ve provided you with an introduction to polymorphism and an explanation of interfaces in PHP. I hope you realize that I’ve only shown you one potential use case for polymorphism. There are many, many more applications. Polymorphism is an elegant way to escape from ugly conditional statements in your OOP code. It follows the principle of keeping your components separate, and is an integral part of many design patterns. If you have any questions, don’t hesitate to ask in the comments!

Theme Tumblr Like a Pro: Upcoming Rockable Book




















I’m pleased to announce the upcoming release of the book I’ve been sporadically referencing on Twitter for the last month or so: “Theme Tumblr Like a Pro.” There’s a reason why Tumblr’s popularity has sky-rocketed in the last few years: it’s amazingly intuitive, and allows you to rapidly build dynamic websites in a matter of hours.

As with my previous book, I’ve included companion screencasts with each chapter. This means that, whether you prefer the written word or screencasts, we have you covered.

Theme Tumblr Like a Pro: Upcoming Rockable Book

What’s in it for you?

Focusing on the fundamentals, this book takes you from front to back. You’ll learn about:

  • The fundamentals: template tags, basic structure
  • Blocks
  • The various post types and variables
  • Build a theme
  • Working with the Tumblr API
  • Passing Tumblr-specific values to your JavaScript
  • Adding enhanced functionality with JavaScript and the API
  • A plethora of miscellaneous recipes
  • Working with custom meta types to create an options panel, which then provides maximum flexibility for the user of the theme
  • And plenty more…
Promo

Save $9 and get a Free Book

The book won’t be out for one more week, however, as always, those who are on the Rockin’ List (takes five seconds to sign up) will receive a voucher for $9 dollars off the cost of the book.

“The Rockin’ List is our irregular mailout about new books and products, discounts and offers and Rockable news. Signing up to the mailing list will get you a free copy of the Rockstar Personal Branding minibook by Skellie.”


I’ll obnoxiously keep everyone posted on when the book officially comes out. Strangely, there simply aren’t many Tumblr resources and screencasts available around the web for those looking to switch over from a framework, like WordPress. Hopefully, this will help! Bye!