Click here to Skip to main content
15,886,199 members
Articles / Multimedia / GDI+

A complete C# Screensaver that does double-buffering on multiple monitor systems!

Rate me:
Please Sign up or sign in to vote.
4.75/5 (37 votes)
24 Jun 200534 min read 272.8K   1.8K   190  
Example screensaver in source code. Does a mini-preview too!
  • swarmscreensaver_src.zip
    • SwarmScreenSaver
      • CodeCommentReport
        • banner.htm
        • banner.jpg
        • CodeCommentReportError.htm
        • commentreport.css
        • CommonCode
        • darkcorner.jpg
        • gradleft.jpg
        • gradtop.jpg
        • graycorner.jpg
        • Insects
        • minus.jpg
        • plus.jpg
        • Solution_SwarmScreenSaver.HTM
        • SwarmScreenSaver
          • CWP0.HTM
          • CWP10.HTM
          • CWP100.HTM
          • CWP101.HTM
          • CWP102.HTM
          • CWP103.HTM
          • CWP104.HTM
          • CWP105.HTM
          • CWP106.HTM
          • CWP107.HTM
          • CWP108.HTM
          • CWP109.HTM
          • CWP11.HTM
          • CWP110.HTM
          • CWP111.HTM
          • CWP112.HTM
          • CWP113.HTM
          • CWP114.HTM
          • CWP115.HTM
          • CWP116.HTM
          • CWP117.HTM
          • CWP118.HTM
          • CWP119.HTM
          • CWP12.HTM
          • CWP120.HTM
          • CWP121.HTM
          • CWP122.HTM
          • CWP123.HTM
          • CWP124.HTM
          • CWP125.HTM
          • CWP126.HTM
          • CWP127.HTM
          • CWP128.HTM
          • CWP129.HTM
          • CWP13.HTM
          • CWP130.HTM
          • CWP131.HTM
          • CWP132.HTM
          • CWP134.HTM
          • CWP135.HTM
          • CWP136.HTM
          • CWP137.HTM
          • CWP138.HTM
          • CWP139.HTM
          • CWP14.HTM
          • CWP140.HTM
          • CWP141.HTM
          • CWP142.HTM
          • CWP143.HTM
          • CWP144.HTM
          • CWP145.HTM
          • CWP146.HTM
          • CWP147.HTM
          • CWP148.HTM
          • CWP149.HTM
          • CWP15.HTM
          • CWP150.HTM
          • CWP151.HTM
          • CWP152.HTM
          • CWP153.HTM
          • CWP154.HTM
          • CWP155.HTM
          • CWP156.HTM
          • CWP157.HTM
          • CWP158.HTM
          • CWP159.HTM
          • CWP16.HTM
          • CWP160.HTM
          • CWP161.HTM
          • CWP162.HTM
          • CWP163.HTM
          • CWP164.HTM
          • CWP165.HTM
          • CWP166.HTM
          • CWP167.HTM
          • CWP168.HTM
          • CWP169.HTM
          • CWP17.HTM
          • CWP170.HTM
          • CWP171.HTM
          • CWP172.HTM
          • CWP173.HTM
          • CWP174.HTM
          • CWP175.HTM
          • CWP176.HTM
          • CWP177.HTM
          • CWP178.HTM
          • CWP179.HTM
          • CWP18.HTM
          • CWP180.HTM
          • CWP181.HTM
          • CWP182.HTM
          • CWP183.HTM
          • CWP184.HTM
          • CWP185.HTM
          • CWP186.HTM
          • CWP187.HTM
          • CWP188.HTM
          • CWP189.HTM
          • CWP19.HTM
          • CWP190.HTM
          • CWP191.HTM
          • CWP192.HTM
          • CWP2.HTM
          • CWP20.HTM
          • CWP21.HTM
          • CWP22.HTM
          • CWP23.HTM
          • CWP24.HTM
          • CWP25.HTM
          • CWP26.HTM
          • CWP27.HTM
          • CWP28.HTM
          • CWP29.HTM
          • CWP3.HTM
          • CWP31.HTM
          • CWP32.HTM
          • CWP33.HTM
          • CWP34.HTM
          • CWP35.HTM
          • CWP36.HTM
          • CWP38.HTM
          • CWP39.HTM
          • CWP4.HTM
          • CWP40.HTM
          • CWP41.HTM
          • CWP42.HTM
          • CWP43.HTM
          • CWP44.HTM
          • CWP45.HTM
          • CWP46.HTM
          • CWP47.HTM
          • CWP48.HTM
          • CWP49.HTM
          • CWP5.HTM
          • CWP50.HTM
          • CWP51.HTM
          • CWP52.HTM
          • CWP53.HTM
          • CWP54.HTM
          • CWP55.HTM
          • CWP56.HTM
          • CWP57.HTM
          • CWP58.HTM
          • CWP59.HTM
          • CWP6.HTM
          • CWP60.HTM
          • CWP61.HTM
          • CWP62.HTM
          • CWP63.HTM
          • CWP64.HTM
          • CWP65.HTM
          • CWP66.HTM
          • CWP67.HTM
          • CWP68.HTM
          • CWP69.HTM
          • CWP7.HTM
          • CWP70.HTM
          • CWP71.HTM
          • CWP72.HTM
          • CWP73.HTM
          • CWP74.HTM
          • CWP75.HTM
          • CWP76.HTM
          • CWP77.HTM
          • CWP78.HTM
          • CWP79.HTM
          • CWP8.HTM
          • CWP80.HTM
          • CWP81.HTM
          • CWP82.HTM
          • CWP83.HTM
          • CWP84.HTM
          • CWP85.HTM
          • CWP86.HTM
          • CWP88.HTM
          • CWP9.HTM
          • CWP90.HTM
          • CWP91.HTM
          • CWP92.HTM
          • CWP93.HTM
          • CWP94.HTM
          • CWP95.HTM
          • CWP96.HTM
          • CWP97.HTM
          • CWP98.HTM
          • CWP99.HTM
          • SwarmScreenSaver.HTM
        • titletile.jpg
        • vt.js
      • CommonCode
      • Insects
      • SwarmScreenSaver.sln
      • SwarmScreenSaver
