Quantcast
Channel: GameDev.net
Viewing all 17825 articles
Browse latest View live

Your Settings

$
0
0
You can access your settings from any page by selecting your name at the top of the screen and then selecting "My Settings".

There are several tabs on the side of the page, which allow you to configure and update different board settings:

Profile Settings

From the Profile Settings area of your UserCP, you can configure various aspects of your profile, including:
  • Profile Picture: This is the photo used to identify you throughout the community.
  • Timezone
  • Allow Comments: If checked, other forum members can leave comments on your profile.
  • Friends
  • Edit your "About Me" information
  • Update your Birthday
  • Add profile information, such as interests
  • Share contact information such as AIM usernames.
Profile Customization
From the Profile Customization tab of your UserCP, if it is enabled with a GDNet+ subscription, you can setup a custom profile background, change the colors of your profile, and perform other ways to customize the look and feel of your profile.

Email & Password
The Email & Password area allows you to update the password or email address associated with your account.

Display Name
The Display Name page allows you to change the name that is shown to members throughout the community. The board administrator limits the number of times you can change your display name, so make changes wisely. NOTE: Changing your display name does not affect your login name, which will remain the username you originally registered with

Signature
The signature page allows you to modify the custom signature that is shown below all of your posts.

Ignore
The "ignore" tab allows you to configure your Ignore settings - you can choose to hide individual member's posts, signatures, chats, status updates, or other aspects of a member that you wish to hide.

Manage Facebook/Twitter
If you have connected your forum profile to Facebook or Twitter, you can manage your connection here, including settings on importing status updates, linking your user photo, and more.

Manage Attachments
This page will display all attachments that you have uploaded to the forum. If you are running close to your global attachment limit, you can delete attachments from this area.

Notification Options
The Notification Options page allows you to configure how you should be notified of certain events, such as a reply to a topic, a private message, or a new topic. You can configure how you would like to receive these notifications as well, such as via the mobile application, email, or inline notifications.

Your Notifications
This tab will display the most recent notifications that you have received.

Topics and Forums

$
0
0
Viewing The Board Index

When visiting the board, you will be presented with a list of categories and forums in those categories. This page is called the Board Index, and it lists all of the forums.

Forums are split into categories. You can choose to hide any category by pressing the "-" button on the right-hand side above the list of forums, and the "+" button to make them visible again. If hidden, such categories, and the forums inside them, will be collapsed and no longer shown to you when visiting the board index.

When viewing the forums, there are icons shown next to them which indicate the status of a forum, and if it has unread posts or not.
Posted Image This indicates that there are posts which you have not read contained inside this forum, or one of it's sub forums.
Posted Image This indicates that all of the posts contained in this forum and it's sub forums have been read.
Posted Image Redirect forum, when you enter this forum you will be redirected elsewhere.

The Topic List

Within each forum there are a list of topics. Just like forums, each topic has an marker to indicate the type of topic it is:
Posted Image A regular topic with unread posts.
Posted Image This is a topic which you have participated in, with no new replies since you last read it.
Posted Image This indicates that you have previously replied in this topic, and there are new replies since you last read or replied to the topic.

Special Types of Topics
Posted Image This icon indicates an "Announcement" - Announcements are not regular topics, because members cannot reply to them. They are simply important news or information which should be read.
Posted Image This icon indicates a hot topic which has many members participating and replying.
Posted Image Topic that has been moved into another forum.
Posted Image This indicates that a topic has been locked, and can no longer be replied to.

To add a new topic, press the "Start new Topic" button. This may not be available for all forums. In forums where you cannot create a topic you will see "You cannot start a new topic" in place of the button.

To enter a any topic at the top of the thread, click on its name. To enter a topic at the newest post since you last visited the forum, click on the topic marker.

Sorting Options
To customize the way topics are displayed, you can use the sorting options found at the top of the forum.
  • Show type - this allows you to only display certain types of topics such as polls or topics that you have posted in.
  • Sort by - this allows you to change the way topics are ordered. By default topics are ordered with the topics that have most recently had replies first, but you can choose to sort by other factors such as the number of replies or alphabetically.
  • Sort direction - this allows you to set which way you want to sort for the setting above. For example if you set "Sort by" to be "Replies", choosing "A-Z" for this setting will show the topics that have no replies first, whereas choosing "Z-A" will show the topics with the most replies first.
  • Time frame - this allows you to limit the topics that are shown to only topics that have been made within a certain amount of time.
There may be more than one page of topics, if this is the case, you will see an option to "Load More Topics" at the bottom of the list of topics. There will also be page numbers to the left of this button. If you choose to Load More Topics the page will dynamically update with an increased listing of forum topics. Leaving the page and returning (via the Back button) will reset the forum listing to only show the number of forum topics per page in your settings. When using the page numbers to display additional topics the page will reload with a new topic listing. Leaving the page and returning (via the Back button) will return you to the last page you viewed.

Viewing Posts

To the side of each post there will be information about the user.

To view a user's profile information at a glance, simply hover your mouse over their username. Their profile card will display, showing you various profile information without having to leave the topic. From their profile card, you can send them a message quickly, without having to leave the topic. If you wish to view their full profile page, simply click on their user name.

Posted Image

On their member card, you can also click on several options to view that user's content.

Below this there are several more buttons: the Posted Image icon adds the user as a friend, Posted Image allows you to read their journal, and Posted Image will take you to their gallery.

Below their username you will see their photo and member rating.

Reputation

If enabled, you will see reputation options in the corner below each post. You may see an icon representing the reputation other members have given for that post, along with icons to give reputation. To give the post a positive reputation, click the Posted Image icon or to give the post a negative reputation, click the Posted Image icon. On some boards, you may see a button to Like content, such as this: Posted Image If you choose to do this, it will show that you "Like" a certain post, and will also add a reputation point to that post. Posted Image You may only be able to give positive or negative reputation, and for some users you may not be able to give reputation at all.

Replying

To add a post to the topic, simply scroll to the bottom of the page, and start typing in the reply box.

To quote another post in your reply, you can either click the Quote button beneath a post, or use the multiquote feature. Multiquote is used when you want to quote more than one post in your reply. Select the Multiquote button underneath the posts you want to quote, and you will notice that the button will change color. At the bottom of the page, you will notice an informational box appear with the total number of posts you have added to multiquote. You can multiquote from different pages in a topic, or even different topics in the forum. When you are ready to post a reply with the posts you have quoted, simply click the "Quote Posts Add Reply" button.

You can also quote using the "Selective Quote" option. Simply highlight the specific text from the post you wish to quote and click the button - the quoted text will be appended into the reply box at the bottom of the page.

Post Options

Next to the reply and multiquote buttons you may also see "Edit" and "Delete" links for your own posts. If so, you can use these buttons to edit or delete your posts. Note that these options may not be available after a certain amount of time.

Sharing Topics

At the bottom of each topic you will see a number of buttons that allow you to email the topic to someone else, share a topic on Twitter, post it to Facebook, print the topic, or download and
save the topic, among other things. Simply press the appropriate button and follow the on-screen instructions.

Polls

Some topic may have polls attached to them. If you can vote in the poll, you will see the questions and the options for voting. Once you have selected your options, press Vote! to add your vote. Once voted, you will see the results and a Posted Image icon besides the options you voted for.

You may be able to change your vote. If so, you will see Delete My Vote. To change your vote, press this and then vote again.

To see the results of the poll without voting, press Show Results. If the poll is a public poll, you can see who voted for which option by pressing the "View" link next to any option.

Notifications

You may want to subscribe to your favorite forums or topics so that when a new topic or reply is added you will be notified.

To subscribe to a topic or forum, go to that area and click the Posted Image Follow button. You will them be prompted with how often you wish to be notified. To the right of this button, it shows how many other people are watching the topic.

There are several types of notification, and you will be asked to choose one of these options:
  • Instantly: You will be notified instantly when a reply is made, via the method specified in your notification preferences.
  • Only When Not Online: This option will send out a notification if a reply has been posted and you're not active on the board.
  • Daily: This option will send out a daily digest of updates.
  • Weekly: This option will send out a weekly digest of updates.
If you wish to automatically subscribe to every topic you reply to, you can configure this from your control panel. Simply select the "Auto follow topics I reply to" option.

You can remove a subscription from your settings, or by going back to the area you are subscribed to and pressing the "Posted Image Stop Watching" button.

Finding your community

$
0
0
The forums are an excellent place to get started with any questions you may have. Our expert base of users can provide answers to your problems very quickly. Just be sure to return the favor when you spot someone struggling with a problem you already know how to solve!

Let’s get started - How would you characterize yourself?

I’m a beginner
I’m the technical type - I like the programming and engineering aspects of game development
I’m the creative type - I am interested in the creative elements of games such as music and art
I’m the business type - I want to know and discuss more of the business production, sales, and legal aspects of game development
I want to socialize, announce projects, or recruit people for my own project

Are you a beginner?
  • For Beginners - Plan on spending some time here before visiting the other forums if you are new to game development.
Are you the technical type?
  • Artiificial Intelligence - All aspects of AI programming and theory
  • DirectX and XNA - Questions and discussion regarding all official technologies under Microsoft's XNA branding (e.g. Direct3D and XNA Game Studio Express) as well as any unofficial and 3rd-party libraries supporting DirectX or XNA (e.g. SlimDX, tools and plugins)
  • Game Programming - This forum covers generic game programming topics not handled by more specific forums
  • Graphics Programming and Theory - All aspects of non-API specific 2D and 3D graphics programming and theory.
  • General Programming - The place for discussing programming issues not related to games.
  • OpenGL - Questions specific to the OpenGL API belong here.
  • Multiplayer and Network Programming - Multiplayer programming and networking in games.
  • Math and Physics - Discussion of math and physics, primarily as they apply to games.
  • Mobile and Console Development - For discussion of game development related to iOS, Android, and other mobile platforms as well as questions specific to the Wii, XBox 360, PS3 or other consoles.
  • API and Tools - For the discussion of APIs such as Unity, CryEngine, SDL, Allegro, FMod, OpenAL, ODE, Ogre, CrystalSpace. Also covered are scripting languages such as Lua, Python, etc., as well as game-specific scripting languages like UnrealScript.
Are you the creative type?
  • Game Design - Game design discussion
  • Visual Arts - From 2D to 3D, all about creating art for games
  • Music and Sound - The artistic side of creating game music and sound effects.
  • Writing for Games - Forum for creative criticism, idea exchange, and instruction in the art of writing for games
Are you the business type?
  • Breaking into the Industry - Talk about breaking into the industry, how and where to find jobs, getting an education in games, and other career-related questions and topics.
  • Business and Law - Discuss business and legal issues related to game development.
  • Production and Management - Discuss all that is involved with producing a game and managing a team
Do you want to socialize, announce projects, or recruit people for your own projects?
  • GDNet Lounge - Chat about anything you feel like, but keep it mature and civil. It does not have to be about game development, but it should be about something; i.e. don't post JUST to post.
  • Your Announcements - Make your web site or game project known to everyone. If you're going to spam our board, this is the place to do it!

Posting

$
0
0
The Post Editor

There are two versions of the post editor: the standard editor and the rich text editor. Which one you use can be configured from the editor using the light switch button in the upper left. With the rich text editor, you'll see how the post will look when it's finally posted, like a live preview.

The toolbar buttons on each editor are very similar, and each button is explained below, from left to right:
  • Posted Image (This is only available in the rich text editor) - This will turn off all formatting tools currently in use.
  • Posted Image (This is only available in the rich text editor) - This will show the HTML source of the post and allow you to enter the post in HTML. Note that we filter posts and some HTML may not be allowed or saved.
  • Other styles - This menu contains all other options which do not have their own toolbar button, such as acronyms or spoilers.
  • Fonts - This menu allows you to set what font your post is displayed in.
  • Sizes - This menu allows you to set what size the text in your post is.
  • Posted Image - This menu allows you to set the color of the text in your post.
  • Posted Image - This will redo the last undone change.
  • Posted Image - This will undo the last change made.
  • Posted Image - This will make the text bold.
  • Posted Image - This will make the text italic .
  • Posted Image - This will make the text underlined.
  • Posted Image - This will make the text striked out.
  • Posted Image - This will make the text subscript.
  • Posted Image - This will make the text superscript.
  • Posted Image - This will start a bullet-point list.
  • Posted Image - This will start a numbered list.
  • Posted Image - This menu will allow you to insert an emoticon into your post.
  • Posted Image - This will insert a link.
  • Posted Image - This will insert an image.
  • Posted Image - This will insert an email address.
  • Posted Image - This will insert a quote.
  • Posted Image - This will insert a codebox.
  • Posted Image - This will allow you to link to media, such as a video or song.
  • Posted Image - This will indent the post. This icon can also be used to create multi-level lists.
  • Posted Image - This will make the text aligned to the left.
  • Posted Image - This will make the text aligned to the right.
  • Posted Image - This will make the text aligned in the center.
Polls

Depending on where in the community you are posting your message at, you may have the option to add a poll that other members can vote in. If so, you will see a "Posted Image Manage Poll" button. Click on this to configure the poll.

You can optionally enter a title for the poll in the "Poll Title" box. You may then also be able to set it as a public poll by checking the "Public Poll?" box. In public polls, all members will be able to see who voted for which option.

You can then add your questions by typing the first question into the Question box. You must then choose if you want this question to be multi-choice (allowing users to select an arbitrary number of answers) or single-choice (users will only be able to select one answer). To make the question multi-choice, check the "Allow users to select multiple answers?" box, otherwise, leave it blank.

Then enter the possible answers for the questions into the boxes below. To add more answers, press the "Posted Image Add Another Choice" button, or to remove an answer, click the Posted Image icon. You can see how many choices you are allowed per question at the bottom of the list of questions.

To add additional questions, press the "Posted Image Add Another Question" button. You can see how many questions you are allowed at the bottom of the list of questions.

To remove a question, press the "Posted Image Remove Question" button, or to cancel adding a poll, press the "Posted Image Close Poll Form" button.

Post Options

Depending on where in the community you are posting your message at, you may have additional options including whether or not to add your signature, what post icon to use, and more. To see and configure these options, press the "Posted Image Click to configure post options" link if it is available.

Attachments

Depending on where in the community you are posting your message at, you may be able to upload attachments to your message. There are two types of uploaders available: the default uploader and the flash uploader.

Default Uploader
The default uploader allows you to upload attachments one at a time. To begin, press the button. A box will appear for you to select the file on your computer that you want to attach. Select the file you want to upload.

If you change your mind, you can press the Cancel button and then choose a different file.

Once you have selected the file you want, press Attach the file.
If there are any errors uploading the file, you will receive an error message, otherwise, you will see the attachment appear.

Flash Uploader
You can enable the flash uploader from your settings menu. When enabled, you will be able to easily upload more than one file at a time.

To start, press Click to Attach Files. A box will appear for you to select the file or files on your computer that you want to attach. Select the file or files you want to upload. You can select more than one file at a time by holding Ctrl (on Windows) or Command (on Mac) and click on the files.

Once you have selected your files and clicked "Open", they will begin uploading. If there are any errors uploading the files, you will receive an error message, otherwise, you will see the attachments appear.

Managing Attachments
Regardless of which uploader you use, once the files are uploaded you will see them on your screen. By default, all attachments are added to the bottom of your message, however, you can add any attachment to a particular section of your post by pressing the "Add to Post" link.

If you wish to remove an attachment and have it not appear in your post, simply press the "Delete" link.

Personal Messenger

$
0
0
The personal messenger can be used to have private conversations with other members. To access it, select your username while logged in from the top corner of any page, and then press "Messenger".

Managing conversations

Change which conversations you are viewing
By default, all conversations are shown, but you can change the view to only display conversations you started, or conversations that others have started. To change this, select the appropriate option from the dropdown underneath the conversation list and then press Update.

