c# .net pdf reader : Add page numbers to pdf document application Library tool html .net web page online Pro_Silverlight_5_in_CSharp_4th_edition49-part114

CHAPTER 13  SILVERLIGHT 3D 
484 
Primitive Type 
Description 
TriangleStrip 
The vertex buffer represents a series of connected triangles. The first triangle is 
described by three vertices; each subsequent triangle uses the last vertex from the 
previous triangle and adds two new vertices. 
LineList 
The vertex buffer represents a series of distinct line segments. Each line segment is 
described by two vertices. 
LineStrip 
The vertex buffer represents a series of connected line segments. The first line 
segment is described by two vertices; each subsequent line segment uses the last 
vertex from the previous triangle and adds one new vertex. 
Backface Culling 
As you’ve learned, there are many insidious problems that can prevent your 3D from appearing 
altogether. Here are some common problems you’ve learned about so far, all of which have the same 
discouraging blank-screen symptom: 
• Failing to enable 3D acceleration 
• Forgetting to put a solid black background behind the DrawingSurface 
• Pointing the camera in the wrong direction 
• Putting the camera too close or too far, so the object falls outside of the viewing 
frustrum 
• Failing to enable vertex shading in the BasicEffect object 
There’s one more mistake that can make your 3D shapes disappear: if you define your vertices in a 
counterclockwise order, instead of clockwise. That’s because Silverlight uses a technique called backface 
culling to remove any surfaces that appear to be the back sides of an object. (Technically, backface 
culling is meant to improve performance by not drawing the unneeded back surface of an object. The 
problem is that Silverlight uses a relatively crude test—it assumes that if a shape is drawn 
counterclockwise, relative to the position of the camera, that shape is a back face.) 
Here’s an example of some problematic code that draws a triangle in counterclockwise order, by 
swapping the first and third vertices from the previous example: 
VertexPositionColor[] vertices = new VertexPositionColor[3]; 
vertices[0] = new VertexPositionColor(bottomRight, color2); 
vertices[1] = new VertexPositionColor(topCenter, color3); 
vertices[2] = new VertexPositionColor(bottomLeft, color1); 
When you render this vertex buffer, no triangle will appear. 
www.it-ebooks.info
Add page numbers to pdf document - insert pages into PDF file in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Guide C# Users to Insert (Empty) PDF Page or Pages from a Supported File Format
add page numbers to pdf document in preview; add blank page to pdf
Add page numbers to pdf document - VB.NET PDF Page Insert Library: insert pages into PDF file in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Easy to Use VB.NET APIs to Add a New Blank Page to PDF Document
adding page numbers to pdf document; adding a page to a pdf in reader
CHAPTER 13  SILVERLIGHT 3D 
485 
 Note  Backface culling works a little differently with the TriangleStrip. Unlike the TriangleList, the TriangleStrip 
