Difference between revisions of "Horde3D Wiki:HOWTO"
m |
|||
Line 61: | Line 61: | ||
'''Note:''' The code above changes directly the material resource. If several meshes are using the same material, all of them will have the new texture. If that is not desired, you can create a private copy of the material by cloning it. | '''Note:''' The code above changes directly the material resource. If several meshes are using the same material, all of them will have the new texture. If that is not desired, you can create a private copy of the material by cloning it. | ||
+ | |||
+ | |||
+ | == How to display text in the scene == | ||
+ | |||
+ | Usually, text is displayed as part of a GUI or HUD on top of the scene. However, sometimes it can be useful to display text inside the scene at the location of a specific node. The following snippet displays the names of all models at the nodes' origins. For obtaining the right screen position, the node positions are projected and converted to overlay coordinates. | ||
+ | |||
+ | {{CppSourceCode|description= C++ Code|code= | ||
+ | <source lang="cpp" line="1"> | ||
+ | // Get camera view matrix | ||
+ | const float *camTrans; | ||
+ | h3dGetNodeTransMats( _cam, 0x0, &camTrans ); | ||
+ | Matrix4f viewMat( Matrix4f( camTrans ).inverted() ); | ||
+ | |||
+ | // Get camera projection matrix | ||
+ | float camProj[16]; | ||
+ | h3dGetCameraProjMat( _cam, camProj ); | ||
+ | Matrix4f projMat( camProj ); | ||
+ | |||
+ | // Loop over all model nodes | ||
+ | int cnt = h3dFindNodes( H3DRootNode, "", H3DNodeTypes::Model ); | ||
+ | for( int i = 0; i < cnt; ++i ) | ||
+ | { | ||
+ | // Get node name | ||
+ | H3DNode node = h3dGetNodeFindResult( i ); | ||
+ | const char *name = h3dGetNodeParamStr( node, H3DNodeParams::NameStr ); | ||
+ | |||
+ | // Get node position | ||
+ | const float *nodeTrans; | ||
+ | h3dGetNodeTransMats( node, 0, &nodeTrans ); | ||
+ | Vec4f pos( nodeTrans[12], nodeTrans[13], nodeTrans[14], 1 ); | ||
+ | |||
+ | // Project | ||
+ | pos = projMat * viewMat * pos; | ||
+ | float x = pos.x / pos.w; | ||
+ | float y = pos.y / pos.w; | ||
+ | |||
+ | // Transform to overlay coordinates | ||
+ | x = x * 0.5f + 0.5f; | ||
+ | y = -y * 0.5f + 0.5f; | ||
+ | |||
+ | // Show text (avoid back-projection) | ||
+ | if( pos.w > 0 ) h3dutShowText( name, x, y, 0.02f, 1.0f, 1.0f, 1.0f, _fontMatRes, 0 ); | ||
+ | } | ||
+ | </source>}} | ||
}} | }} |
Revision as of 21:13, 25 January 2010
The HOWTO contains quick answers for smaller problems. ContentsHow to enable anti-aliasing (MSAA)Anti-aliasing can only be enabled for render targets. The RenderTarget element used in Pipeline resources has an attribute maxSamples which defines the maximum number of samples used for MSAA. The actual number of samples is controlled by the engine option SampleCount. This makes it possible to control the anti-aliasing quality from the application. If SampleCount is set to zero, MSAA is disabled. Note that the hardware needs to support the EXT_framebuffer_multisample extension in order for the MSAA to work. How to get the size of a loaded textureThe following code queries the dimensions of the base mipmap of a loaded texture:
If you want to get the dimensions of mipmap level n, change the elemIdx parameter which is 0 above to n. How to modify vertex dataVertex data is stored as streams in geometry resources. A pointer to the vertex data can be obtained by mapping a stream. The following code modifies the y coordinates of all vertex positions stored in the specified geometry resource.
How to exchange a texture of a meshConsider you want to exchange the diffuse texture (sampler named albedoMap) of a given mesh (with node handle myMesh) by a texture resource with resource handle myNewTex. You can do that with the following code:
First you need to retrieve the material used by the mesh. After that, you can find the desired sampler in the material. Finally, once you have the sampler index, you can access the sampler data and override its texture resource. Note: The code above changes directly the material resource. If several meshes are using the same material, all of them will have the new texture. If that is not desired, you can create a private copy of the material by cloning it. How to display text in the sceneUsually, text is displayed as part of a GUI or HUD on top of the scene. However, sometimes it can be useful to display text inside the scene at the location of a specific node. The following snippet displays the names of all models at the nodes' origins. For obtaining the right screen position, the node positions are projected and converted to overlay coordinates.
|