Deleting conversations
To delete a whole conversation, select the checkbox beside the conversation, then select "Delete" from the dropdown at the bottom and then press Go.

If you started the conversation, this will remove the conversation from your list, and lock it for everyone else - nobody else will be able to make replies to the conversation, but they will still be able to read it until they also delete it.

If you did not start the conversation, this will remove the conversation from your list and remove you from the conversation - you will not be able to make any more replies, but others will still be able to continue the conversation without you, and see your previous replies.

Managing notifications
You will see a Posted Image icon for conversations that you will be notified of updates to, and Posted Image for conversations that you will not receive notifications for.

To turn on or off notifications for any conversation, select the checkbox beside the conversation, then select the appropriate option from the dropdown at the bottom and then press Go.

Managing messages

To edit or delete one of your messages in a conversation, press the "Posted Image Edit" or "Posted Image Delete" button underneath the post. The changes will be reflected to all participants in the conversation.

Starting a new conversation

To start a new conversation, start by pressing the "Posted Image Compose New" button. Enter the user's name into the "Recipient's Name" field. As you type, suggestions will appear below the box. When you see the member you are looking for, click on their name.

You may also be able to add other recipients into the "Other Recipients" box. If so, the next option allows you to specify how the messages will be sent to alternate recipients: "Invitation" allows all invited members to participate in a single conversation, while "Copy" will send a separate conversation to each member.

You should then type a message subject and the message body, just like you would for a new topic in the forums.

When you are done, you can press Send Message or Save (Send Later) to save the message for later.

Replying to a conversation

To reply to any conversation, press the "Posted Image Add Reply" button when viewing it or press the "Posted Image Reply" button underneath any existing message to quote it. Then type your message just like you would a post and press Send Message. You can also use the Fast Reply box at the bottom of each conversation to quickly reply to the conversation.

Adding participants to a conversation

You may be able to add more participants to a conversation. If so, you will see an "Posted Image Add" button on the left-side when viewing a conversation.
Click this button and a box will appear for you to enter member names into. To add more than one member, separate their names with commas. When you are done, press Add.

Reporting a message

If you wish to report to a moderator a message that someone has sent to you, you can press the "Posted Image Report" button underneath the message.

Type in your report and then press Submit Report. This will send a copy of the message to the moderators - only the specific message you report will be displayed to the moderating team, however some moderators may be able to add themselves to the conversation you have reported.

Managing your messenger folders

By default there are three folders for messages:
  • New, which stores all unread conversations.
  • My Conversations, which contains all conversations you are participating in.
  • Drafts, which stores unsent messages saved for later.
You can also add your own folders to make it easier to manage your messages.

Adding a new folder
To add a new folder, press the "Posted Image Add" button beneath the list of folders.
Type the name of the folder you want to add, then press the "+" button.

Moving messages
To move a message from one folder to another, select the checkbox beside the conversation, then select the name of the folder you want to move the conversation to from the dropdown at the bottom and then press Go.

Renaming, Deleting or Emptying a folder
To rename, empty or delete a folder, press the "Posted Image Edit" button beneath the list of folders.

To rename a folder, type the new name in the textbox currently containing the folder name, and then press the ">" button. You cannot rename default folders.

To empty a folder, press the Posted Image icon beside the folder name.

To delete a folder, press the Posted Image icon beside the folder name. Be careful as this will also empty the folder. You cannot delete default folders.

Members

$
0
0
Profiles

You can access a member's profile by clicking their name anywhere in the community. From here you can see content the member has added, information about the member and contact the member.

User Information
To the side, you will see the user's profile picture if they have one. Below this you will see options to add the user as a friend, send the user a personal message and view content from the user. Underneath this, you will see the user's total reputation, taking into account all positive and negative reputation given for all posts. Underneath this, you will see the user's statistics, including what group they are in, how long they have been a member and other basic details.

Status
The user's status displays in the profile upon clicking the Profile Feed tab. You can leave a profile comment here too and reply to their status or previous comments.

To update your own status, open the user menu on the top right available on every page and you'll have an input box to enter one.

Content
In the middle of the profile, you can see what a user has specified in their "About Me" page. You can use the tabs above this to view content the user has contributed to the community. This section will, however, only show recent content - to view all content, use the appropriate links from the user information section of the profile.

Personal and Contact Information
Below the content box, you will see the member's personal information such as age and birthday. You may also be able to send the user an email if they have allowed it.

Friends
Below the personal and contact information, you will see the user's friends. You can click on any of the usernames here to go view their profiles.

Rating
You can rate the user by selecting one of the stars at the top of their profile. If you can rate a user, the stars will change color as you move your mouse over them. If you cannot rate the user, you will not be able to select the stars. You cannot rate yourself. You may be able to change a rating you've given. To do this, just click on a different star and your vote will be updated.

Autodesk Media Summit 2012

$
0
0
It's springtime and the development teams at Autodesk have been busily working on the new releases of their software. To spread the good news, Autodesk's marketing team invited press personnel from all over the world to get a firsthand look at their efforts. The event was billed as the Autodesk Media Summit and covered a wide range of products as well as their corporate vision. We also had a chance to mingle with the product managers as they showed off their new updates and pick their brains concerning all the juicy parts of these releases.

The first half of the day started with presentations by the corporate brass, which announced Autodesk's recent successes and gave some insight into their future goals. The day concluded in break-out sessions with the various product managers. The second day included case study presentations by several of Autodesk's key customers.

Words from the CEO

The opening presentation was made by Carl Bass, the president and CEO of Autodesk. He spoke of the strength of Autodesk in this troubled economy. Over the past year, Autodesk exceeded their aggressive goal of 10 percent growth by growing an impressive 14 percent. He also stated that over 75 percent of Autodesk's business is done outside the U.S.

Attached Image: Carl Ross.jpg

Figure 1: Carl Bass, President and CEO of Autodesk, delivered the opening address, image courtesy of Autodesk


Mr. Bass reflected on a presentation made two years ago where he noted that the entire computer landscape was changing. The platform was moving from desktop workstations to a mobile, social and cloud-based computing. Just as the shift between mainframes and workstations shook up the way we do business, this change has the potential to be even more disruptive. Mr. Bass stated, "We're moving to a world where the computing center of the world is where you are."

He then showed with some pride how Autodesk has answered the call to support these new mobile, social and cloud-based platforms. He mentioned how in years past, engineers were PC-centric and would always say that they would email the files once they get back in the office, but now they can call up their applications on their mobile device and email it immediately to the client. AutoCAD WS is a good example of this. "AutoCAD WS launched less than 2 years ago. Now over 7 million users are accessing it. 300,000 files are uploaded to AutoCAD WS a week, that's 1,800 per hour, 30 files every minute," said Carl Bass. This is proof that mobile devices are being used extensively by Autodesk users.

Another popular application on mobile devices is Sketchbook, which has been downloaded over 10 million times with 150,000 new downloads happening per week. This technology is allowing artists to be more creative than ever. When seeing the quality of art produced on these mobile devices, a viewer commented in amazement, "I can't believe someone drew this on their phone."

The Force Effect software is yet another example. It enables advanced kinematics simulations on an iPad causing one university professor to complain how his students cheated on their homework by using this advanced new software instead of doing it the old fashioned way of pencil and paper.

On the social front, several Autodesk sponsored web sites provide places for communities of users to interact. The recently acquired Instructables.com site has 13 million visitors a month and the PIXLR service, which offers online photo editing has had over 21 million visitors.

The Future is Cloudy

To talk more on Autodesk's cloud initiatives, Ahmar Hanspal, Senior Vice President, Information Modeling & Platform Products Group, presented next. He mentioned that the days of the stand-alone applications is over. The current set of Autodesk products are designed to work together and the products are designed to be cloud-centric. "The cloud is a platform that allows us to get design and creation technology into the hands of anyone anywhere,” he said. The cloud works to Find, Connect and Crunch relevant data. It will enable users to get access to their own work from anywhere and projects that used to take hours or days on the desktop will take only minutes in the cloud. This enables designers to explore hundreds of design options instead of just a handful.

Autodesk is seeing users hungry to access and use these cloud-technologies. With currently only support for AutoCAD and Revit, they are seeing a 22 percent growth in cloud usage each month. The current version of AutoCAD has a cloud rendering option. This option lets users send their project up to the cloud for rendering. Autodesk has seen over 100,000 rendering jobs submitted to the cloud over the 6 months period that the service has been available. One cited example produced a quality, photo-realistic rendering in the fraction of the time for a nominal fee and enabled the user to have access to the an amazingly powerful set of rendering servers available when needed. This puts the power available previously only to a select few companies in the hands of everyone.

Although the presentation discussed the importance of cloud and mobile-based platforms, no definite plans concerning adding cloud and/or mobile options to 3d Max, Maya or the other media and entertainment products were mentioned. However, Autodesk is seeing the benefit and in the future we can certainly expect to have an unlimited render farm at our disposal via the cloud.

Research Updates

Throughout the rest of the day, several more presentations focused on the on-going research efforts happening at Autodesk. Marc Petit, Senior Vice President, Media & Entertainment, showed a prototype character generation tool that will be released on Autodesk 360, which includes a store of applications that users can access.

Scott Reese, Senior Director, Digital Simulation, mentioned the need for real-world simulation tools to be used to counter product failures. He cited the example of the XBOX 360. New units frequently failed with the notorious "red ring of death" caused by the system overheating. Microsoft responded to this problem by extending the warrantee from 1 year to 3 years at a cost that exceeded one billion dollars. Proper thermal analysis of the product could have prevented this.

Autodesk is planning on rolling out a pay-as-you-go service for all its simulation tools on Autodesk 360 making the entire suite available to all its customers without the expense of the full package. This will give all Autodesk customers access to infinite computational power in the cloud for running simulations without the hardware constraints.

Brian Mathews, Vice President, Reality Capture, showed the 123D Catch project that creates 3d models from a series of pictures. This technology was also outfitted on an autonomous drone that flew over a castle and scanned it from an aerial view. He also showed a chip that has been developed that can wirelessly transmit data such as light, temperature and stress. These chips can be placed in concrete to provide information on the stresses and forces acting on the building.

Attached Image: Auto drone.JPG

Figure 2: This autonomous drone flys above buildings and scans them to create a 3d models. Image courtesy of Autodesk


Updated Tools

The rest of the day was spent with the various product managers who made presentations on the updated software releases for the Media and Entertainment products. All of the suite products are being updated and they also announced a new suite called the Autodesk Ultimate Suite that includes both 3ds Max and Maya along with the other key products. Previously, the suites were available with only 3ds Max or Maya, but the Ultimate Suite includes them both. All suites will now also include a copy of Sketchbook Designer 2013 for creating concept art using both paint and vector toolsets.

Attached Image: entertainment_creation_suite_ultimate_2013_boxshot_ppt_webready.jpg

Figure 3: Autodesk's new Ultimate Suite includes both 3ds Max 2013 and Maya 2013, image courtesy of Autodesk


Maya 2013 includes many new features including a new skinning workflow that more effectively applies the skin weights based on the underlying skeleton. There is also a new Maya to MotionBuilder live link that can be used to stream data between open sessions of both packages enabling users to see the animation results as edits are made. The new nHair lets the hair strands interact with particles in the scene.

The 2013 version of 3ds Max includes the ability to use Maya hotkeys for navigating viewports making it easier for artists that have experience in Maya to move to 3ds Max without having to learn new keyboard shortcuts. HumanIK technology has also be added to the Character Animation Toolkit (CAT) features in 3ds Max, which allows CAT characters to work seamlessly in Maya and MotionBuilder. There is also a new Retiming tool for reworking animations without having to redo them and a plug-in to Adobe After Effects that keeps the two packages in sync.

Welcome to Gameware

I spent a lot of time speaking with Greg Castle, who is the Product Manager over the new Gameware brand. Autodesk has been aggressively acquiring different game middleware companies and now has branded all these technologies together as the Gameware brand. The Gameware solutions include broad game engine support including Big World, Hero, CryEngine 3, Havok, Unity S, UDK and Phyre Engine.

The latest acquisition is GRIP Entertainment, makers of AI software. Their two products are Cognition and Population. Cognition is a visual programming tool for organizing, duplicating and assigning behaviors to NPC. Population is used to create character crowds.

Mr. Castle begin his presentation by noting some the trends in the video game industry. The first and most alarming trend is the rising complexity of video games development. Game studios are being asked to make game assets with more complexity using the same budgets and timelines. A key result of this pressure is that many studios are becoming risk averse. Their solutions are often to outsource production and streamline their workflow, but Autodesk is the solution. Using the Autodesk DEC tools, you can remove barriers and decrease the cost of production. FBX provides a workflow that runs from art to the game engine.

Autodesk also recently announced that some of the Gameware products have been licensed by Nintendo and will be included in the Software Development Kit for developers working on Wii U titles. The included tools include Scaleform for creating interfaces, Kynapse for adding artificial intelligence, and HumanIK for interactive character animation. These tools will provide a huge benefit for developers giving them an off-the-shelf solution for many framework structures.

We also got to see a presentation of the new Scaleform 4.1 features. The new version includes a mobile-ready player making it easier than ever to create, not only interfaces, but entire games. There is also a new front-end client that lets you preview changes before exporting and a new Analyzer for Memory and Performance (AMP) tool for optimizing the interface. Scaleform 4.1 now supports the Unity 3 engine and the Microsoft Windows 8 Metro platform.

Mr. Castle also showed off the mobile game called TwinSpin, created by GlobZ, that was ported to the iOS entirely using Scaleform. It was Scaleform's ability to optimize the data that kept the 72-level game at about 10 MB, well under the 20 MB limit.

Autodesk Kynapse has also been updated with a new pathfinding mode that lets the characters update their path as the environment changes around them. There are also some new path smoothing algorithms and a smaller memory footprint for AI characters, which lets you have more NPCs running around the level.

Beast has also been updated with an interactive light editing mode. HumanIK improvements include a new shoulder solver and new parameters to define spine curvature that improves spine movement. The HumanIKk plug-in to MotionBuilder has also been improved.

To show off the efficiency and power of the Gameware suite of tools, Autodesk challenged an internal game development team of 10 people to create a triple AAA title using these tools. The team was able to complete the entire game in only 3 months. The game is called Hyperspace Madness and you can find information on how the game was created on the Autodesk web site.

Case Studies

During the second day of the summit, several Autodesk users presented case studies of their recent work. David Frost, Chief Technology Officer for Industrial Light and Magic, spoke about how they use Autodesk tools coupled with their own proprietary tools to create effects for movies and games.

He also mentioned that with offices in San Francisco and Singapore, they can efficiently use their render farm by submitting render jobs around the clock. Another highlight was the new technology that allows a director to track a virtual scene in a motion capture studio enabling the director to visualize camera angles and setup shots. This technique was used to create Rango, which recently won an Oscar for Best Animated Feature Film.

Attached Image: David Frost.JPG

Figure 4: David Frost of Industrial Light and Magic, discussed how Autodesk tools are used to create blockbuster games and movies. Image courtesy of Autodesk


Bart Ney of the CALTRANS group showed how they used to Autodesk products to create a visualization of the freeway cut-over done on the Bay Bridge in San Francisco. The visualization animation helped motorists to see how the process was being completed in a timely manner without having to close down the essential roadway for an extended period of time.

Finally, an architectural team based in Brazil showed their development of an eco-friendly soccer stadium built for the World Cup 2014.

Conclusion

The good news from this event is that Autodesk as a company is doing fine and will be around despite the tough economic conditions. This is great for companies that use their products because it insures that the products will continue to evolve and improve.

The other good news is that Autodesk is focusing a lot of energy in understanding, acquiring and building tools that game companies need to be more efficient. It is this efficiency that will enable game development teams to stay profitable and ahead of the increasing complex games that are in demand.