“flips” the backface culling order on every even-numbered triangle. That means that even-numbered 
counterclockwise triangles appear, but odd-numbered clockwise triangles do not. 
If you’re running into a problem with backface culling, you can simply turn it off. To do so, you need 
to replace the GraphicState.RasterizerState object with a new RasterizerState object. You can do this 
anywhere in your drawing code (when responding to the Drawing event), before you actually call 
DrawPrimitives(): 
device.RasterizerState = new RasterizerState() 
CullMode = CullMode.None 
}; 
The RasterizerState object also gives you a few more properties to tweak. Most usefully, you can 
switch the rendering into wireframe mode so that the triangle lines are shown with no inside fill. This 
makes it easier to see how different objects in a scene overlap. 
device.RasterizerState = new RasterizerState() 
FillMode = FillMode.WireFrame 
}; 
Scaling Your Drawing 
In the current example, the DrawingSurface is assigned a fixed size (a width of 400 pixels and height of 
300 pixels). But in many applications, you’ll want to give the user the chance to resize the browser 
window, and you’ll size your 3D drawing to match. 
To implement this technique, you first need to remove the hard-coded Width and Height properties 
from the DrawingSurface control in the markup for your page. Then, you need to respond to the 
SizeChanged event of the DrawingSurface, or its container, and adjust the projection appropriately: 
private void DrawingSurface_SizeChanged(object sender, SizeChangedEventArgs e) 
{             
// Apply new scale. 
float aspectRatio = (float)e.NewSize.Width / (float)e.NewSize.Height; 
Matrix view = Matrix.CreateLookAt(new Vector3(0, 0, 5), Vector3.Zero, 
Vector3.Up); 
Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, 
aspectRatio, 1, 10);             
effect.Projection = view * projection;  
This code determines the current aspect ratio of the DrawingSurface and uses that to calculate the 
aspect ratio that it should use for the projection. It then applies this projection to the current BasicEffect. 
You also need to trigger the actual redraw operation. It makes sense to end the SizeChanged event 
handler with a call to DrawingSurface.Invalidate(), but in practice this causes flicker and occasional 
glitches, perhaps because of the overlap between the Windows operating system drawing (of the 
www.it-ebooks.info
C# Create PDF Library SDK to convert PDF from other file formats
offer them the ability to count the page numbers of generated document in C#.NET using this PDF document creating toolkit, if you need to add some text
adding page numbers to pdf in preview; add remove pages from pdf
C# Word - Word Create or Build in C#.NET
also offer them the ability to count the page numbers of generated using this Word document adding control, you can add some additional Create Word From PDF.
add page number to pdf print; adding page numbers to a pdf document
CHAPTER 13  SILVERLIGHT 3D 
486 
background) and the 3D rendering (of the surface). Instead, it’s customary to trigger an immediate 
refresh at the end of the drawing routine, to ensure the drawing is kept continuously up to date: 
private void drawingSurface_Draw(object sender, DrawEventArgs e) 
... 
e.InvalidateSurface(); 
Fortunately, this has a negligible effect on performance, because Silverlight’s 3D pipeline offloads 
the work to the video card. It’s also the technique you’ll need to use if you add any animation or 
interactivity to your 3D content later. 
 Note  If your aspect ratio doesn’t match the dimensions of your DrawingSurface, your content will be stretched 