<!-- saved from url=(0014)about:Swarm -->
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>Insects.clsInsects</TITLE>
<LINK REL=STYLESHEET HREF="../CommentReport.css" TYPE="text/css">
</HEAD>
<BODY topmargin=0 rightmargin=0 leftmargin=0 style="background-image: url(../titletile.jpg); background-repeat:repeat-x; background-position: 0 0;" >
<DIV CLASS="PageHeading">Insects.clsInsects Class</DIV>
<DIV CLASS="Description">

Copyright (c) 1988-91 by Patrick J. Naughton.<br>
Permission to use, copy, modify, and distribute this software and its<br>
documentation for any purpose and without fee is hereby granted,<br>
provided that the above copyright notice appear in all copies and that<br>
both that copyright notice and this permission notice appear in<br>
supporting documentation.<br>
<br>
This file is provided AS IS with no warranties of any kind.  The author<br>
shall have no liability with respect to the infringement of copyrights,<br>
trade secrets or any patents by this file or any part thereof.  In no<br>
event will the author be liable for any lost revenue or profits or<br>
other special, indirect and consequential damages.<br>
<br>
______________________________________________________________________<br>
Patrick J. Naughton                email: naughton@sun.com<br>
Sun Microsystems Laboratories, Inc.        voice: (415) 336 - 1080<br>
Ported from Unix to Dos then to Windows by: Garry Freemyer (530) 877-1053<br>
<br>
This class contains the info on the swarms, the state of the swarm, and the wasp and the<br>
intitialization routines and drawing methods to run this screensaver to any Graphics object passed in.

<P>