For more information about Autodesk and the new products for 2013, check out the corporate web site at www.autodesk.com. You can also find Gameware specific information at gameware.autodesk.com.

Developer Journals

$
0
0
The developer journals section of the community can be used to read other members' journals , and to create a journal yourself. To access it, click the "Developer Journals" link in the "Community" menu

Journals Home Page

When you first go into the journals, you will see a list of journals. Important journals and your favorite journals will be shown at the top, followed by all other journals. You may also see featured journal entries at the top of the list.

Journals may be local journals, meaning that they are stored within the community, or they may be external journals, which are links to journals hosted elsewhere on the internet.

Journal List
For local journals, you will see the title of the most recent entry along with a short excerpt from it, and details of the journal such as the title of the journal, to whom it belongs and the total number of comments, entries and views the journal has had. For external journals, you will just see the title of the journal, to whom it belongs and the total number of views. To view any journal, you can click on the title of the journal. For hosted journals, you may also click on the title of the most recent entry.

Changing the View
There are two ways the journal can be displayed. You can change the display using the icons at the top of the journal list:
Posted Image - The default layout, showing journals in a list view.
Posted Image - A table view, which is similar to how topics are shown on the forums.

Following a journal
You are able to follow a journal and subscribe to be notified of updates to it by clicking on the follow journal button.

Statistics
Below the journal list, you can see statistics of the journals, such as who is currently reading the journals, the total number of journals, the newest journal , etc.

There are also links to see the top 10 viewed journals, top 10 commented journals, and 10 journals with the most entries.

Viewing Journals

This only applies to local journals. For external journals, you will be taken to the journal when clicking on the journal name.

Entry List
In the center of the journal page, you will see a list of recent entries. You will see the title of the entry, who posted it and when, the entry itself and how many comments and trackbacks it has had.

You can click the entry title to see the full entry, along with trackbacks and comments, or press "comments" or "trackbacks" to be taken straight to those areas.

Content Blocks
In the left or right columns of the journal, you will see blocks containing various content. Which blocks are shown and their positions will vary based on the journal owner's configuration. The most common content blocks are:
  • Mini Calendar - This will show a small calendar, highlighting days for which entries are available.
  • Last entries - This will show a list of the most recent entries to the journal. You can click on any entry title to be taken to it.
  • My journal Links - This contains useful links, including:
    • Track this journal - Clicking this link will add the journal to your tracked journals which you can view and manage in your settings panel.
    • Add journal to favorites - Clicking this link will add the journal to your list of favorite journals
    • Syndicate my journal (RSS) - Clicking this link will take you to an RSS feed of the journal which you can subscribe to using an RSS program.
    • Archive - Clicking this link will take you to an archive of all entries to the journal.
  • Last Comments - This will show who most recently commented on the journal and which entry was commented on. You can click on the entry title to be taken to it.
  • My Picture - This will show the profile picture of the journal owner.
  • Active Users - This shows how many and which users are viewing the journal.
  • Categories - This shows the different journal entry categories. You can click on any category to see a list of entries in that category.
  • Search My journal - You can use this to search all entries in the journal. Simply enter your keywords into the box and press "Go".
Sharing
You can share journal stories with sites such as Twitter or Facebook, or share them via Email, by using the "Share" buttons found below each entry.

To email an entry to a friend, press the Posted Image icon then follow the on-screen instructions.

Trackbacks
When viewing an entry you may see any trackbacks stored for the entry, if the journal has trackbacks enabled. You can access the trackback URL by pressing the "Trackback URL" link.

Comments
At the bottom of an entry's page, you will see any existing comments on the entry. Below the comments will be a textbox you can use to leave your own comment.

Creating and Managing Your journal

Creating a journal
You are able to create your own journal within the community. To do so, visit the "journals" tab in your settings panel. Under "Your journal Settings" you will see your current journal if you have one. If you can create a journal, you will also see a section titled "Create a journal" - you must read and accept the terms by checking the box, and pressing Next >.

You can then give your journal a name and description and choose if it will be a local or external journal. When you are ready, press Finish.

You will now be taken back to the "Your journal Settings". Make sure if you are setting up an external journal that you now go into your journal settings and enter your journal URL.

You may be able to create more than one journal, and you may not have all settings mentioned above available to you.

Your journal Settings
From the "Your journal Settings" area of your settings panel, you can click on your journal name to manage its settings, including:
  • Your journal - This is general settings for your journal such as the name, description and whether it is local or external. You may also be able to change the view permissions. "Public" means all members that can see the journals can see your journal, "Private Club" means that only members you allow can see your journal, and "Private" means only you can see your journal. Some of these options may not be available.
  • Your local journal settings - If you have a local journal, you can configure here various settings such as guest access, comments and trackbacks.
  • RSS Settings - You may be able to disable RSS, or enable an alternate RSS service here.
  • Customize the look of your journal - You may be able to change the way your journal is displayed here such as the style it uses, and the number of entries shown per page.
  • Private Club - If your journal is in "Private Club" mode, you can enter who has access to your journal here.
  • Editors - You may be able to assign additional people permission to add entries to your journal. Enter the names of members who should have this permission here.
  • Your external journal settings - If you have an external journal, you can enter the URL to it here.
IMPORTANT: if you have a local journal is it required that all comments be automatically approved. We do not allow journal authors to moderate their comments, those that do so will be warned once and then banned from posting journal updates if the behavior continues

Adding Entries
To add an entry, you can either click "Post new entry" beside your journal from "Your journal Settings", or press the "Posted Image Add Entry" button from your journal.

You will need to enter a title for your entry. You can enter "tags" for your entry, which can be used to separate entries into categories if you frequently talk about multiple subjects.

You may be able to choose the date that the entry is posted on, and if you have more than one journal, you can choose the journal it should be saved to.

You may be able to add a poll to your entry just like you would on the forums.

You should the type your entry like any message. You may be able to add attachments to your entry.

At the very bottom of the page you can choose to submit your entry as a "Draft", meaning it will not be published right away, or, as "Published", which will mean it is immediately available for others to view.

When you are ready, press Post New Entry.

Changing your post time
You can click on the clock link above the Draft and Publish buttons to change the time and date your journal entry will appear. Journals saved as a draft and then published days later will retain the date they were created, not the date they are published so this will have to be updated. You can also use this feature to schedule a journal post to appear at a specific date and time in the future.

Changing Your journal Theme
You may be able to change your journal's theme to a different style by pressing the "Posted Image Change Theme" button from your journal. This will bring up a pop-up displaying the styles you can choose from. Click on a style to change your journal.

You may be able to create your own theme by pressing the "Posted Image Create a custom theme" option. This will bring up a box that will allow you to change the theme of your journal by entering custom CSS code, or using the color picker. Once you have saved your theme, it may have to be approved by an administrator before it becomes active.

Content Blocks
You can add content blocks by pressing the "Posted Image Add Blocks" button from your journal.

The functions of the default blocks are explained earlier in this help file, or you may be able to add your own blocks by pressing the "Posted Image Add Custom Content Block" option. There may be additional content block options available.

You can move your content blocks by clicking and holding on the title bar and then moving them to the new location, which can be in the left or right columns.

To remove a content block, press the Posted Image icon.

Searching

$
0
0
The search feature can be used to search all areas of the community quickly based on keywords you enter.

Quick Search

You can start a quick search by typing your keywords into the quick-search bar at the top of any page and pressing the "Search" button.

You can change the focus of your search by clicking on the gray highlighted text just left of the search button. By default this is set to "Google" which will efficiently search the entire site for the best matches to your search term. You can however focus your search on a specific section of the website if you wish.

Advanced Options

If instead of typing your keywords into the quick-search bar, you click the "Advanced" link next to it, you will see some advanced options for searching.

The first option, "Find words" is where you can enter the keywords to search for.

The next option, "Find author" can be used to only find content from a specific user. As you begin typing a username, you should see a dropdown with username suggestions that you can select from.

The next option, "Find by date" allows you to restrict the results to content added between particular dates. To select your date, click the Posted Image button - this will bring up a calendar. From here you can select any date and your option will be filled into the search form.

The next option, "Find in forum allows you to restrict your results to content within particular forums. You can select multiple options by holding the Ctrl key on your keyboard (or the cmd key if you use a Mac) and clicking on your options.

You can leave any of these options blank, however you must supply at least one search criteria when submitting the form. Once you have filled in the options that you require, press the Do Search button.

Inline Search

When you are viewing a particular topic, or a particular forum, you will notice that the search bar changes from "Search Forum" to "Search This Topic" - this allows you to easily and quickly search through the current topic, forum, or application, without getting search results for other areas of the forum.

Results

Once you have submitted your search, a tabbed page of results will appear - you can change the selected tab to choose which area of the community you wish to search. For example, results under the "Forums" tab will bring up any topics and posts that contain your search keywords, while the "Members" tab will bring up any member accounts that match your search criteria.

You can change the order of the results to sort by relevance or to sort by date using the options at the top of the results page.

The keywords that you searched for will be highlighted.

Once you have found the result you are looking for, you can click on it to bring up the page, or, if you are searching through the forums, you can click on the preview icon to preview the search results without having to leave the search page.

Basic Article Publishing Guidelines

$
0
0
If you are interested in writing for GameDev.net, we'd love to hear from you. Our site receives tens of thousands of visitors per day! This is a great way to get exposure for yourself, as well as for any web sites or companies you are associated with. If you are a registered member of GameDev.net, you will receive a special award icon in your profile to let everyone know you are a published author here. Your article will be placed in our Resources archives which is heavily indexed by Google and if the community loves it enough it could be in the spotlight on the main page! So what better way is there to share your experience with other game developers?

Who are you writing for?
The majority of visitors to GameDev.net are looking to gain experience and knowledge from professionals, and to learn new techniques and methods to develop games on all platforms. We strongly support both the beginners and hobbyists looking to take part in the industry and the active professionals looking to improve their craft. When considering an article to submit, keep in mind these various audiences and make sure you choose the one(s) you wish to target before you begin to write. Some broad examples are:

Beginners

These people are just beginning to build an interest in game development and are looking for entry-level guidance on how to get started. They have usually played games, and they might have heard some disconnected fragments about how development works, but they’re generally technically uninformed. Try and make sure that any technical terms you use are sufficiently explained, and don’t try to cram too much information into too small a space.

Intermediates

These are people who have a decent working knowledge of most parts of game development. They’ve made some games, and might be headed towards pulling together something for a shareware release – or they might be junior programmers in the industry. These folks are usually most interested in information that helps to solidify and consolidate their understanding of things, maybe showing them new ways of doing common things or case studies of other projects. They’re also interested in content that introduces them to topics they don’t really know about, without treating them like a complete beginner.

Experts/Specialists

These are people who have a solid grounding in a particular area, are comfortable reading whitepapers and playing with cutting-edge stuff; they’re usually employed in their field or pursue it very actively as a hobby. These are the people you can present your fantastic new shadowing method or impressive approach to team-based AI to. But take care: these are people who know their stuff and will notice if something isn’t quite right, so make sure you’ve checked everything out, and include full references to support your ideas.

Article Formatting and Content Guidelines
When writing an article, there are several things to keep in mind. Generally, short paragraphs work best for the web, and you should try to divide your article into sections preceded by headers. You may include snippets of code within your article. The final article may be in HTML format, Microsoft Word, RTF, or plain text. Formats that are difficult to convert to HTML - such as PDF or PostScript - are not permitted. If you would like to use another format, please contact us in advance to confirm that we can work with your desired format. You may include artwork within your article. For images low in colors, we generally prefer GIF files (for graphs, graphical text, etc). Photograph quality images should be saved in JPEG format, or PNG if you prefer.

Guidelines for Content

You should consider the following guidelines when submitting content:
  • Articles need to be a decent length. Having a concise writing style is one thing, but if you've explored every possible avenue within a topic and it's still only a couple of paragraphs then maybe you should reconsider whether it deserves a full article. If you want to maximize the chance that we'll pick your article to be featured on the front page, you should aim to produce at least three A4 pages of 10pt Arial font, single spaced, not including images or other embedded non-text media.
  • References should be included wherever possible, either as in-line links in the text or as a bibliography at the end. A "further reading" section never hurts.
  • In the vast majority of cases, we don't begin publishing a series of articles until all parts of the series have been completed, submitted, and approved. If you've got an article series in mind, think hard about it; you can write an article that "builds" on a previous one, perhaps under a new title, without it becoming a series. Write your articles in such a way that they don't build an expectation of more to come – that they're self-contained – and we'll be able to treat them as individual articles instead of a series.
  • Ideally, by the time you submit your article you should have researched all the information you needed, but don't be afraid to admit that you don't know something. It's better to do that than to misinform people, especially when someone who does know it calls you out.
  • Compilable code is not necessarily the best way to demonstrate a concept, even when commented. Consider whether pseudocode would be clearer. That said, if you're going to include a downloadable code package to accompany the article, make sure it compiles.
  • Real-world examples are great. If you can talk about something in the context of an existing game, it can really help to ground the concepts for people and help them to see how they fit into the big picture.
How To Submit Content To Us
Got an Idea?

Please submit a proposal email to Executive Producer Drew Sikora that explains the idea for your article in as much detail as possible, an outline of the article/series would be best. Also be sure to include your credentials and background in the gaming industry as well. We will return your email letting you know whether we accept the proposal or not. In the case of rejection we will try to provide feedback to help you re-tailor the article to better fit our audience.

Note that this step is not mandatory, you can certainly go ahead and post your submission straight away.

Already Composed

You can submit completed or rough draft articles by posting them here. Your submitted content will be looked over by one or more of our Editorial Review Board members for final approval. We will contact you by email regarding the status of your article once it has been submitted.

If your article is already online elsewhere, see this help guide to learn how to share it on GameDev.net

Terms and Conditions

By submitting your article to GameDev.net, you are granting to us a permanent, non-exclusive license to use the article in any format we deem appropriate, with the assurance that you will always be given full credit for your work, and that you will retain full ownership of it. If you are planning on submitting your article to other websites, we ask that you inform us of your intent, and that you not allow other sites to post the article until it has appeared on GameDev.net for at least 30 days.

Any source code must be provided with non-viral licenses.

Articles must be published under the author's real name; we permit the use of an initial where some anonymity is desired, e.g. "Drew S."

Questions? Comments? Feedback?
Drop us an email: dsikora@gamedev.net

Contacting the staff

$
0
0
If you need to contact a moderator, or simply wish to view the complete administration team, you can click the link 'The moderating team' found at the bottom of the main board page. This list will show you administrators and moderators.

Note that you can report content to all staff by pressing the "Posted Image Report" button when viewing the content.

Ravenwood Fair Postmortem

$
0
0
Hello from YetiZen!

YetiZen has two arms. We are a key community builder as we run the San Francisco Game Developer's Workshop, the largest regularly meeting game developer group in the world (5000+ game developers last year). We also run the YetiZen Accelerator, the only games focused accelerator in existence.

After hundreds of requests to bring the San Francisco Game Developer's workshop to your city we are happy to partner with GameDev.net. Through this partnership we will be providing video content from our very popular workshops where we bring together the most successful people in games to share how they found success.

For questions and comments please tweet our CEO and founder Sana @SanaOnGames

Here is to leveling up the games industry!

- Sana and Japheth (cofounders of YetiZen)


Ravenwood Fair Postmortem


Reputation System Point Breakdown

$
0
0
Your goal hopefully is the same as our goal: use this special place that we developers have here to help each other as much as possible. This means starting to adopt a mentality that we all do our best to do what is good for the community.

GameDev.net was created over 10 years ago by a rag tag group of people with the idea that it is the COMMUNITY that can lift each other up, help one another, create articles and share information. The reputation system is going to begin to award members points for different actions on the site and especially those that benefit the community at large.

As a member you’ll be able to earn points for basic site participation activities, for posting helpful replies in the forums, policing the community using moderator actions, and ESPECIALLY for authoring tutorials and helpful blog posts.