one way to fit. 
Complex Objects and Textures 
Going to the trouble of vertex buffers, effects, views, and projections is a lot of work for a single triangle. 
And because this triangle is completely flat, it hardly seems like a decent example of three-dimensional 
drawing. But now that you understand the basic concepts of Silverlight 3D, you’re ready to create more 
complex shapes. 
Once you’ve mastered the lowly triangle, the next step up is to create a solid, faceted shape by 
assembling a small group of flat, 2D triangles. In the following example, you’ll create a cube. 
A cube consists of six square sides. Each square side needs two triangles. Each square side can then 
be joined to the adjacent side at an angle. Figure 13-9 shows how a cube breaks down into triangles that 
you can model. 
Figure 13-9. Breaking the cube into triangles 
To reduce overhead and improve performance in a 3D program, it’s common to avoid rendering 
shapes that you won’t see. For example, if you know you’ll never look at the underside of the cube shown 
in Figure 13-9, there’s no reason to define the two triangles for that side. However, in this example you’ll 
define every side so you can rotate the cube freely or move the camera around it. 
www.it-ebooks.info
C# PowerPoint - PowerPoint Creating in C#.NET
offer them the ability to count the page numbers of generated in C#.NET using this PowerPoint document creating toolkit, if you need to add some text
adding page numbers to pdf in reader; add page to pdf reader
C# Word - Word Creating in C#.NET
offer them the ability to count the page numbers of generated document in C#.NET using this Word document creating toolkit, if you need to add some text
add page break to pdf; add page number to pdf file
CHAPTER 13  SILVERLIGHT 3D 
487 
Drawing a Cube 
The basic infrastructure in this example is the same as in the first, single-triangle example. First, you 
need the same two member fields that store the vertex buffer and the effect object: 
private VertexBuffer vertexBuffer; 
private BasicEffect effect; 
You fill the vertex buffer just before the page appears (in the constructor), usually by calling another 
method that you’ve created (like the PrepareDrawing() method). In this method, the first step is to define 
the colors you want to use: 
private void PrepareDrawing() 
Color colorRed = new Color(255, 0, 0); 
Color colorBlue = new Color(0, 255, 0); 
Color colorGreen = new Color(0, 0, 255); 
Color colorWhite = new Color(255, 255, 255); 
... 
The next step is to define the points you want to use for the triangles. As Figure 13-9 makes clear, 
every vertex is a corner of the cube, and so every vertex is shared with three to six triangles, depending 
on exactly where you divide the sides. To make this pile of vertices easier to manage, it makes sense to 
define the points, separately, and then reuse them to create the vertices you need. 
It’s clear that every cube needs eight points in total, four for the square that makes up the front side 
and four for the square that makes up the backside: 
...     
Vector3 topLeft = new Vector3(-1, 1, 0); 
Vector3 bottomLeft = new Vector3(-1, -1, 0); 
Vector3 topRight = new Vector3(1, 1, 0); 
Vector3 bottomRight = new Vector3(1, -1, 0); 
Vector3 topLeftFront = new Vector3(-1, 1, 1); 
Vector3 bottomLeftFront = new Vector3(-1, -1, 1); 
Vector3 topRightFront = new Vector3(1, 1, 1); 
Vector3 bottomRightFront = new Vector3(1, -1, 1); 
Vector3 topLeftBack = new Vector3(-1, 1, -1); 
Vector3 topRightBack = new Vector3(1, 1, -1); 
Vector3 bottomLeftBack = new Vector3(-1, -1, -1); 
Vector3 bottomRightBack = new Vector3(1, -1, -1); 
... 
And as Figure 13-9 makes clear, every cube also has twelve triangles, two for each face. That means 
that every triangle requires three vertices, and the entire cube needs a total of thirty-six triangles to draw 
every side: 
...     
VertexPositionColor[] vertices = new VertexPositionColor[36]; 
... 
Here’s the code that stitches the eight points into the thirty-six vertices you need: 
...     
// The front face. 
www.it-ebooks.info
VB.NET TIFF: VB.NET Sample Codes to Sort TIFF File with .NET
manipulating multi-page TIFF (Tagged Image File), PDF, Microsoft Office If you want to add barcode into a TIFF a multi-page TIFF file with page numbers using VB
add page numbers to pdf files; add blank page to pdf preview
C# Excel: Create and Draw Linear and 2D Barcodes on Excel Page
can also load document like PDF, TIFF, Word get the first page BasePage page = doc.GetPage REImage barcodeImage = linearBarcode.ToImage(); // add barcode image
add pages to pdf online; adding page to pdf in preview
CHAPTER 13  SILVERLIGHT 3D 
488 
vertices[0] = new VertexPositionColor(topRightFront, colorBlue); 
vertices[1] = new VertexPositionColor(bottomLeftFront, colorBlue); 
vertices[2] = new VertexPositionColor(topLeftFront, colorBlue); 
vertices[3] = new VertexPositionColor(topRightFront, colorGreen); 
vertices[4] = new VertexPositionColor(bottomRightFront, colorGreen); 
vertices[5] = new VertexPositionColor(bottomLeftFront, colorGreen); 
// The back face. 
vertices[6] = new VertexPositionColor(bottomLeftBack, colorRed); 
vertices[7] = new VertexPositionColor(topRightBack, colorRed); 
vertices[8] = new VertexPositionColor(topLeftBack, colorRed); 
vertices[9] = new VertexPositionColor(bottomRightBack, colorWhite); 
vertices[10] = new VertexPositionColor(topRightBack, colorWhite); 
vertices[11] = new VertexPositionColor(bottomLeftBack, colorWhite); 
// The top face. 
vertices[12] = new VertexPositionColor(topLeftBack, colorRed); 
vertices[13] = new VertexPositionColor(topRightBack, colorRed); 
vertices[14] = new VertexPositionColor(topLeftFront, colorRed); 
vertices[15] = new VertexPositionColor(topRightBack, colorWhite); 
vertices[16] = new VertexPositionColor(topRightFront, colorWhite); 
vertices[17] = new VertexPositionColor(topLeftFront, colorWhite); 
// The bottom face. 
vertices[18] = new VertexPositionColor(bottomRightBack, colorWhite); 
vertices[19] = new VertexPositionColor(bottomLeftBack, colorWhite); 
vertices[20] = new VertexPositionColor(bottomLeftFront, colorWhite); 
vertices[21] = new VertexPositionColor(bottomRightFront, colorGreen); 
vertices[22] = new VertexPositionColor(bottomRightBack, colorGreen); 
vertices[23] = new VertexPositionColor(bottomLeftFront, colorGreen); 
// The left face. 
vertices[24] = new VertexPositionColor(bottomLeftFront, colorGreen); 
vertices[25] = new VertexPositionColor(bottomLeftBack, colorGreen); 
vertices[26] = new VertexPositionColor(topLeftFront, colorGreen); 
vertices[27] = new VertexPositionColor(topLeftFront, colorRed); 
vertices[28] = new VertexPositionColor(bottomLeftBack, colorRed); 
vertices[29] = new VertexPositionColor(topLeftBack, colorRed); 
// The right face. 
vertices[30] = new VertexPositionColor(bottomRightBack, colorRed); 
vertices[31] = new VertexPositionColor(bottomRightFront, colorRed); 
vertices[32] = new VertexPositionColor(topRightFront, colorRed); 
vertices[33] = new VertexPositionColor(bottomRightBack, colorBlue); 
vertices[34] = new VertexPositionColor(topRightFront, colorBlue); 
vertices[35] = new VertexPositionColor(topRightBack, colorBlue);     
... 
www.it-ebooks.info
C# Excel - Excel Creating in C#.NET
also offer them the ability to count the page numbers of generated in C#.NET using this Excel document creating toolkit, if you need to add some text
add and remove pages from a pdf; add a page to a pdf online
VB.NET Image: Guide to Convert Images to Stream with DocImage SDK
Follow this guiding page to learn how to easily convert a single image or numbers of it an image processing component which can enable developers to add a wide
add a page to a pdf document; add page number to pdf online
CHAPTER 13  SILVERLIGHT 3D 
489 
SHADING THE CUBE 
In this example, each triangle is given a solid color. (For example, one is blue, the adjacent one is green, 
and so on.) This makes it easy to distinguish the triangles you’ve drawn. However, in a more realistic 
application, you’d probably choose to use different-colored vertices so that your triangles are shaded. 
Usually, you’ll want the triangles on one face to blend into each other, so you’ll keep using the same color 
for each vertex, even when it’s in a different triangle: 
// The front face. 
vertices[0] = new VertexPositionColor(topRightFront, colorBlue); 
vertices[1] = new VertexPositionColor(bottomLeftFront, colorGreen); 
vertices[2] = new VertexPositionColor(topLeftFront, colorRed); 
vertices[3] = new VertexPositionColor(topRightFront, colorBlue); 
vertices[4] = new VertexPositionColor(bottomRightFront, colorWhite); 
vertices[5] = new VertexPositionColor(bottomLeftFront, colorGreen); 
The drawback of this approach is that it can obscure the edges of your cube, because one colored face 
may blend into another. Figure 13-10 shows the cube drawn two ways, with solid triangles on the left, and 
one example of blended triangles on the right. 
Figure 13-10. Differently shaded cubes 
Once you’ve defined the vertices, you have the familiar tasks of creating and initializing the vertex 
buffer and then creating the BasicEffect and configuring it with the view and projection settings for the 
current camera. Here’s the code that does that, which is essentially the same as in the single-triangle 
example: 
...     
// Set up the vertex buffer. 
GraphicsDevice device = GraphicsDeviceManager.Current.GraphicsDevice; 
vertexBuffer = new VertexBuffer(device, typeof(VertexPositionColor), 
vertices.Length, BufferUsage.WriteOnly); 
vertexBuffer.SetData(0, vertices, 0, vertices.Length, 0); 
// Configure the camera. 
Matrix view = Matrix.CreateLookAt(new Vector3(1, 1, 3), Vector3.Zero, 
Vector3.Up);             
www.it-ebooks.info
C# Word: How to Use C# Code to Print Word Document for .NET
are also available within C# Word Printer Add-on , like pages at one paper, setting the page copy numbers to be C# Class Code to Print Certain Page(s) of Word.
add pages to pdf without acrobat; adding page numbers to pdf
C#: Use XImage.OCR to Recognize MICR E-13B, OCR-A, OCR-B Fonts
may need to scan and get check characters like numbers and codes. page.RecSettings. LanguagesEnabled.Add(Language.Other); page.RecSettings.OtherLanguage
add page number pdf; add page to existing pdf file
CHAPTER 13  SILVERLIGHT 3D 
490 
Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, 
1.33f, 1, 100); 
// Set up the effect. 
effect = new BasicEffect(device); 
effect.World = Matrix.Identity; 
effect.View = view; 
effect.Projection = view * projection; 
effect.VertexColorEnabled = true
Finally, you can use the same drawing code as you used in the single-triangle example. That’s 
because you are performing essentially the same task—copying your vertex buffer to the GraphicsDevice 
and rendering it as a triangle list: 
private void drawingSurface_Draw(object sender, DrawEventArgs e) 
GraphicsDevice device = GraphicsDeviceManager.Current.GraphicsDevice; 
device.Clear(new Color(0, 0, 0)); 
device.SetVertexBuffer(vertexBuffer); 
foreach (EffectPass pass in effect.CurrentTechnique.Passes) 
pass.Apply(); 
device.DrawPrimitives(PrimitiveType.TriangleList,  
0, vertexBuffer.VertexCount / 3); 
The cube is a genuine 3D object, although it may still look rather unimpressive when it’s just part of 
a static scene. But because it’s a true object, look at it from different vantage points with the camera or 
rotate it—as you’ll see later in this chapter. 
Adding Textures 
Every pixel shader paints the pixels in your triangles using some sort of formula. The BasicEffect uses a 
relatively basic but still quite practical pixel shader that interpolates a color for each pixel using the three 
vertices. This process can create attractive shading, but it’s not always what you want. 
Another option is to use a texture, a bitmap that’s overlaid onto your 3D object. Every texture 
because as a 2D bitmap—essentially, an ordinary image file. But when you map that 2D texture onto a 
3D shape, it becomes stretched and warped to fit the shape’s contours. You can think of it as though 
you’re taking your shape and covering it tightly with some plastic wrap (that’s the 2D texture). 
The basics of texturing are easy. In the following example you’ll apply it to the cube to create the 
result shown in Figure 13-11. 
www.it-ebooks.info
CHAPTER 13  SILVERLIGHT 3D 
491 
Figure 13-11. A textured cube 
The first step is to change the way you define your vertices. When shading a shape in with color, you 
use the VertexPositionColor class. When applying a texture to a shape, you replace this with the 
VertexPositionTextureClass: 
VertexPositionTexture[] vertices = new VertexPositionTexture[36]; 
Like VertexPositionColor, VertexPositionTextureClass requires a Vector3 object that represents your 
vertex. But instead of coupling that with a Color object, it matches it with a texture coordinate stored in a 
Vector2. Here’s an example: 
vertices[0] = new VertexPositionTexture(topRightFront, new Vector2(1, 0)); 
At first glance, this may seem a bit odd. After all, you’re probably expecting the 
VertexPositionTexture to combine a vertex and some sort of texture object. However, this isn’t what 
happens, because of the way texturing works. With texturing, a single object like the cube will typically 
have a single texture that wraps its entire surface. It isn’t appropriate to pair vertices with textures, 
because that would give each individual triangle three textures, which definitely isn’t what you want. 
So, what’s the point of the texture coordinate? The texture coordinate tells Silverlight where to start 
grabbing the image data from the texture. In the previous example, the first vertex is paired up with the 
point (1,0) in the texture image. Texture coordinates use a scale of 0 to 1, so the point (1,0) actually 
represents the top-right corner of the texture (where x=1 and y=0). So, the end result is that the first 
vertex, which is positioned in the top-right corner of the front face of the cube, is pinned to the top-right 
corner of the texture (Figure 13-12). 
www.it-ebooks.info
CHAPTER 13  SILVERLIGHT 3D 
492 
Figure 13-12. Texture coordinates 
 Note  Technically, texture coordinates use something called the (u,v) system, where u represents horizontal and 