</DIV>
<IMG src="../GradLeft.jpg" width=7 height=378 alt="" border="0" style="position:absolute; left:10; top:18;z-Index:2">
<IMG src="../GradTop.jpg" width=352 height=7 alt="" border="0" align="top" style="position:absolute; left:10; top:18; z-index:1">
<DIV CLASS="Remarks">
<SPAN CLASS="RemarkHdrX">Access: </SPAN>Public</DIV>
<DIV CLASS="Remarks">
<SPAN CLASS="RemarkHdrX">Base Classes: </SPAN>Object</DIV>
<TABLE CLASS="InfoTable" cellpadding=0 cellspacing=0>
<TR height=20>
<TD width=20>&nbsp;</TD>
<TD valign=top align=left width=9 bgcolor="#cccc66"><IMG SRC="../graycorner.jpg" align=top></TD>
<TD CLASS="TableLightLabel" WIDTH=206>Members</TD>
<TD CLASS="TableLightLabel" >Description</TD>
<TD width=20>&nbsp;</TD>
</TR>
<TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP4.HTM" TARGET="CNTFRAME">StopNow</A></TD>
<TD CLASS="TableLightDesc">
This is used for the caller to inform Insects that it needs to stop now!<br>
This is used in IF and For statements to help this class stop drawing<br>
when the screen is to be destroyed.<br>
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP5.HTM" TARGET="CNTFRAME">eraseOldLines</A></TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP6.HTM" TARGET="CNTFRAME">Bees</A></TD>
<TD CLASS="TableLightDesc">
Default value is a count of 144. Count of bees. This is configureable. Defualts are required here<br>
because the program cries foul when I pass them to methods, it thinks I'm going to try to access an<br>
unassigned variable. Pah!
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP7.HTM" TARGET="CNTFRAME">BeeVel</A></TD>
<TD CLASS="TableLightDesc">
Default Bee Velocity although this is recalculated later to be 92% of overall velocity.<br>
This is configureable.
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP8.HTM" TARGET="CNTFRAME">ColorCycleSeconds</A></TD>
<TD CLASS="TableLightDesc">
How many seconds before the swarm color changes. Default:1 Configureable.
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP9.HTM" TARGET="CNTFRAME">GlitterModeWanted</A></TD>
<TD CLASS="TableLightDesc">
Whether Glotter is wanted. Default is false. <br>
Drawing is done to a in memory bit map and then is copied to the screen. No flicker, faster drawing!
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP10.HTM" TARGET="CNTFRAME">screenHeight</A></TD>
<TD CLASS="TableLightDesc">
height of drawing area in pixels.
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP11.HTM" TARGET="CNTFRAME">screenWidth</A></TD>
<TD CLASS="TableLightDesc">
Width of drawing area in pixels.
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP12.HTM" TARGET="CNTFRAME">Border</A></TD>
<TD CLASS="TableLightDesc">
Wasp is not allowed any closer to edge of screen than this value.<br>
This is to reduce the swarm going off screen.
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP13.HTM" TARGET="CNTFRAME">WaspOldX</A></TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP14.HTM" TARGET="CNTFRAME">WaspOldY</A></TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP15.HTM" TARGET="CNTFRAME">WaspX</A></TD>
<TD CLASS="TableLightDesc">
Wasp X position as a three int element array. I don't know why 3 elements.
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP16.HTM" TARGET="CNTFRAME">WaspY</A></TD>
<TD CLASS="TableLightDesc">
Wasp Y position as a three int element array. I don't know why 3 elements.
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP17.HTM" TARGET="CNTFRAME">WaspVel</A></TD>
<TD CLASS="TableLightDesc">
Default wasp max velocity. Configureable. It is compared against the two X and Y<br>
velocity of the Wasp and the bees.
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP18.HTM" TARGET="CNTFRAME">WaspXVel</A></TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP19.HTM" TARGET="CNTFRAME">WaspYVel</A></TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP20.HTM" TARGET="CNTFRAME">dtColorCycleSecondsTime</A></TD>
<TD CLASS="TableLightDesc">
Used to determine if it's time for the swarm to change color. First run through, we add -1 variables to<br>
thia variable, to make it PAST time to pick a color. I don't want to always start with red.
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP21.HTM" TARGET="CNTFRAME">TIMES</A></TD>
<TD CLASS="TableLightDesc">
I think there could have been a better name for this variable but such is the original code.<br>
First Rank for x and y in swarmstruc. Ex: x[Times,Bee#] = SomeVelocity; 
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP22.HTM" TARGET="CNTFRAME">BeeAccMax</A></TD>
<TD CLASS="TableLightDesc">
Ohhh some constants. I wish steady work was a constant for me instead<br>
of jumping from one Titanic to another.<br> 
Maximum accelleration for bees. A speed limit for the byte cops!
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP23.HTM" TARGET="CNTFRAME">WaspAccMax</A></TD>
<TD CLASS="TableLightDesc">
Maximum Wasp Accelleration. Accelleration is not to be confused with Velocity.
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP24.HTM" TARGET="CNTFRAME">SwarmPen</A></TD>
<TD CLASS="TableLightDesc">
This pen is for drawing the swarm. Second parameter is the width of the line in pixels.<br>
Default color is red.
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP25.HTM" TARGET="CNTFRAME">WaspPen</A></TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP26.HTM" TARGET="CNTFRAME">BlackPen</A></TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP27.HTM" TARGET="CNTFRAME">commFunctions</A></TD>
<TD CLASS="TableLightDesc">
An instance of the class CommonFunctions. The random number and color contrast functions are here.<br>
The contrast functions are used to ensure that the swarm not too dark to see.
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP29.HTM" TARGET="CNTFRAME">swarm</A></TD>
<TD CLASS="TableLightDesc">
Creates ONE swarm of bees to flee. Ouch!!
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP31.HTM" TARGET="CNTFRAME">clsInsects</A></TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP32.HTM" TARGET="CNTFRAME">~clsInsects</A></TD>
<TD CLASS="TableLightDesc">
Created a destructor to rid the SwarmPen and commFunctions.
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP33.HTM" TARGET="CNTFRAME">initSwarm</A></TD>
<TD CLASS="TableLightDesc">
Initializes some variables and allocates arrays. See source code in clsInsects.cs<br>
In the GetConfig call, the out variables are set there in the call like a reference.
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP34.HTM" TARGET="CNTFRAME">SetSwarmPenToRandRgbColor</A></TD>
<TD CLASS="TableLightDesc">
Gets a random color into the SwarmPen.Color.<br>
then calls AdjustForeColorBrightnessForBackColor to brighten up invisible colors.
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP35.HTM" TARGET="CNTFRAME">GetRandRgbColor</A></TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP36.HTM" TARGET="CNTFRAME">DrawBees</A></TD>
<TD CLASS="TableLightDesc">
draws bees.<br>
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP38.HTM" TARGET="CNTFRAME">EraseBees</A></TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD width=20>&nbsp;</TD>
</TR><TR height=20>
<TD width=20>&nbsp;</TD>
<TD CLASS="TableLightDesc">&nbsp;</TD>
<TD CLASS="TableLightDesc"><A HREF="CWP39.HTM" TARGET="CNTFRAME">DrawWaspThenSwarm</A></TD>
<TD CLASS="TableLightDesc">
This draws the wasp, and the bees and then moves them, and if needed,<br>
changes the color for the next draw.<br>
See source code for further details.
<P>
</TD>
<TD width=20>&nbsp;</TD>
</TR></TABLE>
</BODY>
</HTML>

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
United States United States
Hello, I have been a professional hairpuller aka programmer for a large company during the last nine years. The acquiring company is closing down the california office so I'll be out of work at the end of June at the latest. I program in a variety of laguages, C#, C++, C, Visual Basic, SQl Server among others. I live north of Sacramento in Paradise CA. I've been programming since the early 1980 and people accuse me of going bald. I'm not going bald, my hair is just migrating south and into my ears.

I am a firm believer that the most widely used programming language is #$@$@$%#$%^ but folks tend to object to the unusual synatax where each word has a colorful meaning and sentences are limited to three words max, while the punching bag flys back and forth so fast it heats up from friction like a meteorite through the air.

In short, I'm nuts, but I'm good at what I do.

Programming is like beating my head against a brick wall, it hurts so bad I can't stand it, but when I stop beating my head against the wall (Solve the problem), it feels so good I gotta do it again!

Comments and Discussions