Points are split into 4 categories:

  • Scholar - Any up/down votes you receive from posts in the technical, business, or creative forums will be added to the scholar category.
  • Moderator - Points given for moderator actions (activities such as submitting moderator reports, voting on content, providing feedback, etc)
  • Author - Points given to authors who write articles, get them peer reviewed, get articles favorited, etc. This is where people can pick up a lot of rep points if they get an article granted with a peer-reviewed status
  • Participation - Points given for everyday site activities - logging in, up/downvoting others, even signing up!

These 4 categories will combine to create your overall reputation number on the site.



Below is a listing of our list of ways to earn reputation. At the moment only those items with an asterisk are active. While this list is by no means final, it should serve as an idea for members as to how reputation can be earned.

Some key terminology:
  • Default Amount - this is how many points a member will earn as a result of this action (note that a negative amount can be applied to rescind an original transaction)
  • Max Per Day - this is the maximum number of times this action can be taken for points, it is NOT the number of points you can earn per day
  • Max Amount - this is the maximum number of times this action can be taken for points over the lifetime of your account
Participation Points
Rewarded for actions taken around the website in general

TitleDefault AmountMax Per DayMax Amount
Sign up for site *10011
Sign up for GDNet+10011
Login *11inf
Opt-in to Newsletter5011
Post an abusive / spammy message
If a post of yours is reported to a moderator and a moderator approves the report, you will suffer a point hit for the offending post *note that this is still under consideration
-20infinf



Moderator Points
Rewarded for actions that involve policing the community or reviewing content

TitleDefault AmountMax Per DayMax Amount
Report Post to Moderator *
Use the "Report" feature of posts and comments to flag inappropriate items for moderator review
5100inf0
Moderator resolves report *10infinf
Moderator rejects report *
Moderators review all submitted reports. A report can either be marked "completed" or deleted altogether. Only blatantly false or spammy reports will be deleted.
-10infinf
Vote and Comment on Article
Vote on an un-reviewed article and offer constructive criticism (requires both a vote AND a comment, can only be done once per article)
5infinf



Scholar Points
Rewarded for actions that work to benefit the knowledge of community members

TitleDefault AmountMax Per DayMax Amount
Legacy Point System Transfer *
Points transferred from the old reputation system
100
Your topic is bookmarked *5infinf
Your post is upvoted/downvoted *
Additional scholar points are added/removed based off of the reputation of the user doing the rating - the higher their rating, the more they contribute
1/-1infinf
Bookmark a topic150inf
Your Reply is Marked as Answer15infinf



Author Points
Rewarded for actions that create content for the community to learn from

TitleDefault AmountMax Per DayMax Amount
Submit a news item
Send in a news item via the front page Submit News button
510inf
Submit an article
Submit a full article for editing
155
Article Content Approved
A content moderator has taken a look at your submitted article and approved it for the community to begin viewing
100infinf
News Content approved
The news item article the user submitted is cleared through the moderation queue
15
Article Granted "Peer Reviewed" Status
The article you submitted was not only approved for initial publication, but is in good enough form to be considered "Peer Reviewed"
50
Create a journal entry101
Your content is voted up/down
Additional points are added/removed based off the reputation of the user doing the rating of the user’s article or journal post
1/-1inf
Your content is commented on125
Write a book review155
Submit an IOTD101
Your IOTD is featured 151

Reputation System Design Rationale

$
0
0
Designing this system


When we came up with the idea behind GameDev.net’s reputation system we decided to take a good hard look at some of the more modern technical resource sites out there and see what they were doing. Now we have been using reputation for years, but a number of sites have expanded well beyond what we were doing.

We focused on three major sites in particular as inspiration for our changes: MSDN Forums, Stackoverflow, and Codeproject. What we liked about the MSDN forums was how they subtly blended a forum-based mode of discussion with a question and answer format. Stackoverflow primarily revolves around a simple question and answer format. Now what you have to understand is that while Stackoverflow is a pure Q&A format and works well.. the pure Q&A format is something we will never switch entirely to because there is benefit in being able to have actual discussions. This is particularly true in situations where there may not be a correct answer to a topic post such as in any art or music-related forum. The bad thing about Stackoverflow Q&A is that it encourages quick answers over continued thoughtful discussion. However, the good thing though is that the end product has more long-term usefulness as an archive.

One of the things sites like Stackoverflow.com have heavily criticized is the cruft inherit in a forum system and how their approach heavily reduces the amount of extraneous “stuff” you see when viewing a particular question (e.g. avatars, member titles, …) We also like the idea of cutting down on non-essential things in topic views while still allowing members to retain their own sense of identity. What we also like about Stackoverflow is the wiki-style ability to revise posts and improve their quality. That’s something that we will be trying to do a lot more of as time goes on with our ability to now store post revisions.

In terms of recognition, we decided to go with a hybrid approach of having members both work to convince others to grant them upvotes as well as giving members the direct ability to gain reputation by participating in the site actively, helping in moderation tasks, and writing tutorials.


How does it work -or- How to be a productive member


We need you to do more than use the community as a resource for your own development. We need you to give back as much as you can by writing up tutorials (even small ones) and sharing your knowledge by answering questions from your fellow members.



Reputation


Reputation is a point value that represents how much the community trusts you and how much you give back to the community. You can accumulate reputation points through answering questions and creating articles/journals. What is cool about reputation is that the more reputation you earn, the more privileges you'll unlock on GameDev.net.

Originally you could only earn reputation by convincing others that you know what you are talking about, but it is far too easy to contribute and not receive proper recognition. We want that to change. Not only are we doing much more to encourage your fellow members to give you recognition for your contributions, but we are putting you in the driver’s seat with a slew of new ways to directly advance your rank within the community.

The new reputation system update is designed to completely turn GameDev.net member participation on it’s head. One of our stated goals for 2012 was to increase member recognition for their contributions and we’re going to change the playing field to put a much bigger spotlight on all those community members who work their butts off to help others.

As a member you’ll be able to earn points for basic site participation activities, for posting helpful replies in the forums, policing the community using moderator actions, and ESPECIALLY for authoring tutorials and helpful blog posts.

Points are split into 4 categories:
  • Scholar - Any up/down votes you receive from posts in the technical, business, or creative forums will be added to the scholar category.
  • Moderator - Points given for moderator actions (activities such as submitting moderator reports, voting on content, providing feedback, etc)
  • Author - Points given to authors who write articles, get them peer reviewed, get articles favorited, etc. This is where people can pick up a lot of rep points if they get an article granted with a peer-reviewed status
  • Participation
These 4 categories will combine to create your overall reputation number on the site.

Gamedev.net has employed some form of reputation/rating system for over 10 years now. Pre-2011 we had a lot of success with a very simple rating system that was modeled after the USCF chess ratings calculations (with some modifications). The idea was that a person with higher rating should be considered more experienced than someone with a lower rating. Granted, it takes time for a person to accumulate rating points but in the end if a person is actively participating on the site they should see a higher rating for themselves. The original system had one member directly rating the helpfulness of another member. What was different between our system and some of the others out there was that how much a member could contribute to another member was not only related to how many points the rating member had, but what the DIFFERENCE between ratings was. Basically, if I have a rating of 2000 I was able to have a more profound impact when I rate someone who has 1000 points versus when I rate someone at 1900 points.

In migrating to a different forums we adopted the reputation system built into that native forum. Under this system members gained reputation largely by up/down voting particular posts. This was actually one of the more frequent suggestions we received on how to tweak the old system to make it better. While the system itself is fine, one of the problems we often see is a failure to recognize those who take the time to help each other.

In one of our staff blogs we had posted our top goals for 2012:

GameDev.net will:
  • Provide an environment that makes it easy for members to publish information on game development
  • Encourage members to communicate and share information with each other and recognize those who take the time to contribute
  • Allow members to easily find information by providing a very focused number of topic areas
  • Allow trustworthy members beyond elected moderators to take ownership of information and participate in the moderation process
  • Allow employers \ team leaders to connect easier with potential employees or contractors
The second point is clear in that we really want to do a better job to recognize contributions of members on our site. And if you want to continue to see expert members contributing their knowledge it’s important that you take the time to recognize them as well.

The Importance of Commenting Your Code

$
0
0
I've been a student at Full Sail University for a while now, and one thing I CONSTANTLY see from students, online forums, and programming related forums, is the lack of comments. I cannot count how many times I hear about people going to the creator of said code saying "why is this working?", "how are you doing this?" Sure, it's always nice to google "how to capture motion in a game" or "how to use FMOD" and have all access to open code sources to allow us to do something that may have taken us hours of API documentation reading or a lot of 'head banging against the wall' time. However, are you always going to be able to do that? Is everything you want to do easily written somewhere on the internet? Probably not. A good programmer doesn't need to lookup how to dynamically allocate an array every time he needs one. He should be able to look it up once and fully understand what is going on in the code and how to do it. a good programmer comments as much as necessary. You want people to understand what you're doing, and why you're doing it. So here are some tips on commenting.

1. Know your audience

Think about who will view your code. Are you on a team? If so, think of the information they need to know to do their part.

// This function pans the camera depending on what the user pressed
// if the user presses A, the camera pans to the left 15 degrees per second, D pans to the right 15 degrees per second

This is for any of the programmers working with the camera. Perhaps making the cinematics.

2. What purpose does your code provide?

Are you doing this code for your personal use? Maybe your making a program involving Direct2D to reference in any future programs involving Direct2D. In that case, you should use comments to explain why you're using a function or factory. Explain the process so thoroughly that you can look at the program years from now, and be able to recite the steps in your sleep. Is the code to teach beginners? Do the same thing. explain it as if the person reading has no idea what DirectX is. Think of a person who knows nothing of your coding language....keep that guy in your head, and comment, comment, comment.

3. No such thing as too much commenting

Too much commenting is non-existent! Remember: someone reading that code may not know ANYTHING about programming. Or maybe they just don't know anything about whatever you're doing. If someone specializes in Object-Oriented C++ and he's switching over to C#, he can skip a LOT of basics (but not all) so he may go straight to the advanced stuff. You're thinking "if someone's looking this far into C# then he definitely knows his C#" well think again. Gurus of one language may be ignorant and skip ahead in another language to save time. There is, however, such thing as too little.

This would be an introduction for C++ to those who just got through the basics in an intermediate lesson:

//instead of using int main(void) use int main(int argc, char ** argv)

Now I don't know about you guys, but if I was a noob in programming, I'd think "wtf are two star thingies doing there!?" A better introduction for replacing the simple main to the more useful main:

// int main(void) is the main function to startup the program you've probably used up until now
// a more optimal version of main would be
//int main(int argc, char ** argv)
// return value: integer (typically 0 indicating success, depends on the program)
// parameters: the integer is the count of arguments(strings) and the second parameter is an array of char pointers (strings)

*Whether you use single line comments or block comments is entirely up to you.*

Was this too much? NO! Was this too little? Perhaps. It largely depends on your audience. You could, for example, further explain the varieties of the return value? You could also explain what exactly arguments are? Maybe explain what this version of main does that the previous version doesn't?


4. Format any way you want

Here are some examples of formatting your comments, using a function I made in a word jumble game

string RandomWordGenerator(hTable &hT_Dict)
/*
FUNCTION BLOCKS -> used to explain a function (I like using these, good for custom functions)	
-----------------------------------------------------------------------------------------------------------------------
Purpose: Finds a random word in the dictionary, scrambles it, and uses it in the game
Return: A string that represents the scrambled word
Parameters: a reference to a Hash Table (the dictionary)
-----------------------------------------------------------------------------------------------------------------------
*/
{
	 STEP MARKS -> used to explain the steps to do a particular task (good for anything that takes a lot of steps to do one thing)

	 //step 1:  create a temporary string to hold the word
		  string temp;

	 // step 2: find a random word in the dictionary and set temp equal to the random word
		temp =  hT_Dict->find(randomblahdyblah);

	 // step 3: scramble the word
		 WordScrambler(&temp);

	 // step 4: return the word
		  return temp;
}

There are many different ways you can use your comments. You can make them look pretty or fancy, you can put them in a boring paragraph, you can put them in step format, you can put them anywhere you want any way you want. Best rule of thumb is to put them up somewhere the user will definitely not skip over by accident.



5. Comment ALL your work

Don't be stubborn! Saying "this stuff is so easy, how could I ever forget this?" is just ignorant. My uncle graduated as a programming major. Twenty-two years later as a computer engineer, he saw a new job opening in his company involving C programming that paid a lot more. Unfortunately, spending the years playing with hardware instead of programming software doesn't keep that stuff in your head. He didn't even remember what a virtual function was. Typically if you learned something, no matter how long it has been, you can refresh your memory much quicker than you can imagine! But to his horror....he didn't comment when he was learning about virtual functions. OOPS! Comment ALL your work! I cannot stress this enough. Don't be stubborn and ignore commenting that lesson about the difference between an integer and a short. You may need it one day.

Finally....

6. Listen to feedback

If someone sends you an email saying "hey, I understand the parameters of your RandomWordGenerator function, but where do you store the string you return? If someone asks you a question, be sure to include something involving that question in your comments. Make your comments so detailed, yet simple, that if your code was viewed by three million people and your email was provided for questions, you would have no unread messages (no, this isn't because nobody loves you, it's because you're comments are flawless).

That's about all I have to say about comment. Please, for your fellow programmers, for your team members, and for yourself, comment your code. I hope you guys do a lot more of it after reading this

The Guide to Implementing 2D Platformers

$
0
0
This article was written by Rodrigo Monteiro and originally published on his own blog at Higher-Order Fun and reprinted on our site (thanks to Rodrigo) in order to provide everyone with this great resource.

Having previously been disappointed by the information available on the topic, this is my attempt at categorizing different ways to implement 2D platform games, list their strengths and weaknesses, and discuss some implementation details.

The long-term goal is to make this an exhaustive and comprehensible guide to the implementation of 2D platform games. If you have any sort of feedback, correction, request, or addition – please leave it in the comments!

Disclaimer: some of the information presented here comes from reverse engineering the behavior of the game, not from its code or programmers. It’s possible that they are not ACTUALLY implemented in this way, and merely behave in an equivalent way. Also note that tile sizes are for the game logic, graphical tiles might be of a different size.


Four Ways of Implementing

I can think of four major ways in which a platform game can be implemented. From simplest to most complicated, they are:

Type #1: Tile-based (pure)

Character movement is limited to tiles, so you can never stand halfway between two tiles. Animations may be used to create the illusion of smooth movement, but as far as the game logic is concerned, the player is always right on top of a specific tile. This is the easiest way to implement a platform game, but it imposes heavy restrictions on the control of character, making it unsuitable for traditional action-based platformers. It is, however, popular with puzzle and “cinematographic” platformers.


Attached Image: Flashback_tiles_2.png

Flashback, shown with tile boundaries

Examples: Prince of Persia, Toki Tori, Lode Runner, Flashback


How it works

The map is a grid of tiles, each one storing information such as whether it’s an obstacle or not, what image to use, what kind of footstep sound to use, and so on. The player and other characters are represented by a set of one or more tiles that move together. In Lode Runner, for example, the player is a single tile. In Toki Tori, the player is 2×2 tiles. In Flashback, which is unusual due to the smaller size of its tiles, the player is two tiles wide and five tiles tall (see image above) when standing, but only three tiles tall when crouching.
In this kind of game, the player will rarely – if ever – be moving diagonally, but, if he is, the movement can be decomposed in two separate steps. Likewise, he will likely only move one tile at once, but multi-tile movement can be done as multiple steps of one tile, if needed (in Flashback, you always move two tiles at once). The algorithm is then as follows:
  • Create a copy of the character where he’d like to move to (e.g., if moving one tile to the right, make a copy where every tile of the character is shifted 1 tile to the right)
  • Check that copy for intersection with the background and other characters.
  • If an intersection is found, the character’s movement is blocked. React accordingly.
  • Otherwise, the path is clear. Move character there, optionally playing an animation so the transition looks smooth.

