Update and finish.
import three;
import solids;
size(8cm);
currentprojection=orthographic((1,-.2,.3));
real a=2;
triple A=O,B=(a,0,0),C=(a,a,0),D=(0,2a,0),S=(0,0,2a);
triple D_=rotate(-90,C,A)*D;
draw(C--D);
draw(A--S--B--cycle,dashed);
draw(A--C^^A--D,dashed);
revolution R=revolution(A,D_--S,C);
draw(C--D_,Arrow3);
//draw(surface(R),green+opacity(.5));
draw(R,linewidth(0.6bp));
path3 c=circle(C,abs(C-D),A-C);
// draw(c,Arrow3); // To specify the direction of circle
path c_=project(c);
draw(subpath(c,reltime(c,0.3),reltime(c,0.5)),green+0.8bp,Arrow3);
dot(relpoint(c,0.3));
dot(relpoint(c,0.5));
path pvisib1 = cut(project(D--S--C),c_,1).before;
path pvisib2 = cut(project(D--S--C),c_,2).after;
path pcache = cut(cut(project(D--S--C),c_,1).after,c_,1).before;
path BCdashed = cut(project(C--B),c_,1).after;
path BC = cut(project(C--B),c_,1).before;
// three.asy, line 1163
draw(invert(pvisib1),blue);
draw(invert(pvisib2),blue);
draw(invert(BC),blue);
draw(invert(pcache)^^invert(BCdashed),red+dashed);
dot("$A$",A,dir(-135));
dot("$B$",B,dir(-90));
dot("$C$",C,dir(-35));
dot("$D$",D,dir(0));
dot("$S$",S,dir(90));

Additional code for revolution
import graph;
import solids;
currentprojection=orthographic(3,3,1.5);
//currentlight=Viewport;
currentlight.background = gray(.7);
picture pic1,pic2;
size(pic1,200);
size(pic2,200);
path g= (0, 0.65){right}
..{up}(0.45, 1)
--(0.5, 1){down}
..{left}(0.1,0.6)
{right}..{down}(0.15,0.55)
..{down}(0.075,0.35){down}
..{down}(0.075, 0.2)
..(0.15,0.15){down}
..{left}(0.1,0.1){right}
..{right}(0.4,0.05)
--(0.4,0){left}
..{left}(0,0.05);
pen[] colors={red,green,blue};
colors.cyclic=true;
for(int i=0;i<length(g);++i){
draw(pic1,subpath(g,i,i+1),colors[i]+1bp);
path3 p=path3(subpath(g,i,i+1),YZplane);
revolution R=revolution(p,Z,0,300);
draw(pic2,surface(R),colors[i],meshpen=black+0.55bp);
}
xaxis(pic1,"$x$",Arrow());
yaxis(pic1,"$y$",Arrow());
picture pic;
picture pic3;
add(pic,pic1.fit(),(0,0),15W);
add(pic,pic2.fit(),(0,0),15E);
draw(pic3,(-15,0)--(15,0),Arrow);
add(pic,pic3.fit());
add(pic.fit(),Fill(gray(.7)));

Animation.
import graph;
import solids;
currentprojection=orthographic(3,3,1.5);
//currentlight.background = gray(.7);
size(8cm);
path g= (0, 0.65){right}
..{up}(0.45, 1)
--(0.5, 1){down}
..{left}(0.1,0.6)
{right}..{down}(0.15,0.55)
..{down}(0.075,0.35){down}
..{down}(0.075, 0.2)
..(0.15,0.15){down}
..{left}(0.1,0.1){right}
..{right}(0.4,0.05)
--(0.4,0){left}
..{left}(0,0.05);
pen[] colors={red,green,blue};
colors.cyclic=true;
int numberofframes=72;
string[] files;
// Optional arguments and "normal" is always coincide with orthographic(3,3,1.5)
path3 boundingbox = circle((3,3,2), r=0.7, normal=(3,3,1.5));
for (int j=37; j<=numberofframes; ++j)
{
files[j]="T"+(string) j;
picture pic;
draw(pic, boundingbox, invisible);
for(int i=0;i<length(g);++i)
{
path3 p=path3(subpath(g,i,i+1),YZplane);
revolution R=revolution(p,Z,0,j*5);
draw(pic,surface(R),colors[i],meshpen=black+0.51bp);
}
add(pic);
shipout(files[j],bbox(invisible));
erase();
}

Compile with Asymptote.
Compile at http://asymptote.ualberta.ca/
From solids.asy
// A surface of revolution generated by rotating a planar path3 g
// from angle1 to angle2 about c--c+axis.
revolution revolution(triple c=O, path3 g, triple axis=Z, real angle1=0, real angle2=360);
Code
import three;
import solids;
size(8cm);
currentprojection=orthographic((1,-.2,.3));
real a=2;
triple A=O,B=(a,0,0),C=(a,a,0),D=(0,2a,0),S=(0,0,2a);
triple D_=rotate(-90,C,A)*D;
draw(A--B--C--D);
draw(A--S--B^^C--S--D);
draw(A--C^^A--D,dashed);
revolution R=revolution(A,D_--S,C);
draw(C--D_,Arrow3);
//draw(surface(R),green+opacity(.5));
draw(R,linewidth(0.6bp));
dot("$A$",A,dir(-135));
dot("$B$",B,dir(-90));
dot("$C$",C,dir(-35));
dot("$D$",D,dir(0));
dot("$S$",S,dir(90));
with D_--S
is a generatrix and A--C
is the directrix.