v represents vertical. This corresponds perfectly well to (x,y) points, but the change in name emphasizes the 
change in units. As you’ve seen, (u,v) points are fractional values from 0 to 1—they represent a relative 
percentage of the texture size, rather than absolute pixel dimensions. 
Lining your textures up with your vertices can get a bit tricky. It’s important that the two adjacent 
triangles on the same cube face place the texture in the same orientation so the image is drawn 
seamlessly over that side. To make this drawing process easier, it’s a good idea to define the four corners 
of the texture using Vector2 objects, before you begin creating VertexPositionTexture objects. 
Vector2 textureTopLeft = new Vector2(0, 0); 
Vector2 textureTopRight = new Vector2(1, 0); 
Vector2 textureBottomLeft = new Vector2(0, 1); 
Vector2 textureBottomRight = new Vector2(1, 1); 
Then you can use these coordinates to build your VertexPositionTexture objects, like this: 
// The front face. 
vertices[0] = new VertexPositionTexture(topRightFront, textureTopRight); 
vertices[1] = new VertexPositionTexture(bottomLeftFront, textureBottomLeft); 
vertices[2] = new VertexPositionTexture(topLeftFront, textureTopLeft); 
vertices[3] = new VertexPositionTexture(topRightFront, textureTopRight); 
vertices[4] = new VertexPositionTexture(bottomRightFront, textureBottomRight); 
vertices[5] = new VertexPositionTexture(bottomLeftFront, textureBottomLeft); 
www.it-ebooks.info
CHAPTER 13  SILVERLIGHT 3D 
493 
This code places the texture on a single face of the cube. The key detail to note is that the two 
triangles use consistent texture coordinates. For example, the point topRightFront is included in both of 
the triangles that make up the side, and both times it’s paired up with the same texture coordinate. To 
see the complete code that creates the VertexPositionTexture objects for all six sides of the cube, 
download the sample project for this chapter. 
Once you define all the vertices, using VertexPositionTexture objects, you can create the 
VertexBuffer and the camera in the usual way: 
GraphicsDevice device = GraphicsDeviceManager.Current.GraphicsDevice; 
vertexBuffer = new VertexBuffer(device, typeof(VertexPositionTexture), 
vertices.Length, BufferUsage.WriteOnly); 
vertexBuffer.SetData(0, vertices, 0, vertices.Length, 0); 
// (Configure the camera here, using the same code as before.) 
The next step is to configure the BasicEffect object. Here is where the process changes. Unlike 
before, you will no longer set the BasicEffect.VertexColorEnabled property. Instead, you will set the 
BasicEffect.TextureEnabled property to use the BasicEffect’s built-in texturing abilities: 
effect = new BasicEffect(device); 
effect.World = Matrix.Identity; 
effect.View = view; 
effect.Projection = view * projection; 
effect.TextureEnabled = true
Now you need to load the texture image (typically, from a resource in your project) and use that to 
create a Texture2D object. There’s a little bit of juggling involved here, because you need to first pull the 
data out of a stream and place it in a BitmapImage and then move it from the BitmapImage to a 
Texture2D. Finally, you pass that Texture2D object to BasicEffect by setting its Texture property: 
// Load the texture from a resource, and place it in a BitmapImage. 
string uri = "Silverlight3D;component/mayablur.jpg"
Stream s = Application.GetResourceStream(new Uri(uri, UriKind.Relative)).Stream; 
BitmapImage bmp = new BitmapImage(); 
bmp.SetSource(s); 
// Copy the BitmapImage data into a Texture2D object. 
Texture2D texture; 
texture = new Texture2D(device, bmp.PixelWidth, bmp.PixelHeight); 
bmp.CopyTo(texture); 
// Set the texture. 
effect.Texture = texture; 
This last step is to tweak the drawing code by adding the following statement: 
private void drawingSurface_Draw(object sender, DrawEventArgs e) 
GraphicsDevice device = GraphicsDeviceManager.Current.GraphicsDevice; 
device.SamplerStates[0] = SamplerState.LinearClamp; 
... 
This allows XNA to map any texture graphic. Without use the SampleState.LinearClamp, your 
texture graphic needs to have pixel dimensions that are a power of two. (For example, valid texture 
www.it-ebooks.info
Documents you may be interested
Documents you may be interested