This kind of movement is very ill-suited for traditional arc-shaped jumps – so games in this genre often have no jump at all (Toki Tori, Lode Runner), or only allow vertical or horizontal jumps (Prince of Persia, Flashback), which are nothing but special cases of linear movement.
Advantages of this system include simplicity and precision. Since the games are more deterministic, glitches are much less likely, and the gameplay experience is more controlled, with less of a need to tweak values depending on circumstances. Implementing certain mechanics (such as grabbing ledges and one-way platforms) becomes a breeze, compared to more complex movement styles – all you have to do is check whether the player tiles and the background tiles are aligned in the one specific way that allows for a given action.

In principle, this system doesn’t allow steps of less than one tile, but that can be mitigated in a few different ways. For example, the tiles can be a bit smaller than the player (say, a player is 2×6 tiles), or you can allow a visual-only movement to take place inside a given tile, without affecting the logic (which is the solution that I believe that “Lode Runner – The Legend Returns” takes).


Type #2: Tile Based (Smooth)

Collision is still determined by a tilemap, but characters can move freely around the world (typically with 1px resolution, aligned to integers, but see the note at the end of article regarding smoothing of movement). This is the most common form of implementing platformers in 8-bit and 16-bit consoles, and remains popular today, as it is still easy to implement and makes level editing simpler than more sophisticated techniques. It also allows for slopes and smooth jump arcs.

If you’re unsure which type of platformer you want to implement, and you want to do an action game, I suggest going for this one. It’s very flexible, relatively easy to implement, and gives you the most control of all four types. It’s no wonder that the majority of the best action platformers of all time are based on this type.


Attached Image: Mega_Man_X_tiles.png

Mega Man X, shown with tile boundaries and player hitbox.

Examples: Super Mario World, Sonic the Hedgehog, Mega Man, Super Metroid, Contra, Metal Slug, and practically every platformer of the 16-bit era


How it works

Map information is stored in the same way as with the pure tile technique, the difference is merely in how the characters interact with the background. The character’s collision hitbox is now an Axis-Aligned Bounding Box (AABB, that is, a rectangle that cannot be rotated), and are typically still an integer multiple of tile size. Common sizes include one tile wide and one (small Mario, morph ball Samus), two (big Mario, Mega Man, crouched Samus) or three (standing Samus) tiles tall. In many cases, the character sprite itself is larger than the logical hitbox, as this makes for a more pleasant visual experience and fairer gameplay (it’s better for the player to avoid getting hit when he should have than for him to get hit when he should not have). In the image above, you can see that the sprite for X is square-ish (in fact, is two tiles wide), but his hitbox is rectangular (one tile wide).

Assuming that there are no slopes and one-way platforms, the algorithm is straightforward:
  • Decompose movement into X and Y axes, step one at a time. If you’re planning on implementing slopes afterwards, step X first, then Y. Otherwise, the order shouldn’t matter much. Then, for each axis:
  • Get the coordinate of the forward-facing edge, e.g. : If walking left, the x coordinate of left of bounding box. If walking right, x coordinate of right side. If up, y coordinate of top, etc.
  • Figure which lines of tiles the bounding box intersects with – this will give you a minimum and maximum tile value on the OPPOSITE axis. For example, if we’re walking left, perhaps the player intersects with horizontal rows 32, 33 and 34 (that is, tiles with y = 32 * TS, y = 33 * TS, and y = 34 * TS, where TS = tile size).
  • Scan along those lines of tiles and towards the direction of movement until you find the closest static obstacle. Then loop through every moving obstacle, and determine which is the closest obstacle that is actually on your path.
  • The total movement of the player along that direction is then the minimum between the distance to closest obstacle, and the amount that you wanted to move in the first place.
  • Move player to the new position. With this new position, step the other coordinate, if still not done.



Slopes

Attached Image: Mega_Man_X_tiles_2.png

Mega Man X, with slope tile annotations

Slopes (the tiles pointed by green arrows on the image above) can be very tricky, because they are obstacles, and yet still allow the character to move into their tile. They also cause movement along the X axis to adjust position on the Y axis. One way to deal with them is to have the tile store the “floor y” of either side. Assuming a coordinate system where (0, 0) is at top-left, then the tile just left of X (first slope tile) is {0, 3} (left, right), then the one he stands on is {4, 7}, then {8, 11}, then {12, 15}. After that, the tiles repeat, with another {0, 3}, etc, and then we have a steeper slope, composed of two tiles: {0, 7} and {8, 15}.


Attached Image: Mega_Man_X_Slope_Tile.png

Detailed View of the {4, 7} tile


The system that I’m going to describe allows arbitrary slopes, though for visual reasons, those two slopes are the most common, and result in a total of 12 tiles (the 6 described previously, and their mirrorings). The collision algorithm changes as follows for horizontal movement:
  • Make sure that you step X position before Y position.
  • During collision detection (4 above), the slope only counts as a collision if its closest edge is the taller (smaller y coordinate) one. This will prevent characters from “popping” through the slope from the opposite side.
  • You might want to forbid slopes to stop “halfway through” (e.g. on a {4, 7} tile). This restriction is adopted by Mega Man X and many other games. If you don’t, you have to deal with the more complicated case of the player attempting to climb from the lower side of the slope tile – one way to deal with this is to pre-process the level, and flag all such offending tiles. Then, on collision detection, also count it as a collision from the lower side if the player’s lowest y coordinate is greater (that is, below) the tile’s offset edge (tile coord * tile size + floor y).
  • A full obstacle tile adjacent to the slope the character is currently on should not be considered for collision if it connects to the slope, that is, if the character (that is, his bottom-center pixel) is on a {0, *} slope, ignore left tile, and, if on a {*, 0} slope, ignore the right tile. You may have to do this for more tiles if your character is wider than two tiles – you might simply skip checking on the entire row if the player is moving towards the upper side of slope. The reason for this is to prevent the character from getting stuck at those tiles (highlighted yellow above) while still climbing the slope, as his foot will still be below the “surface level” by the time he comes into contact with the otherwise solid tile.


And for vertical movement:
  • If you’re letting gravity do its job for downhill movement, make sure that the minimum gravity displacement is compatible with slope and horizontal velocity. For example, on a 4:1 slope (as {4, 7} above), the gravity displacement must be at least 1/4 of the horizontal velocity, rounded up. On a 2:1 slope (such as {0, 7}), at least 1/2. If you don’t ensure this, the player will move horizontally right off the ramp for a while, until gravity catches up and drags him down, making him bounce on the ramp, instead of smoothly descending it.
  • An alternative to using gravity is to compute how many pixels above floor the player was before movement, and how many it is afterwards (using the formula below), and adjust his position so they’re the same.
  • When moving down, instead of considering a slope tile’s top edge as its collision boundary, instead, compute its floor coordinate at the current vertical line, and use that. To do that, find the [0, 1] value which represents the player’s x position on tile (0 = left, 1 = right) and use it to linearly interpolate the floorY values. The code will look something like:
    float t = float(centerX - tileX) / tileSize;
    float floorY = (1-t) * leftFloorY + t * rightFloorY;
  • When moving down, if multiple tiles on the same Y coordinate are obstacle candidates, and the one on the X coordinate of the player’s center is a slope tile, use that one, and ignore the rest – even though the others are technically closer. This ensures proper behaviour around the edges of slopes, with the character actually “sinking” on a completely solid tile because of the adjacent slope.

One-way platforms


Attached Image: Super_Mario_World_One_Way.png


Super Mario World, showing Mario falling through (left) and standing on (right) the same one-way platform


One-way platforms are platforms that you can step on, but you can also jump through them. In other words, they count as an obstacle if you’re already on top of them, but are otherwise traversable. That sentence is the key to understanding their behavior. The algorithm changes as follows:
  • On the x axis, the tile is never an obstacle
  • On the y axis, the tile is only an obstacle if, prior to the movement, the player was entirely above it (that is, bottom-most coordinate of player was at least one pixel above top-most coordinate of one-way platform). To check for this, you will probably want to store the original player position before doing any stepping.


It might be tempting to have it act as an obstacle if the player’s y speed is positive (that is, if the player is falling), but this behavior is wrong: it’s possible for the player to jump so he overlaps the platform, but then falls down again without having his feet reach the platform. In that case, he should still fall through.


Some games allow the player to “jump down” from such platforms. There are a few ways to do this, but they are all relatively simple. You could, for example, disable one-way platforms for a single frame and ensure that y speed is at least one (so he’ll be clear of the initial collision condition on the next frame), or you could check if he’s standing exclusively on one-way platforms, and, if so, manually move the player one pixel to the bottom.


Ladders


Attached Image: Mega_Man_7_Ladder.png

Mega Man 7, with tile boundaries, highlighted ladder tiles, and player ladder hitbox.

Ladders might seem complicated to implement, but they are simply an alternate state – when you’re in a ladder, you ignore most of the standard collision system, and replace it with a new set of rules. Ladders are typically one tile wide.
You can usually enter the ladder state in two ways:
  • Have your character hitbox overlap with the ladder, either on ground or on air, and hit up (some games also allow you to hit down)
  • Have your character stand on top of a “ladder top” tile (which is often a one-way platform tile as well, so you can walk on top of it), and hit down.

This has the effect of immediately snapping the player’s x coordinate to align with the ladder tiles, and, if going down from the top of ladder, move y coordinate so player is now inside the actual ladder. At this point, some games will use a different hitbox for the purposes of determining whether the player is still on the ladder. Mega Man, for example, seems to use a single tile (equivalent to top tile of the original character, highlighted in red in the image above).

There are a few different ways of LEAVING the ladder:
  • Reaching the top of the ladder. This will usually prompt an animation and move the player several pixels up in y, so he’s now standing on top of the ladder.
  • Reaching the bottom of a hanging ladder. This will cause the player to simply fall, although some games won’t let the player leave the ladder in this way.
  • Moving left or right. If there is no obstacle on that side, the player may be allowed to leave that way.
  • Jumping. Some games allow you to release the ladder by doing this.

While on the ladder, the character’s movement changes so, typically, all he can do is move up and down, and sometimes attack.


Stairs

Attached Image: Castlevania_Dracula_X_Stairs.png

Castlevania: Dracula X, with tile boundaries

Stairs are a variation of ladders, seen in few games, but notably in the Castlevania series. The actual implementation is very similar to that of ladders, with a few exceptions:
  • The player moves tile by tile or half-tile by half-tile (as in Dracula X)
  • Each “step” causes the player to be shifted simultaneously on X and Y coordinates, by a preset amount.
  • Initial overlapping detection when going up might look on the tile ahead instead of just the current overlap one.
Other games also have stairs that behave like slopes. In that case, they are simply a visual feature.



Moving Platforms


Attached Image: Super_Mario_World_Moving_Platform.png

Super Mario World

Moving platforms can seem a little tricky, but are actually fairly simple. Unlike normal platforms, they cannot be represented by fixed tiles (for obvious reasons), and instead should be represented by an AABB, that is, a rectangle that cannot be rotated. It is a normal obstacle for all collision purposes, and if you stop here, you’ll have very slippery moving platforms (that is, they work as intended, except that the character does not move along it on his own).


There are a few different ways to implement that. One algorithm is as follows:
  • Before anything on the scene is stepped, determine whether the character is standing on a moving platform. This can be done by checking, for example, whether his center-bottom pixel is just one pixel above the surface of the platform. If it is, store a handle to the platform and its current position inside the character.
  • Step all moving platforms. Make sure that this happens before you step characters.
  • For every character that’s standing on a moving platform, figure the delta-position of the platform, that is, how much it has moved along each axis. Now, shift the character by the same amount.
  • Step the characters as usual.


Other Features


Attached Image: Sonic_2_Loop.jpg

Sonic the Hedgehog 2

Other games have more complicated and exclusive features. Sonic the Hedgehog series is notable for this. Those are beyond the scope of this article (and my knowledge, for that matter!), but might be subject of a future article.



Type #3: Bitmask

Similar to “Tile Based (Smooth)”, but instead of using large tiles, an image is used to determine collision for each pixel. This allows finer detailing, but significantly increases complexity, memory usage, and requires something akin to an image editor to create levels. It also often implies that tiles won’t be used for visuals, and may therefore require large, individual artwork for each level. Due to those issues, this is a relatively uncommon technique, but can produce higher quality results than tile-based approaches. It is also suitable for dynamic environments – such as the destructible scenarios in Worms – as you can “draw” into the bitmask to change the scenario.


Attached Image: Worms_World_Party.png

Worms World Party, featuring destructible terrain

Examples: Worms, Talbot’s Odyssey


How it works

The basic idea is very similar to the tile (smooth) algorithm – you can simply consider each pixel to be a tile, and implement the exact same algorithm, and everything will work, with one major exception – slopes. Since slopes are now implicitly defined by the positioning between nearby tiles, the previous technique doesn’t work, and a much more complex algorithm has to be used in its place. Other things, such as ladders, also become trickier.


Slopes


Attached Image: Talbot_Bitmask_2.png

Talbot’s Odyssey, with the collision bitmask overlaid on top of the game.

Slopes are the primary reason why this type of implementation is very hard to get right. Unfortunately, they are also pretty much mandatory, as it’d make no sense to use this implementation without slopes. Often, they’re the reason why you’re even using this system.
This is, roughly, the algorithm used by Talbot’s Odyssey:
  • Integrate acceleration and velocity to compute the desired delta-position vector (how much to move in each axis).
  • Step each axis separately, starting with the one with the largest absolute difference.
  • For the horizontal movement, offset the player AABB by 3 pixels to the top, so he can climb slopes.
  • Scan ahead, by checking against all valid obstacles and the bitmask itself, to determine how many pixels it is able to move before hitting an obstacle. Move to this new position.
  • If this was horizontal movement, move as many pixels up as necessary (which should be up to 3) to make up for slope.
  • If, at the end of the movement, any pixel of the character is overlaping with any obstacle, undo the movement on this axis.
  • Regardless of result of last condition, proceed to do the same for the other axis.

Because this system has no distinction between moving down because you’re going downhill or because you’re falling, you’re likely to need a system counting how many frames it’s been since the character last touched the floor, for purposes of determining whether it can jump and changing animation. For Talbot, this value is 10 frames.


Another trick here is efficiently computing how many pixels it can move before hitting something. There are other possible complicating factors, such as one-way platforms (dealt in the exact same way as for tiled (smooth)) and sliding down steep inclines (which is fairly complex and beyond the scope of the article). In general, this technique requires a lot of fine tuning, and is intrinsically less stable than tile-based approaches. I only recommend it if you absolutely must have detailed terrain.


Type #4: Vectorial

This technique uses vectorial data (lines or polygons) to determine the boundaries of collision areas. Very difficult to implement properly, it is nevertheless increasingly popular due to the ubiquity of physics engines, such as Box2D, which are suitable for implementing this technique. It provides benefits similar to the bitmask technique, but without major memory overhead, and using a very different way of editing levels.


Attached Image: braid11.jpg

Attached Image: braid2.png


Braid (level editor), with visible layers (top) and the collision polygons (bottom)

Examples: Braid, Limbo



How it works

There are two general ways of approaching this:
  • Resolve movement and collisions yourself, similar to the bitmask method, but using polygon angles to compute deflection and have proper slopes.
  • Use a physics engine (e.g. Box2D)

Obviously, the second is more popular (though I suspect that Braid went for the first), both because it is easier and because it allows you to do many other things with physics in the game. Unfortunately, in my opinion, one has to be very careful when going this route, to avoid making the game feel like a generic, uninteresting physics-platformer.


Compound objects

This approach has its own unique problems. It may suddenly be difficult to tell whether the player is actually standing on the floor (due to rounding errors), or whether it’s hitting a wall or sliding down a steep incline. If using a physics engine, friction can be an issue, as you’ll want friction to be high on the foot, but low on the sides.

There are different ways to deal with those, but a popular solution is to divide the character into several different polygons, each with different roles associated: so you’d (optionally) have the main central body, then a thin rectangle for feet, and two thin rectangles for sides, and another for head or some similar combination. Sometimes they are tapered to avoid getting caught into obstacles. They can have different physics properties, and collision callbacks on those can be used to determine the status of character. For more information, sensors (non-colliding objects that are just used to check for overlap) can be used. Common cases include determinining whether we’re close enough to the floor to perform a jump, or if the character is pushing against a wall, etc.


General Considerations

Regardless of the type of platform movement that you have chosen (except perhaps for type #1), a few general considerations apply.



Acceleration


Attached Image: Mario_Metroid_Megaman_Acceleration1.png

Super Mario World (low acceleration), Super Metroid (mid acceleration), Mega Man 7 (high acceleration)

One of the factors that affects the feel of a platformer the most is the acceleration of the character. Acceleration is the rate of change in speed. When it is low, the character takes a long time to reach its maximum velocity, or to come to a halt after the player lets go of controls. This makes the character feel “slippery”, and can be hard to master. This movement is most commonly associated with the Super Mario series of games. When the acceleration is high, the character takes very little (or no time) to go from zero to maximum speed and back, resulting in very fast responding, “twitchy” controls, as seen in the Mega Man series (I believe that Mega Man actually employs infinite acceleration, that is, you’re either stopped or on full speed).

Even if a game has no acceleration on its horizontal movement, it is likely to have at least some for the jump arcs – otherwise they will be shaped like triangles.


How it works

Implementing acceleration is actually fairly simple, but there are a few traps to watch out for.
  • Determine xTargetSpeed. This should be 0 if the player is not touching the controls, -maxSpeed if pressing left or +maxSpeed if pressing right.
  • Determine yTargetSpeed. This should be 0 if the player is standing on a platform, +terminalSpeed otherwise.
  • For each axis, accelerate the current speed towards target speed using either weighted averaging or adding acceleration.

The two acceleration methods are as follows:
  • Weighted averaging: acceleration is a number (“a”) from 0 (no change) to 1 (instant acceleration). Use that value to linearly interpolate between target and current speed, and set the result as current speed.

vector2f curSpeed = a * targetSpeed + (1-a) * curSpeed;
if (fabs(curSpeed.x) < threshold) curSpeed.x = 0;
if (fabs(curSpeed.y) < threshold) curSpeed.y = 0;

  • Adding acceleration: We’ll determine which direction to add the acceleration to (using the sign function, which returns 1 for numbers >0 and -1 for <0), then check if we overshot.


vector2f direction = vector2f(sign(targetSpeed.x - curSpeed.x),
							  sign(targetSpeed.y - curSpeed.y));
curSpeed += acceleration * direction;
if (sign(targetSpeed.x - curSpeed.x) != direction.x)
	curSpeed.x = targetSpeed.x;
if (sign(targetSpeed.y - curSpeed.y) != direction.y)
	curSpeed.y = targetSpeed.y;



It’s important to integrate the acceleration into the speed before moving the character, otherwise you’ll introduce a one-frame lag into character input.

When the character hits an obstacle, it’s a good idea to zero his speed along that axis.



Jump control


Attached Image: Super_Metroid_Screw_Attack.png

Super Metroid, Samus performing the “Space Jump” (with “Screw Attack” power-up)

Jumping in a platform game can be as simple as checking if the player is on the ground (or, often, whether he was on the ground anytime on the last n frames), and, if so, giving the character an initial negative y speed (in physical terms, an impulse) and letting gravity do the rest.

There are four general ways in which the player can control the jump:
  • Impulse: seen in games such as Super Mario World and Sonic the Hedgehog, the jump preserves the momentum (that is, in implementation terms, the speed) that the character had before the jump. In some games, this is the only way to influence the arc of the jump – just like in real life. There is nothing to implement here – it will be like this unless you do something to stop it!
  • Aerial acceleration: that is, retaining control of horizontal movement while in mid-air. Though this is physically implausible, it is a very popular feature, as it makes the character much more controllable. Almost every platformer game has it, with exceptions for games similar to Prince of Persia. Generally, the airborne acceleration is greatly reduced, so impulse is important, but some games (like Mega Man) give you full air control. This is generally implemented as merely tweaking the acceleration parameter while you’re airborne.
  • Ascent control: another physically implausible action, but very popular, as it gives you much greater control over the character. The longer you hold the jump button, the higher the character jumps. Typically, this is implemented by continuing to add impulse to the character (though this impulse can incrementally decrease) for as long as the button is held, or alternatively by suppressing gravity while the button is held. A time limit is imposed, unless you want the character to be able to jump infinitely.
  • Multiple jumps: once airborne, some games allow the player to jump again, perhaps for an unlimited number of times (as in the Space Jump in Super Metroid or the flight in Talbot’s Odyssey), or for a limited number of jumps before touching the ground (“double jump” being the most common choice). This can be accomplished by keeping a counter that increases for each jump and decreases when you’re on the ground (be careful when you update this, or you might reset it right after the first jump), and only allowing further jumps if the counter is low enough. Sometimes, the second jump is shorter than the initial one. Other restrictions may apply – the Space Jump only triggers if you’re already doing a spin jump and just began to fall.

Animations and leading

Attached Image: Black_Thorne_Lead.png

Black Thorne, character doing a long animation before shooting backwards (Y button)

In many games, your character will play an animation before actually performing the action you requested. However, on a twitchy action-based game, this will frustrate players – DON’T DO THAT! You should still have leading animations for things such as jumping and running, but if you care about how the game responds, make those cosmetic only, with the action taken immediately regardless of the animation.



Smoother movement

Using integers to represent the position of the characters is wise, as it makes it faster and stable. However, if you use integers for everything, you will end up with some jerky motion. There are multiple solutions to this. These are a few:
  • Use a float for all computations and for storing position, and cast to int whenever you’re rendering or computing collisions. Fast and simple, but it starts losing precision if you move too far away from (0,0). This is probably not relevant unless you have a very large playfield, but it’s something to keep in mind. If it comes to it, you can use a double instead.
  • Use a fixed point number for all computations and position, and again cast to int when you’re rendering or computing collisions. Less precise than float and with a more limited range, but the precision is uniform and can, on some hardware, be faster (notably, floating point processing is slow on many mobile phones).
  • Store position as an integer, but keep a “remainder” stored in a float. When integrating position, compute the delta-movement as a float, add the remainder to the delta-movement, then add the integer part of this value to the position, and the fractional part to the “remainder” field. On the next frame, the remainder will get added back in. The advantage of this method is that you’re using an integer everywhere except for movement, ensuring that you won’t have floating point complications elsewhere, and increasing performance. This technique is also very suitable if you have some framework in which the position of the object has to be an integer, or where it is a float, but that same position is used directly by the rendering system – in that case, you can use the framework-provided float position to store integer values only, to make sure that the rendering is always aligned to pixels.

MAME emulator disease: memset()

$
0
0
While analyzing the source codes of various programs I can't help creating associations that each program has a tendency to certain diseases. In many projects you can easily make out patterns of incorrect code that can be found in different project files. In some programs these are Copy-Paste errors, while in others it's "unsigned_integer < 0"-like checks. Each project has its own disease. The sore of the next project (called MAME) we have checked is the memset() function.

MAME is an emulator application designed to recreate the hardware of arcade game systems in software to preserve gaming history by preventing vintage games from being lost or forgotten [1]. Although almost all the project files have the ".c" extension, MAME is actually a C++ project. The source code's size is rather large - 110 Mbytes.

Checking MAME with PVS-Studio was impossible before because it is built with MinGW on Windows. MinGW is a native software port of the GNU Compiler Collection (GCC) under Microsoft Windows [2]. It means that PVS-Studio has to provide correct support of the special features of the GCC syntax and special keywords.

Support of MinGW has been available in PVS-Studio since version 4.70. It is not full yet, but it is enough to check most projects. MAME was one of the first projects to be analyzed.

Note. While performing the analysis, there will be a lot of similar false reports. The odd code fragments are located in several macros widely used in various project parts. It seems at first that there are only false positives - scattered useful messages just get lost among them. However, you can easily fix it by adding just a few comments to suppress the warnings triggered by the macros. See the "Suppression of false alarms" section in the documentation to find out how to do that.

Now let's study the errors we have detected.

Incompletely cleared arrays

As we have already said, you can find a lot of fragments in the MAME project where the memset function is used incorrectly. A typical mistake is filling only a part of an array. Consider a simple example:

UINT32 m_pstars_regs[16];
static DRIVER_INIT( pstar )
{
  ...
  memset(state->m_pstars_regs, 0, 16);
  ...
}


PVS-Studio: V512 A call of the 'memset' function will lead to underflow of the buffer 'state->m_pstars_regs'. pgm.c 4458

Number 16 means the number of items in the "m_pstars_regs" array. But it is the number of bytes being filled in the buffer that should be passed into the memset function. As a result, only a part of the array is filled with zeroes.

This is the correct code:

memset(state->m_pstars_regs, 0, 16 * sizeof(UINT32));


The mistake is trivial. Programmers often think that there are few trivial errors in their programs (see the second myth [3]). It's not so. It is very simple and silly mistakes that make up the largest part of errors found in programs.

Do you think the error shown above is a single one? No. Here you are at least 8 other fragments where instances of the same mistake can be found:
  • V512 A call of the 'memset' function will lead to underflow of the buffer 'state->m_kb_regs'. pgm.c 4975
  • V512 A call of the 'memset' function will lead to underflow of the buffer 'state->m_kb_regs'. pgm.c 4996
  • V512 A call of the 'memset' function will lead to underflow of the buffer 'state->m_kb_regs'. pgm.c 5056
  • V512 A call of the 'memset' function will lead to underflow of the buffer 'state->m_oldsplus_ram'. pgm.c 5780
  • V512 A call of the 'memset' function will lead to underflow of the buffer 'state->m_oldsplus_regs'. pgm.c 5781
  • V512 A call of the 'memset' function will lead to underflow of the buffer 'state->m_sysreg'. rungun.c 399
  • V512 A call of the 'memset' function will lead to underflow of the buffer 'state->m_ttl_vram'. rungun.c 400
  • V512 A call of the 'memset' function will lead to underflow of the buffer 'state->m_playfield_code'. malzak.c 392
In the example above, the number of items was defined by an absolute number. It is bad. You'd better calculate the array size instead of using constants. Unfortunately, it doesn't help to avoid the error we're discussing.

UINT16	  m_control_0[8];
#define ARRAY_LENGTH(x)  (sizeof(x) / sizeof(x[0]))

static MACHINE_RESET( tumbleb )
{
  ...
  memset(state->m_control_0, 0,
		 ARRAY_LENGTH(state->m_control_0));
}


PVS-Studio: V512 A call of the 'memset' function will lead to underflow of the buffer 'state->m_control_0'. tumbleb.c 2065

The ARRAY_LENGTH macro is used to calculate the number of array items. Again, it's incorrect. The programmer should have calculated the array size, not number of items it contains.

There are two ways to fix it.

The first:

memset(state->m_control_0, 0, sizeof(state->m_control_0));


The second:

memset(state->m_control_0, 0,
	   ARRAY_LENGTH(state->m_control_0) * sizeof(UINT16));




These are some other fragments where arrays are not filled correctly in the same way:
  • V512 A call of the 'memset' function will lead to underflow of the buffer 'state->m_pmac_read'. megadriv.c 7156
  • V512 A call of the 'memset' function will lead to underflow of the buffer 'state->m_pmac_write'. megadriv.c 7157
  • V512 A call of the 'memset' function will lead to underflow of the buffer 'state->m_cart_is_genesis'. megatech.c 426
  • V512 A call of the 'memset' function will lead to underflow of the buffer 'state->m_vol_ctrl'. nycaptor.c 841
  • V512 A call of the 'memset' function will lead to underflow of the buffer 'state->m_rotate_ctrl'. wgp.c 949
  • V512 A call of the 'memset' function will lead to underflow of the buffer 'state->m_vreg'. othldrby.c 237
Misfortunes with the memset() function are over here, though I may have missed some mistakes. But it's time for another, as scary, function memcpy().

Incorrect use of the memcpy() function

Let's look at a code that causes an array overrun:

#define CHD_SHA1_BYTES	20
#define CHD_V4_HEADER_SIZE   108
#define CHD_MAX_HEADER_SIZE   CHD_V4_HEADER_SIZE

static chd_error header_read(...., chd_header *header)
{
  UINT8 rawheader[CHD_MAX_HEADER_SIZE];
  ...
  memcpy(header->parentsha1, &rawheader[100], CHD_SHA1_BYTES);
  ...
}


PVS-Studio: V512 A call of the 'memcpy' function will lead to the '& rawheader[100]' buffer becoming out of range. chd.c 1870

The 'rawheader' array consists of 108 bytes. We want to copy its contents from byte 100 on. The trouble is we will reach outside the array boundaries. We can copy only 8 bytes, yet 20 bytes are actually copied. Unfortunately, I don't know how to fix this code, since I'm not familiar with the program logic.



When using the memset() function, it often happens that only a part of an array is filled. Correspondingly, when you use the memset() function, there may often be errors causing only a part of an array to be copied. Consider the following sample:

UINT16 m_spriteram16[0x1000];
UINT16 m_spriteram16_buffered[0x1000];

static WRITE32_HANDLER( deco32_buffer_spriteram_w )
{
  deco32_state *state =
	space->machine().driver_data();
  memcpy(state->m_spriteram16_buffered,
		 state->m_spriteram16, 0x1000);
}


PVS-Studio: V512 A call of the 'memcpy' function will lead to underflow of the buffer 'state->m_spriteram16_buffered'. deco32.c 706

That's a small function. But it has an error. I think you have already guessed that multiplication by sizeof(UINT16) is missing.

This is the correct code:

memcpy(state->m_spriteram16_buffered,
	   state->m_spriteram16,
	   0x1000 * sizeof(UINT16));


The same error here:

V512 A call of the 'memcpy' function will lead to underflow of the buffer 'state->m_spriteram16_2_buffered'. deco32.c 726

Misprints and Copy-Paste

In any project you can see misprints and errors caused by using the Copy-Paste technology. There are few of them in some projects and quite many in others. In MAME these errors are not numerous, yet they are there. Let's study some of them.

static WRITE8_HANDLER( tms70x0_pf_w )
{
  ...
  if( ((cpustate->pf[0x03] & 0x80) == 0) &&
	  ((data & 0x80) == 0x80 ) )
  {
	...
  }
  else if( ((data & 0x80) == 0x80 ) &&
		   ((cpustate->pf[0x03] & 0x80) == 0) )
  {
	...
  }
  ...
}


PVS-Studio: V517 The use of 'if (A) {...} else if (A) {...}' pattern was detected. There is a probability of logical error presence. Check lines: 577, 584. tms7000.c 577

If you look close, you will notice that the first and the second conditions are identical. They have different order of comparisons, but it doesn't influence the result in any way.

Consider the following example.

class device_debug
{
  device_disasm_interface *m_disasm;
  ...
  int min_opcode_bytes() const
	{
	  return (m_disasm != NULL) ?
		m_disasm->max_opcode_bytes() : 1;
	}
  int max_opcode_bytes() const
	{
	  return (m_disasm != NULL) ?
		m_disasm->max_opcode_bytes() : 1;
	}
}


PVS-Studio: V524 It is odd that the body of 'max_opcode_bytes' function is fully equivalent to the body of 'min_opcode_bytes' function (debugcpu.h, line 150). debugcpu.h 151

The max_opcode_bytes() function is identical to the min_opcode_bytes() function. This is most likely incorrect. I suppose that the min_opcode_bytes() function was intended to be written as follows:

int min_opcode_bytes() const
{
  return (m_disasm != NULL) ?
	m_disasm->min_opcode_bytes() : 1;
}


Here are some other code fragments which are most probably misprints:
  • V583 The '?:' operator, regardless of its conditional expression, always returns one and the same value: ",(%d,". 9900dasm.c 670
  • V517 The use of 'if (A) {...} else if (A) {...}' pattern was detected. There is a probability of logical error presence. Check lines: 549, 579. cdrom.c 549
  • V501 There are identical sub-expressions 'offset != (0x370 >> 1)' to the left and to the right of the '&&' operator. decoprot.c 118
  • V501 There are identical sub-expressions 'offset != (0x3c0 >> 1)' to the left and to the right of the '&&' operator. decoprot.c 118
  • V501 There are identical sub-expressions 'offset != 0x2c / 2' to the left and to the right of the '&&' operator. decoprot.c 240
  • V501 There are identical sub-expressions 'offset != 0xe' to the left and to the right of the '&&' operator. decoprot.c 447
Undefined behavior

Quite a number of warnings generated by PVS-Studio for this project refer to shift operations. These operations lead to undefined behavior. Of course, when you use particular compilers, your code can work properly for many years. That's why we can call these errors potential. They may reveal themselves when moving to a different platform, compilers or optimization switches. To learn more about it, please see the article: "Wade not in unknown waters. Part three." [4].

Consider a couple of samples causing undefined behavior. The first sample:

#define ATARIRLE_PRIORITY_SHIFT  12
#define ATARIRLE_PRIORITY_MASK \
  ((~0 

PVS-Studio: V610 Undefined behavior. Check the shift operator '<<. The left operand '~0' is negative. atarig42.c 220

Any code fragment using the ATARIRLE_PRIORITY_MASK macro leads to undefined behavior. Negative numbers cannot be shifted. This macro should be rewritten in the following way:

#define ATARIRLE_PRIORITY_MASK \
  ((~(0u) 



Here is another, larger, sample:

UINT32 m_color1_mask;
#define ARRAY_LENGTH(x) (sizeof(x) / sizeof(x[0]))
PALETTE_INIT( montecar )
{
static const UINT8 colortable_source[] =
{
  0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03,
  0x03, 0x03, 0x03, 0x02, 0x03, 0x01, 0x03, 0x00,
  0x00, 0x00, 0x02, 0x00, 0x02, 0x01, 0x02, 0x02,
  0x00, 0x10, 0x20, 0x30, 0x00, 0x04, 0x08, 0x0c,
  0x00, 0x44, 0x48, 0x4c, 0x00, 0x84, 0x88, 0x8c,
  0x00, 0xc4, 0xc8, 0xcc
};
  ...
for (i = 0; i < ARRAY_LENGTH(colortable_source); i++)
{
  UINT8 color = colortable_source[i];
  if (color == 1)
   state->m_color1_mask |= 1 

PVS-Studio: V610 Undefined behavior. Check the shift operator '<<. The right operand ('i' = [0..43]) is greater than or equal to the length in bits of the promoted left operand. firetrk.c 111

The 'colortable_source' array contains 44 items. Therefore, the 'i' loop counter takes values from 0 to 43. Number '1' has the int type - it cannot be shifted more than by 31 bits. If you shift it by more bits, it will cause undefined behavior according to the language standard.

Since there are quite few warnings related to shifts, we won't cite them in the article. You can look through the list of these messages in the text file: mame-shift-ub.txt.

Other errors

Besides the functions memset() and memcpy(), there is memcmp() I've almost forgotten about. This function is from the same gang. Fortunately, I've found only one error related to use of this function in MAME.

static const char *apr_magic = "ACT Apricot disk image\x1a\x04";

FLOPPY_IDENTIFY( apridisk_identify )
{
  UINT8 header[APR_HEADER_SIZE];
  floppy_image_read(floppy, &header, 0, sizeof(header));
  if (memcmp(header, apr_magic, sizeof(apr_magic)) == 0)
  ...
}


PVS-Studio: V579 The memcmp function receives the pointer and its size as arguments. It is possibly a mistake. Inspect the third argument. apridisk.c 128

The sizeof() operator calculates the pointer size instead of the number of bytes in a string. As a result, only the first several bytes are compared. We can fix it by defining the 'apr_magic' variable as an array:

static const char apr_magic[] = "ACT Apricot disk image\x1a\x04";




This is an example of an expression which is always true:

int m_led_extender;
#define CARD_A   1
#define NO_EXTENDER  0

static WRITE8_DEVICE_HANDLER( pia_ic5_porta_w )
{
  ...
  else if ((state->m_led_extender != CARD_A)||
		   (state->m_led_extender != NO_EXTENDER))
  ...
}


PVS-Studio: V547 Expression is always true. Probably the '&&' operator should be used here. mpu4.c 934

The "X != 1 || X != 0" condition is always true. Most probably, the '&&' operator should be written instead of the '||' operator.



Use of a pointer before a check. I will cite only one example of this. I saw other V595 messages too but didn't note them down. In many cases the code works well, as the pointer never equals zero in those fragments. Here is an example of odd code:

static void stv_vdp2_drawgfxzoom(...,
  const gfx_element *gfx, ...)
{
  ...
  if (gfx->pen_usage &&
	  transparency == STV_TRANSPARENCY_PEN)
  {
	...
  }

  if( gfx )
  {
	...
  }
  ...
}


PVS-Studio: V595 The 'gfx' pointer was utilized before it was verified against nullptr. Check lines: 2457, 2483. stvvdp2.c 2457



At times I come across some strange code about which I cannot tell for sure if it has an error or not. Maybe there is a Copy-Paste mistake. And maybe everything is correct and the two code branches are actually intended to be identical. Here is an example:

static DEVICE_START( deco16ic )
{
  ...
  if (intf->split)
	deco16ic->pf2_tilemap_16x16 =
	  tilemap_create_device(device, get_pf2_tile_info,
		deco16_scan_rows, 16, 16, fullwidth ?
		  64 : 32, fullheight ? 64 : 32);
  else
	deco16ic->pf2_tilemap_16x16 =
	  tilemap_create_device(device, get_pf2_tile_info,
		deco16_scan_rows, 16, 16, fullwidth ?
		  64 : 32, fullheight ? 64 : 32);
  ...
}


PVS-Studio: V523 The 'then' statement is equivalent to the 'else' statement. deco16ic.c 943

Regardless of the condition, one and the same action is performed. Here is another similar sample:

int compute_res_net(int inputs, int channel, const res_net_info *di)
{
  ...
  if (OpenCol)
  {
	rTotal += 1.0 / di->rgb[channel].R[i];
	v += vOL / di->rgb[channel].R[i];
  }
  else
  {
	rTotal += 1.0 / di->rgb[channel].R[i];
	v += vOL / di->rgb[channel].R[i];
  }
  ...
}


PVS-Studio: V523 The 'then' statement is equivalent to the 'else' statement. resnet.c 628

Conclusion

As usual, I will stress that these are probably quite not all the errors that PVS-Studio can find in MAME. The task of this article is to show that PVS-Studio is learning to check crossplatform projects. To know how exactly you can integrate into the make-file, please see the documentation. You may also ask us if you have any troubles analyzing projects built with MinGW.

P.S. Review of analysis results currently implies that you need the Visual Studio environment where you can open the report and study it. Manual analysis of the report is very effortful. Maybe we will make a special tool in future that will allow you to conveniently review the report and perform code navigation without having Visual Studio installed.

References

Pixel perfect collision detection in DirectX

$
0
0
Introduction:
The basic collision detection system everyone starts with is bounding box collision detection, but this method can be a bit inaccurate; however we will take advantage of it in this article.
The basic idea is to check first, if bounding box collision detection has occurred, and then check pixel by pixel if the collision trully took place:

check bounding box collisions
if they exist, take a look pixel by pixel

Bounding box collisions:
Lets see how we can implement bounding box collisions:
Microsoft provides us with an useful struct called RECT. It represents an axis aligned rectangle, and we will use it to test collisions.
What we should do, is save the bounding rectangle of our SPRITE class, and when we want to look for collisions between to sprites, the only thing we have to do is intersect the 2 RECT scructs the sprites hold.
The code would look something like this:

RECT dest;
IntersectRect(&dest, &sprite1.rect, &sprite2.rect);

Pixel perfect check:
Once we know that a collision has happened, it's time to check pixel by pixel!
We will be working directly with the LPDIRECT3DTEXTURE9 variables in order to read their pixels.

First, we will lock them, so that we can read them from the GPU, we have to lock every texture we want to read pixels from:

D3DLOCKED_RECT rectS1;
HRESULT hResult = myTexture->LockRect(0, &rectS1, NULL, NULL);

Then, we will grab the pixel data by reading de pBits component of our locked rectangle:
(Again, we need to do this for every texture we are working with)

D3DCOLOR* pixelsS1 = (D3DCOLOR*)rectS1.pBits;

Now is when the fun part comes in. We have to check the intersected rectangle pixels to see if the pixels collide.
Sadly, we just can read our texture's data (not the screen data) so we will have to tranlate screen coordinates to each texture's coordinates, and then read the texture's pixels.

for (int rx = dest.left; rx < dest.right; rx++)
  {
   for (int ry = dest.top; ry < dest.bottom; ry ++)
   {
	 // Translate screen coordinates into texture coordinates
	int s1x = rx - sprite1.x;
	int s1y = ry - sprite1.y;
	int s2x = rx - sprite2.x;
	int s2y = ry - sprite2.y;
	 // a and b will hold the alpha values of the pixel we are staring at
	BYTE a = (pixelsS1[s1y * TEXTURE1_WIDTH + s1x] & 0xFF000000) >> 24;
	BYTE b = (pixelsS2[s2y * TEXTURE2_WIDTH + s2x] & 0xFF000000) >> 24;
	 // if both pixels are opaque a collision has taken place
	if (a == 255 && b == 255)
	{
	 //Remember to unlock your textures
	 texture1->UnlockRect(0);
	 texture2->UnlockRect(0);
	 return 1;
	}
   }
  }

Full code:
In case you want to read how the full code would be, here it is:
// Returns 1 if a collision is detected and 0 if the collision did not happen
int PixelPerfectCollision(SPRITE sprite1, SPRITE sprite2)
{

// Creation of the bounding rectangles from the SPRITE values
// Remember that coordinates start in the upper left corner of the screen

RECT rect1;
rect1.left = (long)sprite1.x;
rect1.top = (long)sprite1.y;
rect1.right = (long)sprite1.x + sprite1.width;
rect1.bottom = (long)sprite1.y + sprite1.height;

RECT rect2;
rect2.left = (long)sprite2.x;
rect2.top = (long)sprite2.y;
rect2.right = (long)sprite2.x + sprite2.width;
rect2.bottom = (long)sprite2.y + sprite2.height;


// Intersection of the bounding rectangles
// Up to here the code is just bounding box collision detection

RECT dest;
if (IntersectRect(&dest, &rect1, &rect2))
{

  // Loking of the textures
  // In this case the SPRITE object holds the texture to draw
  // We will access it and invoke the LockRect method of LPDIRECT3DTEXTURE9
  // The pixels will be saved in each D3DLOCKED_RECT object
  D3DLOCKED_RECT rectS1;
  HRESULT hResult = sprite1.texture->LockRect(0, &rectS1, NULL, NULL);

  if(FAILED(hResult))
  {
   MessageBox(0,"Failed","Info",0);
   return 0;
  }
  D3DLOCKED_RECT rectS2;
  hResult = sprite2.texture>LockRect(0, &rectS2, NULL, NULL);

  if(FAILED(hResult))
  {
   MessageBox(0,"Failed","Info",0);
   return 0;
  }

  // Get the pointer to the color values
  // From now on, we will read that pointer as an array
  D3DCOLOR* pixelsS1 = (D3DCOLOR*)rectS1.pBits;
  D3DCOLOR* pixelsS2 = (D3DCOLOR*)rectS2.pBits;

  // We will check the area of the intersected rect (dest)
  // In this rectangle, we have to check that in the same spot:
  // A pixel from each texture collide
  for (int rx = dest.left; rx < dest.right; rx++)
  {
   for (int ry = dest.top; ry < dest.bottom; ry ++)
   {

	// Translation from the "dest" rect to sprite1 coordinates
	int s1x = rx - sprite1.x;
	int s1y = ry - sprite1.y;
	
	// Translation from the "dest" rect to sprite2 coordinates
	int s2x = rx - sprite2.x;
	int s2y = ry - sprite2.y;
	
	// Check the alpha value of each texture pixel
	// The alpha value is the leftmost byte
	BYTE a = (pixelsS1[s1y * 128 + s1x] & 0xFF000000) >> 24;
	BYTE b = (pixelsS2[s2y * 480 + s2x] & 0xFF000000) >> 24;
	
	// If both pixels are opaque, we found a collision
	// We have to unlock the textures and return
	if (a == 255 && b == 255)
	{
	 sprite1.texture->UnlockRect(0);
	 sprite2.texture->UnlockRect(0);
	 return 1;
	}
   }
  }

   // If we reached here, it means that we did not find a collision
  sprite1.texture->UnlockRect(0);
  sprite2.texture->UnlockRect(0);
  return 0;
}
return 0;
}

Conclusion:
I hope to have helped you figuring out how you can implement pixel based collisions in DirectX.

But... what to do now?
This is just a "simple" example.
Based on this example you can develop code that takes into account sprite scaling and rotation.
It is often said that locking textures is not very efficient, because it reduces GPU acceleration. A simple approach to solve this would be to store texture pixels in a boolean array and read that array instead of reading the texture's ones.
Another thing to do now is implementing bouncing based on pixels, there are lots of possibilities!

3ds Max 2013 Review

$
0
0
Introduction

3ds Max 2013 is available as a stand-alone package or as part of a suite of tools and, for the first time, Autodesk is also offering an Ultimate Suite that includes both 3ds Max and Maya together along with the other suite packages. This provides a solution to artists that lets them choose the best tool for the task at hand instead of deciding at the project's start which package to stick with.

The 2013 version of 3ds Max includes, as usual, a long list of new and improved features for game, design, visualization and CAD users. For game developers, there are many improvements focused on making it easier than ever to work with characters and for the design users, features such as support for importing multiple CAD formats is a much needed addition.

Render Pass Management with the State Sets Interface

Each release includes lots of little changes and a few major ones. Perhaps the biggest one with this version is the new State Sets interface. Using this interface, you can record a specific set of enabled settings that can be instantly recalled as needed. For example, you could record a state set with one of the non-photorealistic rendering options such as colored pencils enabled, another state set could show the scene using the default scanline renderer and a third state set could be set up using mental ray. Each of these states could be quickly recalled when presenting the scene to a client.

Another way to use the State Sets interface is to setup several different render passes. These states can be nested and can be easily rendered out in a batch with the Render All States command. The State Sets interface also includes a Compositor view (show in Figure 1) that displays each state as a node with connecting wires so you can easily visualize how the composited image is put together. There is even an option to add a Color Correct node if you want to do the basic compositing in 3ds Max.

The interface also allows the data to be transferred in real-time to Autodesk Smoke, Adobe After Effects or Adobe Photoshop using a connection link. Once the link between 3ds Max and the compositing software is established, you can transfer cameras, lights, null objects, plane objects, blend modes, opacity and effects between the two programs.

Attached Image: Figure 1 - State Sets.jpg

Figure 1: The State Sets interface includes a Compositor view that shows all states as a hierarchy of nodes and connections.


Layouts Toolbar and Workspaces

One small interface change was the addition of the Layouts toolbar over on the left side of the screen. This simple little toolbar lets you quickly change the interface layout between several different presets. You can also create and save your own custom layouts to the toolbar for quick recall.

Along the title bar, you can find the new Workspaces drop-down list. This control lets you quickly pick from any of the defined workspaces and you can customize and save your own custom workspaces. This lets you set up the interface for different users or for different tasks. I like to keep a modeling workspace with maximized viewports, another workspace for applying materials that makes the Slate Material Editor accessible and another separate workspace for animation that includes the Track View in a viewport.

Nitrous Improvements

In previous versions of 3ds Max, you had to go to several different places in the interface to change the background depending on whether you are using an environment map or a background image. One of the changes to the viewport in this version places all these controls within a single menu in the Views menu. These same commands can also be accessed from the viewport label making it easy to switch backgrounds. Viewports can now use a vertical gradient as their background.

Other improvements to the Nitrous viewports include support for image-based lighting, depth-of-field effects and better particle flow display. There are also two new render styles: Facets and Clay. Also new in the viewports is the ability to add a Sky Color Map to the Skylight object. This map can be a High-Dynamic Range (HDR) image that illuminates the entire scene without the need for an active Light Tracer.

iray and mental ray Improvements

3ds Max 2013 also includes the latest version of iray 2.1. With this updated version, you can enable iray within an ActiveShade window providing real-time rendered results, as shown in Figure 2. The iray renderer also includes a new Hardware Resources rollout that tells you the number of processors available for rendering and lets you allocate the number of processors to use for Production rendering, the number to user for ActiveShade rendering, and how many to leave for the interface. This lets you maximize the processing power to use for final rendering when you reach that stage of the project.


Attached Image: Figure 2 - iray ActiveShade.jpg

Figure 2: Enabling iray within an ActiveShade window provides immediate feedback on the scene. Image courtesy of Autodesk.


The latest version of iray also includes support for motion blur, a round corner effect, improved sky portal support, and new materials including an Environment Background Switcher that lets you use one map for the background and another for environment reflections.

mental ray has also been upgraded to version 3.10.

Retime Tool and Redesigned Track View

The Retime tool is a new addition to the Track View interface. It adds markers to a selected curve that lets you speed up or slow down the animation curve by simply dragging the markers. There is also a Retime All tool that is used to change the speed of the animation for all animated scene objects.

The Track View interface has also been redesigned. This redesign makes the interface similar to the curve editors found in Maya and MotionBuilder and simplifies the interface making it easier to work with.

Moving CAT Characters to MotionBuilder

The ability to transfer data between Maya, Softimage, MotionBuilder and Mudbox using a single menu option is a great feature and a new option has been added to the list for 2013. 3ds Max data files can now be sent to Autodesk Infrastructure Modeler with a single click.

In addition to a new Send To option, CAT bipedal characters created in 3ds Max that are transferred over to Maya or MotionBuilder are automatically converted to a HumanIK character complete with its skeletal structure and animation. Any changes that are made to the HumanIK character in Maya or MotionBuilder are seamlessly updated back in 3ds Max. This is a huge benefit enabling character animators to build and animate characters using CAT in 3ds Max and then further tweak the animation using the amazing features found in MotionBuilder.

Exchange Data with CAD Packages

The File Link Manager lets you link data files created with Revit, FBX and AutoCAD directly within the scene file using the options found in the Import menu. 3ds Max 2013 also includes Autodesk DirectConnect, which allows support for a broad range of CAD files including AutoCAD, Inventor, Alias, SolidWorks, CATIA, Pro/ENGINEER, PLM Software NX, and JT. CAD objects that are imported appear in 3ds Max as Body Objects. IGES files are also imported as Body Objects instead of NURBS objects.

mCloth, Ragdoll and Other MassFX Improvements

Several additions have been added to the MassFX physics simulation system including the inclusion of mCloth for adding cloth objects to a defined simulation. Another new addition is the ragdoll structure that works with both biped and CAT skeletons. To apply this structure, simply select a skinned character built with either CAT or Biped and click the Create Ragdoll menu command, MassFX then automatically applies all the needed constraints and rigid bodies required to allow the character to be included in a simulation (Figure 3).

Another improvement is the new Multi-Object Editor that lets you edit the properties of multiple rigid body objects and constraints at one time. MassFX simulations can also now include Space Warp forces such as Wind and Vortex, which is especially helpful for simulations involving cloth.

Attached Image: Figure 3 - MassFX Ragdoll.jpg

Figure 3: The new Create Ragdoll command lets you include CAT or Biped skeletons within a MassFX simulation.


Animation Store

Within the Animation menu is the Animation Store option. This command opens links directly in the Command Panel to an online repository of models and motions developed by Mixamo. Using the interface, shown in Figure 4, where you can browse for both character models and for specific motions to add to a biped or CAT character. The available characters include male, female and creature characters in a wide variety of outfits including business, casual, medical and sport attire.


Attached Image: Figure 4 - Animation Store.jpg

Figure 4: The Animation Store dialog box gives you access to purchasing characters and animated motions from within the 3ds Max interface.


The available motions range from general motions like walking and jumping to more specialized motions like sneaking, strafing and swimming. Each motion has a price tag associated with it and can be applied directly to a character.

Hair Improvements

The Hair and Fur features in 3ds Max 2013 have been updated with better viewport display and faster rendering. Several new features have also been added including new material options like the Squirrel value that highlights the tip color. There is also a new Flyaway rollout that defines how messy the hair gets. There are also several new parameters for defining hair Clumping and Multi-Strand effects.

Other Improvements

Often the most valuable improvements are the smallest ones. The 2013 version of 3ds Max includes a huge list of small improvements that could have a huge impact on your work. A good example of this is support for the 64-bit version of Apple's QuickTime. This one bit me on a previous project when the client wanted the animation output as a QuickTime MOV, but my computer was 64-bit, so I had to find a work around. No more tricky work around is needed now.

Another simple little improvement is the inclusion of an Egg-shaped spline primitive. It only saves a few seconds from creating a circle and pulling out one vertex, but every little second can count on a tight project. Another wonderful addition is that the Array dialog box is now modeless, so you can see the results without having to close and reopen the dialog box.

Models that deformed a lot during animation such as a character skin can be dramatically sped up by applying the new gPoly format. This format is the same format that the software uses internally resulting in a much faster playback. This gPoly format works especially well on meshes whose topology doesn't change.

Another key, under-the-hood improvement is that the 3ds Max 2013 is fully Unicode-compliant, which enables multi-language support within a single program. This lets users switch their language choice on the fly. However, Unicode support is only available running under Windows 7. Running 3ds Max on Windows XP is available in English only.

Finally of note is the new feature that lets you work with 3ds Max using the Maya navigation commands. Once the Maya Interaction Mode preference is enabled, users can use the Maya commands to navigate the viewports and to position objects.

Summary

Although I don't see ground shattering features in this latest release, the cumulative effect of all these small and mid-sized improvements is a software package that is easier to use than ever. The ability to seamlessly move CAT characters between 3ds Max and MotionBuilder along with the gPoly format and the ragdoll structures are huge for game developers and support for the major CAD packages opens up 3ds Max to all kinds of new data that required multiple translations before.

3ds Max 2013 and 3ds Max Design 2013 are both available as a stand-alone products. 3ds Max 2013 is also available as part of the Entertainment Creation Suite, bundled with Maya, Mudbox, MotionBuilder, Softimage, and Sketchbook Designer. For more information on 3ds Max 2013, visit the Max product pages on Autodesk’s web site at http://usa.autodesk.com. A free trial version of 3ds Max is also available at www.autodesk.com/3dsmaxtrial.

Autodesk Maya 2013 Review

$
0
0
Introduction

Autodesk Maya 2013 software is available as a stand-alone product; as part of the Maya Entertainment Creation Suite 2013, which includes Maya, Mudbox, MotionBuilder and Sketchbook Designer; as part of the Premium Suite which adds Softimage to the mix; and as part of the Ultimate Suite, which also includes 3ds Max. So, there are several different packages that include Maya.

If you plan on working between the different tools, then the suites are definitely the way to go. There are some cool features such as the Send To commands and Live Connection that share data between different suite applications and that are only available within a suite.

Pipeline Caching and Alembic Files

If you've created a seriously huge model environment or an animated character that is really complex, or a particle simulation that plays back a turtle-speed, then you know the pain of single-digit frame rates. Maya 2013 has a new Pipeline Cache set of tools that lets you save either the entire scene or a selected object as a cached files using the open-source Alembic file format. These saved cached files can then be loaded back into the scene and played back or navigated at a dramatically faster frame rate. This is ideal for moving about a huge data model or playing back just a particle system at a reasonable rate.

The Pipeline Cache menu includes options to export and import files as an Alembic or GPU cache. There are several differences between these two options, but the key visual differences are that the GPU version displays the scene without any textures, only RGBA colors. The GPU cache options also collapses the node hierarchy to a single node making the geometry so it cannot be edited. The benefit for these trade-offs is blinding fast movement about huge scene files. Importing the file as a Alembic cache file isn't quite as fast, but allows editing of geometry and displays applied textures. Both file types use the same Alembic file saved with the .abc extension.

For game developers, this feature lets you load a cached version of a completed environment and move through it at a fast frame rate just like the game player would providing the much needed immediate feedback in the Maya interface, as shown in Figure 1, without having to compile and transport the scene to the game engine.

Attached Image: Figure 1 - Pipeline Cache.jpg

Figure 1: Using the new Pipeline Cache feature you can load and navigate huge data files at a high frame rate. Image courtesy of Autodesk


Node Editor and Attribute Editor Templates

Maya has always been great at letting you get under the hood and tweak various aspects of the current scene and the new Node Editor makes it even easier to work with and tweak individual nodes. This Node Editor, shown in Figure 2, lets you interactively create connections between different attributes which makes it great for creating shading networks. The Node Editor has several display modes including Simple, Connected and Full mode and lets you create bookmarks to find your way back to a specific view.



Attached Image: Figure 2 - Node Editor.jpg

Figure 2: The new Node Editor lets you visualize the connections between nodes and interactively create connections between different attributes.


Using a text editor, you can create and edit XML-based Attribute Editor templates that let you specify which attributes are visible in the Attribute Editor for specific node types. This tool is available as a Bonus Tool which you can download using the Help menu.

Access References in the Outliner

References are great, especially for a team environment, where several artists are working on different pieces of the scene. They let you load in the current version and update it when a newer version is available. Creating, loading and unloading references are easier than ever now that the Outliner includes its new Reference menu. Using this menu, you can create references, load and unload and even export scene objects as references without having to open the Reference Editor.

There is also an option to allow animation curves from referenced files to be edited directly without having to reopen the referenced file.

Working with Characters

Maya 2013 includes many new improvements for working with characters, but of all the improvements, I think the new Heat Map skinning method takes the cake. Traditionally skinning a character with weights is one of the hardest aspects of character creation, but the new Heat Map option in Maya 2013 make the process much easier. This option sets skin weights by treating each influence object as a heat source which cools as you move further from the heat source. The results are much better than the other methods and requires less tweaking to get the skin weights right.

The revolutionary Character Controls that were introduced in the previous edition of Maya has been improved in a number of ways to make working with characters even easier. The various Character Controls have all been combined into a single interface with tabs available for Skeleton, Definition, Controls and Custom Rigs, as shown in Figure 3. The basketball character shown in the figure was loaded from the Maya Visor interface and provides a good example. There is also a new Start Pane to walks you through a character setup. The controls have been opened up so you can define your own custom character templates.

Attached Image: Figure 3 - Character Controls.jpg

Figure 3: All the available Character Controls are now together in a simplified interface making it easier to rig characters.


Animation Improvements

Maya 2013 includes a new Retime Tool that works within the Graph Editor, shown in Figure 4. This tool places visual bars at specific points in the timeline and once placed, you can scale all the animation keys located between those bars by dragging to the left or right which speeds or slows down the animation that is adjacent to the bar's position. You can also lock the bars so that certain sections of animation aren't changed. This gives animators a lot of local control over their animations.


Attached Image: Figure 4 - Retime Tool.jpg

Figure 4: Using the Retime Tool, you can easily speed up or slow down specific areas of your animation.


Retargeting is the magic bullet that lets you reuse animations over and over, but often this is more work than just redoing the animation, but with the new .atom file format, Maya 2013 lets you reuse animations effectively. The .atom file format stands for Animation Transfer Object Model and while importing you can have it match the character hierarchy, match according to joint names or by using a filter template. Once matched up to the current rig, the loaded animation is applied to the new character saving you the trouble of animating from scratch.

When working with separate clips in the Trax Editor, Maya 2013 includes a new Offset setting and a Match Clips feature that lets you match up the clips for better transitions. You can select to Match Translation or Rotation. You can also turn on ghosting to see the clips motion leading to the current frame.

Maya nHair and Bullet Physics

nHair has been added to the Nucleus dynamic simulation framework, which enables the nHair to detect collisions with itself and with other Nucleus objects. It also works much faster than the previous hair system in Maya and has more accurate collision detection. The system also includes a caching feature for saving and playing back hair simulations.

The MayaBullet physics system is also included within Maya 2013. This system, which is installed as a plug-in, includes support for both soft and rigid body dynamics. MayaBullet is only available on 64-bit system and will not work on 32-bit machines.

Viewport 2.0

The Viewport improvements continue to be added to Maya providing a better representation of the scene without having to render the scene. The newest improvements include ghosting features, depth peeling for transparency, single side lighting, better control over lighting effects and area lights. There is also a large number of texture types that are internally baked and you now have control over the viewport fonts and sizes.

Sharing Data with 3ds Max and Live Character Streaming

In the "playing nice with others" category, the File menu includes a new Send to 3ds Max command that moves the current scene over to the 3ds Max. Once loaded in both programs, you can make changes and updates the changes to the other program automatically using the handy little Update icon placed at the bottom of both packages. Be warned that this feature only works between copies of the software that share the same version number.

Another new features found in 3ds Max is that CAT characters created in 3ds Max can be converted to a HumanIK character for use in Maya. This lets you work with characters in either Maya and 3ds Max and move the results to the other software without losing any work.

You can also work with characters between Maya and MotionBuilder by setting up a Live Connection for your HumanIK character. This lets you stream motion capture data applied in MotionBuilder straight to your Maya rig in real-time. This Live Connection is created using the Edit menu or the File, Send To MotionBuilder menu. This causes a Live Connection dialog box to appear which lets you synch the states in the two programs. Once you are happy with the character motion, you can bake the result to the Maya skeleton.

Other Improvements

The Help menu includes a new helpful feature for checking for updates. This opens a dialog box and displays any available hotfixes or service packs.

Maya 2013 can now use the H.264 QuickTime option to output video on 64-bit systems.

There are two new render pass options for UV and World Position. The UV pass converts UV values to red and green values and the World Position pass converts position values to RGB values.

For creating unique textures, the new Mandelbrot texture node has been included. This node lets you add fractals to your textures.

Several new Substance textures have been added to Maya 2013. Substance textures are programmed procedural textures that have a much smaller file size than normal bitmap based textures. The new textures include animated clouds, tiles, metal plates, sunshine, water drips, waves, windscreen glass and more.

mental ray has also been upgraded to version 3.10.

Summary

The 2013 version of Maya once again shows Maya commitment to helping game developers, especially character animators. This version tackles some of the toughest aspects of the pipeline with unique solutions. Another key area of focus is between the different suite applications making them work better together than ever before.

The improvements to Viewport 2.0 and the new Pipeline Cache feature let you see your results quicker with fewer renders letting you work with production quality assets during the development phase.

Maya 2013 is available for Windows, Linux, and Macintosh OS X. The various Entertainment Creation Suite editions are all available for Windows. For more information on any of these products, visit the Autodesk web site located at www.autodesk.com. A free trial version is also available at www.autodesk.com/freetrials.
Viewing all 17825 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>